@yourgpt/llm-sdk 0.1.0 → 1.0.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.
Files changed (56) hide show
  1. package/README.md +61 -40
  2. package/dist/adapters/index.d.mts +4 -258
  3. package/dist/adapters/index.d.ts +4 -258
  4. package/dist/adapters/index.js +0 -113
  5. package/dist/adapters/index.js.map +1 -1
  6. package/dist/adapters/index.mjs +1 -112
  7. package/dist/adapters/index.mjs.map +1 -1
  8. package/dist/base-D_FyHFKj.d.mts +235 -0
  9. package/dist/base-D_FyHFKj.d.ts +235 -0
  10. package/dist/index.d.mts +209 -451
  11. package/dist/index.d.ts +209 -451
  12. package/dist/index.js +1905 -311
  13. package/dist/index.js.map +1 -1
  14. package/dist/index.mjs +1895 -309
  15. package/dist/index.mjs.map +1 -1
  16. package/dist/providers/anthropic/index.d.mts +61 -0
  17. package/dist/providers/anthropic/index.d.ts +61 -0
  18. package/dist/providers/anthropic/index.js +939 -0
  19. package/dist/providers/anthropic/index.js.map +1 -0
  20. package/dist/providers/anthropic/index.mjs +934 -0
  21. package/dist/providers/anthropic/index.mjs.map +1 -0
  22. package/dist/providers/azure/index.d.mts +38 -0
  23. package/dist/providers/azure/index.d.ts +38 -0
  24. package/dist/providers/azure/index.js +380 -0
  25. package/dist/providers/azure/index.js.map +1 -0
  26. package/dist/providers/azure/index.mjs +377 -0
  27. package/dist/providers/azure/index.mjs.map +1 -0
  28. package/dist/providers/google/index.d.mts +72 -0
  29. package/dist/providers/google/index.d.ts +72 -0
  30. package/dist/providers/google/index.js +790 -0
  31. package/dist/providers/google/index.js.map +1 -0
  32. package/dist/providers/google/index.mjs +785 -0
  33. package/dist/providers/google/index.mjs.map +1 -0
  34. package/dist/providers/ollama/index.d.mts +24 -0
  35. package/dist/providers/ollama/index.d.ts +24 -0
  36. package/dist/providers/ollama/index.js +235 -0
  37. package/dist/providers/ollama/index.js.map +1 -0
  38. package/dist/providers/ollama/index.mjs +232 -0
  39. package/dist/providers/ollama/index.mjs.map +1 -0
  40. package/dist/providers/openai/index.d.mts +82 -0
  41. package/dist/providers/openai/index.d.ts +82 -0
  42. package/dist/providers/openai/index.js +679 -0
  43. package/dist/providers/openai/index.js.map +1 -0
  44. package/dist/providers/openai/index.mjs +674 -0
  45. package/dist/providers/openai/index.mjs.map +1 -0
  46. package/dist/providers/xai/index.d.mts +78 -0
  47. package/dist/providers/xai/index.d.ts +78 -0
  48. package/dist/providers/xai/index.js +671 -0
  49. package/dist/providers/xai/index.js.map +1 -0
  50. package/dist/providers/xai/index.mjs +666 -0
  51. package/dist/providers/xai/index.mjs.map +1 -0
  52. package/dist/types-BBCZ3Fxy.d.mts +308 -0
  53. package/dist/types-CdORv1Yu.d.mts +338 -0
  54. package/dist/types-CdORv1Yu.d.ts +338 -0
  55. package/dist/types-DcoCaVVC.d.ts +308 -0
  56. package/package.json +34 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/providers/anthropic/provider.ts","../../../src/adapters/base.ts","../../../src/adapters/anthropic.ts","../../../src/providers/anthropic/index.ts"],"names":["client","formatMessagesForAnthropic","generateMessageId","ANTHROPIC_MODELS"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Anthropic Provider - Modern Pattern\n *\n * @example\n * ```ts\n * import { anthropic } from '@yourgpt/llm-sdk/anthropic';\n * import { generateText } from '@yourgpt/llm-sdk';\n *\n * const result = await generateText({\n * model: anthropic('claude-3-5-sonnet-20241022'),\n * prompt: 'Hello!',\n * });\n * ```\n */\n\nimport type {\n LanguageModel,\n DoGenerateParams,\n DoGenerateResult,\n StreamChunk,\n ToolCall,\n FinishReason,\n CoreMessage,\n} from \"../../core/types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface AnthropicModelConfig {\n vision: boolean;\n tools: boolean;\n thinking: boolean;\n pdf: boolean;\n maxTokens: number;\n}\n\nconst ANTHROPIC_MODELS: Record<string, AnthropicModelConfig> = {\n // Claude 4 series\n \"claude-sonnet-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-opus-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n\n // Claude 3.7 series\n \"claude-3-7-sonnet-20250219\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-7-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n\n // Claude 3.5 series\n \"claude-3-5-sonnet-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-5-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n\n // Claude 3 series\n \"claude-3-opus-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-sonnet-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-haiku-20240307\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n};\n\n// ============================================\n// Provider Options\n// ============================================\n\nexport interface AnthropicProviderOptions {\n /** API key (defaults to ANTHROPIC_API_KEY env var) */\n apiKey?: string;\n /** Base URL for API */\n baseURL?: string;\n /** Enable extended thinking */\n thinking?: {\n enabled: boolean;\n budgetTokens?: number;\n };\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Anthropic language model\n */\nexport function anthropic(\n modelId: string,\n options: AnthropicProviderOptions = {},\n): LanguageModel {\n const apiKey = options.apiKey ?? process.env.ANTHROPIC_API_KEY;\n\n // Lazy-load Anthropic client\n let client: any = null;\n async function getClient(): Promise<any> {\n if (!client) {\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n client = new Anthropic({\n apiKey,\n baseURL: options.baseURL,\n });\n }\n return client;\n }\n\n const modelConfig =\n ANTHROPIC_MODELS[modelId] ?? ANTHROPIC_MODELS[\"claude-3-5-sonnet-latest\"];\n\n return {\n provider: \"anthropic\",\n modelId,\n\n capabilities: {\n supportsVision: modelConfig.vision,\n supportsTools: modelConfig.tools,\n supportsStreaming: true,\n supportsJsonMode: false,\n supportsThinking: modelConfig.thinking,\n supportsPDF: modelConfig.pdf,\n maxTokens: modelConfig.maxTokens,\n supportedImageTypes: modelConfig.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n },\n\n async doGenerate(params: DoGenerateParams): Promise<DoGenerateResult> {\n const client = await getClient();\n\n const { system, messages } = formatMessagesForAnthropic(params.messages);\n\n const requestOptions: any = {\n model: modelId,\n max_tokens: params.maxTokens ?? 4096,\n system: system || undefined,\n messages,\n tools: params.tools as any,\n };\n\n if (params.temperature !== undefined) {\n requestOptions.temperature = params.temperature;\n }\n\n // Add thinking if enabled\n if (options.thinking?.enabled && modelConfig.thinking) {\n requestOptions.thinking = {\n type: \"enabled\",\n budget_tokens: options.thinking.budgetTokens ?? 10000,\n };\n }\n\n const response = await client.messages.create(requestOptions);\n\n // Parse response\n let text = \"\";\n const toolCalls: ToolCall[] = [];\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n text += block.text;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n });\n }\n }\n\n return {\n text,\n toolCalls,\n finishReason: mapFinishReason(response.stop_reason),\n usage: {\n promptTokens: response.usage?.input_tokens ?? 0,\n completionTokens: response.usage?.output_tokens ?? 0,\n totalTokens:\n (response.usage?.input_tokens ?? 0) +\n (response.usage?.output_tokens ?? 0),\n },\n rawResponse: response,\n };\n },\n\n async *doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk> {\n const client = await getClient();\n\n const { system, messages } = formatMessagesForAnthropic(params.messages);\n\n const requestOptions: any = {\n model: modelId,\n max_tokens: params.maxTokens ?? 4096,\n system: system || undefined,\n messages,\n tools: params.tools as any,\n };\n\n if (params.temperature !== undefined) {\n requestOptions.temperature = params.temperature;\n }\n\n if (options.thinking?.enabled && modelConfig.thinking) {\n requestOptions.thinking = {\n type: \"enabled\",\n budget_tokens: options.thinking.budgetTokens ?? 10000,\n };\n }\n\n const stream = await client.messages.stream(requestOptions);\n\n let currentToolUse: { id: string; name: string; input: string } | null =\n null;\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of stream) {\n if (params.signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Aborted\") };\n return;\n }\n\n switch (event.type) {\n case \"message_start\":\n if (event.message?.usage) {\n inputTokens = event.message.usage.input_tokens ?? 0;\n }\n break;\n\n case \"content_block_start\":\n if (event.content_block?.type === \"tool_use\") {\n currentToolUse = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: \"\",\n };\n }\n break;\n\n case \"content_block_delta\":\n if (event.delta?.type === \"text_delta\") {\n yield { type: \"text-delta\", text: event.delta.text };\n } else if (\n event.delta?.type === \"input_json_delta\" &&\n currentToolUse\n ) {\n currentToolUse.input += event.delta.partial_json;\n }\n break;\n\n case \"content_block_stop\":\n if (currentToolUse) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolUse.id,\n name: currentToolUse.name,\n args: JSON.parse(currentToolUse.input || \"{}\"),\n },\n };\n currentToolUse = null;\n }\n break;\n\n case \"message_delta\":\n if (event.usage) {\n outputTokens = event.usage.output_tokens ?? 0;\n }\n if (event.delta?.stop_reason) {\n yield {\n type: \"finish\",\n finishReason: mapFinishReason(event.delta.stop_reason),\n usage: {\n promptTokens: inputTokens,\n completionTokens: outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n };\n }\n break;\n }\n }\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction mapFinishReason(reason: string | null): FinishReason {\n switch (reason) {\n case \"end_turn\":\n case \"stop_sequence\":\n return \"stop\";\n case \"max_tokens\":\n return \"length\";\n case \"tool_use\":\n return \"tool-calls\";\n default:\n return \"unknown\";\n }\n}\n\nfunction formatMessagesForAnthropic(messages: CoreMessage[]): {\n system: string;\n messages: any[];\n} {\n let system = \"\";\n const formatted: any[] = [];\n const pendingToolResults: any[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system += (system ? \"\\n\" : \"\") + msg.content;\n continue;\n }\n\n // Flush pending tool results before adding assistant messages\n if (msg.role === \"assistant\" && pendingToolResults.length > 0) {\n formatted.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.toolCallId,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n if (msg.role === \"user\") {\n // Flush pending tool results first\n if (pendingToolResults.length > 0) {\n formatted.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.toolCallId,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n if (typeof msg.content === \"string\") {\n formatted.push({ role: \"user\", content: msg.content });\n } else {\n // Handle multimodal content\n const content: any[] = [];\n for (const part of msg.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text });\n } else if (part.type === \"image\") {\n const imageData =\n typeof part.image === \"string\"\n ? part.image\n : Buffer.from(part.image).toString(\"base64\");\n\n if (imageData.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: imageData },\n });\n } else {\n const base64 = imageData.startsWith(\"data:\")\n ? imageData.split(\",\")[1]\n : imageData;\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: part.mimeType ?? \"image/png\",\n data: base64,\n },\n });\n }\n }\n }\n formatted.push({ role: \"user\", content });\n }\n } else if (msg.role === \"assistant\") {\n const content: any[] = [];\n\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n for (const tc of msg.toolCalls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.args,\n });\n }\n }\n\n if (content.length > 0) {\n formatted.push({ role: \"assistant\", content });\n }\n } else if (msg.role === \"tool\") {\n pendingToolResults.push({\n toolCallId: msg.toolCallId,\n content: msg.content,\n });\n }\n }\n\n // Flush any remaining tool results\n if (pendingToolResults.length > 0) {\n formatted.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.toolCallId,\n content: tr.content,\n })),\n });\n }\n\n return { system, messages: formatted };\n}\n\nexport { anthropic as createAnthropic };\n","import type {\n Message,\n MessageAttachment,\n ActionDefinition,\n StreamEvent,\n LLMConfig,\n} from \"@yourgpt/copilot-sdk/core\";\n\n/**\n * Chat completion request\n */\nexport interface ChatCompletionRequest {\n /** Conversation messages */\n messages: Message[];\n /**\n * Raw provider-formatted messages (for agent loop with tool calls)\n * When provided, these are used instead of converting from Message[]\n * This allows passing messages with tool_calls and tool role\n */\n rawMessages?: Array<Record<string, unknown>>;\n /** Available actions/tools */\n actions?: ActionDefinition[];\n /** System prompt */\n systemPrompt?: string;\n /** LLM configuration overrides */\n config?: Partial<LLMConfig>;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Non-streaming completion result\n */\nexport interface CompletionResult {\n /** Text content */\n content: string;\n /** Tool calls */\n toolCalls: Array<{ id: string; name: string; args: Record<string, unknown> }>;\n /** Thinking content (if extended thinking enabled) */\n thinking?: string;\n /** Raw provider response for debugging */\n rawResponse: Record<string, unknown>;\n}\n\n/**\n * Base LLM adapter interface\n */\nexport interface LLMAdapter {\n /** Provider name */\n readonly provider: string;\n\n /** Model name */\n readonly model: string;\n\n /**\n * Stream a chat completion\n */\n stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent>;\n\n /**\n * Non-streaming chat completion (for debugging/comparison)\n */\n complete?(request: ChatCompletionRequest): Promise<CompletionResult>;\n}\n\n/**\n * Adapter factory function type\n */\nexport type AdapterFactory = (config: LLMConfig) => LLMAdapter;\n\n/**\n * Convert messages to provider format (simple text only)\n */\nexport function formatMessages(\n messages: Message[],\n systemPrompt?: string,\n): Array<{ role: string; content: string }> {\n const formatted: Array<{ role: string; content: string }> = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n // Add conversation messages\n for (const msg of messages) {\n formatted.push({\n role: msg.role,\n content: msg.content ?? \"\",\n });\n }\n\n return formatted;\n}\n\n/**\n * Convert ActionParameter to JSON Schema format recursively\n */\nfunction parameterToJsonSchema(param: {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: param.type,\n };\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.enum) {\n schema.enum = param.enum;\n }\n\n // Handle array items\n if (param.type === \"array\" && param.items) {\n schema.items = parameterToJsonSchema(\n param.items as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n );\n }\n\n // Handle nested object properties\n if (param.type === \"object\" && param.properties) {\n schema.properties = Object.fromEntries(\n Object.entries(param.properties).map(([key, prop]) => [\n key,\n parameterToJsonSchema(\n prop as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n ),\n ]),\n );\n }\n\n return schema;\n}\n\n/**\n * Convert actions to OpenAI tool format\n */\nexport function formatTools(actions: ActionDefinition[]): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return actions.map((action) => ({\n type: \"function\" as const,\n function: {\n name: action.name,\n description: action.description,\n parameters: {\n type: \"object\",\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n parameterToJsonSchema(param),\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n },\n }));\n}\n\n// ============================================\n// Vision/Multimodal Support\n// ============================================\n\n/**\n * Content block types for multimodal messages\n */\nexport type AnthropicContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n }\n | {\n type: \"document\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n };\n\nexport type OpenAIContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: {\n url: string;\n detail?: \"low\" | \"high\" | \"auto\";\n };\n };\n\n/**\n * Check if a message has image attachments\n * Supports both new format (metadata.attachments) and legacy (attachments)\n */\nexport function hasImageAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return attachments?.some((a) => a.type === \"image\") ?? false;\n}\n\n/**\n * Check if a message has media attachments (images or PDFs)\n */\nexport function hasMediaAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return (\n attachments?.some(\n (a) =>\n a.type === \"image\" ||\n (a.type === \"file\" && a.mimeType === \"application/pdf\"),\n ) ?? false\n );\n}\n\n/**\n * Convert MessageAttachment to Anthropic image content block\n *\n * Anthropic format:\n * {\n * type: \"image\",\n * source: {\n * type: \"base64\",\n * media_type: \"image/png\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicImage(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert MessageAttachment to OpenAI image_url content block\n *\n * OpenAI format:\n * {\n * type: \"image_url\",\n * image_url: {\n * url: \"data:image/png;base64,...\"\n * }\n * }\n */\nexport function attachmentToOpenAIImage(\n attachment: MessageAttachment,\n): OpenAIContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n let imageUrl: string;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Build data URI if not already one\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n return null;\n }\n\n return {\n type: \"image_url\",\n image_url: {\n url: imageUrl,\n detail: \"auto\",\n },\n };\n}\n\n/**\n * Convert MessageAttachment (PDF) to Anthropic document content block\n *\n * Anthropic format:\n * {\n * type: \"document\",\n * source: {\n * type: \"base64\",\n * media_type: \"application/pdf\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicDocument(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n // Only handle PDF files\n if (attachment.type !== \"file\" || attachment.mimeType !== \"application/pdf\") {\n return null;\n }\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert a Message to Anthropic multimodal content blocks\n */\nexport function messageToAnthropicContent(\n message: Message,\n): string | AnthropicContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no media attachments (images or PDFs), return simple string\n if (!hasMediaAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: AnthropicContentBlock[] = [];\n\n // Add media attachments first (Claude recommends media before text)\n if (attachments) {\n for (const attachment of attachments) {\n // Try image first\n const imageBlock = attachmentToAnthropicImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n continue;\n }\n // Try document (PDF)\n const docBlock = attachmentToAnthropicDocument(attachment);\n if (docBlock) {\n blocks.push(docBlock);\n }\n }\n }\n\n // Add text content\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n return blocks;\n}\n\n/**\n * Convert a Message to OpenAI multimodal content blocks\n */\nexport function messageToOpenAIContent(\n message: Message,\n): string | OpenAIContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no image attachments, return simple string\n if (!hasImageAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: OpenAIContentBlock[] = [];\n\n // Add text content first\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n // Add image attachments\n if (attachments) {\n for (const attachment of attachments) {\n const imageBlock = attachmentToOpenAIImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n }\n }\n }\n\n return blocks;\n}\n\n/**\n * Anthropic content block types (extended for tools)\n */\nexport type AnthropicToolUseBlock = {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n};\n\nexport type AnthropicToolResultBlock = {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n};\n\nexport type AnthropicMessageContent =\n | string\n | Array<\n AnthropicContentBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n >;\n\n/**\n * Format messages for Anthropic with full tool support\n * Handles: text, images, tool_use, and tool_result\n *\n * Key differences from OpenAI:\n * - tool_calls become tool_use blocks in assistant content\n * - tool results become tool_result blocks in user content\n */\nexport function formatMessagesForAnthropic(\n messages: Message[],\n systemPrompt?: string,\n): {\n system: string;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }>;\n} {\n const formatted: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }> = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n\n if (msg.role === \"system\") continue; // System handled separately\n\n if (msg.role === \"assistant\") {\n // Build content array for assistant\n const content: Array<AnthropicContentBlock | AnthropicToolUseBlock> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n formatted.push({\n role: \"assistant\",\n content:\n content.length === 1 && content[0].type === \"text\"\n ? (content[0] as { type: \"text\"; text: string }).text\n : content,\n });\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results go in user message as tool_result blocks\n // Group consecutive tool messages together\n const toolResults: AnthropicToolResultBlock[] = [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content ?? \"\",\n },\n ];\n\n // Look ahead for more consecutive tool messages\n while (i + 1 < messages.length && messages[i + 1].role === \"tool\") {\n i++;\n const nextTool = messages[i];\n if (nextTool.tool_call_id) {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: nextTool.tool_call_id,\n content: nextTool.content ?? \"\",\n });\n }\n }\n\n formatted.push({\n role: \"user\",\n content: toolResults,\n });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToAnthropicContent(msg),\n });\n }\n }\n\n return {\n system: systemPrompt || \"\",\n messages: formatted,\n };\n}\n\n/**\n * OpenAI message format with tool support\n */\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentBlock[] }\n | {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n }\n | { role: \"tool\"; content: string; tool_call_id: string };\n\n/**\n * Format messages for OpenAI with full tool support\n * Handles: text, images, tool_calls, and tool results\n */\nexport function formatMessagesForOpenAI(\n messages: Message[],\n systemPrompt?: string,\n): OpenAIMessage[] {\n const formatted: OpenAIMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n formatted.push({ role: \"system\", content: msg.content ?? \"\" });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToOpenAIContent(msg),\n });\n } else if (msg.role === \"assistant\") {\n const assistantMsg: OpenAIMessage = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n (assistantMsg as { tool_calls: typeof msg.tool_calls }).tool_calls =\n msg.tool_calls;\n }\n formatted.push(assistantMsg);\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n formatted.push({\n role: \"tool\",\n content: msg.content ?? \"\",\n tool_call_id: msg.tool_call_id,\n });\n }\n }\n\n return formatted;\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport {\n formatMessagesForAnthropic,\n messageToAnthropicContent,\n type AnthropicContentBlock,\n} from \"./base\";\n\n/**\n * Extended thinking configuration\n */\nexport interface ThinkingConfig {\n type: \"enabled\";\n /** Budget for thinking tokens (minimum 1024) */\n budgetTokens?: number;\n}\n\n/**\n * Anthropic adapter configuration\n */\nexport interface AnthropicAdapterConfig extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n /** Enable extended thinking (for Claude 3.7 Sonnet, Claude 4) */\n thinking?: ThinkingConfig;\n}\n\n/**\n * Anthropic LLM Adapter\n *\n * Supports: Claude 3.5 Sonnet, Claude 3 Opus, Claude 3 Haiku, etc.\n */\nexport class AnthropicAdapter implements LLMAdapter {\n readonly provider = \"anthropic\";\n readonly model: string;\n\n private client: any; // Anthropic client (lazy loaded)\n private config: AnthropicAdapterConfig;\n\n constructor(config: AnthropicAdapterConfig) {\n this.config = config;\n this.model = config.model || \"claude-3-5-sonnet-latest\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make @anthropic-ai/sdk optional\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n this.client = new Anthropic({\n apiKey: this.config.apiKey,\n });\n }\n return this.client;\n }\n\n /**\n * Convert OpenAI-style messages to Anthropic format\n *\n * OpenAI format:\n * - { role: \"assistant\", content: \"...\", tool_calls: [...] }\n * - { role: \"tool\", tool_call_id: \"...\", content: \"...\" }\n *\n * Anthropic format:\n * - { role: \"assistant\", content: [{ type: \"text\", text: \"...\" }, { type: \"tool_use\", id: \"...\", name: \"...\", input: {...} }] }\n * - { role: \"user\", content: [{ type: \"tool_result\", tool_use_id: \"...\", content: \"...\" }] }\n */\n private convertToAnthropicMessages(\n rawMessages: Array<Record<string, unknown>>,\n ): Array<Record<string, unknown>> {\n const messages: Array<Record<string, unknown>> = [];\n const pendingToolResults: Array<{ tool_use_id: string; content: string }> =\n [];\n\n for (const msg of rawMessages) {\n // Skip system messages (handled separately)\n if (msg.role === \"system\") continue;\n\n if (msg.role === \"assistant\") {\n // CRITICAL: Insert pending tool results BEFORE adding any assistant message\n // Anthropic requires: assistant(tool_use) → user(tool_result) → assistant(response)\n // Without this, the sequence becomes: assistant(tool_use) → assistant(response) → user(tool_result)\n // which violates Anthropic's API requirements and causes error:\n // \"tool_use ids were found without tool_result blocks immediately after\"\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n // Convert assistant message with potential tool_calls\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (\n msg.content &&\n typeof msg.content === \"string\" &&\n msg.content.trim()\n ) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n const toolCalls = msg.tool_calls as\n | Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>\n | undefined;\n\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n let input = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n // Keep empty object if parse fails\n }\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input,\n });\n }\n }\n\n // Only add if there's content\n if (content.length > 0) {\n messages.push({ role: \"assistant\", content });\n }\n } else if (msg.role === \"tool\") {\n // Collect tool results to be bundled into a user message\n pendingToolResults.push({\n tool_use_id: msg.tool_call_id as string,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n } else if (msg.role === \"user\") {\n // First, flush any pending tool results as a user message\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n // Check if message has attachments (images)\n if (\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0\n ) {\n // Convert to Anthropic multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content && typeof msg.content === \"string\") {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add attachments (images, PDFs)\n for (const attachment of msg.attachments as Array<{\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n if (attachment.url) {\n // Use URL directly (cloud storage) - Anthropic supports URL sources\n content.push({\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n // Use base64 data\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n // Extract base64 from data URL\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n });\n }\n } else if (\n attachment.type === \"file\" &&\n attachment.mimeType === \"application/pdf\"\n ) {\n // PDF documents - Anthropic uses \"document\" type\n if (attachment.url) {\n content.push({\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n });\n }\n }\n }\n\n messages.push({ role: \"user\", content });\n } else {\n // Add user message without attachments\n messages.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n }\n }\n }\n\n // Flush any remaining tool results\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n }\n\n return messages;\n }\n\n /**\n * Build common request options for both streaming and non-streaming\n */\n private buildRequestOptions(request: ChatCompletionRequest): {\n options: Record<string, unknown>;\n messages: Array<Record<string, unknown>>;\n } {\n // Extract system message\n const systemMessage = request.systemPrompt || \"\";\n\n // Use raw messages if provided (for agent loop with tool calls)\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Convert OpenAI-style messages to Anthropic format\n messages = this.convertToAnthropicMessages(request.rawMessages);\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n const formatted = formatMessagesForAnthropic(request.messages, undefined);\n messages = formatted.messages as Array<Record<string, unknown>>;\n }\n\n // Convert actions to Anthropic tool format\n const tools = request.actions?.map((action) => ({\n name: action.name,\n description: action.description,\n input_schema: {\n type: \"object\" as const,\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n {\n type: param.type,\n description: param.description,\n enum: param.enum,\n },\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n }));\n\n // Build request options\n const options: Record<string, unknown> = {\n model: request.config?.model || this.model,\n max_tokens: request.config?.maxTokens || this.config.maxTokens || 4096,\n system: systemMessage,\n messages,\n tools: tools?.length ? tools : undefined,\n };\n\n // Add thinking configuration if enabled\n if (this.config.thinking?.type === \"enabled\") {\n options.thinking = {\n type: \"enabled\",\n budget_tokens: this.config.thinking.budgetTokens || 10000,\n };\n }\n\n return { options, messages };\n }\n\n /**\n * Non-streaming completion (for debugging/comparison with original studio-ai)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n // Ensure non-streaming mode\n const nonStreamingOptions = {\n ...options,\n stream: false as const,\n } as Record<string, unknown> & { stream: false };\n\n try {\n const response = await client.messages.create(nonStreamingOptions);\n\n // Parse response\n let content = \"\";\n let thinking = \"\";\n const toolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n content += block.text;\n } else if (block.type === \"thinking\") {\n thinking += (block as { thinking: string }).thinking;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n });\n }\n }\n\n return {\n content,\n toolCalls,\n thinking: thinking || undefined,\n rawResponse: response as Record<string, unknown>,\n };\n } catch (error) {\n throw error;\n }\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n const stream = await client.messages.stream(options);\n\n let currentToolUse: {\n id: string;\n name: string;\n input: string;\n } | null = null;\n\n let isInThinkingBlock = false;\n\n for await (const event of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n switch (event.type) {\n case \"content_block_start\":\n if (event.content_block.type === \"tool_use\") {\n currentToolUse = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: \"\",\n };\n yield {\n type: \"action:start\",\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n } else if (event.content_block.type === \"thinking\") {\n // Start of thinking block\n isInThinkingBlock = true;\n yield { type: \"thinking:start\" };\n }\n break;\n\n case \"content_block_delta\":\n if (event.delta.type === \"text_delta\") {\n yield { type: \"message:delta\", content: event.delta.text };\n } else if (event.delta.type === \"thinking_delta\") {\n // Thinking content delta\n yield { type: \"thinking:delta\", content: event.delta.thinking };\n } else if (\n event.delta.type === \"input_json_delta\" &&\n currentToolUse\n ) {\n currentToolUse.input += event.delta.partial_json;\n }\n break;\n\n case \"content_block_stop\":\n if (currentToolUse) {\n yield {\n type: \"action:args\",\n id: currentToolUse.id,\n args: currentToolUse.input,\n };\n currentToolUse = null;\n }\n if (isInThinkingBlock) {\n yield { type: \"thinking:end\" };\n isInThinkingBlock = false;\n }\n break;\n\n case \"message_stop\":\n break;\n }\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"ANTHROPIC_ERROR\",\n };\n }\n }\n}\n\n/**\n * Create Anthropic adapter\n */\nexport function createAnthropicAdapter(\n config: AnthropicAdapterConfig,\n): AnthropicAdapter {\n return new AnthropicAdapter(config);\n}\n","/**\n * Anthropic Provider\n *\n * Modern pattern: anthropic('claude-3-5-sonnet') returns a LanguageModel\n * Legacy pattern: createAnthropic({ apiKey }) returns an AIProvider\n */\n\n// NEW: Modern pattern - anthropic() function\nexport { anthropic, createAnthropic as createAnthropicModel } from \"./provider\";\nexport type { AnthropicProviderOptions } from \"./provider\";\n\n// LEGACY: Keep existing createAnthropic for backward compatibility\nimport { createAnthropicAdapter } from \"../../adapters/anthropic\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n AnthropicProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n thinking: boolean;\n maxTokens: number;\n}\n\nconst ANTHROPIC_MODELS: Record<string, ModelCapabilities> = {\n // Claude 4 series (latest)\n \"claude-sonnet-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 64000,\n },\n \"claude-opus-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 32000,\n },\n\n // Claude 3.5 series\n \"claude-3-5-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-sonnet-20241022\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n\n // Claude 3 series\n \"claude-3-opus-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-opus-20240229\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-sonnet-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-haiku-20240307\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Anthropic provider\n *\n * @example\n * ```typescript\n * const anthropic = createAnthropic({\n * apiKey: '...',\n * thinkingBudget: 10000, // Enable extended thinking\n * });\n * const adapter = anthropic.languageModel('claude-sonnet-4-20250514');\n * const caps = anthropic.getCapabilities('claude-sonnet-4-20250514');\n * ```\n */\nexport function createAnthropic(\n config: AnthropicProviderConfig = {},\n): AIProvider {\n const apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY ?? \"\";\n\n return {\n name: \"anthropic\",\n supportedModels: Object.keys(ANTHROPIC_MODELS),\n\n languageModel(modelId: string) {\n return createAnthropicAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n thinking: config.thinkingBudget\n ? { type: \"enabled\", budgetTokens: config.thinkingBudget }\n : undefined,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model =\n ANTHROPIC_MODELS[modelId] ??\n ANTHROPIC_MODELS[\"claude-3-5-sonnet-latest\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: model.thinking,\n supportsStreaming: true,\n supportsPDF: true, // Claude supports PDFs\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ],\n supportsJsonMode: false, // Anthropic doesn't have JSON mode\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createAnthropicProvider = createAnthropic;\n"]}