You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.8 KiB
99 lines
2.8 KiB
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
|
const {
|
|
mockStreamText,
|
|
mockConvertToModelMessages,
|
|
mockStepCountIs,
|
|
mockCreateOpenAICompatible,
|
|
mockNewApiWGProvider,
|
|
} = vi.hoisted(() => ({
|
|
mockStreamText: vi.fn(),
|
|
mockConvertToModelMessages: vi.fn(),
|
|
mockStepCountIs: vi.fn(),
|
|
mockCreateOpenAICompatible: vi.fn(),
|
|
mockNewApiWGProvider: vi.fn(),
|
|
}));
|
|
|
|
vi.mock("ai", () => ({
|
|
streamText: mockStreamText,
|
|
convertToModelMessages: mockConvertToModelMessages,
|
|
stepCountIs: mockStepCountIs,
|
|
}));
|
|
|
|
vi.mock("@ai-sdk/openai-compatible", () => ({
|
|
createOpenAICompatible: mockCreateOpenAICompatible,
|
|
}));
|
|
|
|
vi.mock("@/lib/chat/tools", () => ({
|
|
buildEditSystemPrompt: vi.fn(() => "system prompt"),
|
|
createChatTools: vi.fn(() => ({ editWorkflow: {} })),
|
|
}));
|
|
|
|
vi.mock("@/lib/chat/contextBuilder", () => ({
|
|
buildWorkflowContext: vi.fn(() => ({ nodes: [] })),
|
|
}));
|
|
|
|
vi.mock("@/lib/chat/subgraphExtractor", () => ({
|
|
extractSubgraph: vi.fn(() => ({
|
|
selectedNodes: [],
|
|
selectedEdges: [],
|
|
restSummary: null,
|
|
})),
|
|
}));
|
|
|
|
import { POST } from "../route";
|
|
|
|
describe("/api/chat route", () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
process.env.NEWAPIWG_API_KEY = "";
|
|
process.env.NEWAPIWG_BASE_URL = "";
|
|
|
|
mockNewApiWGProvider.mockReturnValue("newapiwg-model");
|
|
mockCreateOpenAICompatible.mockReturnValue(mockNewApiWGProvider);
|
|
mockConvertToModelMessages.mockResolvedValue([]);
|
|
mockStepCountIs.mockReturnValue("step-limit");
|
|
mockStreamText.mockReturnValue({
|
|
toUIMessageStreamResponse: () => new Response("ok"),
|
|
});
|
|
});
|
|
|
|
it("uses NewApiWG Doubao Seed 2.0 Lite for chat requests", async () => {
|
|
const request = new Request("http://localhost/api/chat", {
|
|
method: "POST",
|
|
headers: {
|
|
Authorization: "Bearer login-token",
|
|
"X-NewApiWG-Key": "browser-newapi-key",
|
|
"X-NewApiWG-Base-URL": "https://llmapitest.popi.art/v1",
|
|
},
|
|
body: JSON.stringify({
|
|
messages: [],
|
|
workflowState: { nodes: [], edges: [] },
|
|
selectedNodeIds: [],
|
|
}),
|
|
});
|
|
|
|
const response = await POST(request);
|
|
|
|
expect(response.status).toBe(200);
|
|
expect(mockCreateOpenAICompatible).toHaveBeenCalledWith({
|
|
name: "newapiwg",
|
|
apiKey: "browser-newapi-key",
|
|
baseURL: "https://llmapitest.popi.art/v1",
|
|
headers: {
|
|
"X-User-Authorization": "Bearer login-token",
|
|
"X-User-Token": "login-token",
|
|
token: "login-token",
|
|
},
|
|
});
|
|
expect(mockNewApiWGProvider).toHaveBeenCalledWith("doubao-seed-2-0-lite-260428");
|
|
expect(mockStreamText).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
model: "newapiwg-model",
|
|
system: "system prompt",
|
|
toolChoice: "auto",
|
|
stopWhen: "step-limit",
|
|
})
|
|
);
|
|
});
|
|
});
|
|
|