Spaces:
Sleeping
Sleeping
File size: 4,617 Bytes
b88ce1b 2d02ec4 b88ce1b 2d02ec4 b88ce1b 2d02ec4 b88ce1b 2d02ec4 b88ce1b 2d02ec4 b88ce1b 2d02ec4 b88ce1b 2d02ec4 b88ce1b 2d02ec4 b88ce1b 2d02ec4 b88ce1b 8f02d2f 2d02ec4 b88ce1b |
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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
import tokenManager from '../auth/token_manager.js';
import config from '../config/config.js';
export async function generateAssistantResponse(requestBody, callback) {
const token = await tokenManager.getToken();
if (!token) {
throw new Error('没有可用的token,请运行 npm run login 获取token');
}
const url = config.api.url;
const response = await fetch(url, {
method: 'POST',
headers: {
'Host': config.api.host,
'User-Agent': config.api.userAgent,
'Authorization': `Bearer ${token.access_token}`,
'Content-Type': 'application/json',
'Accept-Encoding': 'gzip'
},
body: JSON.stringify(requestBody)
});
if (!response.ok) {
const errorText = await response.text();
if (response.status === 403) {
tokenManager.disableCurrentToken(token);
throw new Error(`该账号没有使用权限,已自动禁用。错误详情: ${errorText}`);
}
throw new Error(`API请求失败 (${response.status}): ${errorText}`);
}
const reader = response.body.getReader();
const decoder = new TextDecoder();
let thinkingStarted = false;
let toolCalls = [];
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n').filter(line => line.startsWith('data: '));
for (const line of lines) {
const jsonStr = line.slice(6);
try {
const data = JSON.parse(jsonStr);
const parts = data.response?.candidates?.[0]?.content?.parts;
if (parts) {
for (const part of parts) {
if (part.thought === true) {
if (!thinkingStarted) {
callback({ type: 'thinking', content: '<think>\n' });
thinkingStarted = true;
}
callback({ type: 'thinking', content: part.text || '' });
} else if (part.text !== undefined) {
if (thinkingStarted) {
callback({ type: 'thinking', content: '\n</think>\n' });
thinkingStarted = false;
}
let content = part.text || '';
if (part.thought_signature) {
content += `\n<!-- thought_signature: ${part.thought_signature} -->`;
}
if (part.inlineData) {
const mimeType = part.inlineData.mimeType;
const data = part.inlineData.data;
content += `\n`;
}
if (content) {
callback({ type: 'text', content: content });
}
} else if (part.functionCall) {
toolCalls.push({
id: part.functionCall.id,
type: 'function',
function: {
name: part.functionCall.name,
arguments: JSON.stringify(part.functionCall.args)
}
});
}
}
}
// 当遇到 finishReason 时,发送所有收集的工具调用
if (data.response?.candidates?.[0]?.finishReason && toolCalls.length > 0) {
if (thinkingStarted) {
callback({ type: 'thinking', content: '\n</think>\n' });
thinkingStarted = false;
}
callback({ type: 'tool_calls', tool_calls: toolCalls });
toolCalls = [];
}
} catch (e) {
// 忽略解析错误
}
}
}
}
export async function getAvailableModels() {
const token = await tokenManager.getToken();
if (!token) {
throw new Error('没有可用的token,请运行 npm run login 获取token');
}
const response = await fetch(config.api.modelsUrl, {
method: 'POST',
headers: {
'Host': config.api.host,
'User-Agent': config.api.userAgent,
'Authorization': `Bearer ${token.access_token}`,
'Content-Type': 'application/json',
'Accept-Encoding': 'gzip'
},
body: JSON.stringify({})
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`获取模型列表失败 (${response.status}): ${errorText}`);
}
const responseText = await response.text();
let data;
try {
data = JSON.parse(responseText);
} catch (e) {
throw new Error(`JSON解析失败: ${e.message}. 原始响应: ${responseText.substring(0, 200)}`);
}
return {
object: 'list',
data: Object.keys(data.models).map(id => ({
id,
object: 'model',
created: Math.floor(Date.now() / 1000),
owned_by: 'google'
}))
};
}
|