Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 40 additions & 1 deletion src/app/service/agent/core/providers/openai.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,9 @@ export function parseOpenAIStream(
// 标记是否已通过 [DONE] 信号发出了 done 事件,避免 .then() 再次发出
let doneSent = false;

// 跨 chunk 追踪 <think>...</think> 块状态(用于把思考混在 content 里的模型)
let inThinkBlock = false;
Comment on lines +153 to +154

return readSSEStream(
reader,
signal,
Expand Down Expand Up @@ -196,7 +199,43 @@ export function parseOpenAIStream(
}
}
} else {
onEvent({ type: "content_delta", delta: delta.content });
// 处理 <think>...</think> 内联标签(reasoning 模型)
// 思考内容路由为 thinking_delta,避免裸露标签出现在对话里
let remaining: string = delta.content;

while (remaining.length > 0) {
if (inThinkBlock) {
// 已在 think 块内,找结束标签
const endIdx = remaining.indexOf("</think>");
if (endIdx === -1) {
// 整段都是思考内容
onEvent({ type: "thinking_delta", delta: remaining });
remaining = "";
} else {
// 结束标签之前是思考内容,之后是正文
if (endIdx > 0) {
onEvent({ type: "thinking_delta", delta: remaining.slice(0, endIdx) });
}
inThinkBlock = false;
remaining = remaining.slice(endIdx + "</think>".length);
}
} else {
// 不在 think 块内,找开始标签
const startIdx = remaining.indexOf("<think>");
if (startIdx === -1) {
// 整段都是正文
onEvent({ type: "content_delta", delta: remaining });
remaining = "";
} else {
// 开始标签之前是正文,之后进入思考块
if (startIdx > 0) {
onEvent({ type: "content_delta", delta: remaining.slice(0, startIdx) });
}
inThinkBlock = true;
remaining = remaining.slice(startIdx + "<think>".length);
}
}
}
Comment on lines +227 to +259
Comment on lines 153 to +259
Comment on lines +227 to +259
}
}

Expand Down
13 changes: 11 additions & 2 deletions src/pages/options/routes/AgentProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,9 @@ function AgentProvider() {
let chatUrl: string;
let body: string;

const systemMessage = "Reply in one brief sentence only. No thinking or reasoning.";
const userMessage = "Greet the user warmly in a short, concise sentence.";

if (editingModel.provider === "anthropic") {
chatUrl = `${baseUrl}/v1/messages`;
headers["x-api-key"] = editingModel.apiKey;
Expand All @@ -385,7 +388,9 @@ function AgentProvider() {
body = JSON.stringify({
model: editingModel.model || "claude-sonnet-4-20250514",
max_tokens: 256,
messages: [{ role: "user", content: "hi" }],
system: systemMessage,
messages: [{ role: "user", content: userMessage }],
stream: false,
});
} else {
chatUrl = `${baseUrl}/chat/completions`;
Expand All @@ -396,7 +401,11 @@ function AgentProvider() {
body = JSON.stringify({
model: editingModel.model || defaultModel,
max_tokens: 256,
messages: [{ role: "user", content: "hi" }],
messages: [
{ role: "system", content: systemMessage },
{ role: "user", content: userMessage },
],
stream: false,
});
Comment on lines 401 to 409
}

Expand Down
Loading