Skip to content

Commit 4623257

Browse files
committed
修正 arguments delta 载入问题
1 parent 665aa0f commit 4623257

File tree

9 files changed

+92
-32
lines changed

9 files changed

+92
-32
lines changed

src/app/service/agent/providers/anthropic.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,19 @@ export function buildAnthropicRequest(
9696
}
9797
}
9898
for (const tc of m.toolCalls) {
99+
let inputArgs = {};
100+
if (tc.arguments) {
101+
try {
102+
inputArgs = JSON.parse(tc.arguments);
103+
} catch {
104+
// 不是有效 JSON ,忽略 arguments
105+
}
106+
}
99107
content.push({
100108
type: "tool_use",
101109
id: tc.id,
102110
name: tc.name,
103-
input: tc.arguments ? JSON.parse(tc.arguments) : {},
111+
input: inputArgs,
104112
});
105113
}
106114
return { role: "assistant" as const, content };
@@ -252,7 +260,7 @@ export function parseAnthropicStream(
252260
onEvent({
253261
type: "tool_call_delta",
254262
id: "",
255-
delta: delta.partial_json,
263+
delta: `${delta.partial_json}`,
256264
});
257265
} else if (delta?.type === "image_delta" && imageBlockData) {
258266
// 累积 base64 数据块

src/app/service/agent/providers/openai.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,20 +208,22 @@ export function parseOpenAIStream(
208208
// 工具调用
209209
if (delta.tool_calls) {
210210
for (const tc of delta.tool_calls) {
211+
let argText = `${tc.function.arguments || ""}`;
212+
if (argText === "{}") argText = "";
211213
if (tc.function?.name) {
212214
onEvent({
213215
type: "tool_call_start",
214216
toolCall: {
215217
id: tc.id || `tc_${Date.now()}`,
216218
name: tc.function.name,
217-
arguments: tc.function.arguments || "",
219+
arguments: argText,
218220
},
219221
});
220-
} else if (tc.function?.arguments) {
222+
} else if (argText) {
221223
onEvent({
222224
type: "tool_call_delta",
223225
id: tc.id || "",
224-
delta: tc.function.arguments,
226+
delta: argText,
225227
});
226228
}
227229
}

src/app/service/agent/tool_call_guard.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ export interface ToolCallRecord {
1111
* 规范化参数字符串(消除 JSON 格式差异)
1212
*/
1313
function normalizeArgs(args: string): string {
14+
if (!args) return args || "{}";
1415
try {
15-
return JSON.stringify(JSON.parse(args));
16+
const result = JSON.parse(args);
17+
if (Object.keys(result).length === 0) return "{}";
18+
return JSON.stringify(result);
1619
} catch {
1720
return args;
1821
}
@@ -23,7 +26,7 @@ function normalizeArgs(args: string): string {
2326
*/
2427
function isNullResult(result: string): boolean {
2528
try {
26-
const parsed = JSON.parse(result);
29+
const parsed = result ? JSON.parse(result) : {};
2730
return parsed.result === null || parsed.result === undefined;
2831
} catch {
2932
return false;

src/app/service/agent/tool_registry.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ export class ToolRegistry {
9494
try {
9595
let args: Record<string, unknown> = {};
9696
if (tc.arguments) {
97-
args = JSON.parse(tc.arguments);
97+
try {
98+
args = JSON.parse(tc.arguments);
99+
} catch {
100+
// 不是有效 JSON ,忽略 arguments
101+
}
98102
}
99103
const rawResult = await tool.executor.execute(args);
100104

src/app/service/agent/tools/web_fetch.ts

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@ export const WEB_FETCH_DEFINITION: ToolDefinition = {
2525

2626
// 简单正则去 HTML 标签(降级方案)
2727
export function stripHtmlTags(html: string): string {
28-
return html
29-
.replace(/<script[\s\S]*?<\/script>/gi, "")
30-
.replace(/<style[\s\S]*?<\/style>/gi, "")
31-
.replace(/<[^>]+>/g, " ")
32-
.replace(/\s+/g, " ")
33-
.trim();
28+
if (html.includes("<") && html.includes(">")) {
29+
html = html
30+
.replace(/<script[\s\S]*?<\/script>/gi, "")
31+
.replace(/<style[\s\S]*?<\/style>/gi, "")
32+
.replace(/<[^>]+>/g, " ");
33+
}
34+
return html.replace(/\s+/g, " ").trim();
3435
}
3536

3637
export class WebFetchExecutor implements ToolExecutor {
@@ -77,15 +78,22 @@ export class WebFetchExecutor implements ToolExecutor {
7778
const contentType = response.headers.get("content-type") || "";
7879
const text = await response.text();
7980
let content: string;
80-
let detectedType: string;
81+
let detectedType: string = "";
8182

8283
// a) Content-Type 含 json → 尝试 JSON.parse
8384
if (contentType.includes("json")) {
8485
try {
85-
const parsed = JSON.parse(text);
86-
content = JSON.stringify(parsed, null, 2);
87-
detectedType = "json";
86+
if (text && typeof text === "string") {
87+
const parsed = JSON.parse(text);
88+
if (Object.keys(parsed).length) {
89+
content = JSON.stringify(parsed, null, 2);
90+
detectedType = "json";
91+
}
92+
}
8893
} catch {
94+
// 不是有效 JSON
95+
}
96+
if (detectedType !== "json") {
8997
// 不是有效 JSON,当作纯文本
9098
content = stripHtmlTags(text);
9199
detectedType = "text";

src/app/service/content/gm_api/cat_agent.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ export class ConversationInstance {
328328

329329
if (msg.action !== "event") return;
330330
const event: ChatStreamEvent = msg.data;
331+
let argText;
331332

332333
switch (event.type) {
333334
case "content_delta":
@@ -342,10 +343,16 @@ export class ConversationInstance {
342343
break;
343344
case "tool_call_start":
344345
if (currentToolCall) toolCalls.push(currentToolCall);
345-
currentToolCall = { ...event.toolCall, arguments: event.toolCall.arguments || "" };
346+
argText = `${event.toolCall.arguments || ""}`;
347+
if (argText === "{}") argText = "";
348+
currentToolCall = { ...event.toolCall, arguments: argText };
346349
break;
347350
case "tool_call_delta":
348-
if (currentToolCall) currentToolCall.arguments += event.delta;
351+
if (currentToolCall) {
352+
argText = `${currentToolCall.arguments || ""}`;
353+
if (argText === "{}") argText = "";
354+
currentToolCall.arguments = argText + event.delta;
355+
}
349356
break;
350357
case "done": {
351358
if (currentToolCall) {

src/app/service/service_worker/agent.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,14 @@ export class AgentService {
895895
for (const tc of msg.toolCalls) {
896896
if (tc.name === "load_skill") {
897897
try {
898-
const args = JSON.parse(tc.arguments || "{}");
898+
let args: Record<string, any> = {};
899+
if (tc.arguments) {
900+
try {
901+
args = JSON.parse(tc.arguments);
902+
} catch {
903+
// 不是有效 JSON ,忽略 arguments
904+
}
905+
}
899906
if (args.skill_name) {
900907
await loadSkillMeta.executor.execute({ skill_name: args.skill_name });
901908
}
@@ -1682,6 +1689,7 @@ export class AgentService {
16821689
const subSendEvent = (event: ChatStreamEvent) => {
16831690
// 转发事件给父代理
16841691
params.sendEvent(event);
1692+
let argText;
16851693
// 收集执行详情
16861694
switch (event.type) {
16871695
case "content_delta":
@@ -1692,15 +1700,19 @@ export class AgentService {
16921700
currentMsg.thinking = (currentMsg.thinking || "") + event.delta;
16931701
break;
16941702
case "tool_call_start":
1703+
argText = `${event.toolCall.arguments || ""}`;
1704+
if (argText === "{}") argText = "";
16951705
currentMsg.toolCalls.push({
16961706
...event.toolCall,
1697-
arguments: event.toolCall.arguments || "",
1707+
arguments: argText,
16981708
status: "running",
16991709
});
17001710
break;
17011711
case "tool_call_delta":
17021712
if (currentMsg.toolCalls.length) {
1703-
currentMsg.toolCalls[currentMsg.toolCalls.length - 1].arguments += event.delta;
1713+
argText = `${currentMsg.toolCalls[currentMsg.toolCalls.length - 1].arguments || ""}`;
1714+
if (argText === "{}") argText = "";
1715+
currentMsg.toolCalls[currentMsg.toolCalls.length - 1].arguments = argText + event.delta;
17041716
}
17051717
break;
17061718
case "tool_call_complete": {
@@ -2137,7 +2149,14 @@ export class AgentService {
21372149
for (const tc of msg.toolCalls) {
21382150
if (tc.name === "load_skill") {
21392151
try {
2140-
const args = JSON.parse(tc.arguments || "{}");
2152+
let args: Record<string, any> = {};
2153+
if (tc.arguments) {
2154+
try {
2155+
args = JSON.parse(tc.arguments);
2156+
} catch {
2157+
// 不是有效 JSON ,忽略 arguments
2158+
}
2159+
}
21412160
if (args.skill_name) {
21422161
loadedSkillNames.add(args.skill_name);
21432162
}
@@ -2417,6 +2436,7 @@ export class AgentService {
24172436
sendEvent(event);
24182437
}
24192438
}
2439+
let argText;
24202440

24212441
switch (event.type) {
24222442
case "content_delta":
@@ -2430,11 +2450,15 @@ export class AgentService {
24302450
if (currentToolCall) {
24312451
toolCalls.push(currentToolCall);
24322452
}
2433-
currentToolCall = { ...event.toolCall, arguments: event.toolCall.arguments || "" };
2453+
argText = `${event.toolCall.arguments || ""}`;
2454+
if (argText === "{}") argText = "";
2455+
currentToolCall = { ...event.toolCall, arguments: argText };
24342456
break;
24352457
case "tool_call_delta":
24362458
if (currentToolCall) {
2437-
currentToolCall.arguments += event.delta;
2459+
argText = `${currentToolCall.arguments || ""}`;
2460+
if (argText === "{}") argText = "";
2461+
currentToolCall.arguments = argText + event.delta;
24382462
}
24392463
break;
24402464
case "done": {

src/app/service/service_worker/agent_dom_cdp.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,10 @@ export function cdpPeekMonitor(tabId: number): { hasChanges: boolean; dialogCoun
308308

309309
// 从 outerHTML 中提取纯文本(去除所有标签)
310310
function stripHtmlTags(html: string): string {
311-
return html
312-
.replace(/<[^>]*>/g, " ")
313-
.replace(/\s+/g, " ")
314-
.trim();
311+
if (html.includes("<") && html.includes(">")) {
312+
html = html.replace(/<[^>]*>/g, " ");
313+
}
314+
return html.replace(/\s+/g, " ").trim();
315315
}
316316

317317
// 停止监控:纯 CDP 解析新增节点 → 收集结果 → detach

src/pages/options/routes/AgentChat/export_utils.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ function renderToolCall(tc: ToolCall, indent = ""): string {
1212
const lines: string[] = [];
1313
let argsStr = "";
1414
try {
15-
const parsed = JSON.parse(tc.arguments);
16-
argsStr = JSON.stringify(parsed, null, 2);
15+
if (tc.arguments) {
16+
const parsed = JSON.parse(tc.arguments);
17+
if (Object.keys(parsed).length) {
18+
argsStr = JSON.stringify(parsed, null, 2);
19+
}
20+
}
1721
} catch {
1822
argsStr = tc.arguments;
1923
}

0 commit comments

Comments
 (0)