@avasis-ai/synthcode 1.0.6 → 1.0.8

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.
@@ -50,9 +50,44 @@ declare class OllamaProvider implements Provider {
50
50
  chat(request: ChatRequest): Promise<ModelResponse>;
51
51
  }
52
52
 
53
+ interface ClusterSlot {
54
+ model: string;
55
+ role: "planner" | "worker" | "reviewer" | "drafter";
56
+ baseURL?: string;
57
+ maxTokens?: number;
58
+ temperature?: number;
59
+ }
60
+ interface ClusterConfig {
61
+ slots: ClusterSlot[];
62
+ baseURL?: string;
63
+ timeoutMs?: number;
64
+ strategy?: "auto" | "draft-verify" | "debate" | "majority" | "single";
65
+ draftCount?: number;
66
+ debateRounds?: number;
67
+ }
68
+ declare class ClusterProvider implements Provider {
69
+ readonly model: string;
70
+ private config;
71
+ private stats;
72
+ constructor(config?: Partial<ClusterConfig>);
73
+ getStats(): {
74
+ calls: number;
75
+ tokensIn: number;
76
+ tokensOut: number;
77
+ byModel: Record<string, number>;
78
+ };
79
+ chat(request: ChatRequest): Promise<ModelResponse>;
80
+ private speculative;
81
+ private draftVerify;
82
+ private debate;
83
+ private safeCall;
84
+ private fallback;
85
+ }
86
+
53
87
  declare function anthropic(config: AnthropicProviderConfig): AnthropicProvider;
54
88
  declare function openai(config: OpenAIProviderConfig): OpenAIProvider;
55
89
  declare function ollama(config: OllamaProviderConfig): OllamaProvider;
90
+ declare function cluster(config?: Partial<ClusterConfig>): ClusterProvider;
56
91
  interface CustomProviderConfig {
57
92
  provider: 'custom';
58
93
  model: string;
@@ -67,4 +102,4 @@ declare function createProvider(config: (AnthropicProviderConfig & {
67
102
  provider: 'openai';
68
103
  }) | OllamaProviderConfigWithProvider | CustomProviderConfig): Provider;
69
104
 
70
- export { APIToolDefinition, AnthropicProvider, type AnthropicProviderConfig, BaseProvider, ChatMessage, ChatRequest, type CustomProviderConfig, OllamaProvider, type OllamaProviderConfig, type OllamaProviderConfigWithProvider, OpenAIProvider, type OpenAIProviderConfig, Provider, anthropic, createProvider, ollama, openai };
105
+ export { APIToolDefinition, AnthropicProvider, type AnthropicProviderConfig, BaseProvider, ChatMessage, ChatRequest, type ClusterConfig, ClusterProvider, type ClusterSlot, type CustomProviderConfig, OllamaProvider, type OllamaProviderConfig, type OllamaProviderConfigWithProvider, OpenAIProvider, type OpenAIProviderConfig, Provider, anthropic, cluster, createProvider, ollama, openai };
package/dist/llm/index.js CHANGED
@@ -1,22 +1,26 @@
1
1
  import {
2
2
  AnthropicProvider,
3
3
  BaseProvider,
4
+ ClusterProvider,
4
5
  OllamaProvider,
5
6
  OpenAIProvider,
6
7
  RetryableError,
7
8
  anthropic,
9
+ cluster,
8
10
  createProvider,
9
11
  ollama,
10
12
  openai
11
- } from "../chunk-F34HO4RA.js";
13
+ } from "../chunk-KPJDLUMB.js";
12
14
  import "../chunk-DGUM43GV.js";
