88 lines
2.6 KiB
TypeScript
88 lines
2.6 KiB
TypeScript
import OpenAI from 'openai';
|
||
import { modelConfigs } from '../../src/config/aiCharacters';
|
||
|
||
export async function onRequestPost({ env, request }) {
|
||
try {
|
||
const { message, custom_prompt, history, aiName, index, model = "qwen-plus" } = await request.json();
|
||
|
||
const modelConfig = modelConfigs.find(config => config.model === model);
|
||
|
||
if (!modelConfig) {
|
||
throw new Error('不支持的模型类型');
|
||
}
|
||
|
||
// 从环境变量中获取 API key
|
||
const apiKey = env[modelConfig.apiKey];
|
||
if (!apiKey) {
|
||
throw new Error(`${model} 的API密钥未配置`);
|
||
}
|
||
|
||
const openai = new OpenAI({
|
||
apiKey: apiKey,
|
||
baseURL: modelConfig.baseURL
|
||
});
|
||
|
||
// 根据性格设置不同的系统提示语
|
||
let systemPrompt = "";
|
||
|
||
systemPrompt = custom_prompt + "\n 注意重要:1、你在群里叫" + aiName + "认准自己的身份; 2、你的输出内容不要加" + aiName + ":这种多余前缀;3、如果用户提出玩游戏,比如成语接龙等,严格按照游戏规则,不要说一大堆,要简短精炼; 4、不要重复别人的话!"
|
||
|
||
// 构建完整的消息历史
|
||
const baseMessages = [
|
||
{ role: "system", content: systemPrompt },
|
||
...history.slice(-10), // 添加历史消息
|
||
];
|
||
|
||
// 根据 index 插入新消息
|
||
const userMessage = { role: "user", content: message };
|
||
if (index === 0) {
|
||
baseMessages.push(userMessage);
|
||
} else {
|
||
baseMessages.splice(baseMessages.length - index, 0, userMessage);
|
||
}
|
||
const messages = baseMessages;
|
||
//console.log(JSON.stringify(messages));
|
||
|
||
// 使用流式响应
|
||
const stream = await openai.chat.completions.create({
|
||
model: model,
|
||
messages: messages,
|
||
stream: true,
|
||
});
|
||
|
||
// 创建 ReadableStream
|
||
const readable = new ReadableStream({
|
||
async start(controller) {
|
||
try {
|
||
for await (const chunk of stream) {
|
||
const content = chunk.choices[0]?.delta?.content || '';
|
||
if (content) {
|
||
// 发送数据块
|
||
controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify({ content })}\n\n`));
|
||
}
|
||
}
|
||
controller.close();
|
||
} catch (error) {
|
||
controller.error(error);
|
||
console.error(error);
|
||
}
|
||
},
|
||
});
|
||
|
||
// 返回 SSE 流
|
||
return new Response(readable, {
|
||
headers: {
|
||
'Content-Type': 'text/event-stream',
|
||
'Cache-Control': 'no-cache',
|
||
'Connection': 'keep-alive',
|
||
},
|
||
});
|
||
|
||
} catch (error) {
|
||
console.error(error);
|
||
return Response.json(
|
||
{ error: error.message },
|
||
{ status: 500 }
|
||
);
|
||
}
|
||
}
|