universal-llm-client 4.3.0 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -24
- package/README.md +60 -11
- package/dist/ai-model.d.ts +12 -1
- package/dist/ai-model.d.ts.map +1 -1
- package/dist/ai-model.js +36 -1
- package/dist/ai-model.js.map +1 -1
- package/dist/auditor.js.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/gemma-channel.d.ts +14 -0
- package/dist/gemma-channel.d.ts.map +1 -0
- package/dist/gemma-channel.js +38 -0
- package/dist/gemma-channel.js.map +1 -0
- package/dist/gemma-diffusion.d.ts +49 -0
- package/dist/gemma-diffusion.d.ts.map +1 -0
- package/dist/gemma-diffusion.js +147 -0
- package/dist/gemma-diffusion.js.map +1 -0
- package/dist/http.d.ts +4 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +14 -1
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +163 -7
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/mcp.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +28 -3
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/google.d.ts +22 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +223 -13
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/ollama.d.ts +2 -0
- package/dist/providers/ollama.d.ts.map +1 -1
- package/dist/providers/ollama.js +59 -30
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/openai.d.ts +14 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +200 -22
- package/dist/providers/openai.js.map +1 -1
- package/dist/router.d.ts +2 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +4 -0
- package/dist/router.js.map +1 -1
- package/dist/stream-decoder.d.ts +12 -0
- package/dist/stream-decoder.d.ts.map +1 -1
- package/dist/stream-decoder.js +182 -5
- package/dist/stream-decoder.js.map +1 -1
- package/dist/structured-output.js.map +1 -1
- package/dist/thinking.d.ts +36 -0
- package/dist/thinking.d.ts.map +1 -0
- package/dist/thinking.js +52 -0
- package/dist/thinking.js.map +1 -0
- package/dist/tools.js.map +1 -1
- package/dist/zod-adapter.js.map +1 -1
- package/package.json +4 -1
- package/src/ai-model.ts +400 -0
- package/src/auditor.ts +213 -0
- package/src/client.ts +402 -0
- package/src/debug/debug-google-streaming.ts +97 -0
- package/src/debug/debug-tool-execution.ts +86 -0
- package/src/debug/test-lmstudio-tools.ts +155 -0
- package/src/demos/README.md +47 -0
- package/src/demos/basic/universal-llm-examples.ts +161 -0
- package/src/demos/diffusion-gemma/.env +29 -0
- package/src/demos/diffusion-gemma/.env.example +27 -0
- package/src/demos/diffusion-gemma/CLAUDE.md +95 -0
- package/src/demos/diffusion-gemma/README.md +59 -0
- package/src/demos/diffusion-gemma/canvas.ts +1606 -0
- package/src/demos/diffusion-gemma/docker-compose.yml +29 -0
- package/src/demos/diffusion-gemma/probe-stream.ts +51 -0
- package/src/demos/diffusion-gemma/probe-tools.ts +55 -0
- package/src/demos/diffusion-gemma/server.ts +1205 -0
- package/src/demos/diffusion-gemma/start-vllm.sh +98 -0
- package/src/demos/mcp/astrid-memory-demo.ts +295 -0
- package/src/demos/mcp/astrid-persona-memory.ts +357 -0
- package/src/demos/mcp/mcp-mongodb-demo.ts +275 -0
- package/src/demos/mcp/simple-astrid-memory.ts +148 -0
- package/src/demos/mcp/simple-mcp-demo.ts +68 -0
- package/src/demos/mcp/working-mcp-demo.ts +62 -0
- package/src/demos/model-alias-demo.ts +0 -0
- package/src/demos/tools/RAG_MEMORY_INTEGRATION.md +267 -0
- package/src/demos/tools/astrid-memory-demo.ts +270 -0
- package/src/demos/tools/astrid-production-memory-clean.ts +785 -0
- package/src/demos/tools/astrid-production-memory.ts +558 -0
- package/src/demos/tools/basic-translation-test.ts +66 -0
- package/src/demos/tools/chromadb-similarity-tuning.ts +390 -0
- package/src/demos/tools/clean-multilingual-conversation.ts +209 -0
- package/src/demos/tools/clean-translation-test.ts +119 -0
- package/src/demos/tools/clean-universal-multilingual-test.ts +131 -0
- package/src/demos/tools/complete-rag-demo.ts +369 -0
- package/src/demos/tools/complete-tool-demo.ts +132 -0
- package/src/demos/tools/demo-tool-calling.ts +124 -0
- package/src/demos/tools/dynamic-language-switching-test.ts +251 -0
- package/src/demos/tools/hybrid-thinking-test.ts +154 -0
- package/src/demos/tools/memory-integration-test.ts +420 -0
- package/src/demos/tools/multilingual-memory-system.ts +802 -0
- package/src/demos/tools/ondemand-translation-demo.ts +655 -0
- package/src/demos/tools/production-tool-demo.ts +245 -0
- package/src/demos/tools/revolutionary-multilingual-test.ts +151 -0
- package/src/demos/tools/rigorous-language-analysis.ts +218 -0
- package/src/demos/tools/test-universal-memory-system.ts +126 -0
- package/src/demos/tools/translation-integration-guide.ts +346 -0
- package/src/demos/tools/universal-memory-system.ts +560 -0
- package/src/gemma-channel.ts +47 -0
- package/src/gemma-diffusion.ts +167 -0
- package/src/http.ts +261 -0
- package/src/index.ts +180 -0
- package/src/interfaces.ts +843 -0
- package/src/mcp.ts +345 -0
- package/src/providers/anthropic.ts +796 -0
- package/src/providers/google.ts +840 -0
- package/src/providers/index.ts +8 -0
- package/src/providers/ollama.ts +503 -0
- package/src/providers/openai.ts +587 -0
- package/src/router.ts +785 -0
- package/src/stream-decoder.ts +535 -0
- package/src/structured-output.ts +759 -0
- package/src/test-scripts/test-advanced-tools.ts +310 -0
- package/src/test-scripts/test-google-deep-research.ts +33 -0
- package/src/test-scripts/test-google-streaming-enhanced.ts +147 -0
- package/src/test-scripts/test-google-streaming.ts +63 -0
- package/src/test-scripts/test-google-system-prompt-comprehensive.ts +189 -0
- package/src/test-scripts/test-google-thinking.ts +46 -0
- package/src/test-scripts/test-mcp-config.ts +28 -0
- package/src/test-scripts/test-mcp-connection.ts +29 -0
- package/src/test-scripts/test-system-message-positions.ts +163 -0
- package/src/test-scripts/test-system-prompt-improvement-demo.ts +83 -0
- package/src/test-scripts/test-tool-calling.ts +231 -0
- package/src/test-scripts/test-vllm-qwen36.ts +256 -0
- package/src/tests/ai-model.test.ts +1614 -0
- package/src/tests/auditor.test.ts +224 -0
- package/src/tests/gemma-diffusion.test.ts +115 -0
- package/src/tests/http.test.ts +200 -0
- package/src/tests/interfaces.test.ts +117 -0
- package/src/tests/providers/anthropic.test.ts +118 -0
- package/src/tests/providers/google.test.ts +841 -0
- package/src/tests/providers/ollama.test.ts +1034 -0
- package/src/tests/providers/openai.test.ts +1511 -0
- package/src/tests/router.test.ts +254 -0
- package/src/tests/stream-decoder.test.ts +263 -0
- package/src/tests/structured-output.test.ts +1450 -0
- package/src/tests/thinking.test.ts +65 -0
- package/src/tests/tools.test.ts +175 -0
- package/src/thinking.ts +73 -0
- package/src/tools.ts +246 -0
- package/src/zod-adapter.ts +72 -0
package/dist/interfaces.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACnB,4BAAa,CAAA;IACb,sCAAuB,CAAA;AAC3B,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB;AAED,MAAM,CAAN,IAAY,cAOX;AAPD,WAAY,cAAc;IACtB,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;IACjB,uCAAqB,CAAA;IACrB,yCAAuB,CAAA;AAC3B,CAAC,EAPW,cAAc,KAAd,cAAc,QAOzB;AA6kBD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,iCAAiC;AACjC,MAAM,UAAU,WAAW,CAAC,IAAY;IACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CACxB,eAAuB,EACvB,WAAmB,YAAY,EAC/B,MAAgC;IAEhC,MAAM,GAAG,GAAG,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC;QACjF,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,QAAQ,QAAQ,WAAW,eAAe,EAAE,CAAC;IACnD,OAAO;QACH,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;KAC7B,CAAC;AACN,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB,CAC7B,IAAY,EACZ,MAAgB,EAChB,WAAmB,YAAY;IAE/B,MAAM,OAAO,GAAqB;QAC9B,WAAW,CAAC,IAAI,CAAC;QACjB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;KACpD,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,kBAAkB,CAAC,OAA0B;IACzD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,OAAO,OAAO;SACT,MAAM,CAAC,CAAC,IAAI,EAA0B,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;SAC9D,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACtB,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,SAAS,CAAC,OAA0B;IAChD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC3D,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,QAAgB;IAC7D,OAAO;QACH,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE;KACxC,CAAC;AACN,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,QAAQ,CAAC,OAA0B;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AACvD,CAAC","sourcesContent":["/**\r\n * Universal LLM Client v3 — Core Interfaces\r\n *\r\n * All types, enums, and helper functions used throughout the library.\r\n * Zero dependencies — pure TypeScript types.\r\n */\r\n\r\n// ============================================================================\r\n// Enums\r\n// ============================================================================\r\n\r\nexport enum AIModelType {\r\n Chat = 'chat',\r\n Embedding = 'embedding',\r\n}\r\n\r\nexport enum AIModelApiType {\r\n Ollama = 'ollama',\r\n OpenAI = 'openai',\r\n Google = 'google',\r\n Vertex = 'vertex',\r\n LlamaCpp = 'llamacpp',\r\n Anthropic = 'anthropic',\r\n}\r\n\r\n// ============================================================================\r\n// Model Metadata\r\n// ============================================================================\r\n\r\nexport interface ModelMetadata {\r\n /** Model name as reported by provider */\r\n model?: string;\r\n /** Context window size in tokens */\r\n contextLength: number;\r\n /** Model architecture (e.g., \"llama\", \"mistral3\") */\r\n architecture?: string;\r\n /** Parameter count */\r\n parameterCount?: number;\r\n /** Model capabilities reported by provider (e.g., \"tools\", \"vision\", \"thinking\") */\r\n capabilities?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Provider Configuration (user-facing)\r\n// ============================================================================\r\n\r\nexport interface ProviderConfig {\r\n /** Provider type */\r\n type: AIModelApiType | 'ollama' | 'openai' | 'google' | 'vertex' | 'llamacpp' | 'anthropic';\r\n /** Provider endpoint URL (has sensible defaults per type) */\r\n url?: string;\r\n /** API key or Bearer token */\r\n apiKey?: string;\r\n /** Override model name for this specific provider */\r\n model?: string;\r\n /** Explicit priority (default: array order, lower = higher priority) */\r\n priority?: number;\r\n /** Vertex AI region (e.g., \"us-central1\") */\r\n region?: string;\r\n /** Google API version (default: \"v1beta\") */\r\n apiVersion?: 'v1' | 'v1beta';\r\n}\r\n\r\n// ============================================================================\r\n// AIModel Configuration (user-facing)\r\n// ============================================================================\r\n\r\nexport interface AIModelConfig {\r\n /** Model name (used across all providers unless overridden) */\r\n model: string;\r\n /** Ordered list of providers (first = highest priority) */\r\n providers: ProviderConfig[];\r\n /** Default parameters for all requests (temperature, top_p, etc.) */\r\n defaultParameters?: Record<string, unknown>;\r\n /** Enable thinking/reasoning mode */\r\n thinking?: boolean;\r\n /** Request timeout in ms (default: 30000) */\r\n timeout?: number;\r\n /** Retries per provider before failover (default: 2) */\r\n retries?: number;\r\n /** Observability hooks */\r\n auditor?: import('./auditor.js').Auditor;\r\n /** Enable debug logging */\r\n debug?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Internal Client Options\r\n// ============================================================================\r\n\r\nexport interface LLMClientOptions {\r\n /** Model name */\r\n model: string;\r\n /** Base URL for the API */\r\n url: string;\r\n /** API type for protocol variations */\r\n apiType: AIModelApiType;\r\n /** Model type (chat or embedding) */\r\n modelType?: AIModelType;\r\n /** Default parameters for requests */\r\n defaultParameters?: Record<string, unknown>;\r\n /** Enable thinking/reasoning mode */\r\n thinking?: boolean;\r\n /** Request timeout in ms */\r\n timeout?: number;\r\n /** Number of retries for failed requests */\r\n retries?: number;\r\n /** API key for authenticated endpoints */\r\n apiKey?: string;\r\n /** Enable debug logging */\r\n debug?: boolean;\r\n /** Vertex AI region */\r\n region?: string;\r\n /** Google API version */\r\n apiVersion?: 'v1' | 'v1beta';\r\n}\r\n\r\n// ============================================================================\r\n// Multimodal Content Types\r\n// ============================================================================\r\n\r\nexport interface LLMTextContent {\r\n type: 'text';\r\n text: string;\r\n}\r\n\r\nexport interface LLMImageContent {\r\n type: 'image_url';\r\n image_url: {\r\n url: string;\r\n detail?: 'auto' | 'low' | 'high';\r\n };\r\n}\r\n\r\nexport interface LLMAudioContent {\r\n type: 'audio';\r\n audio: {\r\n /** Raw base64-encoded audio data */\r\n data: string;\r\n /** MIME type (e.g. 'audio/ogg', 'audio/wav', 'audio/mp3') */\r\n mimeType: string;\r\n };\r\n}\r\n\r\nexport type LLMContentPart = LLMTextContent | LLMImageContent | LLMAudioContent;\r\nexport type LLMMessageContent = string | LLMContentPart[];\r\n\r\n// ============================================================================\r\n// Chat Message Types\r\n// ============================================================================\r\n\r\nexport interface LLMChatMessage {\r\n role: 'system' | 'user' | 'assistant' | 'tool';\r\n content: LLMMessageContent;\r\n tool_call_id?: string;\r\n tool_calls?: LLMToolCall[];\r\n}\r\n\r\n// ============================================================================\r\n// Tool Types\r\n// ============================================================================\r\n\r\nexport interface LLMToolCall {\r\n id: string;\r\n type: 'function';\r\n function: {\r\n name: string;\r\n arguments: string;\r\n };\r\n /**\r\n * Gemini 3.x thought signature — encrypted reasoning context.\r\n * Must be echoed back exactly when sending conversation history\r\n * during multi-turn function calling. Mandatory for Gemini 3,\r\n * optional for Gemini 2.5, ignored by other providers.\r\n */\r\n thoughtSignature?: string;\r\n}\r\n\r\nexport interface LLMFunction {\r\n name: string;\r\n description: string;\r\n parameters: {\r\n type: 'object';\r\n properties?: Record<string, unknown>;\r\n required?: string[];\r\n };\r\n}\r\n\r\nexport interface LLMToolDefinition {\r\n type: 'function';\r\n function: LLMFunction;\r\n}\r\n\r\nexport interface ToolExecutionResult {\r\n tool_call_id: string;\r\n output: unknown;\r\n error?: string;\r\n duration?: number;\r\n}\r\n\r\nexport type ToolHandler = (args: unknown) => Promise<unknown> | unknown;\r\n\r\nexport interface ToolRegistryEntry {\r\n definition: LLMFunction;\r\n handler: ToolHandler;\r\n}\r\n\r\nexport interface ToolRegistry {\r\n [toolName: string]: ToolRegistryEntry;\r\n}\r\n\r\n// ============================================================================\r\n// Chat Options (per-call overrides)\r\n// ============================================================================\r\n\r\n/**\r\n * Response format for structured output.\r\n * \r\n * For json_schema mode, use: { type: 'json_schema', json_schema: { name, schema, strict } }\r\n * For json_object mode (legacy), use: { type: 'json_object' }\r\n */\r\nexport interface ResponseFormat {\r\n /** Response format type */\r\n type: 'json_object' | 'json_schema';\r\n /** JSON Schema definition (required for json_schema type) */\r\n json_schema?: {\r\n /** Name of the schema (for LLM guidance) */\r\n name: string;\r\n /** Schema description (optional, for LLM guidance) */\r\n description?: string;\r\n /** The JSON Schema */\r\n schema: Record<string, unknown>;\r\n /** Enable strict mode (required for reliable structured output) */\r\n strict?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Output options for structured output in chat responses.\r\n * \r\n * When provided, the response will include a `structured` property with\r\n * the validated, typed result. This is the recommended way to request\r\n * structured output via the chat() method.\r\n * \r\n * @example\r\n * ```typescript\r\n * const UserSchema = z.object({\r\n * name: z.string(),\r\n * age: z.number(),\r\n * });\r\n * \r\n * const response = await model.chat(messages, {\r\n * output: { schema: UserSchema },\r\n * });\r\n * \r\n * // response.structured is typed as { name: string, age: number }\r\n * console.log(response.structured?.name);\r\n * ```\r\n */\r\nexport interface OutputOptions<T = unknown> {\r\n /**\r\n * Schema configuration for structured output.\r\n * Use `fromZod()` from `universal-llm-client/zod` to create from a Zod schema,\r\n * or provide a raw SchemaConfig with jsonSchema + optional validate function.\r\n */\r\n schema?: import('./structured-output.js').SchemaConfig<T>;\r\n \r\n /**\r\n * Raw JSON Schema for structured output.\r\n * Alternative to `schema` when you have a pre-defined schema.\r\n */\r\n jsonSchema?: import('./structured-output.js').JSONSchema;\r\n \r\n /**\r\n * Optional name for the schema.\r\n * Used by providers like OpenAI for better LLM guidance.\r\n */\r\n name?: string;\r\n \r\n /**\r\n * Optional description for the schema.\r\n * Used by providers like OpenAI for better LLM guidance.\r\n */\r\n description?: string;\r\n\r\n /**\r\n * Whether to use strict mode for schema validation (OpenAI only).\r\n * When true, OpenAI enforces the schema exactly (no additional properties,\r\n * limited schema subset). Defaults to `true`.\r\n */\r\n strict?: boolean;\r\n}\r\n\r\nexport interface ChatOptions {\r\n /** Override temperature */\r\n temperature?: number;\r\n /** Max tokens to generate */\r\n maxTokens?: number;\r\n /** Tool definitions (auto-populated from registry if not set) */\r\n tools?: LLMToolDefinition[];\r\n /** Tool choice mode */\r\n toolChoice?: 'none' | 'auto' | 'required';\r\n /** Additional provider-specific parameters */\r\n parameters?: Record<string, unknown>;\r\n /** Abort signal for cancellation (forwarded to HTTP layer) */\r\n signal?: AbortSignal;\r\n /** Enable/disable tool execution for chatWithTools */\r\n executeTools?: boolean;\r\n /** Enable prompt caching (Provider specific feature, opt-in for Anthropic) */\r\n enablePromptCaching?: boolean;\r\n /** Maximum tool execution rounds (default: 10) */\r\n maxIterations?: number;\r\n /**\r\n * Stream decoder selection. Accepts:\r\n * - A built-in type name: 'passthrough' | 'standard-chat' | 'interleaved-reasoning'\r\n * - A custom type name registered via `registerDecoder()`\r\n * - A pre-built `StreamDecoder` instance for full control\r\n */\r\n decoder?: import('./stream-decoder.js').DecoderType | string | import('./stream-decoder.js').StreamDecoder;\r\n \r\n // ========================================================================\r\n // Structured Output Options\r\n // ========================================================================\r\n \r\n /**\r\n * Structured output options for chat responses.\r\n * When provided, the response will include a `structured` property\r\n * with the validated result.\r\n * \r\n * **Note**: `output` and `tools` cannot be used together.\r\n * If both are provided, an error will be thrown.\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await model.chat(messages, {\r\n * output: { schema: UserSchema },\r\n * });\r\n * console.log(response.structured);\r\n * ```\r\n */\r\n output?: OutputOptions;\r\n \r\n /**\r\n * Schema configuration for structured output.\r\n * When provided, the response is validated against this schema.\r\n * \r\n * @deprecated Use `output.schema` or `generateStructured()` instead.\r\n */\r\n schema?: import('./structured-output.js').SchemaConfig<unknown>;\r\n \r\n /**\r\n * Raw JSON Schema for structured output.\r\n * Alternative to `schema` when you have a pre-defined schema.\r\n * \r\n * @deprecated Use `output.jsonSchema` or `generateStructured()` instead.\r\n */\r\n jsonSchema?: import('./structured-output.js').JSONSchema;\r\n \r\n /**\r\n * Name for the schema (optional, used for LLM guidance).\r\n * Required by some providers (e.g., OpenAI strict mode).\r\n * \r\n * @deprecated Use `output.name` or `generateStructured()` instead.\r\n */\r\n schemaName?: string;\r\n \r\n /**\r\n * Description for the schema (optional, used for LLM guidance).\r\n * \r\n * @deprecated Use `output.description` or `generateStructured()` instead.\r\n */\r\n schemaDescription?: string;\r\n \r\n /**\r\n * Response format for structured output (legacy json_object mode).\r\n * For new code, prefer `output` or `generateStructured()`.\r\n * \r\n * Use { type: 'json_object' } for legacy JSON mode without schema validation.\r\n */\r\n responseFormat?: ResponseFormat;\r\n\r\n // ========================================================================\r\n // Inference Tier Selection\r\n // ========================================================================\r\n\r\n /** Inference tier selection (provider-specific; Google supports 'flex' and 'priority').\r\n * - 'flex': 50% cost reduction, best-effort, higher latency (background tasks)\r\n * - 'priority': Premium pricing, lowest latency, highest reliability (interactive)\r\n * - 'standard': Default behavior (omitted from request) */\r\n serviceTier?: 'flex' | 'priority' | 'standard';\r\n}\r\n\r\n// ============================================================================\r\n// Token Usage\r\n// ============================================================================\r\n\r\nexport interface TokenUsageInfo {\r\n inputTokens: number;\r\n /**\r\n * Visible output tokens (the streamed `text` content). For providers\r\n * that bill thinking separately (Google Gemini), this excludes the\r\n * reasoning trace — see `reasoningTokens`.\r\n */\r\n outputTokens: number;\r\n totalTokens: number;\r\n cachedTokens?: number;\r\n /**\r\n * Server-side reasoning/thinking tokens that were generated but not\r\n * yielded as visible text. Currently populated by the Google provider\r\n * from `usageMetadata.thoughtsTokenCount` for thinking-enabled models.\r\n * Other providers may roll thinking into `outputTokens` (Ollama) or\r\n * stream it as `thinking` events (the universal client surfaces these\r\n * via `DecodedEvent { type: 'thinking' }`); consult the provider.\r\n */\r\n reasoningTokens?: number;\r\n}\r\n\r\n// ============================================================================\r\n// Response Types\r\n// ============================================================================\r\n\r\nexport interface LLMChatResponse<T = unknown> {\r\n message: LLMChatMessage;\r\n /** Reasoning/thinking content from the model (if supported) */\r\n reasoning?: string;\r\n /** Token usage info */\r\n usage?: TokenUsageInfo;\r\n /** Tool execution trace (populated by chatWithTools) */\r\n toolExecutions?: ToolExecutionResult[];\r\n /** Which provider served this response */\r\n provider?: string;\r\n /**\r\n * Validated structured output when `output` parameter is provided to chat().\r\n * This is the same type as inferred from the schema provided in `output.schema`.\r\n * \r\n * Undefined when:\r\n * - No `output` parameter was provided\r\n * - Structured output validation failed (throws StructuredOutputError instead)\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await model.chat(messages, {\r\n * output: { schema: UserSchema },\r\n * });\r\n * if (response.structured) {\r\n * console.log(response.structured.name); // Fully typed!\r\n * }\r\n * ```\r\n */\r\n structured?: T;\r\n /** Which inference tier actually served this response (from provider response headers, e.g. x-gemini-service-tier) */\r\n serviceTier?: 'flex' | 'priority' | 'standard';\r\n}\r\n\r\n// ============================================================================\r\n// Provider Response Types (internal)\r\n// ============================================================================\r\n\r\nexport interface OllamaResponse {\r\n model: string;\r\n created_at: string;\r\n message: {\r\n role: string;\r\n content: string;\r\n thinking?: string;\r\n tool_calls?: LLMToolCall[];\r\n };\r\n done: boolean;\r\n prompt_eval_count?: number;\r\n eval_count?: number;\r\n prompt_eval_duration?: number;\r\n eval_duration?: number;\r\n}\r\n\r\nexport interface OpenAIResponse {\r\n id: string;\r\n object: string;\r\n created: number;\r\n model: string;\r\n choices: Array<{\r\n index: number;\r\n message: {\r\n role: string;\r\n content: string | null;\r\n tool_calls?: LLMToolCall[];\r\n };\r\n finish_reason: string;\r\n }>;\r\n usage?: {\r\n prompt_tokens: number;\r\n completion_tokens: number;\r\n total_tokens: number;\r\n prompt_tokens_details?: {\r\n cached_tokens?: number;\r\n audio_tokens?: number;\r\n };\r\n };\r\n}\r\n\r\nexport interface OllamaModelInfo {\r\n name: string;\r\n size: number;\r\n digest: string;\r\n details: {\r\n format: string;\r\n family: string;\r\n families: string[];\r\n parameter_size: string;\r\n quantization_level: string;\r\n };\r\n modified_at: string;\r\n}\r\n\r\nexport interface OpenAIModelInfo {\r\n id: string;\r\n object: string;\r\n created: number;\r\n owned_by: string;\r\n}\r\n\r\n// ============================================================================\r\n// Google API Types\r\n// ============================================================================\r\n\r\nexport interface GooglePart {\r\n text?: string;\r\n functionCall?: {\r\n name: string;\r\n args: Record<string, unknown>;\r\n };\r\n functionResponse?: {\r\n name: string;\r\n response: Record<string, unknown>;\r\n };\r\n inlineData?: {\r\n mimeType: string;\r\n data: string;\r\n };\r\n /** Gemini 3.x thought signature — must be echoed back on functionCall parts */\r\n thoughtSignature?: string;\r\n}\r\n\r\nexport interface GoogleContent {\r\n role: 'user' | 'model' | 'function';\r\n parts: GooglePart[];\r\n}\r\n\r\nexport interface GoogleGenerationConfig {\r\n responseMimeType?: string;\r\n temperature?: number;\r\n maxOutputTokens?: number;\r\n topK?: number;\r\n topP?: number;\r\n thinkingConfig?: {\r\n thinkingBudget?: number;\r\n };\r\n}\r\n\r\nexport interface GoogleFunctionDeclaration {\r\n name: string;\r\n description: string;\r\n parameters: {\r\n type: 'object';\r\n properties: Record<string, unknown>;\r\n required?: string[];\r\n };\r\n}\r\n\r\nexport interface GoogleToolConfig {\r\n functionCallingConfig?: {\r\n mode: 'AUTO' | 'ANY' | 'NONE';\r\n allowedFunctionNames?: string[];\r\n };\r\n}\r\n\r\nexport interface GoogleRequest {\r\n contents: GoogleContent[];\r\n generationConfig?: GoogleGenerationConfig;\r\n systemInstruction?: { parts: Array<{ text: string }> };\r\n tools?: Array<{\r\n functionDeclarations: GoogleFunctionDeclaration[];\r\n }>;\r\n toolConfig?: GoogleToolConfig;\r\n /** Inference tier: FLEX (50% off, best-effort) or PRIORITY (premium, highest reliability) */\r\n service_tier?: 'FLEX' | 'PRIORITY' | 'STANDARD';\r\n}\r\n\r\nexport interface GoogleCandidate {\r\n content: {\r\n parts: GooglePart[];\r\n role: string;\r\n };\r\n finishReason?: string;\r\n index: number;\r\n}\r\n\r\nexport interface GoogleResponse {\r\n candidates: GoogleCandidate[];\r\n usageMetadata?: {\r\n promptTokenCount: number;\r\n candidatesTokenCount: number;\r\n totalTokenCount: number;\r\n cachedContentTokenCount?: number;\r\n /**\r\n * Server-side reasoning tokens emitted by Gemini thinking models\r\n * (e.g. 2.5 Pro / 3.x Pro). Counted toward billing as output but\r\n * not included in `candidatesTokenCount` and not streamed as text.\r\n */\r\n thoughtsTokenCount?: number;\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/** Create a text content part */\r\nexport function textContent(text: string): LLMTextContent {\r\n return { type: 'text', text };\r\n}\r\n\r\n/** Create an image content part from base64 data or URL */\r\nexport function imageContent(\r\n base64DataOrUrl: string,\r\n mimeType: string = 'image/jpeg',\r\n detail?: 'auto' | 'low' | 'high',\r\n): LLMImageContent {\r\n const url = base64DataOrUrl.startsWith('data:') || base64DataOrUrl.startsWith('http')\r\n ? base64DataOrUrl\r\n : `data:${mimeType};base64,${base64DataOrUrl}`;\r\n return {\r\n type: 'image_url',\r\n image_url: { url, detail },\r\n };\r\n}\r\n\r\n/** Create a multimodal user message with text and images */\r\nexport function multimodalMessage(\r\n text: string,\r\n images: string[],\r\n mimeType: string = 'image/jpeg',\r\n): LLMChatMessage {\r\n const content: LLMContentPart[] = [\r\n textContent(text),\r\n ...images.map(img => imageContent(img, mimeType)),\r\n ];\r\n return { role: 'user', content };\r\n}\r\n\r\n/** Extract text content from a message content value */\r\nexport function extractTextContent(content: LLMMessageContent): string {\r\n if (typeof content === 'string') return content;\r\n return content\r\n .filter((part): part is LLMTextContent => part.type === 'text')\r\n .map(part => part.text)\r\n .join('');\r\n}\r\n\r\n/** Check if message content contains images */\r\nexport function hasImages(content: LLMMessageContent): boolean {\r\n if (typeof content === 'string') return false;\r\n return content.some(part => part.type === 'image_url');\r\n}\r\n\r\n/** Create an audio content part from raw base64 data */\r\nexport function audioContent(base64Data: string, mimeType: string): LLMAudioContent {\r\n return {\r\n type: 'audio',\r\n audio: { data: base64Data, mimeType },\r\n };\r\n}\r\n\r\n/** Check if message content contains audio */\r\nexport function hasAudio(content: LLMMessageContent): boolean {\r\n if (typeof content === 'string') return false;\r\n return content.some(part => part.type === 'audio');\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACnB,4BAAa,CAAA;IACb,sCAAuB,CAAA;AAC3B,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB;AAED,MAAM,CAAN,IAAY,cAOX;AAPD,WAAY,cAAc;IACtB,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;IACjB,uCAAqB,CAAA;IACrB,yCAAuB,CAAA;AAC3B,CAAC,EAPW,cAAc,KAAd,cAAc,QAOzB;AAmvBD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,iCAAiC;AACjC,MAAM,UAAU,WAAW,CAAC,IAAY;IACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CACxB,eAAuB,EACvB,WAAmB,YAAY,EAC/B,MAAgC;IAEhC,MAAM,GAAG,GAAG,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC;QACjF,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,QAAQ,QAAQ,WAAW,eAAe,EAAE,CAAC;IACnD,OAAO;QACH,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;KAC7B,CAAC;AACN,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB,CAC7B,IAAY,EACZ,MAAgB,EAChB,WAAmB,YAAY;IAE/B,MAAM,OAAO,GAAqB;QAC9B,WAAW,CAAC,IAAI,CAAC;QACjB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;KACpD,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,kBAAkB,CAAC,OAA0B;IACzD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,OAAO,OAAO;SACT,MAAM,CAAC,CAAC,IAAI,EAA0B,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;SAC9D,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACtB,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,SAAS,CAAC,OAA0B;IAChD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC3D,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,QAAgB;IAC7D,OAAO;QACH,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE;KACxC,CAAC;AACN,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,QAAQ,CAAC,OAA0B;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AACvD,CAAC"}
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Universal LLM Client v3 — MCP Integration\r\n *\r\n * Native MCP tool discovery and execution bridge.\r\n * Uses @modelcontextprotocol/sdk as a peer dependency.\r\n *\r\n * Supports:\r\n * - Stdio transport (Node/Bun/Deno — spawns server processes)\r\n * - Streamable HTTP transport (all runtimes including browsers)\r\n *\r\n * Usage:\r\n * const mcp = new MCPToolBridge({\r\n * servers: {\r\n * filesystem: { command: 'npx', args: ['-y', '@modelcontextprotocol/server-filesystem', './'] },\r\n * weather: { url: 'https://mcp.example.com/weather' },\r\n * }\r\n * });\r\n * await mcp.connect();\r\n * await mcp.registerTools(model); // or registerTools(model)\r\n * // ... use model.chatWithTools() — MCP tools are now callable\r\n * await mcp.disconnect();\r\n */\r\n\r\nimport type { AIModel } from './ai-model.js';\r\nimport type { LLMFunction, ToolHandler } from './interfaces.js';\r\nimport type { Auditor } from './auditor.js';\r\nimport { NoopAuditor } from './auditor.js';\r\n\r\n// ============================================================================\r\n// MCP Types\r\n// ============================================================================\r\n\r\nexport interface MCPServerConfig {\r\n /** Stdio transport: command to spawn the MCP server */\r\n command?: string;\r\n /** Stdio transport: arguments for the command */\r\n args?: string[];\r\n /** Stdio transport: environment variables for the spawned process */\r\n env?: Record<string, string>;\r\n /** HTTP transport: URL of the remote MCP server */\r\n url?: string;\r\n /** HTTP transport: additional headers for requests */\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport interface MCPBridgeConfig {\r\n /** Named MCP server configurations */\r\n servers: Record<string, MCPServerConfig>;\r\n /** Auditor for observability */\r\n auditor?: Auditor;\r\n}\r\n\r\nexport interface MCPTool {\r\n /** Server this tool came from */\r\n serverName: string;\r\n /** Tool name (as reported by the server) */\r\n name: string;\r\n /** Full qualified name (serverName:toolName) */\r\n qualifiedName: string;\r\n /** Tool description */\r\n description: string;\r\n /** JSON Schema for tool input */\r\n inputSchema: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Internal: SDK types (to avoid hard dependency)\r\n// ============================================================================\r\n\r\ninterface MCPClientLike {\r\n connect(transport: unknown): Promise<void>;\r\n close(): Promise<void>;\r\n listTools(): Promise<{ tools: Array<{ name: string; description?: string; inputSchema: Record<string, unknown> }> }>;\r\n callTool(params: { name: string; arguments?: Record<string, unknown> }): Promise<{ content: Array<{ type: string; text?: string }> }>;\r\n}\r\n\r\n// ============================================================================\r\n// MCPToolBridge\r\n// ============================================================================\r\n\r\nexport class MCPToolBridge {\r\n private config: MCPBridgeConfig;\r\n private auditor: Auditor;\r\n private clients: Map<string, MCPClientLike> = new Map();\r\n private transports: Map<string, unknown> = new Map();\r\n private discoveredTools: MCPTool[] = [];\r\n private connected = false;\r\n\r\n constructor(config: MCPBridgeConfig) {\r\n this.config = config;\r\n this.auditor = config.auditor ?? new NoopAuditor();\r\n }\r\n\r\n // ========================================================================\r\n // Connection Lifecycle\r\n // ========================================================================\r\n\r\n /**\r\n * Connect to all configured MCP servers and discover their tools.\r\n * Requires @modelcontextprotocol/sdk to be installed.\r\n */\r\n async connect(): Promise<void> {\r\n if (this.connected) return;\r\n\r\n // Dynamic import of MCP SDK (peer dependency)\r\n let sdk: {\r\n Client: new (info: { name: string; version: string }, opts?: { capabilities?: Record<string, unknown> }) => MCPClientLike;\r\n StdioClientTransport?: new (opts: { command: string; args?: string[]; env?: Record<string, string> }) => unknown;\r\n StreamableHTTPClientTransport?: new (url: URL, opts?: { requestInit?: { headers: Record<string, string> } }) => unknown;\r\n };\r\n\r\n try {\r\n // @ts-ignore — peer dependency, may not be installed\r\n sdk = await import('@modelcontextprotocol/sdk/client/index.js');\r\n } catch {\r\n throw new Error(\r\n 'MCP integration requires @modelcontextprotocol/sdk.\\n' +\r\n 'Install it: bun add @modelcontextprotocol/sdk'\r\n );\r\n }\r\n\r\n const entries = Object.entries(this.config.servers);\r\n\r\n for (const [serverName, serverConfig] of entries) {\r\n try {\r\n const client = new sdk.Client(\r\n { name: 'universal-llm-client', version: '3.0.0' },\r\n { capabilities: {} },\r\n );\r\n\r\n let transport: unknown;\r\n\r\n if (serverConfig.url) {\r\n // HTTP transport (all runtimes)\r\n if (!sdk.StreamableHTTPClientTransport) {\r\n // Try separate import path\r\n // @ts-ignore — peer dependency, may not be installed\r\n const httpModule = await import('@modelcontextprotocol/sdk/client/streamableHttp.js').catch(() => null);\r\n if (!httpModule?.StreamableHTTPClientTransport) {\r\n throw new Error('StreamableHTTPClientTransport not available in this SDK version');\r\n }\r\n transport = new httpModule.StreamableHTTPClientTransport(\r\n new URL(serverConfig.url),\r\n serverConfig.headers ? { requestInit: { headers: serverConfig.headers } } : undefined,\r\n );\r\n } else {\r\n transport = new sdk.StreamableHTTPClientTransport(\r\n new URL(serverConfig.url),\r\n serverConfig.headers ? { requestInit: { headers: serverConfig.headers } } : undefined,\r\n );\r\n }\r\n } else if (serverConfig.command) {\r\n // Stdio transport (Node/Bun/Deno only)\r\n if (!sdk.StdioClientTransport) {\r\n // @ts-ignore — peer dependency, may not be installed\r\n const stdioModule = await import('@modelcontextprotocol/sdk/client/stdio.js').catch(() => null);\r\n if (!stdioModule?.StdioClientTransport) {\r\n throw new Error(\r\n 'Stdio transport not available. This is expected in browser environments.\\n' +\r\n 'Use HTTP transport (url) instead, or run in Node/Bun/Deno.'\r\n );\r\n }\r\n transport = new stdioModule.StdioClientTransport({\r\n command: serverConfig.command,\r\n args: serverConfig.args,\r\n env: serverConfig.env,\r\n });\r\n } else {\r\n transport = new sdk.StdioClientTransport({\r\n command: serverConfig.command,\r\n args: serverConfig.args,\r\n env: serverConfig.env,\r\n });\r\n }\r\n } else {\r\n throw new Error(`MCP server \"${serverName}\" must have either \"url\" or \"command\" configured`);\r\n }\r\n\r\n await client.connect(transport);\r\n this.clients.set(serverName, client);\r\n this.transports.set(serverName, transport);\r\n\r\n // Discover tools\r\n const toolList = await client.listTools();\r\n for (const tool of toolList.tools) {\r\n this.discoveredTools.push({\r\n serverName,\r\n name: tool.name,\r\n qualifiedName: `${serverName}:${tool.name}`,\r\n description: tool.description ?? '',\r\n inputSchema: tool.inputSchema,\r\n });\r\n }\r\n\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'response',\r\n metadata: {\r\n event: 'mcp_connected',\r\n server: serverName,\r\n toolCount: toolList.tools.length,\r\n },\r\n });\r\n } catch (error) {\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'error',\r\n error: error instanceof Error ? error.message : String(error),\r\n metadata: { event: 'mcp_connect_failed', server: serverName },\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n this.connected = true;\r\n }\r\n\r\n // ========================================================================\r\n // Tool Registration\r\n // ========================================================================\r\n\r\n /**\r\n * Register all discovered MCP tools with an AIModel instance.\r\n * Each MCP tool becomes a callable tool that forwards execution\r\n * to the appropriate MCP server.\r\n */\r\n async registerTools(model: AIModel): Promise<void> {\r\n if (!this.connected) {\r\n await this.connect();\r\n }\r\n\r\n const tools = this.discoveredTools.map(mcpTool => ({\r\n name: mcpTool.qualifiedName,\r\n description: mcpTool.description,\r\n parameters: this.convertInputSchema(mcpTool.inputSchema),\r\n handler: this.createToolHandler(mcpTool),\r\n }));\r\n\r\n model.registerTools(tools);\r\n }\r\n\r\n /**\r\n * Get all discovered MCP tools (for inspection).\r\n */\r\n getTools(): ReadonlyArray<MCPTool> {\r\n return this.discoveredTools;\r\n }\r\n\r\n // ========================================================================\r\n // Disconnect\r\n // ========================================================================\r\n\r\n /**\r\n * Disconnect from all MCP servers and clean up.\r\n */\r\n async disconnect(): Promise<void> {\r\n for (const [serverName, client] of this.clients) {\r\n try {\r\n await client.close();\r\n } catch (error) {\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'error',\r\n error: error instanceof Error ? error.message : String(error),\r\n metadata: { event: 'mcp_disconnect_failed', server: serverName },\r\n });\r\n }\r\n }\r\n this.clients.clear();\r\n this.transports.clear();\r\n this.discoveredTools = [];\r\n this.connected = false;\r\n }\r\n\r\n // ========================================================================\r\n // Internal\r\n // ========================================================================\r\n\r\n private createToolHandler(mcpTool: MCPTool): ToolHandler {\r\n return async (args: unknown) => {\r\n const client = this.clients.get(mcpTool.serverName);\r\n if (!client) {\r\n throw new Error(`MCP server \"${mcpTool.serverName}\" is not connected`);\r\n }\r\n\r\n const start = Date.now();\r\n this.auditor.record({\r\n timestamp: start,\r\n type: 'tool_call',\r\n metadata: {\r\n event: 'mcp_tool_call',\r\n server: mcpTool.serverName,\r\n tool: mcpTool.name,\r\n },\r\n });\r\n\r\n try {\r\n const result = await client.callTool({\r\n name: mcpTool.name,\r\n arguments: args as Record<string, unknown> | undefined,\r\n });\r\n\r\n // Extract text content from MCP response\r\n const textParts = result.content\r\n .filter(c => c.type === 'text' && c.text)\r\n .map(c => c.text);\r\n\r\n const output = textParts.length === 1 ? textParts[0] : textParts.join('\\n');\r\n\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'tool_result',\r\n metadata: {\r\n event: 'mcp_tool_result',\r\n server: mcpTool.serverName,\r\n tool: mcpTool.name,\r\n duration: Date.now() - start,\r\n },\r\n });\r\n\r\n return output;\r\n } catch (error) {\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'error',\r\n error: error instanceof Error ? error.message : String(error),\r\n metadata: {\r\n event: 'mcp_tool_error',\r\n server: mcpTool.serverName,\r\n tool: mcpTool.name,\r\n },\r\n });\r\n throw error;\r\n }\r\n };\r\n }\r\n\r\n private convertInputSchema(schema: Record<string, unknown>): LLMFunction['parameters'] {\r\n return {\r\n type: 'object',\r\n properties: (schema['properties'] as Record<string, unknown>) ?? {},\r\n required: schema['required'] as string[] | undefined,\r\n };\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C,OAAO,KAAK,EACR,gBAAgB,EAChB,cAAc,EACd,eAAe,EAGf,WAAW,EAEX,aAAa,EAGhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAqK7C,qBAAa,eAAgB,SAAQ,aAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;IAUxD,OAAO,CAAC,qBAAqB;IAed,IAAI,CACf,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,eAAe,CAAC;IAsCX,UAAU,CACtB,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,cAAc,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,CAAC;IAoKjD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQvC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAoB9B,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAyBxE,OAAO,CAAC,gBAAgB;IA2ExB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IA2EvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0C1B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAkCzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4C9B,gEAAgE;IAChE,OAAO,CAAC,cAAc;IAYtB,2CAA2C;IAC3C,OAAO,CAAC,WAAW;CAOtB"}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* - Streaming: content_block_start/delta/stop events with typed deltas
|
|
15
15
|
*/
|
|
16
16
|
import { BaseLLMClient } from '../client.js';
|
|
17
|
+
import { resolveThinking, anthropicThinkingBudget } from '../thinking.js';
|
|
17
18
|
import { httpRequest, httpStream, parseSSE } from '../http.js';
|
|
18
19
|
import { StandardChatDecoder } from '../stream-decoder.js';
|
|
19
20
|
// ============================================================================
|
|
@@ -271,6 +272,17 @@ export class AnthropicClient extends BaseLLMClient {
|
|
|
271
272
|
.map(m => typeof m.content === 'string' ? m.content : this.extractText(m.content))
|
|
272
273
|
.join('\n\n')
|
|
273
274
|
: undefined;
|
|
275
|
+
// Prompt caching support (Anthropic-specific, high impact for long system prompts / RAG)
|
|
276
|
+
let system = systemPrompt;
|
|
277
|
+
if (options?.enablePromptCaching && systemPrompt) {
|
|
278
|
+
system = [
|
|
279
|
+
{
|
|
280
|
+
type: 'text',
|
|
281
|
+
text: systemPrompt,
|
|
282
|
+
cache_control: { type: 'ephemeral' },
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
}
|
|
274
286
|
// Convert tools from OpenAI format to Anthropic format
|
|
275
287
|
const tools = options?.tools ?? (Object.keys(this.toolRegistry).length > 0 ? this.getToolDefinitions() : undefined);
|
|
276
288
|
const anthropicTools = tools?.map(t => this.convertToolDef(t));
|
|
@@ -285,15 +297,28 @@ export class AnthropicClient extends BaseLLMClient {
|
|
|
285
297
|
else if (options?.toolChoice === 'auto') {
|
|
286
298
|
toolChoice = { type: 'auto' };
|
|
287
299
|
}
|
|
300
|
+
// Unified thinking flag → Anthropic extended thinking. Per-call overrides
|
|
301
|
+
// model config; the level sets `budget_tokens` (kept < max_tokens). The
|
|
302
|
+
// API forbids a custom temperature while thinking is enabled, so it is
|
|
303
|
+
// omitted in that case (the required default of 1 applies).
|
|
304
|
+
const thinking = resolveThinking(options?.thinking, this.options.thinking);
|
|
305
|
+
const thinkingOn = thinking?.enabled === true;
|
|
306
|
+
const requestedMax = options?.maxTokens ?? 4096;
|
|
307
|
+
// Extended thinking requires budget_tokens >= 1024 AND < max_tokens, so when
|
|
308
|
+
// thinking is on we bump max_tokens to guarantee headroom for the answer.
|
|
309
|
+
const budget = thinkingOn ? anthropicThinkingBudget(thinking?.level, requestedMax) : 0;
|
|
310
|
+
const maxTokens = thinkingOn ? Math.max(requestedMax, budget + 1024) : requestedMax;
|
|
288
311
|
const body = {
|
|
289
312
|
model: this.options.model,
|
|
290
313
|
messages: this.convertMessages(nonSystemMessages),
|
|
291
|
-
max_tokens:
|
|
292
|
-
...(
|
|
314
|
+
max_tokens: maxTokens,
|
|
315
|
+
...(system && { system }),
|
|
293
316
|
...(anthropicTools?.length && { tools: anthropicTools }),
|
|
294
317
|
...(toolChoice && { tool_choice: toolChoice }),
|
|
295
318
|
...(stream && { stream: true }),
|
|
296
|
-
...(
|
|
319
|
+
...(thinkingOn
|
|
320
|
+
? { thinking: { type: 'enabled', budget_tokens: budget } }
|
|
321
|
+
: (options?.temperature !== undefined && { temperature: options.temperature })),
|
|
297
322
|
};
|
|
298
323
|
return body;
|
|
299
324
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Universal LLM Client v3 — Anthropic Messages API Provider\r\n *\r\n * Implements BaseLLMClient for Anthropic's Messages API (Claude).\r\n * Uses the custom Anthropic protocol — NOT OpenAI-compatible.\r\n *\r\n * Key differences from OpenAI:\r\n * - Endpoint: POST /v1/messages (not /chat/completions)\r\n * - Auth: x-api-key header (not Authorization: Bearer)\r\n * - System prompt: top-level `system` field, not a message\r\n * - Messages: content is always an array of content blocks\r\n * - Tool calls: `tool_use` content blocks (not tool_calls array)\r\n * - Tool results: `tool_result` content blocks in user messages\r\n * - Streaming: content_block_start/delta/stop events with typed deltas\r\n */\r\n\r\nimport { BaseLLMClient } from '../client.js';\r\nimport { httpRequest, httpStream, parseSSE } from '../http.js';\r\nimport { StandardChatDecoder } from '../stream-decoder.js';\r\nimport type {\r\n LLMClientOptions,\r\n LLMChatMessage,\r\n LLMChatResponse,\r\n LLMToolCall,\r\n LLMToolDefinition,\r\n ChatOptions,\r\n TokenUsageInfo,\r\n ModelMetadata,\r\n LLMContentPart,\r\n LLMMessageContent,\r\n} from '../interfaces.js';\r\nimport type { DecodedEvent } from '../stream-decoder.js';\r\nimport type { Auditor } from '../auditor.js';\r\n\r\n// ============================================================================\r\n// Anthropic-Specific Types\r\n// ============================================================================\r\n\r\n/** Anthropic content block types */\r\ninterface AnthropicTextBlock {\r\n readonly type: 'text';\r\n readonly text: string;\r\n}\r\n\r\ninterface AnthropicImageBlock {\r\n readonly type: 'image';\r\n readonly source: {\r\n readonly type: 'base64' | 'url';\r\n readonly media_type?: string;\r\n readonly data?: string;\r\n readonly url?: string;\r\n };\r\n}\r\n\r\ninterface AnthropicToolUseBlock {\r\n readonly type: 'tool_use';\r\n readonly id: string;\r\n readonly name: string;\r\n readonly input: Record<string, unknown>;\r\n}\r\n\r\ninterface AnthropicToolResultBlock {\r\n readonly type: 'tool_result';\r\n readonly tool_call_id: string;\r\n readonly content: string | AnthropicTextBlock[];\r\n}\r\n\r\ninterface AnthropicThinkingBlock {\r\n readonly type: 'thinking';\r\n readonly thinking: string;\r\n readonly signature: string;\r\n}\r\n\r\ntype AnthropicContentBlock =\r\n | AnthropicTextBlock\r\n | AnthropicImageBlock\r\n | AnthropicToolUseBlock\r\n | AnthropicToolResultBlock\r\n | AnthropicThinkingBlock;\r\n\r\n/** Anthropic message format */\r\ninterface AnthropicMessage {\r\n readonly role: 'user' | 'assistant';\r\n readonly content: string | AnthropicContentBlock[];\r\n}\r\n\r\n/** Anthropic tool definition (uses input_schema, not parameters) */\r\ninterface AnthropicToolDef {\r\n readonly name: string;\r\n readonly description: string;\r\n readonly input_schema: {\r\n readonly type: 'object';\r\n readonly properties?: Record<string, unknown>;\r\n readonly required?: string[];\r\n };\r\n}\r\n\r\n/** Anthropic request body */\r\ninterface AnthropicRequest {\r\n readonly model: string;\r\n readonly messages: AnthropicMessage[];\r\n readonly max_tokens: number;\r\n readonly system?: string;\r\n readonly tools?: AnthropicToolDef[];\r\n readonly tool_choice?: { readonly type: 'auto' | 'any' | 'tool'; readonly name?: string };\r\n readonly stream?: boolean;\r\n readonly temperature?: number;\r\n}\r\n\r\n/** Anthropic non-streaming response */\r\ninterface AnthropicResponse {\r\n readonly id: string;\r\n readonly type: 'message';\r\n readonly role: 'assistant';\r\n readonly content: AnthropicContentBlock[];\r\n readonly model: string;\r\n readonly stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use' | null;\r\n readonly usage: {\r\n readonly input_tokens: number;\r\n readonly output_tokens: number;\r\n };\r\n}\r\n\r\n/** Anthropic model from models list */\r\ninterface AnthropicModelInfo {\r\n readonly id: string;\r\n readonly display_name: string;\r\n readonly created_at: string;\r\n readonly type: 'model';\r\n}\r\n\r\n// ============================================================================\r\n// Streaming Event Types\r\n// ============================================================================\r\n\r\ninterface StreamMessageStart {\r\n readonly type: 'message_start';\r\n readonly message: AnthropicResponse;\r\n}\r\n\r\ninterface StreamContentBlockStart {\r\n readonly type: 'content_block_start';\r\n readonly index: number;\r\n readonly content_block: AnthropicContentBlock;\r\n}\r\n\r\ninterface StreamContentBlockDelta {\r\n readonly type: 'content_block_delta';\r\n readonly index: number;\r\n readonly delta:\r\n | { readonly type: 'text_delta'; readonly text: string }\r\n | { readonly type: 'input_json_delta'; readonly partial_json: string }\r\n | { readonly type: 'thinking_delta'; readonly thinking: string }\r\n | { readonly type: 'signature_delta'; readonly signature: string };\r\n}\r\n\r\ninterface StreamContentBlockStop {\r\n readonly type: 'content_block_stop';\r\n readonly index: number;\r\n}\r\n\r\ninterface StreamMessageDelta {\r\n readonly type: 'message_delta';\r\n readonly delta: {\r\n readonly stop_reason: string | null;\r\n readonly stop_sequence?: string | null;\r\n };\r\n readonly usage: {\r\n readonly output_tokens: number;\r\n };\r\n}\r\n\r\ninterface StreamMessageStop {\r\n readonly type: 'message_stop';\r\n}\r\n\r\ntype AnthropicStreamEvent =\r\n | StreamMessageStart\r\n | StreamContentBlockStart\r\n | StreamContentBlockDelta\r\n | StreamContentBlockStop\r\n | StreamMessageDelta\r\n | StreamMessageStop\r\n | { readonly type: 'ping' }\r\n | { readonly type: 'error'; readonly error: { readonly type: string; readonly message: string } };\r\n\r\n// ============================================================================\r\n// Anthropic Client\r\n// ============================================================================\r\n\r\nexport class AnthropicClient extends BaseLLMClient {\r\n private readonly baseUrl: string;\r\n\r\n constructor(options: LLMClientOptions, auditor?: Auditor) {\r\n const url = (options.url || 'https://api.anthropic.com').replace(/\\/+$/, '');\r\n super({ ...options, url }, auditor);\r\n this.baseUrl = url;\r\n }\r\n\r\n // ========================================================================\r\n // Headers\r\n // ========================================================================\r\n\r\n private buildAnthropicHeaders(): Record<string, string> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n 'anthropic-version': '2023-06-01',\r\n };\r\n if (this.options.apiKey) {\r\n headers['x-api-key'] = this.options.apiKey;\r\n }\r\n return headers;\r\n }\r\n\r\n // ========================================================================\r\n // Chat (non-streaming)\r\n // ========================================================================\r\n\r\n override async chat(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): Promise<LLMChatResponse> {\r\n const url = `${this.baseUrl}/v1/messages`;\r\n const body = this.buildRequestBody(messages, options, false);\r\n\r\n const start = Date.now();\r\n this.auditor.record({\r\n timestamp: start,\r\n type: 'request',\r\n provider: 'anthropic',\r\n model: this.options.model,\r\n });\r\n\r\n const response = await httpRequest<AnthropicResponse>(url, {\r\n method: 'POST',\r\n headers: this.buildAnthropicHeaders(),\r\n body,\r\n timeout: this.options.timeout ?? 60000,\r\n });\r\n\r\n const data = response.data;\r\n const result = this.parseAnthropicResponse(data);\r\n\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'response',\r\n provider: 'anthropic',\r\n model: this.options.model,\r\n duration: Date.now() - start,\r\n usage: result.usage,\r\n });\r\n\r\n return result;\r\n }\r\n\r\n // ========================================================================\r\n // Streaming\r\n // ========================================================================\r\n\r\n override async *chatStream(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): AsyncGenerator<DecodedEvent, LLMChatResponse | void, unknown> {\r\n const url = `${this.baseUrl}/v1/messages`;\r\n const body = this.buildRequestBody(messages, options, true);\r\n\r\n const start = Date.now();\r\n this.auditor.record({\r\n timestamp: start,\r\n type: 'stream_start',\r\n provider: 'anthropic',\r\n model: this.options.model,\r\n });\r\n\r\n const decoder = new StandardChatDecoder(() => {});\r\n\r\n // Track content blocks as they stream in\r\n const contentBlocks: Map<number, {\r\n type: string;\r\n text: string;\r\n toolId?: string;\r\n toolName?: string;\r\n inputJson?: string;\r\n thinking?: string;\r\n signature?: string;\r\n }> = new Map();\r\n\r\n let usage: TokenUsageInfo | undefined;\r\n let inputTokens = 0;\r\n\r\n const stream = httpStream(url, {\r\n method: 'POST',\r\n headers: this.buildAnthropicHeaders(),\r\n body,\r\n timeout: this.options.timeout ?? 120000,\r\n });\r\n\r\n for await (const { data } of parseSSE(stream)) {\r\n try {\r\n const event = JSON.parse(data) as AnthropicStreamEvent;\r\n\r\n switch (event.type) {\r\n case 'message_start': {\r\n inputTokens = event.message.usage?.input_tokens ?? 0;\r\n break;\r\n }\r\n\r\n case 'content_block_start': {\r\n const block = event.content_block;\r\n if (block.type === 'text') {\r\n contentBlocks.set(event.index, { type: 'text', text: '' });\r\n } else if (block.type === 'tool_use') {\r\n contentBlocks.set(event.index, {\r\n type: 'tool_use',\r\n text: '',\r\n toolId: block.id,\r\n toolName: block.name,\r\n inputJson: '',\r\n });\r\n } else if (block.type === 'thinking') {\r\n contentBlocks.set(event.index, { type: 'thinking', text: '', thinking: '' });\r\n }\r\n break;\r\n }\r\n\r\n case 'content_block_delta': {\r\n const block = contentBlocks.get(event.index);\r\n if (!block) break;\r\n\r\n if (event.delta.type === 'text_delta') {\r\n block.text += event.delta.text;\r\n decoder.push(event.delta.text);\r\n yield { type: 'text', content: event.delta.text };\r\n } else if (event.delta.type === 'input_json_delta') {\r\n block.inputJson = (block.inputJson ?? '') + event.delta.partial_json;\r\n } else if (event.delta.type === 'thinking_delta') {\r\n block.thinking = (block.thinking ?? '') + event.delta.thinking;\r\n decoder.pushReasoning(event.delta.thinking);\r\n yield { type: 'thinking', content: event.delta.thinking };\r\n } else if (event.delta.type === 'signature_delta') {\r\n block.signature = event.delta.signature;\r\n }\r\n break;\r\n }\r\n\r\n case 'content_block_stop': {\r\n const block = contentBlocks.get(event.index);\r\n if (block?.type === 'tool_use' && block.toolId && block.toolName) {\r\n // Parse accumulated JSON and emit tool call\r\n const toolCall: LLMToolCall = {\r\n id: block.toolId,\r\n type: 'function',\r\n function: {\r\n name: block.toolName,\r\n arguments: block.inputJson ?? '{}',\r\n },\r\n };\r\n yield { type: 'tool_call', calls: [toolCall] };\r\n }\r\n break;\r\n }\r\n\r\n case 'message_delta': {\r\n const outputTokens = event.usage?.output_tokens ?? 0;\r\n usage = {\r\n inputTokens,\r\n outputTokens,\r\n totalTokens: inputTokens + outputTokens,\r\n };\r\n break;\r\n }\r\n\r\n case 'error': {\r\n throw new Error(`Anthropic stream error: ${event.error.type} — ${event.error.message}`);\r\n }\r\n }\r\n } catch (e) {\r\n if (e instanceof Error && e.message.startsWith('Anthropic stream error')) {\r\n throw e;\r\n }\r\n // Skip unparseable SSE data\r\n }\r\n }\r\n\r\n decoder.flush();\r\n\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'stream_end',\r\n provider: 'anthropic',\r\n model: this.options.model,\r\n duration: Date.now() - start,\r\n usage,\r\n });\r\n\r\n // Build final tool calls from accumulated content blocks\r\n const toolCalls: LLMToolCall[] = [];\r\n for (const block of contentBlocks.values()) {\r\n if (block.type === 'tool_use' && block.toolId && block.toolName) {\r\n toolCalls.push({\r\n id: block.toolId,\r\n type: 'function',\r\n function: {\r\n name: block.toolName,\r\n arguments: block.inputJson ?? '{}',\r\n },\r\n });\r\n }\r\n }\r\n\r\n return {\r\n message: {\r\n role: 'assistant',\r\n content: decoder.getCleanContent(),\r\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\r\n },\r\n reasoning: decoder.getReasoning(),\r\n usage,\r\n provider: 'anthropic',\r\n };\r\n }\r\n\r\n // ========================================================================\r\n // Embeddings (not supported by Anthropic)\r\n // ========================================================================\r\n\r\n override async embed(_text: string): Promise<number[]> {\r\n throw new Error('Anthropic does not support embeddings. Use a different provider.');\r\n }\r\n\r\n // ========================================================================\r\n // Model Discovery\r\n // ========================================================================\r\n\r\n override async getModels(): Promise<string[]> {\r\n const url = `${this.baseUrl}/v1/models`;\r\n try {\r\n const response = await httpRequest<{\r\n data: AnthropicModelInfo[];\r\n }>(url, {\r\n headers: this.buildAnthropicHeaders(),\r\n timeout: 5000,\r\n });\r\n return response.data.data.map(m => m.id);\r\n } catch {\r\n // Fallback: return well-known Claude models\r\n return [\r\n 'claude-sonnet-4-20250514',\r\n 'claude-haiku-4-20250514',\r\n 'claude-opus-4-20250514',\r\n ];\r\n }\r\n }\r\n\r\n override async getModelInfo(_modelName?: string): Promise<ModelMetadata> {\r\n // Claude models support large context windows\r\n const model = _modelName ?? this.options.model;\r\n\r\n // Claude 4 models have 200K context\r\n if (model.includes('claude-4') || model.includes('claude-opus') ||\r\n model.includes('claude-sonnet') || model.includes('claude-haiku')) {\r\n return {\r\n model,\r\n contextLength: 200_000,\r\n capabilities: ['tools', 'vision', 'thinking'],\r\n };\r\n }\r\n\r\n return {\r\n model,\r\n contextLength: 200_000,\r\n capabilities: ['tools', 'vision'],\r\n };\r\n }\r\n\r\n // ========================================================================\r\n // Internal: Request Building\r\n // ========================================================================\r\n\r\n private buildRequestBody(\r\n messages: LLMChatMessage[],\r\n options: ChatOptions | undefined,\r\n stream: boolean,\r\n ): AnthropicRequest {\r\n // Extract system prompt from messages\r\n const systemMessages = messages.filter(m => m.role === 'system');\r\n const nonSystemMessages = messages.filter(m => m.role !== 'system');\r\n\r\n const systemPrompt = systemMessages.length > 0\r\n ? systemMessages\r\n .map(m => typeof m.content === 'string' ? m.content : this.extractText(m.content))\r\n .join('\\n\\n')\r\n : undefined;\r\n\r\n // Convert tools from OpenAI format to Anthropic format\r\n const tools = options?.tools ?? (\r\n Object.keys(this.toolRegistry).length > 0 ? this.getToolDefinitions() : undefined\r\n );\r\n const anthropicTools = tools?.map(t => this.convertToolDef(t));\r\n\r\n // Map tool_choice\r\n let toolChoice: AnthropicRequest['tool_choice'];\r\n if (options?.toolChoice === 'required') {\r\n toolChoice = { type: 'any' };\r\n } else if (options?.toolChoice === 'none') {\r\n toolChoice = { type: 'auto' }; // Anthropic doesn't have 'none', closest is 'auto'\r\n } else if (options?.toolChoice === 'auto') {\r\n toolChoice = { type: 'auto' };\r\n }\r\n\r\n const body: AnthropicRequest = {\r\n model: this.options.model,\r\n messages: this.convertMessages(nonSystemMessages),\r\n max_tokens: options?.maxTokens ?? 4096,\r\n ...(systemPrompt && { system: systemPrompt }),\r\n ...(anthropicTools?.length && { tools: anthropicTools }),\r\n ...(toolChoice && { tool_choice: toolChoice }),\r\n ...(stream && { stream: true }),\r\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\r\n };\r\n\r\n return body;\r\n }\r\n\r\n // ========================================================================\r\n // Internal: Message Conversion\r\n // ========================================================================\r\n\r\n /**\r\n * Convert our canonical LLMChatMessage[] to Anthropic's message format.\r\n * Key conversions:\r\n * - 'tool' role messages → merged into preceding user message as tool_result blocks\r\n * - assistant messages with tool_calls → assistant message with tool_use blocks\r\n * - multimodal content → Anthropic image blocks\r\n */\r\n private convertMessages(messages: LLMChatMessage[]): AnthropicMessage[] {\r\n const result: AnthropicMessage[] = [];\r\n\r\n for (let i = 0; i < messages.length; i++) {\r\n const msg = messages[i]!;\r\n\r\n if (msg.role === 'assistant') {\r\n // Build content blocks for assistant\r\n const blocks: AnthropicContentBlock[] = [];\r\n\r\n // Add text content if present\r\n const text = typeof msg.content === 'string'\r\n ? msg.content\r\n : this.extractText(msg.content);\r\n if (text) {\r\n blocks.push({ type: 'text', text });\r\n }\r\n\r\n // Convert tool_calls to tool_use blocks\r\n if (msg.tool_calls) {\r\n for (const tc of msg.tool_calls) {\r\n let input: Record<string, unknown> = {};\r\n try {\r\n input = JSON.parse(tc.function.arguments);\r\n } catch {\r\n // Keep empty object if parse fails\r\n }\r\n blocks.push({\r\n type: 'tool_use',\r\n id: tc.id,\r\n name: tc.function.name,\r\n input,\r\n });\r\n }\r\n }\r\n\r\n if (blocks.length > 0) {\r\n result.push({ role: 'assistant', content: blocks });\r\n }\r\n } else if (msg.role === 'tool') {\r\n // Anthropic needs tool results inside user messages\r\n const toolResultBlock: AnthropicToolResultBlock = {\r\n type: 'tool_result',\r\n tool_call_id: msg.tool_call_id ?? '',\r\n content: typeof msg.content === 'string'\r\n ? msg.content\r\n : this.extractText(msg.content),\r\n };\r\n\r\n // Collect consecutive tool results\r\n const toolResults: AnthropicContentBlock[] = [toolResultBlock];\r\n while (i + 1 < messages.length && messages[i + 1]!.role === 'tool') {\r\n i++;\r\n const nextMsg = messages[i]!;\r\n toolResults.push({\r\n type: 'tool_result',\r\n tool_call_id: nextMsg.tool_call_id ?? '',\r\n content: typeof nextMsg.content === 'string'\r\n ? nextMsg.content\r\n : this.extractText(nextMsg.content),\r\n });\r\n }\r\n\r\n result.push({ role: 'user', content: toolResults });\r\n } else if (msg.role === 'user') {\r\n const blocks = this.convertUserContent(msg.content);\r\n result.push({ role: 'user', content: blocks });\r\n }\r\n }\r\n\r\n // Anthropic requires alternating user/assistant messages.\r\n // Merge consecutive same-role messages if needed.\r\n return this.ensureAlternating(result);\r\n }\r\n\r\n /**\r\n * Convert user message content (string or multimodal) to Anthropic blocks.\r\n */\r\n private convertUserContent(content: LLMMessageContent): AnthropicContentBlock[] {\r\n if (typeof content === 'string') {\r\n return [{ type: 'text', text: content }];\r\n }\r\n\r\n const blocks: AnthropicContentBlock[] = [];\r\n for (const part of content as LLMContentPart[]) {\r\n if (part.type === 'text') {\r\n blocks.push({ type: 'text', text: part.text });\r\n } else if (part.type === 'audio') {\r\n // Anthropic does not yet support audio input — skip silently\r\n this.debugLog('[Anthropic] Audio content dropped — not supported');\r\n } else if (part.type === 'image_url') {\r\n const url = part.image_url.url;\r\n if (url.startsWith('data:')) {\r\n // Extract base64 data from data URI\r\n const match = url.match(/^data:([^;]+);base64,(.+)$/);\r\n if (match) {\r\n blocks.push({\r\n type: 'image',\r\n source: {\r\n type: 'base64',\r\n media_type: match[1],\r\n data: match[2],\r\n },\r\n });\r\n }\r\n } else {\r\n // URL-based image\r\n blocks.push({\r\n type: 'image',\r\n source: {\r\n type: 'url',\r\n url,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n return blocks.length > 0 ? blocks : [{ type: 'text', text: '' }];\r\n }\r\n\r\n /**\r\n * Ensure messages alternate between user and assistant roles.\r\n * Anthropic requires strict alternation. Merge consecutive same-role messages.\r\n */\r\n private ensureAlternating(messages: AnthropicMessage[]): AnthropicMessage[] {\r\n if (messages.length <= 1) return messages;\r\n\r\n const merged: AnthropicMessage[] = [messages[0]!];\r\n\r\n for (let i = 1; i < messages.length; i++) {\r\n const current = messages[i]!;\r\n const last = merged[merged.length - 1]!;\r\n\r\n if (current.role === last.role) {\r\n // Merge content arrays\r\n const lastContent = Array.isArray(last.content)\r\n ? last.content\r\n : [{ type: 'text' as const, text: last.content }];\r\n const currentContent = Array.isArray(current.content)\r\n ? current.content\r\n : [{ type: 'text' as const, text: current.content }];\r\n\r\n merged[merged.length - 1] = {\r\n role: current.role,\r\n content: [...lastContent, ...currentContent],\r\n };\r\n } else {\r\n merged.push(current);\r\n }\r\n }\r\n\r\n return merged;\r\n }\r\n\r\n // ========================================================================\r\n // Internal: Response Parsing\r\n // ========================================================================\r\n\r\n /**\r\n * Parse Anthropic's response format into our canonical LLMChatResponse.\r\n */\r\n private parseAnthropicResponse(data: AnthropicResponse): LLMChatResponse {\r\n let textContent = '';\r\n let reasoning: string | undefined;\r\n const toolCalls: LLMToolCall[] = [];\r\n\r\n for (const block of data.content) {\r\n if (block.type === 'text') {\r\n textContent += block.text;\r\n } else if (block.type === 'tool_use') {\r\n toolCalls.push({\r\n id: block.id,\r\n type: 'function',\r\n function: {\r\n name: block.name,\r\n arguments: JSON.stringify(block.input),\r\n },\r\n });\r\n } else if (block.type === 'thinking') {\r\n reasoning = (reasoning ?? '') + block.thinking;\r\n }\r\n }\r\n\r\n const usage: TokenUsageInfo = {\r\n inputTokens: data.usage.input_tokens,\r\n outputTokens: data.usage.output_tokens,\r\n totalTokens: data.usage.input_tokens + data.usage.output_tokens,\r\n };\r\n\r\n return {\r\n message: {\r\n role: 'assistant',\r\n content: textContent,\r\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\r\n },\r\n reasoning,\r\n usage,\r\n provider: 'anthropic',\r\n };\r\n }\r\n\r\n // ========================================================================\r\n // Internal: Helpers\r\n // ========================================================================\r\n\r\n /** Convert OpenAI-format tool definition to Anthropic format */\r\n private convertToolDef(tool: LLMToolDefinition): AnthropicToolDef {\r\n return {\r\n name: tool.function.name,\r\n description: tool.function.description,\r\n input_schema: {\r\n type: 'object',\r\n properties: tool.function.parameters.properties,\r\n required: tool.function.parameters.required,\r\n },\r\n };\r\n }\r\n\r\n /** Extract text from multimodal content */\r\n private extractText(content: LLMMessageContent): string {\r\n if (typeof content === 'string') return content;\r\n return (content as LLMContentPart[])\r\n .filter((p): p is { type: 'text'; text: string } => p.type === 'text')\r\n .map(p => p.text)\r\n .join('');\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* streaming, embeddings, and system prompt handling.
|
|
7
7
|
*/
|
|
8
8
|
import { BaseLLMClient } from '../client.js';
|
|
9
|
-
import type { LLMClientOptions, LLMChatMessage, LLMChatResponse, ChatOptions } from '../interfaces.js';
|
|
9
|
+
import type { LLMClientOptions, LLMChatMessage, LLMChatResponse, ChatOptions, DeepResearchOptions, DeepResearchResult, DeepResearchEvent } from '../interfaces.js';
|
|
10
10
|
import type { DecodedEvent } from '../stream-decoder.js';
|
|
11
11
|
import type { Auditor } from '../auditor.js';
|
|
12
12
|
export declare class GoogleClient extends BaseLLMClient {
|
|
@@ -20,6 +20,26 @@ export declare class GoogleClient extends BaseLLMClient {
|
|
|
20
20
|
private getHeaders;
|
|
21
21
|
chat(messages: LLMChatMessage[], options?: ChatOptions): Promise<LLMChatResponse>;
|
|
22
22
|
chatStream(messages: LLMChatMessage[], options?: ChatOptions): AsyncGenerator<DecodedEvent, LLMChatResponse | void, unknown>;
|
|
23
|
+
/** Deep Research is available via Google AI Studio only (not Vertex AI). */
|
|
24
|
+
supportsDeepResearch(): boolean;
|
|
25
|
+
private interactionsBase;
|
|
26
|
+
private deepResearchHeaders;
|
|
27
|
+
private buildInteractionBody;
|
|
28
|
+
private toDeepResearchResult;
|
|
29
|
+
/** httpRequest with small backoff retries — the preview interactions API is flaky (503s). */
|
|
30
|
+
private drRequest;
|
|
31
|
+
/**
|
|
32
|
+
* Run an agentic Deep Research interaction: create it, then poll until it
|
|
33
|
+
* completes/fails or the timeout elapses. Returns the final report + steps.
|
|
34
|
+
*/
|
|
35
|
+
deepResearch(input: string, opts?: DeepResearchOptions): Promise<DeepResearchResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Stream a Deep Research interaction's intermediate updates (`step.delta`
|
|
38
|
+
* thought/text/image events) and return the final result. Best-effort:
|
|
39
|
+
* falls back to the created interaction object if the stream ends early.
|
|
40
|
+
*/
|
|
41
|
+
deepResearchStream(input: string, opts?: DeepResearchOptions): AsyncGenerator<DeepResearchEvent, DeepResearchResult, unknown>;
|
|
42
|
+
private delay;
|
|
23
43
|
embed(text: string): Promise<number[]>;
|
|
24
44
|
getModels(): Promise<string[]>;
|
|
25
45
|
private buildRequestBody;
|
|
@@ -28,6 +48,7 @@ export declare class GoogleClient extends BaseLLMClient {
|
|
|
28
48
|
private convertContentToGoogleParts;
|
|
29
49
|
private convertToGoogleTool;
|
|
30
50
|
private convertFunctionCallToToolCall;
|
|
51
|
+
private parseToolArguments;
|
|
31
52
|
private parseGoogleResponse;
|
|
32
53
|
/**
|
|
33
54
|
* Retry HTTP requests for Flex tier when receiving 503/429 errors.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAU7C,OAAO,KAAK,EACR,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,WAAW,EAYX,mBAAmB,EACnB,kBAAkB,EAElB,iBAAiB,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,qBAAa,YAAa,SAAQ,aAAa;IAC3C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;IAUxD,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,UAAU;IAcZ,IAAI,CACN,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,eAAe,CAAC;IAuDpB,UAAU,CACb,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,cAAc,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,CAAC;IAgHhE,4EAA4E;IAC5E,oBAAoB,IAAI,OAAO;IAI/B,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,oBAAoB;IA0B5B,6FAA6F;YAC/E,SAAS;IAkBvB;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgC9F;;;;OAIG;IACI,kBAAkB,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,mBAAwB,GAC/B,cAAc,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,OAAO,CAAC;IAgCjE,OAAO,CAAC,KAAK;IAYP,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBtC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBpC,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,qBAAqB;IAwD7B,OAAO,CAAC,uBAAuB;IA0F/B,OAAO,CAAC,2BAA2B;IAuCnC,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,6BAA6B;IAkBrC,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,mBAAmB;IAsD3B;;;OAGG;YACW,kBAAkB;CAoBnC"}
|