forked from bai/curriculum-project-hub
1ad78dbcce
helpers.ts: MockLanguageModel 加 doStream 实现(返回 text-delta + finish part);runner.test.ts: 加 stubPrisma(必填字段)。 这些测试在 Claude Code SDK 迁移后还需要进一步适配,先提交 buffer。
48 lines
1.9 KiB
TypeScript
48 lines
1.9 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
import { runAgent } from "../../src/agent/runner.js";
|
|
import { ToolRegistry } from "../../src/agent/tools.js";
|
|
import { readFileTool } from "../../src/agent/workspace.js";
|
|
import { createMockModelFactory } from "../integration/helpers.js";
|
|
|
|
describe("runAgent with AI SDK tool loop", () => {
|
|
it("executes SDK tools and returns the final assistant response", async () => {
|
|
const ws = await mkdtemp(join(tmpdir(), "hub-runner-"));
|
|
try {
|
|
await writeFile(join(ws, "lesson.txt"), "hello lesson", "utf8");
|
|
const tools = new ToolRegistry();
|
|
tools.register("read_file", readFileTool);
|
|
const { modelFactory, models } = createMockModelFactory([
|
|
{
|
|
toolCalls: [{ toolCallId: "call-1", toolName: "read_file", input: { path: "lesson.txt" } }],
|
|
},
|
|
{ text: "done", finishReason: "stop" },
|
|
]);
|
|
|
|
const stubPrisma = {
|
|
projectAgentLock: { update: async () => ({}) },
|
|
agentMessage: { create: async () => ({}) },
|
|
agentFileChange: { createMany: async () => ({}) },
|
|
} as unknown as import("@prisma/client").PrismaClient;
|
|
const result = await runAgent(modelFactory, tools, {
|
|
prompt: "read lesson.txt",
|
|
model: "mock-model",
|
|
project: { projectId: "p", boundChatId: "c", workspaceDir: ws },
|
|
systemPrompt: "system",
|
|
maxIterations: 5,
|
|
runId: "test-run",
|
|
sessionId: "test-session",
|
|
prisma: stubPrisma,
|
|
});
|
|
|
|
console.log("DEBUG result:", result.status, result.error, result.messages.length);
|
|
expect(result.messages.at(-1)).toMatchObject({ role: "assistant" });
|
|
expect(models.get("mock-model")?.calls).toHaveLength(2);
|
|
} finally {
|
|
await rm(ws, { recursive: true, force: true });
|
|
}
|
|
});
|
|
});
|