(messages: any[], refreshToken: string, model = MODEL_NAME, refConvId = "", retryCount = 0, tools?: any[])
| 346 | } |
| 347 | |
| 348 | export async function createCompletion(messages: any[], refreshToken: string, model = MODEL_NAME, refConvId = "", retryCount = 0, tools?: any[]): Promise<any> { |
| 349 | return (async () => { |
| 350 | let processedMessages = convertToolMessages(messages); |
| 351 | processedMessages = injectToolsPrompt(processedMessages, tools || []); |
| 352 | const refFileUrls = extractRefFileUrls(processedMessages); |
| 353 | const refs = refFileUrls.length ? await Promise.all(refFileUrls.map((fileUrl) => uploadFile(fileUrl, refreshToken))) : []; |
| 354 | if (!/[0-9a-zA-Z]{24}/.test(refConvId)) refConvId = ""; |
| 355 | let assistantId = /^[a-z0-9]{24,}$/.test(model) ? model : DEFAULT_ASSISTANT_ID; |
| 356 | let chatMode = ''; |
| 357 | if (model.includes('think') || model.includes('zero')) { chatMode = 'zero'; } |
| 358 | if (model.includes('deepresearch')) { chatMode = 'deep_research'; } |
| 359 | const token = await acquireToken(refreshToken); |
| 360 | const sign = await generateSign(); |
| 361 | const response = await glmPostStream( |
| 362 | "https://chatglm.cn/chatglm/backend-api/assistant/stream", |
| 363 | { |
| 364 | assistant_id: assistantId, |
| 365 | conversation_id: refConvId, |
| 366 | project_id: "", |
| 367 | chat_type: "user_chat", |
| 368 | messages: messagesPrepare(processedMessages, refs, !!refConvId), |
| 369 | meta_data: { |
| 370 | channel: "", |
| 371 | chat_mode: chatMode || undefined, |
| 372 | draft_id: "", |
| 373 | if_plus_model: true, |
| 374 | input_question_type: "xxxx", |
| 375 | is_networking: true, |
| 376 | is_test: false, |
| 377 | platform: "pc", |
| 378 | quote_log_id: "", |
| 379 | cogview: { rm_label_watermark: false } |
| 380 | }, |
| 381 | }, |
| 382 | { |
| 383 | Authorization: `Bearer ${token}`, |
| 384 | ...getHeaders(), |
| 385 | "X-Device-Id": uuid(false), |
| 386 | "X-Request-Id": uuid(false), |
| 387 | "X-Sign": sign.sign, |
| 388 | "X-Timestamp": sign.timestamp, |
| 389 | "X-Nonce": sign.nonce, |
| 390 | } |
| 391 | ); |
| 392 | const contentType = response.headers.get("content-type") || ""; |
| 393 | if (!contentType.includes("text/event-stream")) { |
| 394 | const errText = await response.text(); |
| 395 | console.error(errText); |
| 396 | throw new Error(`Stream response Content-Type invalid: ${contentType}`); |
| 397 | } |
| 398 | const answer = await receiveStream(model, response.body!, tools); |
| 399 | removeConversation(answer.id, refreshToken, assistantId).catch(() => {}); |
| 400 | return answer; |
| 401 | })().catch(async (err) => { |
| 402 | if (retryCount < MAX_RETRY_COUNT) { |
| 403 | console.error(`Stream response error: ${err.stack || err.message}`); |
| 404 | await sleep(RETRY_DELAY); |
| 405 | return createCompletion(messages, refreshToken, model, refConvId, retryCount + 1, tools); |
no test coverage detected