mirror of
https://github.com/CopilotKit/CopilotKit.git
synced 2026-09-14 16:26:20 +08:00
96885b5959
Flatten all packages from packages/v1/* and packages/v2/* into packages/* — every package now lives directly under the @copilotkit/ scope with no v1/v2 subdirectories. - Move all v1 packages (react-core, react-ui, runtime, shared, etc.) from packages/v1/* to packages/* - Absorb v2 react code into packages/react-core/src/v2/ (exported via /v2 subpath) - Absorb v2 agent code into packages/runtime/src/agent/ (exported via /v2 subpath) - Move v2 packages (core, angular, demo-agents, etc.) to packages/* - Replace all @copilotkitnext/* imports with @copilotkit/* equivalents - Keep @copilotkitnext/angular as the sole exception (angular remains on next) - Update CI workflows, renovate config, release scripts for flat structure - No public API surface changes — all exports fields are preserved Co-authored-by: Alem Tuzlak <t.zlak@hotmail.com> Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
102 lines
3.4 KiB
TypeScript
102 lines
3.4 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
import type { AnthropicProviderSettings } from "@ai-sdk/anthropic";
|
|
import { AnthropicAdapter } from "../../../src/service-adapters/anthropic/anthropic-adapter";
|
|
import Anthropic from "@anthropic-ai/sdk";
|
|
|
|
// Keys from AnthropicProviderSettings that we forward from the Anthropic SDK client.
|
|
type ForwardedAnthropicKeys = "baseURL" | "apiKey" | "headers" | "fetch";
|
|
|
|
// We don't set `name` or `generateId` — they're provider-internal concerns.
|
|
type ControlledAnthropicKeys = "name" | "generateId";
|
|
|
|
// Compile-time exhaustiveness check: every key in AnthropicProviderSettings
|
|
// must be accounted for. If this line errors, a new key was added.
|
|
type _exhaustive =
|
|
Exclude<
|
|
keyof AnthropicProviderSettings,
|
|
ForwardedAnthropicKeys | ControlledAnthropicKeys
|
|
> extends never
|
|
? true
|
|
: {
|
|
error: "AnthropicProviderSettings has unhandled keys";
|
|
unhandled: Exclude<
|
|
keyof AnthropicProviderSettings,
|
|
ForwardedAnthropicKeys | ControlledAnthropicKeys
|
|
>;
|
|
};
|
|
const _check: _exhaustive = true;
|
|
|
|
const { mockProviderFn, mockCreateAnthropic } = vi.hoisted(() => {
|
|
const mockProviderFn = vi.fn().mockReturnValue({ modelId: "test-model" });
|
|
const mockCreateAnthropic = vi.fn().mockReturnValue(mockProviderFn);
|
|
return { mockProviderFn, mockCreateAnthropic };
|
|
});
|
|
|
|
vi.mock("@ai-sdk/anthropic", async (importOriginal) => {
|
|
const actual = await importOriginal<typeof import("@ai-sdk/anthropic")>();
|
|
return { ...actual, createAnthropic: mockCreateAnthropic };
|
|
});
|
|
|
|
vi.mock("@anthropic-ai/sdk", () => {
|
|
return {
|
|
default: class MockAnthropic {
|
|
baseURL: string;
|
|
apiKey: string;
|
|
_options: Record<string, any>;
|
|
messages = { create: vi.fn() };
|
|
|
|
constructor(opts: any = {}) {
|
|
this.baseURL = opts.baseURL ?? "https://api.anthropic.com/v1";
|
|
this.apiKey = opts.apiKey ?? "default-key";
|
|
this._options = {
|
|
defaultHeaders: opts.defaultHeaders,
|
|
fetch: opts.fetch,
|
|
...opts,
|
|
};
|
|
}
|
|
},
|
|
};
|
|
});
|
|
|
|
describe("AnthropicAdapter.getLanguageModel()", () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it("forwards all provider-relevant options from the Anthropic SDK client", () => {
|
|
const customFetch = vi.fn();
|
|
const anthropic = new Anthropic({
|
|
apiKey: "sk-ant-test",
|
|
baseURL: "https://proxy.example.com/v1",
|
|
defaultHeaders: { "x-custom": "value" },
|
|
fetch: customFetch,
|
|
});
|
|
|
|
const adapter = new AnthropicAdapter({
|
|
anthropic,
|
|
model: "claude-3-5-sonnet-latest",
|
|
});
|
|
adapter.getLanguageModel();
|
|
|
|
expect(mockCreateAnthropic).toHaveBeenCalledOnce();
|
|
const settings = mockCreateAnthropic.mock.calls[0][0];
|
|
|
|
expect(settings.baseURL).toBe("https://proxy.example.com/v1");
|
|
expect(settings.apiKey).toBe("sk-ant-test");
|
|
expect(settings.headers).toEqual({ "x-custom": "value" });
|
|
expect(settings.fetch).toBe(customFetch);
|
|
|
|
expect(mockProviderFn).toHaveBeenCalledWith("claude-3-5-sonnet-latest");
|
|
});
|
|
|
|
it("works with default Anthropic config (no custom options)", () => {
|
|
const anthropic = new Anthropic({ apiKey: "sk-ant-default" });
|
|
const adapter = new AnthropicAdapter({ anthropic });
|
|
adapter.getLanguageModel();
|
|
|
|
const settings = mockCreateAnthropic.mock.calls[0][0];
|
|
expect(settings.baseURL).toBe("https://api.anthropic.com/v1");
|
|
expect(settings.apiKey).toBe("sk-ant-default");
|
|
});
|
|
});
|