-
Notifications
You must be signed in to change notification settings - Fork 854
Expand file tree
/
Copy pathyou-web.mjs
More file actions
114 lines (98 loc) · 3.5 KB
/
you-web.mjs
File metadata and controls
114 lines (98 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// path/to/services/apis/you-web.mjs
import { pushRecord, setAbortController } from '../../services/apis/shared.mjs'
import { fetchSSE } from '../../utils/fetch-sse.mjs'
import { getUserConfig, youWebModelKeys } from '../../config/index.mjs'
import { getConversationPairs } from '../../utils/get-conversation-pairs.mjs'
import { getModelValue, isUsingModelName } from '../../utils/model-name-convert.mjs'
/**
* @param {Runtime.Port} port
* @param {string} question
* @param {Session} session
* @param {string} sessionCookie
*/
export async function generateAnswersWithYouWebApi(port, question, session, sessionCookie) {
const { controller, cleanController } = setAbortController(port)
const config = await getUserConfig()
const model = getModelValue(session)
const apiUrl = 'https://you.com/api/streamingSearch'
// Use the existing chatId from the session or generate a new one
if (!session.chatId) {
session.chatId = generateUUID() // You need a function to generate UUIDs
}
// Always include the conversation history
const conversationContext = getConversationPairs(session.conversationRecords, false)
const traceId = `${session.chatId}|${session.messageId}|${new Date().toISOString()}`
const params = new URLSearchParams()
params.append('page', '1')
params.append('count', '10')
params.append('safeSearch', 'Off')
params.append('q', question)
params.append('chatId', session.chatId) // Use the existing or new chatId
params.append('traceId', traceId)
params.append('conversationTurnId', session.messageId)
params.append('selectedAiModel', model)
// Conditional chatMode based on modelName
let chatMode = 'custom'
if (isUsingModelName('create', session)) {
chatMode = 'create'
}
params.append('selectedChatMode', chatMode)
params.append('pastChatLength', session.conversationRecords.length.toString())
params.append('queryTraceId', traceId)
params.append('use_personalization_extraction', 'false')
params.append('domain', 'youchat')
params.append('mkt', 'en-US')
params.append('chat', JSON.stringify(conversationContext))
const url = `${apiUrl}?${params.toString()}`
let answer = ''
await fetchSSE(url, {
method: 'GET',
signal: controller.signal,
headers: {
'Content-Type': 'text/event-stream;charset=utf-8',
Cookie: `sessionKey=${sessionCookie}`,
'User-Agent': navigator.userAgent,
},
onMessage(message) {
if (message.trim() === '[DONE]') {
finishMessage()
return
}
let data
try {
data = JSON.parse(message)
} catch (error) {
console.error('SSE message parse error:', error)
return
}
if (data.youChatToken) {
answer += data.youChatToken
port.postMessage({ answer: answer, done: false, session: null })
}
},
onStart() {
// Handle start if needed
},
onEnd() {
finishMessage()
port.postMessage({ done: true })
cleanController()
},
onError(error) {
cleanController()
port.postMessage({ error: error.message, done: true })
},
})
function finishMessage() {
pushRecord(session, question, answer)
port.postMessage({ answer: answer, done: true, session: session })
}
}
// Helper function to generate UUIDs (you can use a library for this if you prefer)
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (Math.random() * 16) | 0,
v = c == 'x' ? r : (r & 0x3) | 0x8
return v.toString(16)
})
}