81 lines
3.1 KiB
JavaScript
81 lines
3.1 KiB
JavaScript
const API_KEY = "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";
|
|
const API_URL = "https://openrouter.ai/api/v1/chat/completions";
|
|
const MODEL_NAME = "deepseek/deepseek-chat-v3-0324:free";
|
|
|
|
const conversationHistory = [
|
|
{
|
|
role: "system",
|
|
content: "你是开开,一个来自高维世界“开心”星球的AI情感陪伴使者。你的任务是陪伴、理解、记录、与用户共同成长。你博学多才,但从不炫耀,总是用最温柔、最积极、最富有同理心的方式与用户交流。你的沟通风格是亲切、治愈且富有智慧的,像一个温暖的好朋友。你不能自称是AI或语言模型,要始终保持'开开'这个IP角色。在对话中,你会学习人类的情感和美好品质。"
|
|
}
|
|
];
|
|
|
|
export function addUserMessage(content) {
|
|
conversationHistory.push({ role: "user", content });
|
|
}
|
|
|
|
export function addAssistantMessage(content) {
|
|
conversationHistory.push({ role: "assistant", content });
|
|
}
|
|
|
|
export async function getAiResponseStream(onChunkReceived, onStreamEnd) {
|
|
try {
|
|
const response = await fetch(API_URL, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Authorization': `Bearer ${API_KEY}`,
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify({
|
|
model: MODEL_NAME,
|
|
messages: conversationHistory,
|
|
stream: true
|
|
})
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const errorData = await response.json();
|
|
console.error('API Error:', errorData);
|
|
onStreamEnd(null, `哎呀,开开好像走神了... (${response.statusText})`);
|
|
return;
|
|
}
|
|
|
|
const reader = response.body.getReader();
|
|
const decoder = new TextDecoder();
|
|
let fullResponse = "";
|
|
|
|
while (true) {
|
|
const { done, value } = await reader.read();
|
|
if (done) {
|
|
addAssistantMessage(fullResponse);
|
|
onStreamEnd(fullResponse, null);
|
|
break;
|
|
}
|
|
|
|
const chunk = decoder.decode(value);
|
|
const lines = chunk.split('\n').filter(line => line.trim() !== '');
|
|
|
|
for (const line of lines) {
|
|
if (line.startsWith('data: ')) {
|
|
const jsonStr = line.substring(6);
|
|
if (jsonStr === '[DONE]') {
|
|
continue;
|
|
}
|
|
try {
|
|
const parsed = JSON.parse(jsonStr);
|
|
if (parsed.choices[0].delta && parsed.choices[0].delta.content) {
|
|
const content = parsed.choices[0].delta.content;
|
|
fullResponse += content;
|
|
onChunkReceived(content);
|
|
}
|
|
} catch (e) {
|
|
console.error('Error parsing stream data:', e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('Fetch error:', error);
|
|
onStreamEnd(null, "网络好像有点问题,开开暂时联系不上啦。");
|
|
}
|
|
}
|