13
15
  export {
14
16
  AnthropicProvider,
15
17
  BaseProvider,
18
+ ClusterProvider,
16
19
  OllamaProvider,
17
20
  OpenAIProvider,
18
21
  RetryableError,
19
22
  anthropic,
23
+ cluster,
20
24
  createProvider,
21
25
  ollama,
22
26
  openai
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@avasis-ai/synthcode",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "SynthCode - Synthesize any LLM into a production-grade AI agent. Battle-tested agentic patterns, model-agnostic, TypeScript-first.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/llm/provider.ts","../src/llm/anthropic.ts","../src/llm/openai.ts","../src/llm/ollama.ts","../src/llm/index.ts"],"sourcesContent":["import type { ModelResponse, ContentBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { APIToolDefinition } from '../tools/tool.js';\n\nexport interface Provider {\n readonly model: string;\n chat(request: ChatRequest): Promise<ModelResponse>;\n}\n\nexport interface ChatRequest {\n messages: ChatMessage[];\n tools?: APIToolDefinition[];\n systemPrompt?: string;\n maxOutputTokens?: number;\n temperature?: number;\n abortSignal?: AbortSignal;\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"tool\";\n content: string | ContentBlock[];\n tool_use_id?: string;\n is_error?: boolean;\n}\n\nexport type { APIToolDefinition } from '../tools/tool.js';\n\nexport class RetryableError extends Error {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'RetryableError';\n this.cause = cause;\n }\n}\n\nexport abstract class BaseProvider implements Provider {\n readonly model: string;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n this.maxOutputTokens = config.maxOutputTokens;\n this.temperature = config.temperature;\n }\n\n abstract chat(request: ChatRequest): Promise<ModelResponse>;\n\n protected abstract mapMessages(messages: ChatMessage[]): unknown[];\n\n protected abstract mapTools(tools?: APIToolDefinition[]): unknown[] | undefined;\n\n protected abstract mapUsage(providerUsage: unknown): TokenUsage;\n\n protected mapStopReason(reason: string): ModelResponse[\"stopReason\"] {\n switch (reason) {\n case 'end_turn':\n case 'stop':\n return 'end_turn';\n case 'tool_use':\n case 'tool_calls':\n return 'tool_use';\n case 'max_tokens':\n case 'length':\n return 'max_tokens';\n case 'stop_sequence':\n return 'stop_sequence';\n default:\n return 'end_turn';\n }\n }\n}\n","import type { ModelResponse, ContentBlock, TextBlock, ToolUseBlock, ThinkingBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { BaseProvider, RetryableError } from './provider.js';\n\nexport interface AnthropicProviderConfig extends ProviderConfig {\n apiKey: string;\n baseURL?: string;\n dangerouslySkipAuth?: boolean;\n enableCaching?: boolean;\n}\n\nexport class AnthropicProvider extends BaseProvider {\n private readonly apiKey: string;\n private readonly baseURL?: string;\n private readonly dangerouslySkipAuth?: boolean;\n private readonly enableCaching: boolean;\n private client: any = null;\n\n constructor(config: AnthropicProviderConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL;\n this.dangerouslySkipAuth = config.dangerouslySkipAuth;\n this.enableCaching = config.enableCaching ?? false;\n }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const AnthropicSDK = (await import('@anthropic-ai/sdk')).default;\n\n if (!this.client) {\n const opts: Record<string, unknown> = { apiKey: this.apiKey };\n if (this.baseURL) opts.baseURL = this.baseURL;\n if (this.dangerouslySkipAuth) opts.dangerouslySkipAuth = true;\n this.client = new AnthropicSDK(opts);\n }\n\n const messages = this.mapMessages(request.messages);\n const tools = this.mapTools(request.tools);\n const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens ?? 4096;\n const temperature = request.temperature ?? this.temperature;\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: maxTokens,\n messages,\n };\n\n if (request.systemPrompt) {\n if (this.enableCaching) {\n body.system = [\n { type: \"text\", text: request.systemPrompt, cache_control: { type: \"ephemeral\" } },\n ];\n } else {\n body.system = request.systemPrompt;\n }\n }\n if (tools) body.tools = tools;\n if (temperature !== undefined) body.temperature = temperature;\n\n const reqOptions: Record<string, unknown> = {};\n if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n let response: any;\n try {\n response = await this.client.messages.create(body, reqOptions);\n } catch (err: unknown) {\n const status = (err as any)?.status;\n const code = (err as any)?.code;\n const isNetwork =\n err instanceof TypeError ||\n (typeof code === 'string' &&\n ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n if (status === 429 || status === 529 || isNetwork) {\n throw new RetryableError(\n err instanceof Error ? err.message : String(err),\n err instanceof Error ? err : undefined,\n );\n }\n throw new Error(\n `Anthropic API error: ${err instanceof Error ? err.message : String(err)}`,\n err instanceof Error ? { cause: err } : undefined,\n );\n }\n\n const content: ContentBlock[] = [];\n for (const block of response.content) {\n if (block.type === 'text') {\n content.push({ type: 'text', text: block.text } as TextBlock);\n } else if (block.type === 'tool_use') {\n content.push({ type: 'tool_use', id: block.id, name: block.name, input: block.input } as ToolUseBlock);\n } else if (block.type === 'thinking') {\n content.push({ type: 'thinking', thinking: block.thinking } as ThinkingBlock);\n }\n }\n\n return {\n content,\n usage: this.mapUsage(response.usage),\n stopReason: this.mapStopReason(response.stop_reason),\n };\n }\n\n protected mapMessages(messages: ChatMessage[]): unknown[] {\n return messages.map((msg) => {\n if (msg.role === 'tool') {\n const textContent =\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n');\n\n return {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: msg.tool_use_id ?? '',\n content: textContent,\n ...(msg.is_error ? { is_error: true } : {}),\n },\n ],\n };\n }\n\n if (msg.role === 'assistant') {\n const content =\n typeof msg.content === 'string'\n ? [{ type: 'text', text: msg.content }]\n : msg.content.map((block) => this.mapOutgoingBlock(block));\n return { role: 'assistant', content };\n }\n\n if (typeof msg.content === 'string') {\n return { role: 'user', content: msg.content };\n }\n\n return {\n role: 'user',\n content: msg.content.map((block) => this.mapOutgoingBlock(block)),\n };\n });\n }\n\n protected mapTools(tools?: APIToolDefinition[]): unknown[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.input_schema,\n type: 'tool',\n }));\n }\n\n protected mapUsage(providerUsage: unknown): TokenUsage {\n const u = providerUsage as {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n return {\n inputTokens: u.input_tokens,\n outputTokens: u.output_tokens,\n cacheReadTokens: u.cache_read_input_tokens,\n cacheWriteTokens: u.cache_creation_input_tokens,\n };\n }\n\n private mapOutgoingBlock(block: ContentBlock): Record<string, unknown> {\n switch (block.type) {\n case 'text':\n return { type: 'text', text: block.text };\n case 'tool_use':\n return { type: 'tool_use', id: block.id, name: block.name, input: block.input };\n case 'thinking':\n return { type: 'thinking', thinking: block.thinking };\n default:\n return { type: 'text', text: '' };\n }\n }\n}\n","import type { ModelResponse, ContentBlock, TextBlock, ToolUseBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { BaseProvider, RetryableError } from './provider.js';\n\nexport interface OpenAIProviderConfig extends ProviderConfig {\n apiKey: string;\n baseURL?: string;\n organization?: string;\n}\n\nexport class OpenAIProvider extends BaseProvider {\n private readonly apiKey: string;\n private readonly baseURL?: string;\n private readonly organization?: string;\n private client: any = null;\n\n constructor(config: OpenAIProviderConfig) {\n super(config);\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL;\n this.organization = config.organization;\n }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const OpenAI = (await import('openai')).default;\n\n if (!this.client) {\n const opts: Record<string, unknown> = { apiKey: this.apiKey };\n if (this.baseURL) opts.baseURL = this.baseURL;\n if (this.organization) opts.organization = this.organization;\n this.client = new OpenAI(opts);\n }\n\n const mappedMessages = this.mapMessages(request.messages);\n const messages: unknown[] = [];\n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n messages.push(...mappedMessages);\n\n const tools = this.mapTools(request.tools);\n const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens;\n const temperature = request.temperature ?? this.temperature;\n\n const body: Record<string, unknown> = {\n model: this.model,\n messages,\n stream: false,\n };\n\n if (tools) body.tools = tools;\n if (maxTokens !== undefined) body.max_tokens = maxTokens;\n if (temperature !== undefined) body.temperature = temperature;\n\n const reqOptions: Record<string, unknown> = {};\n if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n let response: any;\n try {\n response = await this.client.chat.completions.create(body, reqOptions);\n } catch (err: unknown) {\n const status = (err as any)?.status;\n const code = (err as any)?.code;\n const isNetwork =\n err instanceof TypeError ||\n (typeof code === 'string' &&\n ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n if (status === 429 || isNetwork) {\n throw new RetryableError(\n err instanceof Error ? err.message : String(err),\n err instanceof Error ? err : undefined,\n );\n }\n throw new Error(\n `OpenAI API error: ${err instanceof Error ? err.message : String(err)}`,\n err instanceof Error ? { cause: err } : undefined,\n );\n }\n\n const choice = response.choices[0];\n const content: ContentBlock[] = [];\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content } as TextBlock);\n }\n\n if (choice.message.tool_calls) {\n for (const tc of choice.message.tool_calls) {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {}\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n input,\n } as ToolUseBlock);\n }\n }\n\n return {\n content,\n usage: this.mapUsage(response.usage),\n stopReason: this.mapStopReason(choice.finish_reason),\n };\n }\n\n protected mapMessages(messages: ChatMessage[]): unknown[] {\n return messages.map((msg) => {\n if (msg.role === 'tool') {\n return {\n role: 'tool',\n tool_call_id: msg.tool_use_id ?? '',\n content:\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n'),\n };\n }\n\n if (msg.role === 'assistant') {\n if (typeof msg.content === 'string') {\n return { role: 'assistant', content: msg.content };\n }\n\n const textParts = msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('');\n const toolCalls = msg.content\n .filter((b): b is ToolUseBlock => b.type === 'tool_use')\n .map((b) => ({\n id: b.id,\n type: 'function' as const,\n function: { name: b.name, arguments: JSON.stringify(b.input) },\n }));\n\n return {\n role: 'assistant',\n content: textParts || null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n };\n }\n\n return {\n role: 'user',\n content:\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n'),\n };\n });\n }\n\n protected mapTools(tools?: APIToolDefinition[]): unknown[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\n },\n }));\n }\n\n protected mapUsage(providerUsage: unknown): TokenUsage {\n const u = providerUsage as {\n prompt_tokens: number;\n completion_tokens: number;\n prompt_tokens_details?: { cached_tokens?: number };\n };\n return {\n inputTokens: u.prompt_tokens,\n outputTokens: u.completion_tokens,\n cacheReadTokens: u.prompt_tokens_details?.cached_tokens,\n };\n }\n}\n","import type { Provider, ChatRequest } from \"./provider.js\";\nimport { RetryableError } from \"./provider.js\";\nimport type { ModelResponse, ContentBlock } from \"../types.js\";\nimport type { APIToolDefinition } from \"../tools/tool.js\";\n\nexport interface OllamaProviderConfig {\n model: string;\n baseURL?: string;\n}\n\nexport class OllamaProvider implements Provider {\n readonly model: string;\n private readonly baseURL: string;\n\n constructor(config: OllamaProviderConfig) {\n this.model = config.model;\n this.baseURL = config.baseURL ?? \"http://localhost:11434/v1\";\n }\n\n async chat(request: ChatRequest): Promise<ModelResponse> {\n const messages: any[] = [];\n\n if (request.systemPrompt) {\n messages.push({ role: \"system\", content: request.systemPrompt });\n }\n\n for (const m of request.messages) {\n if (m.role === \"tool\") {\n messages.push({\n role: \"tool\" as const,\n tool_call_id: m.tool_use_id,\n content: m.content,\n });\n continue;\n }\n if (m.role === \"assistant\" && Array.isArray(m.content)) {\n const textParts = (m.content as ContentBlock[]).filter(b => b.type === \"text\");\n const toolParts = (m.content as ContentBlock[]).filter(b => b.type === \"tool_use\");\n\n const msg: any = {};\n if (textParts.length > 0) {\n msg.content = textParts.map(p => (p as { text: string }).text).join(\"\");\n }\n if (toolParts.length > 0) {\n msg.tool_calls = toolParts.map(b => {\n const tb = b as { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n return {\n id: tb.id,\n type: \"function\",\n function: { name: tb.name, arguments: JSON.stringify(tb.input) },\n };\n });\n }\n msg.role = \"assistant\";\n messages.push(msg);\n continue;\n }\n messages.push({ role: m.role, content: m.content });\n }\n\n const body: any = {\n model: this.model,\n messages,\n stream: false,\n };\n\n if (request.maxOutputTokens) {\n body.max_tokens = request.maxOutputTokens;\n }\n\n if (request.tools?.length) {\n body.tools = request.tools.map(t => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n }\n\n let response;\n try {\n response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: request.abortSignal,\n });\n } catch (err) {\n if (err instanceof RetryableError) throw err;\n throw new RetryableError(\n `Ollama connection failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n if (!response.ok) {\n const text = await response.text();\n if (response.status === 429 || response.status === 503 || response.status === 529) {\n throw new RetryableError(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n }\n throw new Error(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n }\n\n const data = await response.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error(\"Ollama returned no choices\");\n }\n\n const content: any[] = [];\n let stopReason: ModelResponse[\"stopReason\"] = \"end_turn\";\n\n if (choice.message?.content) {\n let text = choice.message.content;\n text = text.replace(/<think[^>]*>[\\s\\S]*?<\\/think>/gi, \"\").trim();\n text = text.replace(/<thinking>[\\s\\S]*?<\\/thinking>/gi, \"\").trim();\n text = text.replace(/\\[Thinking[^\\]]*\\]/gi, \"\").trim();\n if (text.length > 0) {\n content.push({ type: \"text\" as const, text });\n }\n }\n\n if (choice.message?.tool_calls?.length) {\n stopReason = \"tool_use\";\n for (const tc of choice.message.tool_calls) {\n let input: Record<string, unknown>;\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n input = {};\n }\n content.push({\n type: \"tool_use\" as const,\n id: tc.id,\n name: tc.function.name,\n input,\n });\n }\n }\n\n return {\n content,\n stopReason,\n usage: {\n inputTokens: data.usage?.prompt_tokens ?? 0,\n outputTokens: data.usage?.completion_tokens ?? 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n },\n };\n }\n}\n","import type { ModelResponse } from '../types.js';\nimport { BaseProvider, RetryableError } from './provider.js';\nimport type { Provider, ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport type { AnthropicProviderConfig } from './anthropic.js';\nimport { OpenAIProvider } from './openai.js';\nimport type { OpenAIProviderConfig } from './openai.js';\nimport { OllamaProvider } from './ollama.js';\nimport type { OllamaProviderConfig } from './ollama.js';\n\nexport { BaseProvider, RetryableError } from './provider.js';\nexport type { Provider, ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nexport { AnthropicProvider } from './anthropic.js';\nexport type { AnthropicProviderConfig } from './anthropic.js';\nexport { OpenAIProvider } from './openai.js';\nexport type { OpenAIProviderConfig } from './openai.js';\nexport { OllamaProvider } from './ollama.js';\nexport type { OllamaProviderConfig } from './ollama.js';\n\nexport function anthropic(config: AnthropicProviderConfig): AnthropicProvider {\n return new AnthropicProvider(config);\n}\n\nexport function openai(config: OpenAIProviderConfig): OpenAIProvider {\n return new OpenAIProvider(config);\n}\n\nexport function ollama(config: OllamaProviderConfig): OllamaProvider {\n return new OllamaProvider(config);\n}\n\nexport interface CustomProviderConfig {\n provider: 'custom';\n model: string;\n chat: (request: ChatRequest) => Promise<ModelResponse>;\n}\n\nclass CustomProvider implements Provider {\n readonly model: string;\n private readonly chatFn: (request: ChatRequest) => Promise<ModelResponse>;\n\n constructor(config: CustomProviderConfig) {\n this.model = config.model;\n this.chatFn = config.chat;\n }\n\n chat(request: ChatRequest): Promise<ModelResponse> {\n return this.chatFn(request);\n }\n}\n\nexport type OllamaProviderConfigWithProvider = OllamaProviderConfig & { provider: 'ollama' };\n\nexport function createProvider(\n config:\n | (AnthropicProviderConfig & { provider: 'anthropic' })\n | (OpenAIProviderConfig & { provider: 'openai' })\n | OllamaProviderConfigWithProvider\n | CustomProviderConfig,\n): Provider {\n switch (config.provider) {\n case 'anthropic':\n return new AnthropicProvider(config);\n case 'openai':\n return new OpenAIProvider(config);\n case 'ollama':\n return new OllamaProvider(config);\n case 'custom':\n return new CustomProvider(config);\n }\n}\n"],"mappings":"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","names":[]}