agentic-flow 2.0.1-alpha.2 → 2.0.1-alpha.20

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 (218) hide show
  1. package/CHANGELOG.md +352 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentdb/controllers/EmbeddingService.d.ts +37 -0
  4. package/dist/agentdb/controllers/EmbeddingService.d.ts.map +1 -0
  5. package/dist/agentdb/controllers/EmbeddingService.js +1 -0
  6. package/dist/agentdb/controllers/EmbeddingService.js.map +1 -0
  7. package/dist/billing/mcp/tools.d.ts.map +1 -1
  8. package/dist/billing/mcp/tools.js +2 -0
  9. package/dist/billing/mcp/tools.js.map +1 -1
  10. package/dist/cli/commands/hooks.d.ts +18 -0
  11. package/dist/cli/commands/hooks.d.ts.map +1 -0
  12. package/dist/cli/commands/hooks.js +755 -0
  13. package/dist/cli/commands/hooks.js.map +1 -0
  14. package/dist/cli-proxy.d.ts +1 -1
  15. package/dist/cli-proxy.d.ts.map +1 -1
  16. package/dist/cli-proxy.js +28 -1
  17. package/dist/cli-proxy.js.map +1 -1
  18. package/dist/core/agentdb-fast.js +3 -3
  19. package/dist/core/agentdb-fast.js.map +1 -1
  20. package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
  21. package/dist/core/agentdb-wrapper-enhanced.js +32 -17
  22. package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
  23. package/dist/core/attention-native.d.ts +1 -0
  24. package/dist/core/attention-native.d.ts.map +1 -1
  25. package/dist/core/attention-native.js +6 -1
  26. package/dist/core/attention-native.js.map +1 -1
  27. package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
  28. package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
  29. package/dist/intelligence/EmbeddingCache.d.ts +112 -0
  30. package/dist/intelligence/EmbeddingCache.d.ts.map +1 -0
  31. package/dist/intelligence/EmbeddingCache.js +624 -0
  32. package/dist/intelligence/EmbeddingCache.js.map +1 -0
  33. package/dist/intelligence/EmbeddingService.d.ts +380 -0
  34. package/dist/intelligence/EmbeddingService.d.ts.map +1 -0
  35. package/dist/intelligence/EmbeddingService.js +1484 -0
  36. package/dist/intelligence/EmbeddingService.js.map +1 -0
  37. package/dist/intelligence/IntelligenceStore.d.ts +168 -0
  38. package/dist/intelligence/IntelligenceStore.d.ts.map +1 -0
  39. package/dist/intelligence/IntelligenceStore.js +364 -0
  40. package/dist/intelligence/IntelligenceStore.js.map +1 -0
  41. package/dist/intelligence/RuVectorIntelligence.d.ts +362 -0
  42. package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -0
  43. package/dist/intelligence/RuVectorIntelligence.js +853 -0
  44. package/dist/intelligence/RuVectorIntelligence.js.map +1 -0
  45. package/dist/intelligence/embedding-benchmark.d.ts +7 -0
  46. package/dist/intelligence/embedding-benchmark.d.ts.map +1 -0
  47. package/dist/intelligence/embedding-benchmark.js +155 -0
  48. package/dist/intelligence/embedding-benchmark.js.map +1 -0
  49. package/dist/intelligence/index.d.ts +14 -0
  50. package/dist/intelligence/index.d.ts.map +1 -0
  51. package/dist/intelligence/index.js +14 -0
  52. package/dist/intelligence/index.js.map +1 -0
  53. package/dist/llm/RuvLLMOrchestrator.d.ts +184 -0
  54. package/dist/llm/RuvLLMOrchestrator.d.ts.map +1 -0
  55. package/dist/llm/RuvLLMOrchestrator.js +442 -0
  56. package/dist/llm/RuvLLMOrchestrator.js.map +1 -0
  57. package/dist/llm/index.d.ts +9 -0
  58. package/dist/llm/index.d.ts.map +1 -0
  59. package/dist/llm/index.js +8 -0
  60. package/dist/llm/index.js.map +1 -0
  61. package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
  62. package/dist/mcp/claudeFlowSdkServer.js +86 -21
  63. package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
  64. package/dist/mcp/fastmcp/servers/hooks-server.d.ts +15 -0
  65. package/dist/mcp/fastmcp/servers/hooks-server.d.ts.map +1 -0
  66. package/dist/mcp/fastmcp/servers/hooks-server.js +63 -0
  67. package/dist/mcp/fastmcp/servers/hooks-server.js.map +1 -0
  68. package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts +20 -0
  69. package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts.map +1 -0
  70. package/dist/mcp/fastmcp/tools/hooks/benchmark.js +110 -0
  71. package/dist/mcp/fastmcp/tools/hooks/benchmark.js.map +1 -0
  72. package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts +7 -0
  73. package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts.map +1 -0
  74. package/dist/mcp/fastmcp/tools/hooks/build-agents.js +276 -0
  75. package/dist/mcp/fastmcp/tools/hooks/build-agents.js.map +1 -0
  76. package/dist/mcp/fastmcp/tools/hooks/explain.d.ts +6 -0
  77. package/dist/mcp/fastmcp/tools/hooks/explain.d.ts.map +1 -0
  78. package/dist/mcp/fastmcp/tools/hooks/explain.js +164 -0
  79. package/dist/mcp/fastmcp/tools/hooks/explain.js.map +1 -0
  80. package/dist/mcp/fastmcp/tools/hooks/index.d.ts +28 -0
  81. package/dist/mcp/fastmcp/tools/hooks/index.d.ts.map +1 -0
  82. package/dist/mcp/fastmcp/tools/hooks/index.js +59 -0
  83. package/dist/mcp/fastmcp/tools/hooks/index.js.map +1 -0
  84. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts +307 -0
  85. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts.map +1 -0
  86. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +714 -0
  87. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -0
  88. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts +58 -0
  89. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts.map +1 -0
  90. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js +425 -0
  91. package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js.map +1 -0
  92. package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts +6 -0
  93. package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts.map +1 -0
  94. package/dist/mcp/fastmcp/tools/hooks/metrics.js +137 -0
  95. package/dist/mcp/fastmcp/tools/hooks/metrics.js.map +1 -0
  96. package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts +7 -0
  97. package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts.map +1 -0
  98. package/dist/mcp/fastmcp/tools/hooks/post-command.js +91 -0
  99. package/dist/mcp/fastmcp/tools/hooks/post-command.js.map +1 -0
  100. package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts +12 -0
  101. package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts.map +1 -0
  102. package/dist/mcp/fastmcp/tools/hooks/post-edit.js +146 -0
  103. package/dist/mcp/fastmcp/tools/hooks/post-edit.js.map +1 -0
  104. package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts +7 -0
  105. package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts.map +1 -0
  106. package/dist/mcp/fastmcp/tools/hooks/pre-command.js +70 -0
  107. package/dist/mcp/fastmcp/tools/hooks/pre-command.js.map +1 -0
  108. package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts +14 -0
  109. package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts.map +1 -0
  110. package/dist/mcp/fastmcp/tools/hooks/pre-edit.js +121 -0
  111. package/dist/mcp/fastmcp/tools/hooks/pre-edit.js.map +1 -0
  112. package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts +7 -0
  113. package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts.map +1 -0
  114. package/dist/mcp/fastmcp/tools/hooks/pretrain.js +171 -0
  115. package/dist/mcp/fastmcp/tools/hooks/pretrain.js.map +1 -0
  116. package/dist/mcp/fastmcp/tools/hooks/route.d.ts +12 -0
  117. package/dist/mcp/fastmcp/tools/hooks/route.d.ts.map +1 -0
  118. package/dist/mcp/fastmcp/tools/hooks/route.js +267 -0
  119. package/dist/mcp/fastmcp/tools/hooks/route.js.map +1 -0
  120. package/dist/mcp/fastmcp/tools/hooks/shared.d.ts +46 -0
  121. package/dist/mcp/fastmcp/tools/hooks/shared.d.ts.map +1 -0
  122. package/dist/mcp/fastmcp/tools/hooks/shared.js +159 -0
  123. package/dist/mcp/fastmcp/tools/hooks/shared.js.map +1 -0
  124. package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts +7 -0
  125. package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts.map +1 -0
  126. package/dist/mcp/fastmcp/tools/hooks/transfer.js +151 -0
  127. package/dist/mcp/fastmcp/tools/hooks/transfer.js.map +1 -0
  128. package/dist/mcp/tools/agent-booster-tools.d.ts +10 -1
  129. package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
  130. package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
  131. package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
  132. package/dist/mcp/tools/sona-tools.js +15 -3
  133. package/dist/mcp/tools/sona-tools.js.map +1 -1
  134. package/dist/memory/SharedMemoryPool.d.ts +16 -3
  135. package/dist/memory/SharedMemoryPool.d.ts.map +1 -1
  136. package/dist/memory/SharedMemoryPool.js +33 -1
  137. package/dist/memory/SharedMemoryPool.js.map +1 -1
  138. package/dist/middleware/auth.middleware.d.ts +114 -0
  139. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  140. package/dist/middleware/auth.middleware.js +222 -0
  141. package/dist/middleware/auth.middleware.js.map +1 -0
  142. package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
  143. package/dist/optimizations/agent-booster-migration.js.map +1 -1
  144. package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
  145. package/dist/proxy/anthropic-to-gemini.js.map +1 -1
  146. package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
  147. package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
  148. package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
  149. package/dist/proxy/anthropic-to-requesty.js.map +1 -1
  150. package/dist/proxy/quic-proxy.d.ts +0 -1
  151. package/dist/proxy/quic-proxy.d.ts.map +1 -1
  152. package/dist/proxy/quic-proxy.js +2 -1
  153. package/dist/proxy/quic-proxy.js.map +1 -1
  154. package/dist/reasoningbank/AdvancedMemory.d.ts.map +1 -1
  155. package/dist/reasoningbank/AdvancedMemory.js +12 -1
  156. package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
  157. package/dist/reasoningbank/HybridBackend.d.ts +9 -0
  158. package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
  159. package/dist/reasoningbank/HybridBackend.js +48 -4
  160. package/dist/reasoningbank/HybridBackend.js.map +1 -1
  161. package/dist/reasoningbank/backend-selector.d.ts +1 -1
  162. package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
  163. package/dist/reasoningbank/backend-selector.js.map +1 -1
  164. package/dist/reasoningbank/index-new.d.ts +0 -6
  165. package/dist/reasoningbank/index-new.d.ts.map +1 -1
  166. package/dist/reasoningbank/index-new.js +9 -7
  167. package/dist/reasoningbank/index-new.js.map +1 -1
  168. package/dist/reasoningbank/index.d.ts +1 -6
  169. package/dist/reasoningbank/index.d.ts.map +1 -1
  170. package/dist/reasoningbank/index.js +10 -7
  171. package/dist/reasoningbank/index.js.map +1 -1
  172. package/dist/router/providers/onnx-local.d.ts.map +1 -1
  173. package/dist/router/providers/onnx-local.js +3 -1
  174. package/dist/router/providers/onnx-local.js.map +1 -1
  175. package/dist/routing/CircuitBreakerRouter.d.ts +187 -0
  176. package/dist/routing/CircuitBreakerRouter.d.ts.map +1 -0
  177. package/dist/routing/CircuitBreakerRouter.js +460 -0
  178. package/dist/routing/CircuitBreakerRouter.js.map +1 -0
  179. package/dist/routing/SemanticRouter.d.ts +164 -0
  180. package/dist/routing/SemanticRouter.d.ts.map +1 -0
  181. package/dist/routing/SemanticRouter.js +291 -0
  182. package/dist/routing/SemanticRouter.js.map +1 -0
  183. package/dist/routing/index.d.ts +12 -0
  184. package/dist/routing/index.d.ts.map +1 -0
  185. package/dist/routing/index.js +10 -0
  186. package/dist/routing/index.js.map +1 -0
  187. package/dist/services/embedding-service.d.ts.map +1 -1
  188. package/dist/services/embedding-service.js +5 -2
  189. package/dist/services/embedding-service.js.map +1 -1
  190. package/dist/services/sona-agent-training.js +1 -1
  191. package/dist/services/sona-agent-training.js.map +1 -1
  192. package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
  193. package/dist/services/sona-agentdb-integration.js +10 -5
  194. package/dist/services/sona-agentdb-integration.js.map +1 -1
  195. package/dist/services/sona-service.d.ts +6 -6
  196. package/dist/services/sona-service.d.ts.map +1 -1
  197. package/dist/services/sona-service.js +3 -1
  198. package/dist/services/sona-service.js.map +1 -1
  199. package/dist/utils/agentdb-runtime-patch.d.ts +1 -0
  200. package/dist/utils/agentdb-runtime-patch.d.ts.map +1 -1
  201. package/dist/utils/agentdb-runtime-patch.js +97 -2
  202. package/dist/utils/agentdb-runtime-patch.js.map +1 -1
  203. package/dist/utils/audit-logger.d.ts +115 -0
  204. package/dist/utils/audit-logger.d.ts.map +1 -0
  205. package/dist/utils/audit-logger.js +228 -0
  206. package/dist/utils/audit-logger.js.map +1 -0
  207. package/dist/utils/cli.d.ts +1 -1
  208. package/dist/utils/cli.d.ts.map +1 -1
  209. package/dist/utils/cli.js +5 -0
  210. package/dist/utils/cli.js.map +1 -1
  211. package/dist/utils/input-validator.d.ts +116 -0
  212. package/dist/utils/input-validator.d.ts.map +1 -0
  213. package/dist/utils/input-validator.js +299 -0
  214. package/dist/utils/input-validator.js.map +1 -0
  215. package/dist/utils/rate-limiter.js +2 -2
  216. package/dist/utils/rate-limiter.js.map +1 -1
  217. package/package.json +14 -3
  218. package/scripts/postinstall.js +72 -0
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-to-gemini.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-gemini.ts"],"names":[],"mappings":"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","sourcesContent":["// Anthropic to Gemini Proxy Server\n// Converts Anthropic API format to Google Gemini format\nimport express, { Request, Response, NextFunction } from 'express';\nimport { logger } from '../utils/logger.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string; [key: string]: any }>;\n}\n\ninterface AnthropicTool {\n name: string;\n description?: string;\n input_schema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n}\n\ninterface AnthropicRequest {\n model?: string;\n messages: AnthropicMessage[];\n max_tokens?: number;\n temperature?: number;\n system?: string;\n stream?: boolean;\n tools?: AnthropicTool[];\n [key: string]: any;\n}\n\ninterface GeminiPart {\n text: string;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model';\n parts: GeminiPart[];\n}\n\ninterface GeminiTool {\n functionDeclarations: Array<{\n name: string;\n description?: string;\n parameters?: any;\n }>;\n}\n\ninterface GeminiRequest {\n contents: GeminiContent[];\n generationConfig?: {\n temperature?: number;\n maxOutputTokens?: number;\n [key: string]: any;\n };\n tools?: GeminiTool[];\n}\n\nexport class AnthropicToGeminiProxy {\n private app: express.Application;\n private geminiApiKey: string;\n private geminiBaseUrl: string;\n private defaultModel: string;\n\n constructor(config: {\n geminiApiKey: string;\n geminiBaseUrl?: string;\n defaultModel?: string;\n }) {\n this.app = express();\n this.geminiApiKey = config.geminiApiKey;\n this.geminiBaseUrl = config.geminiBaseUrl || 'https://generativelanguage.googleapis.com/v1beta';\n this.defaultModel = config.defaultModel || 'gemini-2.0-flash-exp';\n\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n private setupMiddleware(): void {\n // Parse JSON bodies\n this.app.use(express.json({ limit: '50mb' }));\n\n // Logging middleware\n this.app.use((req: Request, res: Response, next: NextFunction) => {\n logger.debug('Gemini proxy request', {\n method: req.method,\n path: req.path,\n headers: Object.keys(req.headers)\n });\n next();\n });\n }\n\n private setupRoutes(): void {\n // Health check\n this.app.get('/health', (req: Request, res: Response) => {\n res.json({ status: 'ok', service: 'anthropic-to-gemini-proxy' });\n });\n\n // Anthropic Messages API → Gemini generateContent\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n try {\n const anthropicReq: AnthropicRequest = req.body;\n\n // Convert Anthropic format to Gemini format\n const geminiReq = this.convertAnthropicToGemini(anthropicReq);\n\n logger.info('Converting Anthropic request to Gemini', {\n anthropicModel: anthropicReq.model,\n geminiModel: this.defaultModel,\n messageCount: geminiReq.contents.length,\n stream: anthropicReq.stream,\n apiKeyPresent: !!this.geminiApiKey,\n apiKeyPrefix: this.geminiApiKey?.substring(0, 10)\n });\n\n // Determine endpoint based on streaming\n const endpoint = anthropicReq.stream ? 'streamGenerateContent' : 'generateContent';\n // BUG FIX: Add &alt=sse for streaming to get Server-Sent Events format\n const streamParam = anthropicReq.stream ? '&alt=sse' : '';\n const url = `${this.geminiBaseUrl}/models/${this.defaultModel}:${endpoint}?key=${this.geminiApiKey}${streamParam}`;\n\n // Forward to Gemini\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(geminiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n logger.error('Gemini API error', { status: response.status, error });\n return res.status(response.status).json({\n error: {\n type: 'api_error',\n message: error\n }\n });\n }\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let chunkCount = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n chunkCount++;\n logger.info('Gemini stream chunk received', { chunkCount, chunkLength: chunk.length, chunkPreview: chunk.substring(0, 200) });\n\n const anthropicChunk = this.convertGeminiStreamToAnthropic(chunk);\n logger.info('Anthropic stream chunk generated', { chunkCount, anthropicLength: anthropicChunk.length, anthropicPreview: anthropicChunk.substring(0, 200) });\n\n res.write(anthropicChunk);\n }\n\n logger.info('Gemini stream complete', { totalChunks: chunkCount });\n res.end();\n } else {\n // Non-streaming response\n const geminiRes = await response.json();\n\n // DEBUG: Log raw Gemini response\n logger.info('Raw Gemini API response', {\n hasResponse: !!geminiRes,\n hasCandidates: !!geminiRes.candidates,\n candidatesLength: geminiRes.candidates?.length,\n firstCandidate: geminiRes.candidates?.[0],\n fullResponse: JSON.stringify(geminiRes).substring(0, 500)\n });\n\n const anthropicRes = this.convertGeminiToAnthropic(geminiRes);\n\n logger.info('Gemini proxy response sent', {\n model: this.defaultModel,\n usage: anthropicRes.usage,\n contentBlocks: anthropicRes.content?.length,\n hasText: anthropicRes.content?.some((c: any) => c.type === 'text'),\n firstContent: anthropicRes.content?.[0]\n });\n\n res.json(anthropicRes);\n }\n } catch (error: any) {\n logger.error('Gemini proxy error', { error: error.message, stack: error.stack });\n res.status(500).json({\n error: {\n type: 'proxy_error',\n message: error.message\n }\n });\n }\n });\n\n // Fallback for other Anthropic API endpoints\n this.app.use((req: Request, res: Response) => {\n logger.warn('Unsupported endpoint', { path: req.path, method: req.method });\n res.status(404).json({\n error: {\n type: 'not_found',\n message: `Endpoint ${req.path} not supported by Gemini proxy`\n }\n });\n });\n }\n\n private convertAnthropicToGemini(anthropicReq: AnthropicRequest): GeminiRequest {\n const contents: GeminiContent[] = [];\n\n // Add system message as first user message if present\n // Gemini doesn't have a dedicated system role, so we prepend it to the first user message\n let systemPrefix = '';\n if (anthropicReq.system) {\n systemPrefix = `System: ${anthropicReq.system}\\n\\n`;\n }\n\n // Add tool instructions for Gemini to understand file operations\n // Since Gemini doesn't have native tool calling, we instruct it to use structured XML-like commands\n const toolInstructions = `\nIMPORTANT: You have access to file system operations through structured commands. Use these exact formats:\n\n<file_write path=\"filename.ext\">\ncontent here\n</file_write>\n\n<file_read path=\"filename.ext\"/>\n\n<bash_command>\ncommand here\n</bash_command>\n\nWhen you need to create, edit, or read files, use these structured commands in your response.\nThe system will automatically execute these commands and provide results.\n\n`;\n\n // Prepend tool instructions to system prompt\n if (systemPrefix) {\n systemPrefix = toolInstructions + systemPrefix;\n } else {\n systemPrefix = toolInstructions;\n }\n\n // Convert Anthropic messages to Gemini format\n for (let i = 0; i < anthropicReq.messages.length; i++) {\n const msg = anthropicReq.messages[i];\n let text: string;\n\n if (typeof msg.content === 'string') {\n text = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n text = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n text = '';\n }\n\n // Add system prefix to first user message\n if (i === 0 && msg.role === 'user' && systemPrefix) {\n text = systemPrefix + text;\n }\n\n contents.push({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: [{ text }]\n });\n }\n\n const geminiReq: GeminiRequest = {\n contents\n };\n\n // Add generation config if temperature or max_tokens specified\n if (anthropicReq.temperature !== undefined || anthropicReq.max_tokens !== undefined) {\n geminiReq.generationConfig = {};\n\n if (anthropicReq.temperature !== undefined) {\n geminiReq.generationConfig.temperature = anthropicReq.temperature;\n }\n\n if (anthropicReq.max_tokens !== undefined) {\n geminiReq.generationConfig.maxOutputTokens = anthropicReq.max_tokens;\n }\n }\n\n // Convert MCP/Anthropic tools to Gemini tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n geminiReq.tools = [{\n functionDeclarations: anthropicReq.tools.map(tool => {\n // Clean schema: Remove fields that Gemini doesn't support\n const cleanSchema = (schema: any): any => {\n if (!schema || typeof schema !== 'object') return schema;\n\n const {\n $schema,\n additionalProperties,\n exclusiveMinimum,\n exclusiveMaximum,\n ...rest\n } = schema;\n const cleaned: any = { ...rest };\n\n // Recursively clean nested objects\n if (cleaned.properties) {\n cleaned.properties = Object.fromEntries(\n Object.entries(cleaned.properties).map(([key, value]: [string, any]) => [\n key,\n cleanSchema(value)\n ])\n );\n }\n\n // Clean items if present\n if (cleaned.items) {\n cleaned.items = cleanSchema(cleaned.items);\n }\n\n return cleaned;\n };\n\n return {\n name: tool.name,\n description: tool.description || '',\n parameters: cleanSchema(tool.input_schema) || {\n type: 'object',\n properties: {},\n required: []\n }\n };\n })\n }];\n\n logger.info('Forwarding MCP tools to Gemini', {\n toolCount: anthropicReq.tools.length,\n toolNames: anthropicReq.tools.map(t => t.name)\n });\n }\n\n return geminiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertGeminiToAnthropic(geminiRes: any): any {\n const candidate = geminiRes.candidates?.[0];\n if (!candidate) {\n logger.error('No candidates in Gemini response', { geminiRes });\n throw new Error('No candidates in Gemini response');\n }\n\n const content = candidate.content;\n const parts = content?.parts || [];\n\n logger.info('Converting Gemini to Anthropic', {\n hasParts: !!parts,\n partsCount: parts.length,\n partTypes: parts.map((p: any) => Object.keys(p))\n });\n\n // Extract text and function calls\n let rawText = '';\n const functionCalls: any[] = [];\n\n for (const part of parts) {\n if (part.text) {\n rawText += part.text;\n logger.info('Found text in part', { textLength: part.text.length, textPreview: part.text.substring(0, 100) });\n }\n if (part.functionCall) {\n functionCalls.push(part.functionCall);\n }\n }\n\n logger.info('Extracted content from Gemini', {\n rawTextLength: rawText.length,\n functionCallsCount: functionCalls.length,\n rawTextPreview: rawText.substring(0, 200)\n });\n\n // Parse structured commands from Gemini's text response\n const { cleanText, toolUses } = this.parseStructuredCommands(rawText);\n\n // Build content array with text and tool uses\n const contentBlocks: any[] = [];\n\n if (cleanText) {\n contentBlocks.push({\n type: 'text',\n text: cleanText\n });\n }\n\n // Add tool uses from structured commands\n contentBlocks.push(...toolUses);\n\n // Add tool uses from Gemini function calls (MCP tools)\n if (functionCalls.length > 0) {\n for (const functionCall of functionCalls) {\n contentBlocks.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n name: functionCall.name,\n input: functionCall.args || {}\n });\n }\n\n logger.info('Converted Gemini function calls to Anthropic format', {\n functionCallCount: functionCalls.length,\n functionNames: functionCalls.map((fc: any) => fc.name)\n });\n }\n\n return {\n id: `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: this.defaultModel,\n content: contentBlocks.length > 0 ? contentBlocks : [\n {\n type: 'text',\n text: rawText\n }\n ],\n stop_reason: this.mapFinishReason(candidate.finishReason),\n usage: {\n input_tokens: geminiRes.usageMetadata?.promptTokenCount || 0,\n output_tokens: geminiRes.usageMetadata?.candidatesTokenCount || 0\n }\n };\n }\n\n private convertGeminiStreamToAnthropic(chunk: string): string {\n // Gemini streaming returns Server-Sent Events format: \"data: {json}\"\n const lines = chunk.split('\\n').filter(line => line.trim());\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n try {\n // Parse SSE format: \"data: {json}\"\n if (line.startsWith('data: ')) {\n const jsonStr = line.substring(6); // Remove \"data: \" prefix\n const parsed = JSON.parse(jsonStr);\n const candidate = parsed.candidates?.[0];\n const text = candidate?.content?.parts?.[0]?.text;\n\n if (text) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text }\n })}\\n\\n`\n );\n }\n\n // Check for finish\n if (candidate?.finishReason) {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n }\n }\n } catch (e) {\n // Ignore parse errors\n logger.debug('Failed to parse Gemini stream chunk', { line, error: (e as Error).message });\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'STOP': 'end_turn',\n 'MAX_TOKENS': 'max_tokens',\n 'SAFETY': 'stop_sequence',\n 'RECITATION': 'stop_sequence',\n 'OTHER': 'end_turn'\n };\n return mapping[reason || 'STOP'] || 'end_turn';\n }\n\n public start(port: number): void {\n this.app.listen(port, () => {\n logger.info('Anthropic to Gemini proxy started', {\n port,\n geminiBaseUrl: this.geminiBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\n✅ Gemini Proxy running at http://localhost:${port}`);\n console.log(` Gemini Base URL: ${this.geminiBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}\\n`);\n });\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3001');\n const geminiApiKey = process.env.GOOGLE_GEMINI_API_KEY;\n\n if (!geminiApiKey) {\n console.error('❌ Error: GOOGLE_GEMINI_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToGeminiProxy({\n geminiApiKey,\n geminiBaseUrl: process.env.GEMINI_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n}\n"]}
1
+ {"version":3,"file":"anthropic-to-gemini.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-gemini.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,wDAAwD;AACxD,OAAO,OAA4C,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAwE5C,MAAM,OAAO,sBAAsB;IACzB,GAAG,CAAsB;IACzB,YAAY,CAAS;IACrB,aAAa,CAAS;IACtB,YAAY,CAAS;IAE7B,YAAY,MAIX;QACC,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,kDAAkD,CAAC;QAChG,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,sBAAsB,CAAC;QAElE,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEO,eAAe;QACrB,oBAAoB;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9C,qBAAqB;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YAC/D,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACnC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,eAAe;QACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACtD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,kDAAkD;QAClD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;YAClE,IAAI,CAAC;gBACH,MAAM,YAAY,GAAqB,GAAG,CAAC,IAAI,CAAC;gBAEhD,4CAA4C;gBAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;gBAE9D,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;oBACpD,cAAc,EAAE,YAAY,CAAC,KAAK;oBAClC,WAAW,EAAE,IAAI,CAAC,YAAY;oBAC9B,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;oBACvC,MAAM,EAAE,YAAY,CAAC,MAAM;oBAC3B,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;oBAClC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;iBAClD,CAAC,CAAC;gBAEH,wCAAwC;gBACxC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,iBAAiB,CAAC;gBACnF,uEAAuE;gBACvE,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,WAAW,IAAI,CAAC,YAAY,IAAI,QAAQ,QAAQ,IAAI,CAAC,YAAY,GAAG,WAAW,EAAE,CAAC;gBAEnH,oBAAoB;gBACpB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAChC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;qBACnC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;iBAChC,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACpC,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;oBACrE,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;wBACtC,KAAK,EAAE;4BACL,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,KAAK;yBACf;qBACF,CAAC,CAAC;gBACL,CAAC;gBAED,oCAAoC;gBACpC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;oBACxB,kBAAkB;oBAClB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;oBACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;oBAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;oBAE1C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;oBAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBACtC,CAAC;oBAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;oBAClC,IAAI,UAAU,GAAG,CAAC,CAAC;oBACnB,OAAO,IAAI,EAAE,CAAC;wBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;wBAC5C,IAAI,IAAI;4BAAE,MAAM;wBAEhB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBACpC,UAAU,EAAE,CAAC;wBACb,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;wBAE9H,MAAM,cAAc,GAAG,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;wBAClE,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;wBAE5J,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBAC5B,CAAC;oBAED,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,GAAG,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,yBAAyB;oBACzB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAoB,CAAC;oBAE1D,iCAAiC;oBACjC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;wBACrC,WAAW,EAAE,CAAC,CAAC,SAAS;wBACxB,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU;wBACrC,gBAAgB,EAAE,SAAS,CAAC,UAAU,EAAE,MAAM;wBAC9C,cAAc,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;wBACzC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;qBAC1D,CAAC,CAAC;oBAEH,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;oBAE9D,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;wBACxC,KAAK,EAAE,IAAI,CAAC,YAAY;wBACxB,KAAK,EAAE,YAAY,CAAC,KAAK;wBACzB,aAAa,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM;wBAC3C,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;wBAClE,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;qBACxC,CAAC,CAAC;oBAEH,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE;wBACL,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,KAAK,CAAC,OAAO;qBACvB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6CAA6C;QAC7C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,YAAY,GAAG,CAAC,IAAI,gCAAgC;iBAC9D;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,wBAAwB,CAAC,YAA8B;QAC7D,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,sDAAsD;QACtD,0FAA0F;QAC1F,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,YAAY,GAAG,WAAW,YAAY,CAAC,MAAM,MAAM,CAAC;QACtD,CAAC;QAED,iEAAiE;QACjE,oGAAoG;QACpG,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;CAgB5B,CAAC;QAEE,6CAA6C;QAC7C,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,GAAG,gBAAgB,GAAG,YAAY,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,gBAAgB,CAAC;QAClC,CAAC;QAED,8CAA8C;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,IAAY,CAAC;YAEjB,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACrB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,mCAAmC;gBACnC,IAAI,GAAG,GAAG,CAAC,OAAO;qBACf,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;qBACtC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBACxB,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,EAAE,CAAC;YACZ,CAAC;YAED,0CAA0C;YAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,YAAY,EAAE,CAAC;gBACnD,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC;YAC7B,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBACjD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;aAClB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAkB;YAC/B,QAAQ;SACT,CAAC;QAEF,+DAA+D;QAC/D,IAAI,YAAY,CAAC,WAAW,KAAK,SAAS,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpF,SAAS,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAEhC,IAAI,YAAY,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC3C,SAAS,CAAC,gBAAgB,CAAC,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC;YACpE,CAAC;YAED,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC1C,SAAS,CAAC,gBAAgB,CAAC,eAAe,GAAG,YAAY,CAAC,UAAU,CAAC;YACvE,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,SAAS,CAAC,KAAK,GAAG,CAAC;oBACjB,oBAAoB,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;wBAClD,0DAA0D;wBAC1D,MAAM,WAAW,GAAG,CAAC,MAAW,EAAO,EAAE;4BACvC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;gCAAE,OAAO,MAAM,CAAC;4BAEzD,MAAM,EACJ,OAAO,EACP,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,GAAG,IAAI,EACR,GAAG,MAAM,CAAC;4BACX,MAAM,OAAO,GAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;4BAEjC,mCAAmC;4BACnC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gCACvB,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CACrC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAgB,EAAE,EAAE,CAAC;oCACtE,GAAG;oCACH,WAAW,CAAC,KAAK,CAAC;iCACnB,CAAC,CACH,CAAC;4BACJ,CAAC;4BAED,yBAAyB;4BACzB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gCAClB,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;4BAC7C,CAAC;4BAED,OAAO,OAAO,CAAC;wBACjB,CAAC,CAAC;wBAEF,OAAO;4BACL,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;4BACnC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI;gCAC5C,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE,EAAE;gCACd,QAAQ,EAAE,EAAE;6BACb;yBACF,CAAC;oBACJ,CAAC,CAAC;iBACH,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;gBAC5C,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM;gBACpC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAI1C,MAAM,QAAQ,GAAU,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,4BAA4B;QAC5B,MAAM,cAAc,GAAG,sDAAsD,CAAC;QAC9E,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;oBACnB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACzB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,2BAA2B;QAC3B,MAAM,aAAa,GAAG,+BAA+B,CAAC;QACtD,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;iBACpB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,sBAAsB;QACtB,MAAM,SAAS,GAAG,2CAA2C,CAAC;QAC9D,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACzB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC;IAEO,wBAAwB,CAAC,SAAc;QAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QAEnC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;YAC5C,QAAQ,EAAE,CAAC,CAAC,KAAK;YACjB,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjD,CAAC,CAAC;QAEH,kCAAkC;QAClC,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,MAAM,aAAa,GAAU,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAChH,CAAC;YACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE;YAC3C,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,kBAAkB,EAAE,aAAa,CAAC,MAAM;YACxC,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;SAC1C,CAAC,CAAC;QAEH,wDAAwD;QACxD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEtE,8CAA8C;QAC9C,MAAM,aAAa,GAAU,EAAE,CAAC;QAEhC,IAAI,SAAS,EAAE,CAAC;YACd,aAAa,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;QACL,CAAC;QAED,yCAAyC;QACzC,aAAa,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAEhC,uDAAuD;QACvD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;gBACzC,aAAa,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;oBACnE,IAAI,EAAE,YAAY,CAAC,IAAI;oBACvB,KAAK,EAAE,YAAY,CAAC,IAAI,IAAI,EAAE;iBAC/B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,qDAAqD,EAAE;gBACjE,iBAAiB,EAAE,aAAa,CAAC,MAAM;gBACvC,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,OAAO,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;gBAClD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO;iBACd;aACF;YACD,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,YAAY,CAAC;YACzD,KAAK,EAAE;gBACL,YAAY,EAAE,SAAS,CAAC,aAAa,EAAE,gBAAgB,IAAI,CAAC;gBAC5D,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,oBAAoB,IAAI,CAAC;aAClE;SACF,CAAC;IACJ,CAAC;IAEO,8BAA8B,CAAC,KAAa;QAClD,qEAAqE;QACrE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,mCAAmC;gBACnC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB;oBAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACnC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;oBAElD,IAAI,IAAI,EAAE,CAAC;wBACT,eAAe,CAAC,IAAI,CAClB,qCAAqC,IAAI,CAAC,SAAS,CAAC;4BAClD,IAAI,EAAE,qBAAqB;4BAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE;yBACpC,CAAC,MAAM,CACT,CAAC;oBACJ,CAAC;oBAED,mBAAmB;oBACnB,IAAI,SAAS,EAAE,YAAY,EAAE,CAAC;wBAC5B,eAAe,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;oBAC5D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,sBAAsB;gBACtB,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAEO,eAAe,CAAC,MAAe;QACrC,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,UAAU;YAClB,YAAY,EAAE,YAAY;YAC1B,QAAQ,EAAE,eAAe;YACzB,YAAY,EAAE,eAAe;YAC7B,OAAO,EAAE,UAAU;SACpB,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,IAAY;QACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;gBAC/C,IAAI;gBACJ,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,kBAAkB;AAClB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAEvD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC;QACvC,YAAY;QACZ,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QAC1C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;KAC1E,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC","sourcesContent":["// Anthropic to Gemini Proxy Server\n// Converts Anthropic API format to Google Gemini format\nimport express, { Request, Response, NextFunction } from 'express';\nimport { logger } from '../utils/logger.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string; [key: string]: any }>;\n}\n\ninterface AnthropicTool {\n name: string;\n description?: string;\n input_schema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n}\n\ninterface AnthropicRequest {\n model?: string;\n messages: AnthropicMessage[];\n max_tokens?: number;\n temperature?: number;\n system?: string;\n stream?: boolean;\n tools?: AnthropicTool[];\n [key: string]: any;\n}\n\ninterface GeminiPart {\n text: string;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model';\n parts: GeminiPart[];\n}\n\ninterface GeminiTool {\n functionDeclarations: Array<{\n name: string;\n description?: string;\n parameters?: any;\n }>;\n}\n\ninterface GeminiRequest {\n contents: GeminiContent[];\n generationConfig?: {\n temperature?: number;\n maxOutputTokens?: number;\n [key: string]: any;\n };\n tools?: GeminiTool[];\n}\n\ninterface GeminiResponse {\n candidates?: Array<{\n content?: {\n parts?: Array<{ text?: string }>;\n role?: string;\n };\n finishReason?: string;\n safetyRatings?: any[];\n }>;\n promptFeedback?: any;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n };\n}\n\nexport class AnthropicToGeminiProxy {\n private app: express.Application;\n private geminiApiKey: string;\n private geminiBaseUrl: string;\n private defaultModel: string;\n\n constructor(config: {\n geminiApiKey: string;\n geminiBaseUrl?: string;\n defaultModel?: string;\n }) {\n this.app = express();\n this.geminiApiKey = config.geminiApiKey;\n this.geminiBaseUrl = config.geminiBaseUrl || 'https://generativelanguage.googleapis.com/v1beta';\n this.defaultModel = config.defaultModel || 'gemini-2.0-flash-exp';\n\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n private setupMiddleware(): void {\n // Parse JSON bodies\n this.app.use(express.json({ limit: '50mb' }));\n\n // Logging middleware\n this.app.use((req: Request, res: Response, next: NextFunction) => {\n logger.debug('Gemini proxy request', {\n method: req.method,\n path: req.path,\n headers: Object.keys(req.headers)\n });\n next();\n });\n }\n\n private setupRoutes(): void {\n // Health check\n this.app.get('/health', (req: Request, res: Response) => {\n res.json({ status: 'ok', service: 'anthropic-to-gemini-proxy' });\n });\n\n // Anthropic Messages API → Gemini generateContent\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n try {\n const anthropicReq: AnthropicRequest = req.body;\n\n // Convert Anthropic format to Gemini format\n const geminiReq = this.convertAnthropicToGemini(anthropicReq);\n\n logger.info('Converting Anthropic request to Gemini', {\n anthropicModel: anthropicReq.model,\n geminiModel: this.defaultModel,\n messageCount: geminiReq.contents.length,\n stream: anthropicReq.stream,\n apiKeyPresent: !!this.geminiApiKey,\n apiKeyPrefix: this.geminiApiKey?.substring(0, 10)\n });\n\n // Determine endpoint based on streaming\n const endpoint = anthropicReq.stream ? 'streamGenerateContent' : 'generateContent';\n // BUG FIX: Add &alt=sse for streaming to get Server-Sent Events format\n const streamParam = anthropicReq.stream ? '&alt=sse' : '';\n const url = `${this.geminiBaseUrl}/models/${this.defaultModel}:${endpoint}?key=${this.geminiApiKey}${streamParam}`;\n\n // Forward to Gemini\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(geminiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n logger.error('Gemini API error', { status: response.status, error });\n return res.status(response.status).json({\n error: {\n type: 'api_error',\n message: error\n }\n });\n }\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let chunkCount = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n chunkCount++;\n logger.info('Gemini stream chunk received', { chunkCount, chunkLength: chunk.length, chunkPreview: chunk.substring(0, 200) });\n\n const anthropicChunk = this.convertGeminiStreamToAnthropic(chunk);\n logger.info('Anthropic stream chunk generated', { chunkCount, anthropicLength: anthropicChunk.length, anthropicPreview: anthropicChunk.substring(0, 200) });\n\n res.write(anthropicChunk);\n }\n\n logger.info('Gemini stream complete', { totalChunks: chunkCount });\n res.end();\n } else {\n // Non-streaming response\n const geminiRes = await response.json() as GeminiResponse;\n\n // DEBUG: Log raw Gemini response\n logger.info('Raw Gemini API response', {\n hasResponse: !!geminiRes,\n hasCandidates: !!geminiRes.candidates,\n candidatesLength: geminiRes.candidates?.length,\n firstCandidate: geminiRes.candidates?.[0],\n fullResponse: JSON.stringify(geminiRes).substring(0, 500)\n });\n\n const anthropicRes = this.convertGeminiToAnthropic(geminiRes);\n\n logger.info('Gemini proxy response sent', {\n model: this.defaultModel,\n usage: anthropicRes.usage,\n contentBlocks: anthropicRes.content?.length,\n hasText: anthropicRes.content?.some((c: any) => c.type === 'text'),\n firstContent: anthropicRes.content?.[0]\n });\n\n res.json(anthropicRes);\n }\n } catch (error: any) {\n logger.error('Gemini proxy error', { error: error.message, stack: error.stack });\n res.status(500).json({\n error: {\n type: 'proxy_error',\n message: error.message\n }\n });\n }\n });\n\n // Fallback for other Anthropic API endpoints\n this.app.use((req: Request, res: Response) => {\n logger.warn('Unsupported endpoint', { path: req.path, method: req.method });\n res.status(404).json({\n error: {\n type: 'not_found',\n message: `Endpoint ${req.path} not supported by Gemini proxy`\n }\n });\n });\n }\n\n private convertAnthropicToGemini(anthropicReq: AnthropicRequest): GeminiRequest {\n const contents: GeminiContent[] = [];\n\n // Add system message as first user message if present\n // Gemini doesn't have a dedicated system role, so we prepend it to the first user message\n let systemPrefix = '';\n if (anthropicReq.system) {\n systemPrefix = `System: ${anthropicReq.system}\\n\\n`;\n }\n\n // Add tool instructions for Gemini to understand file operations\n // Since Gemini doesn't have native tool calling, we instruct it to use structured XML-like commands\n const toolInstructions = `\nIMPORTANT: You have access to file system operations through structured commands. Use these exact formats:\n\n<file_write path=\"filename.ext\">\ncontent here\n</file_write>\n\n<file_read path=\"filename.ext\"/>\n\n<bash_command>\ncommand here\n</bash_command>\n\nWhen you need to create, edit, or read files, use these structured commands in your response.\nThe system will automatically execute these commands and provide results.\n\n`;\n\n // Prepend tool instructions to system prompt\n if (systemPrefix) {\n systemPrefix = toolInstructions + systemPrefix;\n } else {\n systemPrefix = toolInstructions;\n }\n\n // Convert Anthropic messages to Gemini format\n for (let i = 0; i < anthropicReq.messages.length; i++) {\n const msg = anthropicReq.messages[i];\n let text: string;\n\n if (typeof msg.content === 'string') {\n text = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n text = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n text = '';\n }\n\n // Add system prefix to first user message\n if (i === 0 && msg.role === 'user' && systemPrefix) {\n text = systemPrefix + text;\n }\n\n contents.push({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: [{ text }]\n });\n }\n\n const geminiReq: GeminiRequest = {\n contents\n };\n\n // Add generation config if temperature or max_tokens specified\n if (anthropicReq.temperature !== undefined || anthropicReq.max_tokens !== undefined) {\n geminiReq.generationConfig = {};\n\n if (anthropicReq.temperature !== undefined) {\n geminiReq.generationConfig.temperature = anthropicReq.temperature;\n }\n\n if (anthropicReq.max_tokens !== undefined) {\n geminiReq.generationConfig.maxOutputTokens = anthropicReq.max_tokens;\n }\n }\n\n // Convert MCP/Anthropic tools to Gemini tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n geminiReq.tools = [{\n functionDeclarations: anthropicReq.tools.map(tool => {\n // Clean schema: Remove fields that Gemini doesn't support\n const cleanSchema = (schema: any): any => {\n if (!schema || typeof schema !== 'object') return schema;\n\n const {\n $schema,\n additionalProperties,\n exclusiveMinimum,\n exclusiveMaximum,\n ...rest\n } = schema;\n const cleaned: any = { ...rest };\n\n // Recursively clean nested objects\n if (cleaned.properties) {\n cleaned.properties = Object.fromEntries(\n Object.entries(cleaned.properties).map(([key, value]: [string, any]) => [\n key,\n cleanSchema(value)\n ])\n );\n }\n\n // Clean items if present\n if (cleaned.items) {\n cleaned.items = cleanSchema(cleaned.items);\n }\n\n return cleaned;\n };\n\n return {\n name: tool.name,\n description: tool.description || '',\n parameters: cleanSchema(tool.input_schema) || {\n type: 'object',\n properties: {},\n required: []\n }\n };\n })\n }];\n\n logger.info('Forwarding MCP tools to Gemini', {\n toolCount: anthropicReq.tools.length,\n toolNames: anthropicReq.tools.map(t => t.name)\n });\n }\n\n return geminiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertGeminiToAnthropic(geminiRes: any): any {\n const candidate = geminiRes.candidates?.[0];\n if (!candidate) {\n logger.error('No candidates in Gemini response', { geminiRes });\n throw new Error('No candidates in Gemini response');\n }\n\n const content = candidate.content;\n const parts = content?.parts || [];\n\n logger.info('Converting Gemini to Anthropic', {\n hasParts: !!parts,\n partsCount: parts.length,\n partTypes: parts.map((p: any) => Object.keys(p))\n });\n\n // Extract text and function calls\n let rawText = '';\n const functionCalls: any[] = [];\n\n for (const part of parts) {\n if (part.text) {\n rawText += part.text;\n logger.info('Found text in part', { textLength: part.text.length, textPreview: part.text.substring(0, 100) });\n }\n if (part.functionCall) {\n functionCalls.push(part.functionCall);\n }\n }\n\n logger.info('Extracted content from Gemini', {\n rawTextLength: rawText.length,\n functionCallsCount: functionCalls.length,\n rawTextPreview: rawText.substring(0, 200)\n });\n\n // Parse structured commands from Gemini's text response\n const { cleanText, toolUses } = this.parseStructuredCommands(rawText);\n\n // Build content array with text and tool uses\n const contentBlocks: any[] = [];\n\n if (cleanText) {\n contentBlocks.push({\n type: 'text',\n text: cleanText\n });\n }\n\n // Add tool uses from structured commands\n contentBlocks.push(...toolUses);\n\n // Add tool uses from Gemini function calls (MCP tools)\n if (functionCalls.length > 0) {\n for (const functionCall of functionCalls) {\n contentBlocks.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n name: functionCall.name,\n input: functionCall.args || {}\n });\n }\n\n logger.info('Converted Gemini function calls to Anthropic format', {\n functionCallCount: functionCalls.length,\n functionNames: functionCalls.map((fc: any) => fc.name)\n });\n }\n\n return {\n id: `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: this.defaultModel,\n content: contentBlocks.length > 0 ? contentBlocks : [\n {\n type: 'text',\n text: rawText\n }\n ],\n stop_reason: this.mapFinishReason(candidate.finishReason),\n usage: {\n input_tokens: geminiRes.usageMetadata?.promptTokenCount || 0,\n output_tokens: geminiRes.usageMetadata?.candidatesTokenCount || 0\n }\n };\n }\n\n private convertGeminiStreamToAnthropic(chunk: string): string {\n // Gemini streaming returns Server-Sent Events format: \"data: {json}\"\n const lines = chunk.split('\\n').filter(line => line.trim());\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n try {\n // Parse SSE format: \"data: {json}\"\n if (line.startsWith('data: ')) {\n const jsonStr = line.substring(6); // Remove \"data: \" prefix\n const parsed = JSON.parse(jsonStr);\n const candidate = parsed.candidates?.[0];\n const text = candidate?.content?.parts?.[0]?.text;\n\n if (text) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text }\n })}\\n\\n`\n );\n }\n\n // Check for finish\n if (candidate?.finishReason) {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n }\n }\n } catch (e) {\n // Ignore parse errors\n logger.debug('Failed to parse Gemini stream chunk', { line, error: (e as Error).message });\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'STOP': 'end_turn',\n 'MAX_TOKENS': 'max_tokens',\n 'SAFETY': 'stop_sequence',\n 'RECITATION': 'stop_sequence',\n 'OTHER': 'end_turn'\n };\n return mapping[reason || 'STOP'] || 'end_turn';\n }\n\n public start(port: number): void {\n this.app.listen(port, () => {\n logger.info('Anthropic to Gemini proxy started', {\n port,\n geminiBaseUrl: this.geminiBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\n✅ Gemini Proxy running at http://localhost:${port}`);\n console.log(` Gemini Base URL: ${this.geminiBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}\\n`);\n });\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3001');\n const geminiApiKey = process.env.GOOGLE_GEMINI_API_KEY;\n\n if (!geminiApiKey) {\n console.error('❌ Error: GOOGLE_GEMINI_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToGeminiProxy({\n geminiApiKey,\n geminiBaseUrl: process.env.GEMINI_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-to-openrouter.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-openrouter.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;AAqD3F,qBAAa,0BAA0B;IACrC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAoB;gBAE7B,MAAM,EAAE;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,iBAAiB,CAAC;KAClC;IAoBD,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,WAAW;YAsEL,aAAa;YAsBb,mBAAmB;YA8GnB,qBAAqB;YA8CrB,cAAc;IAqB5B,OAAO,CAAC,wBAAwB;IA8JhC,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,wBAAwB;IAmGhC,OAAO,CAAC,8BAA8B;IAkCtC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAUhB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAkBjC"}
1
+ {"version":3,"file":"anthropic-to-openrouter.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-openrouter.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;AA4E3F,qBAAa,0BAA0B;IACrC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAoB;gBAE7B,MAAM,EAAE;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,iBAAiB,CAAC;KAClC;IAoBD,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,WAAW;YAsEL,aAAa;YAsBb,mBAAmB;YA8GnB,qBAAqB;YA8CrB,cAAc;IAqB5B,OAAO,CAAC,wBAAwB;IA8JhC,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,wBAAwB;IAmGhC,OAAO,CAAC,8BAA8B;IAkCtC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAUhB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAkBjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-to-openrouter.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-openrouter.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,qDAAqD;AACrD,OAAO,OAA4C,MAAM,SAAS,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAoE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACpI,OAAO,EAAqB,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAY,MAAM,qBAAqB,CAAC;AAoD/E,MAAM,OAAO,0BAA0B;IAC7B,GAAG,CAAsB;IACzB,gBAAgB,CAAS;IACzB,iBAAiB,CAAS;IAC1B,YAAY,CAAS;IACrB,YAAY,CAAqB;IAEzC,YAAY,MAKX;QACC,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,8BAA8B,CAAC;QACpF,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,kCAAkC,CAAC;QAC9E,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAExC,gBAAgB;QAChB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBACjD,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB;gBACtD,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB;aAC9C,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEO,eAAe;QACrB,oBAAoB;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9C,qBAAqB;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YAC/D,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE;gBAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,eAAe;QACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACtD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,uDAAuD;QACvD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;YAClE,IAAI,CAAC;gBACH,MAAM,YAAY,GAAqB,GAAG,CAAC,IAAI,CAAC;gBAEhD,kDAAkD;gBAClD,sEAAsE;gBACtE,MAAM,aAAa,GAAG,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ;oBAC3D,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;oBACvC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;wBACpC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;wBACvD,CAAC,CAAC,SAAS,CAAC;gBAEd,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;oBAChD,KAAK,EAAE,YAAY,CAAC,KAAK;oBACzB,YAAY,EAAE,aAAa;oBAC3B,UAAU,EAAE,OAAO,YAAY,CAAC,MAAM;oBACtC,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM;oBAC3C,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;oBAC1C,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;oBACrD,SAAS,EAAE,YAAY,CAAC,UAAU;oBAClC,WAAW,EAAE,YAAY,CAAC,WAAW;oBACrC,MAAM,EAAE,YAAY,CAAC,MAAM;iBAC5B,CAAC,CAAC;gBAEH,uCAAuC;gBACvC,IAAI,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9D,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;wBACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,cAAc,EAAE,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;4BAClD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;4BACpC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;qBACvD,CAAC,CAAC;gBACL,CAAC;gBAED,qDAAqD;gBACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;gBAC3D,IAAI,MAAM,EAAE,CAAC;oBACX,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC1E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE;wBACL,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,KAAK,CAAC,OAAO;qBACvB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6CAA6C;QAC7C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,YAAY,GAAG,CAAC,IAAI,yBAAyB;iBACvD;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,YAA8B,EAAE,GAAa;QACvE,IAAI,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QAEpD,2FAA2F;QAC3F,0CAA0C;QAC1C,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACjG,MAAM,CAAC,IAAI,CAAC,+BAA+B,KAAK,uBAAuB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YAC5F,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;YAC1B,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAEzE,iCAAiC;QACjC,IAAI,YAAY,CAAC,iBAAiB,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,YAA8B,EAAE,GAAa;QAC7E,4CAA4C;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAE9D,gDAAgD;QAChD,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;YAC9C,cAAc,EAAE,YAAY,CAAC,KAAK;YAClC,WAAW,EAAE,SAAS,CAAC,KAAK;YAC5B,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;YACvC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YAC/D,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YACvC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;YAC3D,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB;YACtC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;SACtD,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,iBAAiB,mBAAmB,EAAE;YACzE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,gBAAgB,EAAE;gBAClD,cAAc,EAAE,kBAAkB;gBAClC,cAAc,EAAE,wCAAwC;gBACxD,SAAS,EAAE,cAAc;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;gBAC/B,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kDAAkD;QAClD,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;YAClD,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SACxD,CAAC,CAAC;QAEH,oCAAoC;QACpC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC9C,kBAAkB;YAClB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;YACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,cAAc,GAAG,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;gBAClE,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC5B,CAAC;YAED,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,CAAC,wBAAwB;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAClD,yBAAyB;YACzB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAExC,2CAA2C;YAC3C,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACzC,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM;gBAClC,YAAY,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa;gBACnD,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC;gBAC7D,aAAa,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;gBACvE,aAAa,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;gBACpG,cAAc,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC3E,KAAK,EAAE,SAAS,CAAC,KAAK;aACvB,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;YAE9D,oDAAoD;YACpD,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBAClD,EAAE,EAAE,YAAY,CAAC,EAAE;gBACnB,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,UAAU,EAAE,YAAY,CAAC,WAAW;gBACpC,aAAa,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM;gBAC3C,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC3D,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,MAAM;gBACpF,WAAW,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC/F,KAAK,EAAE,YAAY,CAAC,KAAK;aAC1B,CAAC,CAAC;YAEH,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,YAA8B,EAC9B,YAA+B;QAE/B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAC/B,YAAY,CAAC,KAAK,IAAI,EAAE,EACxB,YAAY,CAAC,iBAAuC,CACrD,CAAC;QAEF,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ;YACzD,CAAC,CAAC,WAAW,CAAC,OAAO;YACrB,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,QAAQ,EACR,WAAW,EACX,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,mCAAmC;YACnC,MAAM,SAAS,GAAG;gBAChB,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;gBAC9C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC7C,WAAW,EAAE,YAAY,CAAC,WAAW;gBACrC,UAAU,EAAE,YAAY,CAAC,UAAU;aACpC,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACtD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAC7C,CAAC,EACD,KAAK,EAAE,QAAkB,EAAE,EAAE;YAC3B,MAAM,CAAC,IAAI,CAAC,uCAAuC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,OAAO,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;QAChE,CAAC,EACD,EAAE,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,MAAM,EAAE,CAC9D,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE;YAC5B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;YACtE,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;YAC9C,WAAW,EAAE,UAAU;YACvB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;SAC7C,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,SAAc;QACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,iBAAiB,mBAAmB,EAAE;YACzE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,gBAAgB,EAAE;gBAClD,cAAc,EAAE,kBAAkB;gBAClC,cAAc,EAAE,wCAAwC;gBACxD,SAAS,EAAE,cAAc;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAGO,wBAAwB,CAAC,YAA8B;QAC7D,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,uCAAuC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC9B,cAAc,EAAE,YAAY,CAAC,KAAK;YAClC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,OAAO;YACrB,iBAAiB,EAAE,QAAQ;SAC5B,CAAC,CAAC;QAEH,6DAA6D;QAC7D,4EAA4E;QAC5E,iEAAiE;QACjE,mEAAmE;QAEnE,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,gDAAgD;QAChD,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAExE,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC7B,WAAW;YACX,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YAC1C,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SACtD,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,kEAAkE;YAClE,aAAa,GAAG,oJAAoJ,CAAC;YACrK,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,aAAa,GAAG,sFAAsF,CAAC;YACvG,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,kDAAkD;YAClD,IAAI,cAAsB,CAAC;YAC3B,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC5C,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC;YACvC,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,mCAAmC;gBACnC,cAAc,GAAG,YAAY,CAAC,MAAM;qBACjC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;qBACpD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBACxB,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,EAAE,CAAC;YACtB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;gBAC/C,UAAU,EAAE,OAAO,YAAY,CAAC,MAAM;gBACtC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;gBAC3C,oBAAoB,EAAE,cAAc,CAAC,MAAM;gBAC3C,qBAAqB,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aACxD,CAAC,CAAC;YAEH,IAAI,cAAc,EAAE,CAAC;gBACnB,aAAa,IAAI,MAAM,GAAG,cAAc,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,mBAAmB,EAAE,aAAa,CAAC,MAAM;YACzC,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;SACtD,CAAC,CAAC;QAEH,2EAA2E;QAC3E,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,mBAAmB,GAAG,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;QACpF,MAAM,UAAU,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;QAE5E,8CAA8C;QAC9C,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,OAAe,CAAC;YAEpB,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YACxB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,mCAAmC;gBACnC,OAAO,GAAG,GAAG,CAAC,OAAO;qBAClB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;qBACtC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBACxB,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,GAAG,CAAC,IAA4B;gBACtC,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,MAAM,SAAS,GAAG,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QAE5E,MAAM,SAAS,GAAkB;YAC/B,KAAK,EAAE,UAAU;YACjB,QAAQ;YACR,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,MAAM,EAAE,YAAY,CAAC,MAAM;SAC5B,CAAC;QAEF,qDAAqD;QACrD,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACxD,SAAS,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBAC9C,MAAM,UAAU,GAAG;oBACjB,IAAI,EAAE,UAAmB;oBACzB,QAAQ,EAAE;wBACR,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;wBACnC,UAAU,EAAE,IAAI,CAAC,YAAY,IAAI;4BAC/B,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE,EAAE;4BACd,QAAQ,EAAE,EAAE;yBACb;qBACF;iBACF,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,EAAE,EAAE;oBAC1C,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW;oBAClC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;iBACpC,CAAC,CAAC;gBACH,OAAO,UAAU,CAAC;YACpB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;gBAChD,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;gBACjC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACzC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;YACvC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK;YAC9B,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YACvC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAI1C,MAAM,QAAQ,GAAU,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,4BAA4B;QAC5B,MAAM,cAAc,GAAG,sDAAsD,CAAC;QAC9E,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;oBACnB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACzB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,2BAA2B;QAC3B,MAAM,aAAa,GAAG,+BAA+B,CAAC;QACtD,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;iBACpB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,sBAAsB;QACtB,MAAM,SAAS,GAAG,2CAA2C,CAAC;QAC9D,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACzB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC;IAEO,wBAAwB,CAAC,SAAc;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;YACpD,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,aAAa,EAAE,OAAO,EAAE,MAAM;YAC9B,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;YAClC,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,YAAY,EAAE,MAAM,CAAC,aAAa;SACnC,CAAC,CAAC;QAEH,qDAAqD;QACrD,2DAA2D;QAC3D,gEAAgE;QAEhE,MAAM,aAAa,GAAU,EAAE,CAAC;QAEhC,wEAAwE;QACxE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC7D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;wBAChC,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;wBAC5B,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS;qBAC1C,CAAC,CAAC;oBAEH,aAAa,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,UAAU;wBAChB,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;wBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;qBACvD,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE;wBAClD,QAAQ;wBACR,KAAK,EAAG,KAAe,CAAC,OAAO;qBAChC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,qDAAqD,EAAE;gBACjE,aAAa,EAAE,SAAS,CAAC,MAAM;gBAC/B,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACvC,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aACvC,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAED,uCAAuC;QACvC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YAChE,aAAa,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO,IAAI,EAAE;aACpB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACnC,UAAU,EAAE,aAAa,CAAC,MAAM;YAChC,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG;YACb,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC;YACvD,KAAK,EAAE;gBACL,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;gBACjD,aAAa,EAAE,SAAS,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;aACvD;SACF,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,8BAA8B,CAAC,KAAa;QAClD,oDAAoD;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACtB,eAAe,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;oBAC1D,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;oBAEzC,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;wBACnB,eAAe,CAAC,IAAI,CAClB,qCAAqC,IAAI,CAAC,SAAS,CAAC;4BAClD,IAAI,EAAE,qBAAqB;4BAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;yBACnD,CAAC,MAAM,CACT,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,sBAAsB;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,oEAAoE;QACpE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,CAAC;IAEO,eAAe,CAAC,MAAe;QACrC,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,YAAY;YACtB,gBAAgB,EAAE,eAAe;YACjC,eAAe,EAAE,UAAU;SAC5B,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,IAAY;QACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;gBACnD,IAAI;gBACJ,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mDAAmD,IAAI,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YAEtD,IAAI,IAAI,CAAC,YAAY,EAAE,iBAAiB,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;gBACrG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,YAAY,CAAC,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,kBAAkB;AAClB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAExD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,0BAA0B,CAAC;QAC3C,gBAAgB;QAChB,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACvD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;KAC1E,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC","sourcesContent":["// Anthropic to OpenRouter Proxy Server\n// Converts Anthropic API format to OpenRouter format\nimport express, { Request, Response, NextFunction } from 'express';\nimport { createProxyMiddleware, Options } from 'http-proxy-middleware';\nimport { logger } from '../utils/logger.js';\nimport { getInstructionsForModel, formatInstructions, taskRequiresFileOps, getMaxTokensForModel } from './provider-instructions.js';\nimport { ModelCapabilities, detectModelCapabilities } from '../utils/modelCapabilities.js';\nimport { ToolEmulator, executeEmulation, ToolCall } from './tool-emulation.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string; [key: string]: any }>;\n}\n\ninterface AnthropicTool {\n name: string;\n description?: string;\n input_schema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n}\n\ninterface AnthropicRequest {\n model?: string;\n messages: AnthropicMessage[];\n max_tokens?: number;\n temperature?: number;\n system?: string | Array<{ type: string; text?: string; [key: string]: any }>; // Can be string OR array of blocks\n stream?: boolean;\n tools?: AnthropicTool[];\n [key: string]: any;\n}\n\ninterface OpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\ninterface OpenAITool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: any;\n };\n}\n\ninterface OpenAIRequest {\n model: string;\n messages: OpenAIMessage[];\n max_tokens?: number;\n temperature?: number;\n stream?: boolean;\n tools?: OpenAITool[];\n [key: string]: any;\n}\n\nexport class AnthropicToOpenRouterProxy {\n private app: express.Application;\n private openrouterApiKey: string;\n private openrouterBaseUrl: string;\n private defaultModel: string;\n private capabilities?: ModelCapabilities;\n\n constructor(config: {\n openrouterApiKey: string;\n openrouterBaseUrl?: string;\n defaultModel?: string;\n capabilities?: ModelCapabilities;\n }) {\n this.app = express();\n this.openrouterApiKey = config.openrouterApiKey;\n this.openrouterBaseUrl = config.openrouterBaseUrl || 'https://openrouter.ai/api/v1';\n this.defaultModel = config.defaultModel || 'meta-llama/llama-3.1-8b-instruct';\n this.capabilities = config.capabilities;\n\n // Debug logging\n if (this.capabilities) {\n logger.info('Proxy initialized with capabilities', {\n model: this.defaultModel,\n requiresEmulation: this.capabilities.requiresEmulation,\n strategy: this.capabilities.emulationStrategy\n });\n }\n\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n private setupMiddleware(): void {\n // Parse JSON bodies\n this.app.use(express.json({ limit: '50mb' }));\n\n // Logging middleware\n this.app.use((req: Request, res: Response, next: NextFunction) => {\n logger.debug('Proxy request', {\n method: req.method,\n path: req.path,\n headers: Object.keys(req.headers)\n });\n next();\n });\n }\n\n private setupRoutes(): void {\n // Health check\n this.app.get('/health', (req: Request, res: Response) => {\n res.json({ status: 'ok', service: 'anthropic-to-openrouter-proxy' });\n });\n\n // Anthropic Messages API → OpenRouter Chat Completions\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n try {\n const anthropicReq: AnthropicRequest = req.body;\n\n // VERBOSE LOGGING: Log incoming Anthropic request\n // Handle system prompt which can be string OR array of content blocks\n const systemPreview = typeof anthropicReq.system === 'string'\n ? anthropicReq.system.substring(0, 200)\n : Array.isArray(anthropicReq.system)\n ? JSON.stringify(anthropicReq.system).substring(0, 200)\n : undefined;\n\n logger.info('=== INCOMING ANTHROPIC REQUEST ===', {\n model: anthropicReq.model,\n systemPrompt: systemPreview,\n systemType: typeof anthropicReq.system,\n messageCount: anthropicReq.messages?.length,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || [],\n maxTokens: anthropicReq.max_tokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n });\n\n // Log first user message for debugging\n if (anthropicReq.messages && anthropicReq.messages.length > 0) {\n const firstMsg = anthropicReq.messages[0];\n logger.info('First user message:', {\n role: firstMsg.role,\n contentPreview: typeof firstMsg.content === 'string'\n ? firstMsg.content.substring(0, 200)\n : JSON.stringify(firstMsg.content).substring(0, 200)\n });\n }\n\n // Route to appropriate handler based on capabilities\n const result = await this.handleRequest(anthropicReq, res);\n if (result) {\n res.json(result);\n }\n } catch (error: any) {\n logger.error('Proxy error', { error: error.message, stack: error.stack });\n res.status(500).json({\n error: {\n type: 'proxy_error',\n message: error.message\n }\n });\n }\n });\n\n // Fallback for other Anthropic API endpoints\n this.app.use((req: Request, res: Response) => {\n logger.warn('Unsupported endpoint', { path: req.path, method: req.method });\n res.status(404).json({\n error: {\n type: 'not_found',\n message: `Endpoint ${req.path} not supported by proxy`\n }\n });\n });\n }\n\n private async handleRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n let model = anthropicReq.model || this.defaultModel;\n\n // If SDK is requesting a Claude model but we're using OpenRouter with a different default,\n // override to use the CLI-specified model\n if (model.startsWith('claude-') && this.defaultModel && !this.defaultModel.startsWith('claude-')) {\n logger.info(`Overriding SDK Claude model ${model} with CLI-specified ${this.defaultModel}`);\n model = this.defaultModel;\n anthropicReq.model = model;\n }\n\n const capabilities = this.capabilities || detectModelCapabilities(model);\n\n // Check if emulation is required\n if (capabilities.requiresEmulation && anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info(`Using tool emulation for model: ${model}`);\n return this.handleEmulatedRequest(anthropicReq, capabilities);\n }\n\n return this.handleNativeRequest(anthropicReq, res);\n }\n\n private async handleNativeRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n // Convert Anthropic format to OpenAI format\n const openaiReq = this.convertAnthropicToOpenAI(anthropicReq);\n\n // VERBOSE LOGGING: Log converted OpenAI request\n logger.info('=== CONVERTED OPENAI REQUEST ===', {\n anthropicModel: anthropicReq.model,\n openaiModel: openaiReq.model,\n messageCount: openaiReq.messages.length,\n systemPrompt: openaiReq.messages[0]?.content?.substring(0, 300),\n toolCount: openaiReq.tools?.length || 0,\n toolNames: openaiReq.tools?.map(t => t.function.name) || [],\n maxTokens: openaiReq.max_tokens,\n apiKeyPresent: !!this.openrouterApiKey,\n apiKeyPrefix: this.openrouterApiKey?.substring(0, 10)\n });\n\n // Forward to OpenRouter\n const response = await fetch(`${this.openrouterBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.openrouterApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n logger.error('OpenRouter API error', { status: response.status, error });\n res.status(response.status).json({\n error: {\n type: 'api_error',\n message: error\n }\n });\n return null;\n }\n\n // VERBOSE LOGGING: Log OpenRouter response status\n logger.info('=== OPENROUTER RESPONSE RECEIVED ===', {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries())\n });\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n logger.info('Handling streaming response...');\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const anthropicChunk = this.convertOpenAIStreamToAnthropic(chunk);\n res.write(anthropicChunk);\n }\n\n res.end();\n return null; // Already sent response\n } else {\n logger.info('Handling non-streaming response...');\n // Non-streaming response\n const openaiRes = await response.json();\n\n // VERBOSE LOGGING: Log raw OpenAI response\n logger.info('=== RAW OPENAI RESPONSE ===', {\n id: openaiRes.id,\n model: openaiRes.model,\n choices: openaiRes.choices?.length,\n finishReason: openaiRes.choices?.[0]?.finish_reason,\n hasToolCalls: !!(openaiRes.choices?.[0]?.message?.tool_calls),\n toolCallCount: openaiRes.choices?.[0]?.message?.tool_calls?.length || 0,\n toolCallNames: openaiRes.choices?.[0]?.message?.tool_calls?.map((tc: any) => tc.function.name) || [],\n contentPreview: openaiRes.choices?.[0]?.message?.content?.substring(0, 300),\n usage: openaiRes.usage\n });\n\n const anthropicRes = this.convertOpenAIToAnthropic(openaiRes);\n\n // VERBOSE LOGGING: Log converted Anthropic response\n logger.info('=== CONVERTED ANTHROPIC RESPONSE ===', {\n id: anthropicRes.id,\n model: anthropicRes.model,\n role: anthropicRes.role,\n stopReason: anthropicRes.stop_reason,\n contentBlocks: anthropicRes.content?.length,\n contentTypes: anthropicRes.content?.map((c: any) => c.type),\n toolUseCount: anthropicRes.content?.filter((c: any) => c.type === 'tool_use').length,\n textPreview: anthropicRes.content?.find((c: any) => c.type === 'text')?.text?.substring(0, 200),\n usage: anthropicRes.usage\n });\n\n return anthropicRes;\n }\n }\n\n private async handleEmulatedRequest(\n anthropicReq: AnthropicRequest,\n capabilities: ModelCapabilities\n ): Promise<any> {\n const emulator = new ToolEmulator(\n anthropicReq.tools || [],\n capabilities.emulationStrategy as 'react' | 'prompt'\n );\n\n const lastMessage = anthropicReq.messages[anthropicReq.messages.length - 1];\n const userMessage = typeof lastMessage.content === 'string'\n ? lastMessage.content\n : (lastMessage.content.find(c => c.type === 'text')?.text || '');\n\n const result = await executeEmulation(\n emulator,\n userMessage,\n async (prompt) => {\n // Call model with emulation prompt\n const openaiReq = {\n model: anthropicReq.model || this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n temperature: anthropicReq.temperature,\n max_tokens: anthropicReq.max_tokens\n };\n const response = await this.callOpenRouter(openaiReq);\n return response.choices[0].message.content;\n },\n async (toolCall: ToolCall) => {\n logger.warn(`Tool execution not yet implemented: ${toolCall.name}`);\n return { error: 'Tool execution not implemented in Phase 2' };\n },\n { maxIterations: 5, verbose: process.env.VERBOSE === 'true' }\n );\n\n return {\n id: `emulated_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: result.finalAnswer || 'No response' }],\n model: anthropicReq.model || this.defaultModel,\n stop_reason: 'end_turn',\n usage: { input_tokens: 0, output_tokens: 0 }\n };\n }\n\n private async callOpenRouter(openaiReq: any): Promise<any> {\n const response = await fetch(`${this.openrouterBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.openrouterApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenRouter API error: ${error}`);\n }\n\n return response.json();\n }\n\n\n private convertAnthropicToOpenAI(anthropicReq: AnthropicRequest): OpenAIRequest {\n logger.info('=== STARTING ANTHROPIC TO OPENAI CONVERSION ===');\n const messages: OpenAIMessage[] = [];\n\n // Get model-specific tool instructions\n const modelId = anthropicReq.model || this.defaultModel;\n const provider = this.extractProvider(modelId);\n\n logger.info('Model detection:', {\n requestedModel: anthropicReq.model,\n defaultModel: this.defaultModel,\n finalModelId: modelId,\n extractedProvider: provider\n });\n\n // CRITICAL: OpenRouter models use native OpenAI tool calling\n // - If MCP tools are provided, OpenRouter handles them via function calling\n // - Do NOT inject XML instructions - they cause malformed output\n // - Let OpenRouter models use tools via OpenAI's tool_calls format\n\n let systemContent = '';\n\n // Check if we have MCP tools (function calling)\n const hasMcpTools = anthropicReq.tools && anthropicReq.tools.length > 0;\n\n logger.info('Tool detection:', {\n hasMcpTools,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || []\n });\n\n if (hasMcpTools) {\n // MCP tools present - OpenRouter will handle via function calling\n systemContent = 'You are a helpful AI assistant. When you need to perform actions, use the available tools by calling functions. Always explain what you\\'re doing.';\n logger.info('Using MCP tools system prompt (with function calling support)');\n } else {\n // No tools - simple response mode\n systemContent = 'You are a helpful AI assistant. Provide clear, well-formatted code and explanations.';\n logger.info('Using simple system prompt (no tools)');\n }\n\n if (anthropicReq.system) {\n // System can be string OR array of content blocks\n let originalSystem: string;\n if (typeof anthropicReq.system === 'string') {\n originalSystem = anthropicReq.system;\n } else if (Array.isArray(anthropicReq.system)) {\n // Extract text from content blocks\n originalSystem = anthropicReq.system\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text)\n .join('\\n');\n } else {\n originalSystem = '';\n }\n\n logger.info('Appending original system prompt:', {\n systemType: typeof anthropicReq.system,\n isArray: Array.isArray(anthropicReq.system),\n originalSystemLength: originalSystem.length,\n originalSystemPreview: originalSystem.substring(0, 200)\n });\n\n if (originalSystem) {\n systemContent += '\\n\\n' + originalSystem;\n }\n }\n\n messages.push({\n role: 'system',\n content: systemContent\n });\n\n logger.info('System message created:', {\n systemContentLength: systemContent.length,\n systemContentPreview: systemContent.substring(0, 300)\n });\n\n // Override model - if request has a Claude model, use defaultModel instead\n const requestedModel = anthropicReq.model || '';\n const shouldOverrideModel = requestedModel.startsWith('claude-') || !requestedModel;\n const finalModel = shouldOverrideModel ? this.defaultModel : requestedModel;\n\n // Convert Anthropic messages to OpenAI format\n for (const msg of anthropicReq.messages) {\n let content: string;\n\n if (typeof msg.content === 'string') {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n content = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n content = '';\n }\n\n messages.push({\n role: msg.role as 'user' | 'assistant',\n content\n });\n }\n\n // Get appropriate max_tokens for this model\n const maxTokens = getMaxTokensForModel(finalModel, anthropicReq.max_tokens);\n\n const openaiReq: OpenAIRequest = {\n model: finalModel,\n messages,\n max_tokens: maxTokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n };\n\n // Convert MCP/Anthropic tools to OpenAI tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info('Converting MCP tools to OpenAI format...');\n openaiReq.tools = anthropicReq.tools.map(tool => {\n const openaiTool = {\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description || '',\n parameters: tool.input_schema || {\n type: 'object',\n properties: {},\n required: []\n }\n }\n };\n logger.info(`Converted tool: ${tool.name}`, {\n hasDescription: !!tool.description,\n hasInputSchema: !!tool.input_schema\n });\n return openaiTool;\n });\n\n logger.info('Forwarding MCP tools to OpenRouter', {\n toolCount: openaiReq.tools.length,\n toolNames: openaiReq.tools.map(t => t.function.name)\n });\n } else {\n logger.info('No MCP tools to convert');\n }\n\n logger.info('=== CONVERSION COMPLETE ===', {\n messageCount: openaiReq.messages.length,\n hasMcpTools: !!openaiReq.tools,\n toolCount: openaiReq.tools?.length || 0,\n maxTokens: openaiReq.max_tokens,\n model: openaiReq.model\n });\n\n return openaiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertOpenAIToAnthropic(openaiRes: any): any {\n const choice = openaiRes.choices?.[0];\n if (!choice) {\n throw new Error('No choices in OpenAI response');\n }\n\n const message = choice.message || {};\n const rawText = message.content || choice.text || '';\n const toolCalls = message.tool_calls || [];\n\n logger.info('=== CONVERTING OPENAI TO ANTHROPIC ===', {\n hasMessage: !!message,\n hasContent: !!rawText,\n contentLength: rawText?.length,\n hasToolCalls: toolCalls.length > 0,\n toolCallCount: toolCalls.length,\n finishReason: choice.finish_reason\n });\n\n // CRITICAL: Use ONLY native OpenAI tool_calls format\n // Do NOT parse XML from text - models output malformed XML\n // OpenRouter handles tools via OpenAI function calling standard\n\n const contentBlocks: any[] = [];\n\n // Add tool uses from OpenAI tool_calls (MCP tools via function calling)\n if (toolCalls.length > 0) {\n logger.info('Processing tool calls from OpenAI response...');\n for (const toolCall of toolCalls) {\n try {\n logger.info('Tool call details:', {\n id: toolCall.id,\n name: toolCall.function.name,\n argumentsRaw: toolCall.function.arguments\n });\n\n contentBlocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments || '{}')\n });\n } catch (error) {\n logger.error('Failed to parse tool call arguments', {\n toolCall,\n error: (error as Error).message\n });\n }\n }\n\n logger.info('Converted OpenRouter tool calls to Anthropic format', {\n toolCallCount: toolCalls.length,\n toolNames: toolCalls.map((tc: any) => tc.function.name)\n });\n }\n\n // Add text response if present\n if (rawText && rawText.trim()) {\n logger.info('Adding text content block', {\n textLength: rawText.length,\n textPreview: rawText.substring(0, 200)\n });\n contentBlocks.push({\n type: 'text',\n text: rawText\n });\n }\n\n // If no content blocks, add empty text\n if (contentBlocks.length === 0) {\n logger.warn('No content blocks found, adding empty text block');\n contentBlocks.push({\n type: 'text',\n text: rawText || ''\n });\n }\n\n logger.info('Final content blocks:', {\n blockCount: contentBlocks.length,\n blockTypes: contentBlocks.map(b => b.type)\n });\n\n const result = {\n id: openaiRes.id || `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: openaiRes.model,\n content: contentBlocks,\n stop_reason: this.mapFinishReason(choice.finish_reason),\n usage: {\n input_tokens: openaiRes.usage?.prompt_tokens || 0,\n output_tokens: openaiRes.usage?.completion_tokens || 0\n }\n };\n\n logger.info('Conversion complete, returning Anthropic response');\n return result;\n }\n\n private convertOpenAIStreamToAnthropic(chunk: string): string {\n // Convert OpenAI SSE format to Anthropic SSE format\n const lines = chunk.split('\\n').filter(line => line.trim());\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n continue;\n }\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text: delta.content }\n })}\\n\\n`\n );\n }\n } catch (e) {\n // Ignore parse errors\n }\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private extractProvider(modelId: string): string {\n // Extract provider from model ID (e.g., \"openai/gpt-4\" -> \"openai\")\n const parts = modelId.split('/');\n return parts.length > 1 ? parts[0] : '';\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'stop': 'end_turn',\n 'length': 'max_tokens',\n 'content_filter': 'stop_sequence',\n 'function_call': 'tool_use'\n };\n return mapping[reason || 'stop'] || 'end_turn';\n }\n\n public start(port: number): void {\n this.app.listen(port, () => {\n logger.info('Anthropic to OpenRouter proxy started', {\n port,\n openrouterBaseUrl: this.openrouterBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\n✅ Anthropic Proxy running at http://localhost:${port}`);\n console.log(` OpenRouter Base URL: ${this.openrouterBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}`);\n\n if (this.capabilities?.requiresEmulation) {\n console.log(`\\n ⚙️ Tool Emulation: ${this.capabilities.emulationStrategy.toUpperCase()} pattern`);\n console.log(` 📊 Expected reliability: ${this.capabilities.emulationStrategy === 'react' ? '70-85%' : '50-70%'}`);\n }\n console.log('');\n });\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3000');\n const openrouterApiKey = process.env.OPENROUTER_API_KEY;\n\n if (!openrouterApiKey) {\n console.error('❌ Error: OPENROUTER_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToOpenRouterProxy({\n openrouterApiKey,\n openrouterBaseUrl: process.env.ANTHROPIC_PROXY_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n}\n"]}
1
+ {"version":3,"file":"anthropic-to-openrouter.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-openrouter.ts"],"names":[],"mappings":"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","sourcesContent":["// Anthropic to OpenRouter Proxy Server\n// Converts Anthropic API format to OpenRouter format\nimport express, { Request, Response, NextFunction } from 'express';\nimport { createProxyMiddleware, Options } from 'http-proxy-middleware';\nimport { logger } from '../utils/logger.js';\nimport { getInstructionsForModel, formatInstructions, taskRequiresFileOps, getMaxTokensForModel } from './provider-instructions.js';\nimport { ModelCapabilities, detectModelCapabilities } from '../utils/modelCapabilities.js';\nimport { ToolEmulator, executeEmulation, ToolCall } from './tool-emulation.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string; [key: string]: any }>;\n}\n\ninterface AnthropicTool {\n name: string;\n description?: string;\n input_schema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n}\n\ninterface AnthropicRequest {\n model?: string;\n messages: AnthropicMessage[];\n max_tokens?: number;\n temperature?: number;\n system?: string | Array<{ type: string; text?: string; [key: string]: any }>; // Can be string OR array of blocks\n stream?: boolean;\n tools?: AnthropicTool[];\n [key: string]: any;\n}\n\ninterface OpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\ninterface OpenAITool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: any;\n };\n}\n\ninterface OpenAIRequest {\n model: string;\n messages: OpenAIMessage[];\n max_tokens?: number;\n temperature?: number;\n stream?: boolean;\n tools?: OpenAITool[];\n [key: string]: any;\n}\n\ninterface OpenAIResponse {\n id: string;\n model: string;\n choices: Array<{\n index: number;\n finish_reason: string;\n message: {\n role: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>;\n };\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\nexport class AnthropicToOpenRouterProxy {\n private app: express.Application;\n private openrouterApiKey: string;\n private openrouterBaseUrl: string;\n private defaultModel: string;\n private capabilities?: ModelCapabilities;\n\n constructor(config: {\n openrouterApiKey: string;\n openrouterBaseUrl?: string;\n defaultModel?: string;\n capabilities?: ModelCapabilities;\n }) {\n this.app = express();\n this.openrouterApiKey = config.openrouterApiKey;\n this.openrouterBaseUrl = config.openrouterBaseUrl || 'https://openrouter.ai/api/v1';\n this.defaultModel = config.defaultModel || 'meta-llama/llama-3.1-8b-instruct';\n this.capabilities = config.capabilities;\n\n // Debug logging\n if (this.capabilities) {\n logger.info('Proxy initialized with capabilities', {\n model: this.defaultModel,\n requiresEmulation: this.capabilities.requiresEmulation,\n strategy: this.capabilities.emulationStrategy\n });\n }\n\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n private setupMiddleware(): void {\n // Parse JSON bodies\n this.app.use(express.json({ limit: '50mb' }));\n\n // Logging middleware\n this.app.use((req: Request, res: Response, next: NextFunction) => {\n logger.debug('Proxy request', {\n method: req.method,\n path: req.path,\n headers: Object.keys(req.headers)\n });\n next();\n });\n }\n\n private setupRoutes(): void {\n // Health check\n this.app.get('/health', (req: Request, res: Response) => {\n res.json({ status: 'ok', service: 'anthropic-to-openrouter-proxy' });\n });\n\n // Anthropic Messages API → OpenRouter Chat Completions\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n try {\n const anthropicReq: AnthropicRequest = req.body;\n\n // VERBOSE LOGGING: Log incoming Anthropic request\n // Handle system prompt which can be string OR array of content blocks\n const systemPreview = typeof anthropicReq.system === 'string'\n ? anthropicReq.system.substring(0, 200)\n : Array.isArray(anthropicReq.system)\n ? JSON.stringify(anthropicReq.system).substring(0, 200)\n : undefined;\n\n logger.info('=== INCOMING ANTHROPIC REQUEST ===', {\n model: anthropicReq.model,\n systemPrompt: systemPreview,\n systemType: typeof anthropicReq.system,\n messageCount: anthropicReq.messages?.length,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || [],\n maxTokens: anthropicReq.max_tokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n });\n\n // Log first user message for debugging\n if (anthropicReq.messages && anthropicReq.messages.length > 0) {\n const firstMsg = anthropicReq.messages[0];\n logger.info('First user message:', {\n role: firstMsg.role,\n contentPreview: typeof firstMsg.content === 'string'\n ? firstMsg.content.substring(0, 200)\n : JSON.stringify(firstMsg.content).substring(0, 200)\n });\n }\n\n // Route to appropriate handler based on capabilities\n const result = await this.handleRequest(anthropicReq, res);\n if (result) {\n res.json(result);\n }\n } catch (error: any) {\n logger.error('Proxy error', { error: error.message, stack: error.stack });\n res.status(500).json({\n error: {\n type: 'proxy_error',\n message: error.message\n }\n });\n }\n });\n\n // Fallback for other Anthropic API endpoints\n this.app.use((req: Request, res: Response) => {\n logger.warn('Unsupported endpoint', { path: req.path, method: req.method });\n res.status(404).json({\n error: {\n type: 'not_found',\n message: `Endpoint ${req.path} not supported by proxy`\n }\n });\n });\n }\n\n private async handleRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n let model = anthropicReq.model || this.defaultModel;\n\n // If SDK is requesting a Claude model but we're using OpenRouter with a different default,\n // override to use the CLI-specified model\n if (model.startsWith('claude-') && this.defaultModel && !this.defaultModel.startsWith('claude-')) {\n logger.info(`Overriding SDK Claude model ${model} with CLI-specified ${this.defaultModel}`);\n model = this.defaultModel;\n anthropicReq.model = model;\n }\n\n const capabilities = this.capabilities || detectModelCapabilities(model);\n\n // Check if emulation is required\n if (capabilities.requiresEmulation && anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info(`Using tool emulation for model: ${model}`);\n return this.handleEmulatedRequest(anthropicReq, capabilities);\n }\n\n return this.handleNativeRequest(anthropicReq, res);\n }\n\n private async handleNativeRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n // Convert Anthropic format to OpenAI format\n const openaiReq = this.convertAnthropicToOpenAI(anthropicReq);\n\n // VERBOSE LOGGING: Log converted OpenAI request\n logger.info('=== CONVERTED OPENAI REQUEST ===', {\n anthropicModel: anthropicReq.model,\n openaiModel: openaiReq.model,\n messageCount: openaiReq.messages.length,\n systemPrompt: openaiReq.messages[0]?.content?.substring(0, 300),\n toolCount: openaiReq.tools?.length || 0,\n toolNames: openaiReq.tools?.map(t => t.function.name) || [],\n maxTokens: openaiReq.max_tokens,\n apiKeyPresent: !!this.openrouterApiKey,\n apiKeyPrefix: this.openrouterApiKey?.substring(0, 10)\n });\n\n // Forward to OpenRouter\n const response = await fetch(`${this.openrouterBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.openrouterApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n logger.error('OpenRouter API error', { status: response.status, error });\n res.status(response.status).json({\n error: {\n type: 'api_error',\n message: error\n }\n });\n return null;\n }\n\n // VERBOSE LOGGING: Log OpenRouter response status\n logger.info('=== OPENROUTER RESPONSE RECEIVED ===', {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries())\n });\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n logger.info('Handling streaming response...');\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const anthropicChunk = this.convertOpenAIStreamToAnthropic(chunk);\n res.write(anthropicChunk);\n }\n\n res.end();\n return null; // Already sent response\n } else {\n logger.info('Handling non-streaming response...');\n // Non-streaming response\n const openaiRes = await response.json() as OpenAIResponse;\n\n // VERBOSE LOGGING: Log raw OpenAI response\n logger.info('=== RAW OPENAI RESPONSE ===', {\n id: openaiRes.id,\n model: openaiRes.model,\n choices: openaiRes.choices?.length,\n finishReason: openaiRes.choices?.[0]?.finish_reason,\n hasToolCalls: !!(openaiRes.choices?.[0]?.message?.tool_calls),\n toolCallCount: openaiRes.choices?.[0]?.message?.tool_calls?.length || 0,\n toolCallNames: openaiRes.choices?.[0]?.message?.tool_calls?.map((tc: any) => tc.function.name) || [],\n contentPreview: openaiRes.choices?.[0]?.message?.content?.substring(0, 300),\n usage: openaiRes.usage\n });\n\n const anthropicRes = this.convertOpenAIToAnthropic(openaiRes);\n\n // VERBOSE LOGGING: Log converted Anthropic response\n logger.info('=== CONVERTED ANTHROPIC RESPONSE ===', {\n id: anthropicRes.id,\n model: anthropicRes.model,\n role: anthropicRes.role,\n stopReason: anthropicRes.stop_reason,\n contentBlocks: anthropicRes.content?.length,\n contentTypes: anthropicRes.content?.map((c: any) => c.type),\n toolUseCount: anthropicRes.content?.filter((c: any) => c.type === 'tool_use').length,\n textPreview: anthropicRes.content?.find((c: any) => c.type === 'text')?.text?.substring(0, 200),\n usage: anthropicRes.usage\n });\n\n return anthropicRes;\n }\n }\n\n private async handleEmulatedRequest(\n anthropicReq: AnthropicRequest,\n capabilities: ModelCapabilities\n ): Promise<any> {\n const emulator = new ToolEmulator(\n anthropicReq.tools || [],\n capabilities.emulationStrategy as 'react' | 'prompt'\n );\n\n const lastMessage = anthropicReq.messages[anthropicReq.messages.length - 1];\n const userMessage = typeof lastMessage.content === 'string'\n ? lastMessage.content\n : (lastMessage.content.find(c => c.type === 'text')?.text || '');\n\n const result = await executeEmulation(\n emulator,\n userMessage,\n async (prompt) => {\n // Call model with emulation prompt\n const openaiReq = {\n model: anthropicReq.model || this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n temperature: anthropicReq.temperature,\n max_tokens: anthropicReq.max_tokens\n };\n const response = await this.callOpenRouter(openaiReq);\n return response.choices[0].message.content;\n },\n async (toolCall: ToolCall) => {\n logger.warn(`Tool execution not yet implemented: ${toolCall.name}`);\n return { error: 'Tool execution not implemented in Phase 2' };\n },\n { maxIterations: 5, verbose: process.env.VERBOSE === 'true' }\n );\n\n return {\n id: `emulated_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: result.finalAnswer || 'No response' }],\n model: anthropicReq.model || this.defaultModel,\n stop_reason: 'end_turn',\n usage: { input_tokens: 0, output_tokens: 0 }\n };\n }\n\n private async callOpenRouter(openaiReq: any): Promise<any> {\n const response = await fetch(`${this.openrouterBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.openrouterApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenRouter API error: ${error}`);\n }\n\n return response.json();\n }\n\n\n private convertAnthropicToOpenAI(anthropicReq: AnthropicRequest): OpenAIRequest {\n logger.info('=== STARTING ANTHROPIC TO OPENAI CONVERSION ===');\n const messages: OpenAIMessage[] = [];\n\n // Get model-specific tool instructions\n const modelId = anthropicReq.model || this.defaultModel;\n const provider = this.extractProvider(modelId);\n\n logger.info('Model detection:', {\n requestedModel: anthropicReq.model,\n defaultModel: this.defaultModel,\n finalModelId: modelId,\n extractedProvider: provider\n });\n\n // CRITICAL: OpenRouter models use native OpenAI tool calling\n // - If MCP tools are provided, OpenRouter handles them via function calling\n // - Do NOT inject XML instructions - they cause malformed output\n // - Let OpenRouter models use tools via OpenAI's tool_calls format\n\n let systemContent = '';\n\n // Check if we have MCP tools (function calling)\n const hasMcpTools = anthropicReq.tools && anthropicReq.tools.length > 0;\n\n logger.info('Tool detection:', {\n hasMcpTools,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || []\n });\n\n if (hasMcpTools) {\n // MCP tools present - OpenRouter will handle via function calling\n systemContent = 'You are a helpful AI assistant. When you need to perform actions, use the available tools by calling functions. Always explain what you\\'re doing.';\n logger.info('Using MCP tools system prompt (with function calling support)');\n } else {\n // No tools - simple response mode\n systemContent = 'You are a helpful AI assistant. Provide clear, well-formatted code and explanations.';\n logger.info('Using simple system prompt (no tools)');\n }\n\n if (anthropicReq.system) {\n // System can be string OR array of content blocks\n let originalSystem: string;\n if (typeof anthropicReq.system === 'string') {\n originalSystem = anthropicReq.system;\n } else if (Array.isArray(anthropicReq.system)) {\n // Extract text from content blocks\n originalSystem = anthropicReq.system\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text)\n .join('\\n');\n } else {\n originalSystem = '';\n }\n\n logger.info('Appending original system prompt:', {\n systemType: typeof anthropicReq.system,\n isArray: Array.isArray(anthropicReq.system),\n originalSystemLength: originalSystem.length,\n originalSystemPreview: originalSystem.substring(0, 200)\n });\n\n if (originalSystem) {\n systemContent += '\\n\\n' + originalSystem;\n }\n }\n\n messages.push({\n role: 'system',\n content: systemContent\n });\n\n logger.info('System message created:', {\n systemContentLength: systemContent.length,\n systemContentPreview: systemContent.substring(0, 300)\n });\n\n // Override model - if request has a Claude model, use defaultModel instead\n const requestedModel = anthropicReq.model || '';\n const shouldOverrideModel = requestedModel.startsWith('claude-') || !requestedModel;\n const finalModel = shouldOverrideModel ? this.defaultModel : requestedModel;\n\n // Convert Anthropic messages to OpenAI format\n for (const msg of anthropicReq.messages) {\n let content: string;\n\n if (typeof msg.content === 'string') {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n content = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n content = '';\n }\n\n messages.push({\n role: msg.role as 'user' | 'assistant',\n content\n });\n }\n\n // Get appropriate max_tokens for this model\n const maxTokens = getMaxTokensForModel(finalModel, anthropicReq.max_tokens);\n\n const openaiReq: OpenAIRequest = {\n model: finalModel,\n messages,\n max_tokens: maxTokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n };\n\n // Convert MCP/Anthropic tools to OpenAI tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info('Converting MCP tools to OpenAI format...');\n openaiReq.tools = anthropicReq.tools.map(tool => {\n const openaiTool = {\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description || '',\n parameters: tool.input_schema || {\n type: 'object',\n properties: {},\n required: []\n }\n }\n };\n logger.info(`Converted tool: ${tool.name}`, {\n hasDescription: !!tool.description,\n hasInputSchema: !!tool.input_schema\n });\n return openaiTool;\n });\n\n logger.info('Forwarding MCP tools to OpenRouter', {\n toolCount: openaiReq.tools.length,\n toolNames: openaiReq.tools.map(t => t.function.name)\n });\n } else {\n logger.info('No MCP tools to convert');\n }\n\n logger.info('=== CONVERSION COMPLETE ===', {\n messageCount: openaiReq.messages.length,\n hasMcpTools: !!openaiReq.tools,\n toolCount: openaiReq.tools?.length || 0,\n maxTokens: openaiReq.max_tokens,\n model: openaiReq.model\n });\n\n return openaiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertOpenAIToAnthropic(openaiRes: any): any {\n const choice = openaiRes.choices?.[0];\n if (!choice) {\n throw new Error('No choices in OpenAI response');\n }\n\n const message = choice.message || {};\n const rawText = message.content || choice.text || '';\n const toolCalls = message.tool_calls || [];\n\n logger.info('=== CONVERTING OPENAI TO ANTHROPIC ===', {\n hasMessage: !!message,\n hasContent: !!rawText,\n contentLength: rawText?.length,\n hasToolCalls: toolCalls.length > 0,\n toolCallCount: toolCalls.length,\n finishReason: choice.finish_reason\n });\n\n // CRITICAL: Use ONLY native OpenAI tool_calls format\n // Do NOT parse XML from text - models output malformed XML\n // OpenRouter handles tools via OpenAI function calling standard\n\n const contentBlocks: any[] = [];\n\n // Add tool uses from OpenAI tool_calls (MCP tools via function calling)\n if (toolCalls.length > 0) {\n logger.info('Processing tool calls from OpenAI response...');\n for (const toolCall of toolCalls) {\n try {\n logger.info('Tool call details:', {\n id: toolCall.id,\n name: toolCall.function.name,\n argumentsRaw: toolCall.function.arguments\n });\n\n contentBlocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments || '{}')\n });\n } catch (error) {\n logger.error('Failed to parse tool call arguments', {\n toolCall,\n error: (error as Error).message\n });\n }\n }\n\n logger.info('Converted OpenRouter tool calls to Anthropic format', {\n toolCallCount: toolCalls.length,\n toolNames: toolCalls.map((tc: any) => tc.function.name)\n });\n }\n\n // Add text response if present\n if (rawText && rawText.trim()) {\n logger.info('Adding text content block', {\n textLength: rawText.length,\n textPreview: rawText.substring(0, 200)\n });\n contentBlocks.push({\n type: 'text',\n text: rawText\n });\n }\n\n // If no content blocks, add empty text\n if (contentBlocks.length === 0) {\n logger.warn('No content blocks found, adding empty text block');\n contentBlocks.push({\n type: 'text',\n text: rawText || ''\n });\n }\n\n logger.info('Final content blocks:', {\n blockCount: contentBlocks.length,\n blockTypes: contentBlocks.map(b => b.type)\n });\n\n const result = {\n id: openaiRes.id || `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: openaiRes.model,\n content: contentBlocks,\n stop_reason: this.mapFinishReason(choice.finish_reason),\n usage: {\n input_tokens: openaiRes.usage?.prompt_tokens || 0,\n output_tokens: openaiRes.usage?.completion_tokens || 0\n }\n };\n\n logger.info('Conversion complete, returning Anthropic response');\n return result;\n }\n\n private convertOpenAIStreamToAnthropic(chunk: string): string {\n // Convert OpenAI SSE format to Anthropic SSE format\n const lines = chunk.split('\\n').filter(line => line.trim());\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n continue;\n }\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text: delta.content }\n })}\\n\\n`\n );\n }\n } catch (e) {\n // Ignore parse errors\n }\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private extractProvider(modelId: string): string {\n // Extract provider from model ID (e.g., \"openai/gpt-4\" -> \"openai\")\n const parts = modelId.split('/');\n return parts.length > 1 ? parts[0] : '';\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'stop': 'end_turn',\n 'length': 'max_tokens',\n 'content_filter': 'stop_sequence',\n 'function_call': 'tool_use'\n };\n return mapping[reason || 'stop'] || 'end_turn';\n }\n\n public start(port: number): void {\n this.app.listen(port, () => {\n logger.info('Anthropic to OpenRouter proxy started', {\n port,\n openrouterBaseUrl: this.openrouterBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\n✅ Anthropic Proxy running at http://localhost:${port}`);\n console.log(` OpenRouter Base URL: ${this.openrouterBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}`);\n\n if (this.capabilities?.requiresEmulation) {\n console.log(`\\n ⚙️ Tool Emulation: ${this.capabilities.emulationStrategy.toUpperCase()} pattern`);\n console.log(` 📊 Expected reliability: ${this.capabilities.emulationStrategy === 'react' ? '70-85%' : '50-70%'}`);\n }\n console.log('');\n });\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3000');\n const openrouterApiKey = process.env.OPENROUTER_API_KEY;\n\n if (!openrouterApiKey) {\n console.error('❌ Error: OPENROUTER_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToOpenRouterProxy({\n openrouterApiKey,\n openrouterBaseUrl: process.env.ANTHROPIC_PROXY_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-to-requesty.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-requesty.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;AAqD3F,qBAAa,wBAAwB;IACnC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAoB;gBAE7B,MAAM,EAAE;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,iBAAiB,CAAC;KAClC;IAoBD,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,WAAW;YAyEL,aAAa;YAsBb,mBAAmB;YA8GnB,qBAAqB;YAmDrB,YAAY;IAoC1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAuD1B,OAAO,CAAC,wBAAwB;IAqLhC,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,wBAAwB;IAmGhC,OAAO,CAAC,8BAA8B;IAkCtC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAUhB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAkBjC"}
1
+ {"version":3,"file":"anthropic-to-requesty.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-requesty.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;AA4E3F,qBAAa,wBAAwB;IACnC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAoB;gBAE7B,MAAM,EAAE;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,iBAAiB,CAAC;KAClC;IAoBD,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,WAAW;YAyEL,aAAa;YAsBb,mBAAmB;YA8GnB,qBAAqB;YAmDrB,YAAY;IAoC1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAuD1B,OAAO,CAAC,wBAAwB;IAqLhC,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,wBAAwB;IAmGhC,OAAO,CAAC,8BAA8B;IAkCtC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAUhB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAkBjC"}