




























1+import { beforeEach, describe, expect, it, vi } from "vitest";
2+import type { Model } from "../llm/types.js";
3+4+const mocks = vi.hoisted(() => ({
5+ensureCustomApiRegistered: vi.fn(),
6+createTransportAwareStreamFnForModel: vi.fn(),
7+resolveProviderStreamFn: vi.fn(),
8+wrapProviderStreamFn: vi.fn(),
9+}));
10+11+vi.mock("../plugins/provider-runtime.js", () => ({
12+resolveProviderStreamFn: mocks.resolveProviderStreamFn,
13+wrapProviderStreamFn: mocks.wrapProviderStreamFn,
14+}));
15+vi.mock("./custom-api-registry.js", () => ({
16+ensureCustomApiRegistered: mocks.ensureCustomApiRegistered,
17+}));
18+vi.mock("./provider-transport-stream.js", () => ({
19+createTransportAwareStreamFnForModel: mocks.createTransportAwareStreamFnForModel,
20+}));
21+22+import { registerProviderStreamForModel } from "./provider-stream.js";
23+24+const MODEL = {
25+id: "anthropic/default",
26+name: "Anthropic default",
27+api: "anthropic-messages",
28+provider: "clawrouter",
29+baseUrl: "https://clawrouter.example/v1/native/anthropic",
30+reasoning: false,
31+input: ["text"],
32+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
33+contextWindow: 200_000,
34+maxTokens: 32_768,
35+} satisfies Model<"anthropic-messages">;
36+37+describe("registerProviderStreamForModel", () => {
38+beforeEach(() => {
39+vi.clearAllMocks();
40+});
41+42+it("applies an opted-in provider wrapper after selecting the managed transport", () => {
43+const baseStream = vi.fn();
44+const wrappedStream = vi.fn();
45+mocks.createTransportAwareStreamFnForModel.mockReturnValue(baseStream);
46+mocks.wrapProviderStreamFn.mockReturnValue(wrappedStream);
47+48+expect(
49+registerProviderStreamForModel({
50+model: MODEL,
51+cfg: { models: {} },
52+agentDir: "/agent",
53+workspaceDir: "/workspace",
54+applyProviderWrapper: true,
55+}),
56+).toBe(wrappedStream);
57+expect(mocks.wrapProviderStreamFn).toHaveBeenCalledWith({
58+provider: "clawrouter",
59+config: { models: {} },
60+workspaceDir: "/workspace",
61+env: undefined,
62+context: {
63+config: { models: {} },
64+agentDir: "/agent",
65+workspaceDir: "/workspace",
66+provider: "clawrouter",
67+modelId: "anthropic/default",
68+model: MODEL,
69+streamFn: baseStream,
70+},
71+});
72+expect(mocks.ensureCustomApiRegistered).toHaveBeenCalledWith(
73+"anthropic-messages",
74+wrappedStream,
75+);
76+});
77+78+it("leaves existing callers unwrapped by default", () => {
79+const baseStream = vi.fn();
80+mocks.resolveProviderStreamFn.mockReturnValue(baseStream);
81+82+expect(registerProviderStreamForModel({ model: MODEL })).toBe(baseStream);
83+expect(mocks.wrapProviderStreamFn).not.toHaveBeenCalled();
84+});
85+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。