From e80feb46d67dba344a03bf5845c16039f6a894c3 Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Mon, 10 Aug 2026 00:14:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E7=8A=B6=E6=80=81=E7=AE=A1=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=87=86=E5=A4=87=E5=92=8C=E4=B8=AD=E6=96=AD?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/agent/AgentToolCallBlock.vue | 29 +++++++++++++++++++- app/composables/useAgentChat.ts | 40 +++++++++++++++++++++++++--- app/types/chat.ts | 2 +- e2e/global-setup.ts | 2 +- e2e/specs/agent-documents.spec.ts | 9 ++++--- packages/drizzle-pkg/db.sqlite | Bin 1077248 -> 1220608 bytes server/service/agent-tool/index.ts | 20 +++++++------- 7 files changed, 82 insertions(+), 20 deletions(-) diff --git a/app/components/agent/AgentToolCallBlock.vue b/app/components/agent/AgentToolCallBlock.vue index cd4e54a..fc44848 100644 --- a/app/components/agent/AgentToolCallBlock.vue +++ b/app/components/agent/AgentToolCallBlock.vue @@ -19,7 +19,9 @@ const collapsed = ref(false); {{ part.toolName }} - + + + @@ -35,6 +37,11 @@ const collapsed = ref(false);
+
+ + 正在生成调用参数… +
+
参数
{{ JSON.stringify(part.args, null, 2) }}
@@ -119,7 +126,9 @@ const collapsed = ref(false); color: var(--color-muted); } +.tool-state.preparing { color: var(--color-accent-amber); } .tool-state.call { color: var(--color-accent-amber); } +.tool-state.interrupted { color: var(--color-accent-red, #e74c3c); } .tool-state.result { color: var(--color-accent-teal); } .tool-state.approval-requested { color: var(--color-accent-amber); } .tool-state.approval-responded { color: var(--color-body); } @@ -224,4 +233,22 @@ const collapsed = ref(false); font-size: 12px; color: var(--color-body); } + +.tool-preparing { + display: flex; + align-items: center; + gap: 6px; + padding: 6px 0; + font-size: 12px; + color: var(--color-muted); +} + +.tool-preparing .spin { + font-size: 13px; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} diff --git a/app/composables/useAgentChat.ts b/app/composables/useAgentChat.ts index 165d524..4abd59d 100644 --- a/app/composables/useAgentChat.ts +++ b/app/composables/useAgentChat.ts @@ -286,7 +286,7 @@ export function useAgentChat(options: UseAgentChatOptions) { errorMessage.value = chunk.errorText || "流式响应出错"; break; } - case "tool-input-available": { + case "tool-input-start": { const msg = messages.value[assistantIdx]; if (!msg) break; updateLastReasoningDuration(msg); @@ -295,11 +295,36 @@ export function useAgentChat(options: UseAgentChatOptions) { type: "tool-call", toolName: chunk.toolName, toolCallId: chunk.toolCallId, - args: chunk.input, - state: "call", + args: undefined, + state: "preparing", }); break; } + case "tool-input-delta": { + break; + } + case "tool-input-available": { + const msg = messages.value[assistantIdx]; + if (!msg) break; + updateLastReasoningDuration(msg); + const existing = msg.parts?.find( + (p) => p.type === "tool-call" && p.toolCallId === chunk.toolCallId && p.state === "preparing" + ); + if (existing) { + existing.args = chunk.input; + existing.state = "call"; + } else { + appendPart(msg, { + id: generateId(), + type: "tool-call", + toolName: chunk.toolName, + toolCallId: chunk.toolCallId, + args: chunk.input, + state: "call", + }); + } + break; + } case "tool-output-available": { const msg = messages.value[assistantIdx]; if (!msg || !msg.parts) break; @@ -361,7 +386,14 @@ export function useAgentChat(options: UseAgentChatOptions) { } const msg = messages.value[assistantIdx]; - if (msg) updateLastReasoningDuration(msg); + if (msg) { + updateLastReasoningDuration(msg); + for (const p of msg.parts ?? []) { + if (p.type === "tool-call" && p.state === "preparing") { + p.state = "interrupted"; + } + } + } } function validateAssistantContent(assistantIdx: number, isApprovalContinue = false) { diff --git a/app/types/chat.ts b/app/types/chat.ts index 695c5c4..f0cb839 100644 --- a/app/types/chat.ts +++ b/app/types/chat.ts @@ -8,7 +8,7 @@ export interface MessagePart { toolCallId?: string args?: unknown result?: unknown - state?: 'call' | 'result' | 'approval-requested' | 'approval-responded' + state?: 'preparing' | 'call' | 'result' | 'approval-requested' | 'approval-responded' | 'interrupted' approvalId?: string approved?: boolean approvalReason?: string diff --git a/e2e/global-setup.ts b/e2e/global-setup.ts index a248956..ed50d94 100644 --- a/e2e/global-setup.ts +++ b/e2e/global-setup.ts @@ -313,7 +313,7 @@ async function seedLlmData(dbPath: string) { // 插入 default agent(seed 脚本只做 bootstrap admin,不含 agent seed) await client.execute({ - sql: `INSERT INTO agents (slug, name, description, system_prompt, default_model_id, title_strategy, enable_thinking, enable_tools, max_step_count, is_default, is_callable, sort_order, enabled) + sql: `INSERT OR IGNORE INTO agents (slug, name, description, system_prompt, default_model_id, title_strategy, enable_thinking, enable_tools, max_step_count, is_default, is_callable, sort_order, enabled) VALUES ('default', '默认助手', '通用 AI 助手', 'You are a helpful AI assistant.', ?, 'llm', 0, 1, 6, 1, 0, 0, 1)`, args: [Number(modelId)], }); diff --git a/e2e/specs/agent-documents.spec.ts b/e2e/specs/agent-documents.spec.ts index 78639fe..f1ce6b0 100644 --- a/e2e/specs/agent-documents.spec.ts +++ b/e2e/specs/agent-documents.spec.ts @@ -189,8 +189,9 @@ test.describe("Agent 文档", () => { await expect(docLink).toBeVisible({ timeout: 10000 }); }); - test("带 agentSlug 创建的文档绑定到该 agent", async ({ page, request }) => { + test("带 agentSlug 创建的文档绑定到该 agent", async ({ page }) => { await loginViaUI(page); + const request = page.request; const title = `E2E绑定Agent_${Date.now()}`; const res = await request.post("/api/agent-documents", { @@ -210,8 +211,9 @@ test.describe("Agent 文档", () => { await request.delete(`/api/agent-documents/${docId}`); }); - test("不带 agentSlug 创建的文档为全局共享", async ({ page, request }) => { + test("不带 agentSlug 创建的文档为全局共享", async ({ page }) => { await loginViaUI(page); + const request = page.request; const title = `E2E全局文档_${Date.now()}`; const res = await request.post("/api/agent-documents", { @@ -235,8 +237,9 @@ test.describe("Agent 文档", () => { await request.delete(`/api/agent-documents/${docId}`); }); - test("PATCH 切换文档归属(全局 ↔ agent 专属)", async ({ page, request }) => { + test("PATCH 切换文档归属(全局 ↔ agent 专属)", async ({ page }) => { await loginViaUI(page); + const request = page.request; // 先创建全局文档 const createRes = await request.post("/api/agent-documents", { diff --git a/packages/drizzle-pkg/db.sqlite b/packages/drizzle-pkg/db.sqlite index 6c5fa390ff334daa34fe3b8edab84ce8a3b0b536..fa66cd8e2b36db5f4ae1d4e2910d96b14848a475 100644 GIT binary patch delta 122470 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�DTwMSr|GS)b<}spqS;^ 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 delta 1018 zcmY*XYiv|S6rS1pzB_ZyZmpr~+PD%?NR6%f!$(59joJXqqYWXTXj4-#D)bSxT9qHw z-PmX#fH!p#tGuG2CP)h_ofsuWA@ql-U1CkvYSxNS3Q}9Z*xH(`b2q68_vHI>?wtF5 zXU@s(IJK%{ta?w>Xd#4Jdt+6!i$7ZN3EpiU=^gz{bNWtDB4s|ga%s@<4wt_`?eEOx+aeJY#|Z@!^xH7xI04ZDJY_we+zv$k5~Or+VfQYeaxBV_mMtOCD-!nrlMZk z#b1eu8G@tuBW7?CujA}OC}l4$)-{K6pU@}p$yQRZ{LJ)8P7XW8p(uW)oRS2)aRhf` z63^q*LMW#v5xDM@(k(5GZB1L7U*RG-<=kDSoXY+`vu^sryy?y0Vr0sxC^2!6;14*2 zgLnm}ab_V@i%)Txp*w`~0%L)p!2X59)GFj=f#sFFvuGOWCZdy*gq(D~W`DTzUO4u- z!0T?e4&T~a5DHwo;TP*$OedBlw-%_q%)9kaKgcY22!Qj7s8=$nxYi@`zzH zZEb3K>2-0f6HDaMd6!fD;)b8{sbGqI!SxJ%Sr{39nFhqO5n3z~=Xi8)b+Py8wV+&n zj_bidpiMmX3x8Wyo?ug|ZH`CeP>w%zzqZ=$l2!=jaJ`!2eOgcO5`K>-@FTV57qJc> z#yil2Nf?2z;1IkEt*{X)VF@sPgOBoWcn{yrU**s6$9WkqV*ju)Hpq^$F1CX;vQ@&4 zK~@d^fULh0uDa>77y7mS3ZQY*x { - const execResult = await executeAgentTool(agentTool.id, input, userId); - if (!execResult.success) { - return `工具执行失败: ${execResult.error ?? "未知错误"}。请停止调用此工具,基于已有信息回答用户或告知用户此工具不可用。`; - } - const meta = execResult.metadata; - const sizeInfo = meta?.responseSize ? `${meta.responseSize} bytes` : `未知大小`; - const statusInfo = meta?.statusCode ? `HTTP ${meta.statusCode}` : ""; - const dataStr = typeof execResult.data === "string" ? execResult.data : JSON.stringify(execResult.data); + execute: async (input: unknown) => { + const execResult = await executeAgentTool(agentTool.id, input, userId, undefined, agentId); + if (!execResult.success) { + return `工具执行失败: ${execResult.error ?? "未知错误"}。请停止调用此工具,基于已有信息回答用户或告知用户此工具不可用。`; + } + const meta = execResult.metadata; + const sizeInfo = meta?.responseSize ? `${meta.responseSize} bytes` : `未知大小`; + const statusInfo = meta?.statusCode ? `HTTP ${meta.statusCode}` : ""; + const dataStr = typeof execResult.data === "string" ? execResult.data : JSON.stringify(execResult.data); return `[${agentTool.type} 结果 ${statusInfo} ${sizeInfo}]\n${dataStr}`; }, needsApproval: false, @@ -602,7 +602,7 @@ export async function getAgentToolsForChatByAgentId(params: { }, }), execute: async (input: unknown) => { - const execResult = await executeAgentTool(agentTool.id, input, userId); + const execResult = await executeAgentTool(agentTool.id, input, userId, undefined, agentId); if (!execResult.success) { return `工具执行失败: ${execResult.error ?? "未知错误"}。请停止调用此工具,基于已有信息回答用户或告知用户此工具不可用。`; }