feat(agent): 助手交互 - 优化推理展示、工具分组与审批反馈
This commit is contained in:
1 parent
788a298004
commit
eb7344f92a
10 files changed
+457
-38
No files matched your search
@@ -10,6 +10,24 @@ test("completed tools keep an accessible status without a duplicate visual badge
|
||||
expect(html).not.toContain("agent-tool-label");
|
||||
});
|
||||
|
||||
test("empty read and operation events stay flat instead of rendering empty cards", () => {
|
||||
const readHtml = renderToStaticMarkup(<AgentToolCard title="model_list" text="工具执行成功" detail={{ eventType: "tool_completed" }} theme={canvasThemes.dark} />);
|
||||
const operationHtml = renderToStaticMarkup(<AgentToolCard title="canvas_apply_ops" text="画布操作已完成" detail={{ eventType: "canvas_updated" }} theme={canvasThemes.dark} />);
|
||||
expect(readHtml).toContain("agent-tool-row--plain");
|
||||
expect(operationHtml).toContain("agent-tool-row--plain");
|
||||
});
|
||||
|
||||
test("canvas reads show one node by default and expose the collapsed count", () => {
|
||||
const html = renderToStaticMarkup(<AgentToolCard title="canvas_get_state" text="已读取当前画布" detail={{ eventType: "tool_completed", result: { nodes: [
|
||||
{ id: "node-1", title: "第一个节点", type: "image" },
|
||||
{ id: "node-2", title: "第二个节点", type: "text" },
|
||||
{ id: "node-3", title: "第三个节点", type: "video" },
|
||||
] } }} theme={canvasThemes.dark} onFocusNode={() => {}} />);
|
||||
expect(html).toContain("读取了图片节点《第一个节点》");
|
||||
expect(html).not.toContain("读取了文本节点《第二个节点》");
|
||||
expect(html).toContain("已折叠 2 个节点,展开查看");
|
||||
});
|
||||
|
||||
test("failed tools retain a visible failure label", () => {
|
||||
const html = renderToStaticMarkup(<AgentToolCard title="model_list" text="无法获取" detail={{ eventType: "tool_failed" }} theme={canvasThemes.light} />);
|
||||
expect(html).toContain("agent-tool-label");
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
import { describe, expect, it } from "bun:test";
|
||||
import { agentToolStatus, friendlyAgentToolSummary } from "@/lib/canvas/agent-tool-presentation";
|
||||
import { agentToolCategory, agentToolCategoryLabel, agentToolStatus, friendlyAgentToolSummary } from "@/lib/canvas/agent-tool-presentation";
|
||||
|
||||
describe("Agent tool presentation", () => {
|
||||
it("separates read, create, and canvas operation activity", () => {
|
||||
expect(agentToolCategory("canvas_get_state", { eventType: "tool_completed" })).toBe("read");
|
||||
expect(agentToolCategoryLabel("canvas_get_state", "read")).toBe("读取节点");
|
||||
expect(agentToolCategory("generate_media", { eventType: "generation_task_created" })).toBe("create");
|
||||
expect(agentToolCategory("canvas_apply_ops", { eventType: "canvas_updated", actions: [{ action: "updated" }] })).toBe("operate");
|
||||
expect(agentToolCategory("canvas_apply_ops", { eventType: "canvas_updated", actions: [{ action: "created" }] })).toBe("create");
|
||||
});
|
||||
|
||||
it("distinguishes media submission from a completed canvas result", () => {
|
||||
expect(friendlyAgentToolSummary("generate_media", "", { eventType: "generation_task_created" })).toBe("媒体节点已创建,生成任务已提交");
|
||||
expect(friendlyAgentToolSummary("generate_media", "", { eventType: "tool_completed" })).toBe("生成结果已回写画布节点");
|
||||
|
||||
@@ -6,6 +6,21 @@ import { applyCanvasOperations, type CanvasSnapshot } from "../src/lib/canvas/ca
|
||||
import { defaultConfig } from "../src/stores/use-config-store";
|
||||
import type { GenerationTask } from "../src/services/api/task-center";
|
||||
import { CanvasNodeType } from "../src/types/canvas";
|
||||
import { CREATIVE_AGENT_SYSTEM_PROMPT, CREATIVE_AGENT_TOOLS } from "../src/lib/creation/creative-agent-tools";
|
||||
|
||||
test("首页创造规划请求使用自动工具选择", async () => {
|
||||
const source = await Bun.file(new URL("../src/services/creative-agent-controller.ts", import.meta.url)).text();
|
||||
expect(source).toContain('tools: CREATIVE_AGENT_TOOLS, toolChoice: "auto"');
|
||||
expect(source).not.toContain('tools: CREATIVE_AGENT_TOOLS, toolChoice: "required"');
|
||||
});
|
||||
|
||||
test("首页创造提示词只声明实际注册的规划工具", () => {
|
||||
expect(CREATIVE_AGENT_TOOLS.map((tool) => tool.function.name)).toEqual(["creative_respond"]);
|
||||
expect(CREATIVE_AGENT_SYSTEM_PROMPT).toContain("唯一可调用的函数工具是 creative_respond");
|
||||
expect(CREATIVE_AGENT_SYSTEM_PROMPT).not.toContain("canvas_generate_storyboard");
|
||||
expect(CREATIVE_AGENT_SYSTEM_PROMPT).not.toContain("canvas_create_storyboard");
|
||||
expect(CREATIVE_AGENT_SYSTEM_PROMPT).not.toContain("canvas_edit_storyboard");
|
||||
});
|
||||
|
||||
function harness(state: CreativeAgentState, status: CreationRun["status"] = "paused", submissions: CreationSubmission[] = [], waitTask?: ConstructorParameters<typeof CreativeAgentController>[0]["waitTask"]) {
|
||||
let run: CreationRun = { id: "run", userId: "user", canvasId: "canvas", revision: 1, executionEpoch: 0, executionOwner: "", status, state: structuredClone(state) as unknown as Record<string, unknown>, approvedProposalVersion: state.proposal?.version, approvedProposalHash: state.operations ? "approved-proposal-hash" : undefined, createdAt: "", updatedAt: "" };
|
||||
|
||||
Reference in new issue
Block a user