mirror of
https://github.com/badlogic/pi-mono.git
synced 2026-07-09 17:28:45 +00:00
Stream implementations move from src/providers/ to src/api/, renamed by API id (anthropic.ts -> anthropic-messages.ts, google.ts -> google-generative-ai.ts, mistral.ts -> mistral-conversations.ts, amazon-bedrock.ts -> bedrock-converse-stream.ts). Every module now exports exactly stream/streamSimple; shared helpers move alongside. New ProviderStreams dispatch contract in types.ts, lazyApi() wrapper in api/lazy.ts, and one .lazy.ts wrapper per API. Bedrock's wrapper keeps the node-only variable-specifier import and setBedrockProviderModule() (now taking ProviderStreams). providers/register-builtins.ts deleted; interim until the compat entrypoint lands, builtin api-registry registration lives in stream.ts and lazy wrappers are exported from the root barrel. Old per-API lazy exports (streamAnthropic, ...) are gone; package.json subpaths retarget to dist/api/.
187 lines
4.3 KiB
TypeScript
187 lines
4.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { convertTools } from "../src/api/google-shared.ts";
|
|
import type { Tool } from "../src/types.ts";
|
|
|
|
function makeTool(parameters: Record<string, unknown>): Tool {
|
|
return {
|
|
name: "test_tool",
|
|
description: "A test tool",
|
|
parameters: parameters as Tool["parameters"],
|
|
};
|
|
}
|
|
|
|
describe("google-shared convertTools", () => {
|
|
it("strips JSON Schema meta keys from parameters when useParameters=true", () => {
|
|
const tools = [
|
|
makeTool({
|
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
$id: "urn:bash-tool",
|
|
$comment: "A bash tool for demonstration",
|
|
$defs: {
|
|
commandDef: { type: "string" },
|
|
},
|
|
definitions: {
|
|
legacyDef: { type: "number" },
|
|
},
|
|
type: "object",
|
|
properties: {
|
|
command: { type: "string" },
|
|
},
|
|
required: ["command"],
|
|
}),
|
|
];
|
|
|
|
const result = convertTools(tools, true);
|
|
const decl = result?.[0]?.functionDeclarations?.[0];
|
|
|
|
expect(decl).toBeDefined();
|
|
expect(decl?.parameters).toEqual({
|
|
type: "object",
|
|
properties: {
|
|
command: { type: "string" },
|
|
},
|
|
required: ["command"],
|
|
});
|
|
expect(decl?.parameters).not.toHaveProperty("$schema");
|
|
expect(decl?.parameters).not.toHaveProperty("$id");
|
|
expect(decl?.parameters).not.toHaveProperty("$comment");
|
|
expect(decl?.parameters).not.toHaveProperty("$defs");
|
|
expect(decl?.parameters).not.toHaveProperty("definitions");
|
|
});
|
|
|
|
it("recursively strips nested JSON Schema meta keys", () => {
|
|
const tools = [
|
|
makeTool({
|
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
type: "object",
|
|
properties: {
|
|
deep: {
|
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
$id: "urn:nested",
|
|
type: "string",
|
|
},
|
|
},
|
|
}),
|
|
];
|
|
|
|
const result = convertTools(tools, true);
|
|
const decl = result?.[0]?.functionDeclarations?.[0];
|
|
|
|
expect(decl).toBeDefined();
|
|
expect(decl?.parameters).toEqual({
|
|
type: "object",
|
|
properties: {
|
|
deep: {
|
|
type: "string",
|
|
},
|
|
},
|
|
});
|
|
});
|
|
|
|
it("preserves $ref while stripping meta keys", () => {
|
|
const tools = [
|
|
makeTool({
|
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
type: "object",
|
|
properties: {
|
|
refProp: {
|
|
$ref: "#/$defs/someDef",
|
|
type: "string",
|
|
},
|
|
},
|
|
}),
|
|
];
|
|
|
|
const result = convertTools(tools, true);
|
|
const decl = result?.[0]?.functionDeclarations?.[0];
|
|
|
|
expect(decl).toBeDefined();
|
|
expect(decl?.parameters).toEqual({
|
|
type: "object",
|
|
properties: {
|
|
refProp: {
|
|
$ref: "#/$defs/someDef",
|
|
type: "string",
|
|
},
|
|
},
|
|
});
|
|
});
|
|
|
|
it("does not mutate the original Tool.parameters object", () => {
|
|
const originalParameters = {
|
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
type: "object",
|
|
properties: {
|
|
command: { type: "string" },
|
|
},
|
|
required: ["command"],
|
|
};
|
|
const tools = [makeTool(originalParameters)];
|
|
|
|
convertTools(tools, true);
|
|
|
|
expect(originalParameters).toEqual({
|
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
type: "object",
|
|
properties: {
|
|
command: { type: "string" },
|
|
},
|
|
required: ["command"],
|
|
});
|
|
});
|
|
|
|
it("preserves $schema in parametersJsonSchema when useParameters=false", () => {
|
|
const tools = [
|
|
makeTool({
|
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
type: "object",
|
|
properties: {
|
|
command: { type: "string" },
|
|
},
|
|
required: ["command"],
|
|
}),
|
|
];
|
|
|
|
const result = convertTools(tools, false);
|
|
const decl = result?.[0]?.functionDeclarations?.[0];
|
|
|
|
expect(decl).toBeDefined();
|
|
expect(decl?.parametersJsonSchema).toEqual({
|
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
type: "object",
|
|
properties: {
|
|
command: { type: "string" },
|
|
},
|
|
required: ["command"],
|
|
});
|
|
});
|
|
|
|
it("handles tools without $schema gracefully", () => {
|
|
const tools = [
|
|
makeTool({
|
|
type: "object",
|
|
properties: {
|
|
path: { type: "string" },
|
|
},
|
|
required: ["path"],
|
|
}),
|
|
];
|
|
|
|
const result = convertTools(tools, true);
|
|
const decl = result?.[0]?.functionDeclarations?.[0];
|
|
|
|
expect(decl).toBeDefined();
|
|
expect(decl?.parameters).toEqual({
|
|
type: "object",
|
|
properties: {
|
|
path: { type: "string" },
|
|
},
|
|
required: ["path"],
|
|
});
|
|
});
|
|
|
|
it("returns undefined for empty tool list", () => {
|
|
expect(convertTools([])).toBeUndefined();
|
|
expect(convertTools([], true)).toBeUndefined();
|
|
});
|
|
});
|