agentic-flow 2.0.3 → 2.0.4

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 (322) hide show
  1. package/.claude/agents/test-neural.md +14 -0
  2. package/.claude/settings.json +9 -133
  3. package/README.md +624 -1776
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/billing/mcp/tools.js +0 -1
  6. package/dist/billing/mcp/tools.js.map +1 -1
  7. package/dist/cli/commands/hooks.d.ts.map +1 -1
  8. package/dist/cli/commands/hooks.js +4 -79
  9. package/dist/cli/commands/hooks.js.map +1 -1
  10. package/dist/cli-proxy.js +1 -89
  11. package/dist/cli-proxy.js.map +1 -1
  12. package/dist/core/agentdb-fast.js +3 -3
  13. package/dist/core/agentdb-fast.js.map +1 -1
  14. package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
  15. package/dist/core/agentdb-wrapper-enhanced.js +4 -20
  16. package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
  17. package/dist/core/agentdb-wrapper.d.ts +2 -3
  18. package/dist/core/agentdb-wrapper.d.ts.map +1 -1
  19. package/dist/core/agentdb-wrapper.js +1 -15
  20. package/dist/core/agentdb-wrapper.js.map +1 -1
  21. package/dist/core/attention-native.d.ts +0 -4
  22. package/dist/core/attention-native.d.ts.map +1 -1
  23. package/dist/core/attention-native.js +2 -14
  24. package/dist/core/attention-native.js.map +1 -1
  25. package/dist/federation/SecurityManager.d.ts +2 -11
  26. package/dist/federation/SecurityManager.d.ts.map +1 -1
  27. package/dist/federation/SecurityManager.js +17 -50
  28. package/dist/federation/SecurityManager.js.map +1 -1
  29. package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
  30. package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
  31. package/dist/hooks/swarm-learning-optimizer.js +5 -5
  32. package/dist/hooks/swarm-learning-optimizer.js.map +1 -1
  33. package/dist/intelligence/IntelligenceStore.d.ts +26 -35
  34. package/dist/intelligence/IntelligenceStore.d.ts.map +1 -1
  35. package/dist/intelligence/IntelligenceStore.js +123 -308
  36. package/dist/intelligence/IntelligenceStore.js.map +1 -1
  37. package/dist/intelligence/RuVectorIntelligence.d.ts +1 -26
  38. package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
  39. package/dist/intelligence/RuVectorIntelligence.js +10 -49
  40. package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
  41. package/dist/intelligence/agent-booster-enhanced.d.ts +0 -1
  42. package/dist/intelligence/agent-booster-enhanced.d.ts.map +1 -1
  43. package/dist/intelligence/agent-booster-enhanced.js +3 -24
  44. package/dist/intelligence/agent-booster-enhanced.js.map +1 -1
  45. package/dist/intelligence/index.d.ts +3 -29
  46. package/dist/intelligence/index.d.ts.map +1 -1
  47. package/dist/intelligence/index.js +3 -13
  48. package/dist/intelligence/index.js.map +1 -1
  49. package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
  50. package/dist/mcp/claudeFlowSdkServer.js +3 -9
  51. package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
  52. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +5 -5
  53. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -1
  54. package/dist/mcp/fastmcp/tools/swarm/init.d.ts.map +1 -1
  55. package/dist/mcp/fastmcp/tools/swarm/init.js +7 -36
  56. package/dist/mcp/fastmcp/tools/swarm/init.js.map +1 -1
  57. package/dist/mcp/fastmcp/tools/swarm/spawn.d.ts.map +1 -1
  58. package/dist/mcp/fastmcp/tools/swarm/spawn.js +8 -47
  59. package/dist/mcp/fastmcp/tools/swarm/spawn.js.map +1 -1
  60. package/dist/mcp/tools/agent-booster-tools.d.ts +1 -1
  61. package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
  62. package/dist/mcp/tools/agent-booster-tools.js +4 -10
  63. package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
  64. package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
  65. package/dist/mcp/tools/sona-tools.js +0 -6
  66. package/dist/mcp/tools/sona-tools.js.map +1 -1
  67. package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
  68. package/dist/optimizations/agent-booster-migration.js +2 -5
  69. package/dist/optimizations/agent-booster-migration.js.map +1 -1
  70. package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
  71. package/dist/proxy/anthropic-to-requesty.js.map +1 -1
  72. package/dist/proxy/quic-proxy.d.ts +1 -0
  73. package/dist/proxy/quic-proxy.d.ts.map +1 -1
  74. package/dist/proxy/quic-proxy.js +2 -2
  75. package/dist/proxy/quic-proxy.js.map +1 -1
  76. package/dist/reasoningbank/AdvancedMemory.js +1 -1
  77. package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
  78. package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
  79. package/dist/reasoningbank/HybridBackend.js +5 -2
  80. package/dist/reasoningbank/HybridBackend.js.map +1 -1
  81. package/dist/reasoningbank/backend-selector.d.ts +1 -11
  82. package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
  83. package/dist/reasoningbank/backend-selector.js +5 -45
  84. package/dist/reasoningbank/backend-selector.js.map +1 -1
  85. package/dist/reasoningbank/core/consolidate.d.ts.map +1 -1
  86. package/dist/reasoningbank/core/consolidate.js +45 -113
  87. package/dist/reasoningbank/core/consolidate.js.map +1 -1
  88. package/dist/reasoningbank/index-new.d.ts +6 -1
  89. package/dist/reasoningbank/index-new.d.ts.map +1 -1
  90. package/dist/reasoningbank/index-new.js +6 -1
  91. package/dist/reasoningbank/index-new.js.map +1 -1
  92. package/dist/reasoningbank/index.d.ts +6 -2
  93. package/dist/reasoningbank/index.d.ts.map +1 -1
  94. package/dist/reasoningbank/index.js +6 -2
  95. package/dist/reasoningbank/index.js.map +1 -1
  96. package/dist/reasoningbank/utils/embeddings.d.ts +0 -1
  97. package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
  98. package/dist/reasoningbank/utils/embeddings.js +26 -53
  99. package/dist/reasoningbank/utils/embeddings.js.map +1 -1
  100. package/dist/router/index.d.ts +17 -0
  101. package/dist/router/index.d.ts.map +1 -0
  102. package/dist/router/index.js +19 -0
  103. package/dist/router/index.js.map +1 -0
  104. package/dist/router/providers/onnx-local-optimized.d.ts +0 -2
  105. package/dist/router/providers/onnx-local-optimized.d.ts.map +1 -1
  106. package/dist/router/providers/onnx-local-optimized.js +0 -10
  107. package/dist/router/providers/onnx-local-optimized.js.map +1 -1
  108. package/dist/router/providers/onnx-local.d.ts +0 -1
  109. package/dist/router/providers/onnx-local.d.ts.map +1 -1
  110. package/dist/router/providers/onnx-local.js +5 -22
  111. package/dist/router/providers/onnx-local.js.map +1 -1
  112. package/dist/services/embedding-service.js.map +1 -1
  113. package/dist/services/sona-agent-training.d.ts +0 -1
  114. package/dist/services/sona-agent-training.d.ts.map +1 -1
  115. package/dist/services/sona-agent-training.js.map +1 -1
  116. package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
  117. package/dist/services/sona-agentdb-integration.js +6 -9
  118. package/dist/services/sona-agentdb-integration.js.map +1 -1
  119. package/dist/services/sona-service.d.ts.map +1 -1
  120. package/dist/services/sona-service.js +5 -6
  121. package/dist/services/sona-service.js.map +1 -1
  122. package/dist/utils/cli.d.ts +1 -1
  123. package/dist/utils/cli.d.ts.map +1 -1
  124. package/dist/utils/cli.js +0 -21
  125. package/dist/utils/cli.js.map +1 -1
  126. package/package.json +7 -19
  127. package/scripts/postinstall.js +4 -45
  128. package/.claude/agents/.claude-flow/metrics/agent-metrics.json +0 -1
  129. package/.claude/agents/.claude-flow/metrics/performance.json +0 -87
  130. package/.claude/agents/.claude-flow/metrics/task-metrics.json +0 -10
  131. package/.claude/skills/.claude-flow/metrics/agent-metrics.json +0 -1
  132. package/.claude/skills/.claude-flow/metrics/performance.json +0 -87
  133. package/.claude/skills/.claude-flow/metrics/task-metrics.json +0 -10
  134. package/.claude/skills/agentic-flow-quickstart/skill.md +0 -69
  135. package/.claude/skills/hooks-automation/skill.md +0 -155
  136. package/.claude/skills/memory-patterns/skill.md +0 -110
  137. package/.claude/skills/skill-builder/.claude-flow/metrics/agent-metrics.json +0 -1
  138. package/.claude/skills/skill-builder/.claude-flow/metrics/performance.json +0 -87
  139. package/.claude/skills/skill-builder/.claude-flow/metrics/task-metrics.json +0 -10
  140. package/.claude/skills/sparc-methodology/skill.md +0 -137
  141. package/.claude/skills/swarm-coordination/skill.md +0 -94
  142. package/.claude/skills/worker-benchmarks/skill.md +0 -135
  143. package/.claude/skills/worker-integration/skill.md +0 -154
  144. package/.claude/statusline.mjs +0 -109
  145. package/.claude/statusline.sh +0 -71
  146. package/dist/agentdb/benchmarks/comprehensive-benchmark.js +0 -664
  147. package/dist/agentdb/benchmarks/frontier-benchmark.js +0 -419
  148. package/dist/agentdb/benchmarks/reflexion-benchmark.js +0 -370
  149. package/dist/agentdb/cli/agentdb-cli.js +0 -717
  150. package/dist/agentdb/controllers/CausalMemoryGraph.js +0 -322
  151. package/dist/agentdb/controllers/CausalRecall.js +0 -281
  152. package/dist/agentdb/controllers/EmbeddingService.d.ts +0 -37
  153. package/dist/agentdb/controllers/EmbeddingService.d.ts.map +0 -1
  154. package/dist/agentdb/controllers/EmbeddingService.js +0 -119
  155. package/dist/agentdb/controllers/EmbeddingService.js.map +0 -1
  156. package/dist/agentdb/controllers/ExplainableRecall.js +0 -387
  157. package/dist/agentdb/controllers/NightlyLearner.js +0 -382
  158. package/dist/agentdb/controllers/ReflexionMemory.js +0 -239
  159. package/dist/agentdb/controllers/SkillLibrary.js +0 -276
  160. package/dist/agentdb/controllers/frontier-index.js +0 -9
  161. package/dist/agentdb/controllers/index.js +0 -8
  162. package/dist/agentdb/optimizations/BatchOperations.js +0 -198
  163. package/dist/agentdb/optimizations/QueryOptimizer.js +0 -225
  164. package/dist/agentdb/optimizations/index.js +0 -7
  165. package/dist/agentdb/tests/frontier-features.test.js +0 -665
  166. package/dist/benchmarks/embeddings-benchmark.d.ts +0 -38
  167. package/dist/benchmarks/embeddings-benchmark.d.ts.map +0 -1
  168. package/dist/benchmarks/embeddings-benchmark.js +0 -282
  169. package/dist/benchmarks/embeddings-benchmark.js.map +0 -1
  170. package/dist/cli/commands/embeddings.d.ts +0 -12
  171. package/dist/cli/commands/embeddings.d.ts.map +0 -1
  172. package/dist/cli/commands/embeddings.js +0 -386
  173. package/dist/cli/commands/embeddings.js.map +0 -1
  174. package/dist/cli/commands/init.d.ts +0 -8
  175. package/dist/cli/commands/init.d.ts.map +0 -1
  176. package/dist/cli/commands/init.js +0 -514
  177. package/dist/cli/commands/init.js.map +0 -1
  178. package/dist/cli/commands/workers.d.ts +0 -9
  179. package/dist/cli/commands/workers.d.ts.map +0 -1
  180. package/dist/cli/commands/workers.js +0 -991
  181. package/dist/cli/commands/workers.js.map +0 -1
  182. package/dist/cli/skills-manager.js +0 -1297
  183. package/dist/cli/update-message.js +0 -175
  184. package/dist/embeddings/index.d.ts +0 -17
  185. package/dist/embeddings/index.d.ts.map +0 -1
  186. package/dist/embeddings/index.js +0 -17
  187. package/dist/embeddings/index.js.map +0 -1
  188. package/dist/embeddings/neural-substrate.d.ts +0 -206
  189. package/dist/embeddings/neural-substrate.d.ts.map +0 -1
  190. package/dist/embeddings/neural-substrate.js +0 -629
  191. package/dist/embeddings/neural-substrate.js.map +0 -1
  192. package/dist/embeddings/optimized-embedder.d.ts +0 -103
  193. package/dist/embeddings/optimized-embedder.d.ts.map +0 -1
  194. package/dist/embeddings/optimized-embedder.js +0 -730
  195. package/dist/embeddings/optimized-embedder.js.map +0 -1
  196. package/dist/examples/embedding-geometry.d.ts +0 -105
  197. package/dist/examples/embedding-geometry.d.ts.map +0 -1
  198. package/dist/examples/embedding-geometry.js +0 -528
  199. package/dist/examples/embedding-geometry.js.map +0 -1
  200. package/dist/memory/SharedMemoryPool.d.ts +0 -129
  201. package/dist/memory/SharedMemoryPool.d.ts.map +0 -1
  202. package/dist/memory/SharedMemoryPool.js +0 -243
  203. package/dist/memory/SharedMemoryPool.js.map +0 -1
  204. package/dist/memory/index.d.ts +0 -8
  205. package/dist/memory/index.d.ts.map +0 -1
  206. package/dist/memory/index.js +0 -7
  207. package/dist/memory/index.js.map +0 -1
  208. package/dist/proxy/http3-proxy-old.js +0 -331
  209. package/dist/proxy/proxy/anthropic-to-gemini.js +0 -439
  210. package/dist/proxy/utils/logger.js +0 -59
  211. package/dist/reasoningbank/agentdb-adapter.js +0 -125
  212. package/dist/reasoningbank/core/database.js +0 -250
  213. package/dist/reasoningbank/core/memory-engine.js +0 -335
  214. package/dist/swarm/ipfs-swarm.d.ts +0 -265
  215. package/dist/swarm/ipfs-swarm.d.ts.map +0 -1
  216. package/dist/swarm/ipfs-swarm.js +0 -508
  217. package/dist/swarm/ipfs-swarm.js.map +0 -1
  218. package/dist/swarm/p2p-free-swarm.d.ts +0 -344
  219. package/dist/swarm/p2p-free-swarm.d.ts.map +0 -1
  220. package/dist/swarm/p2p-free-swarm.js +0 -603
  221. package/dist/swarm/p2p-free-swarm.js.map +0 -1
  222. package/dist/swarm/real-p2p-swarm.d.ts +0 -183
  223. package/dist/swarm/real-p2p-swarm.d.ts.map +0 -1
  224. package/dist/swarm/real-p2p-swarm.js +0 -469
  225. package/dist/swarm/real-p2p-swarm.js.map +0 -1
  226. package/dist/utils/adaptive-pool-sizing.js +0 -414
  227. package/dist/utils/agentdbCommands.js +0 -175
  228. package/dist/utils/circular-rate-limiter.js +0 -391
  229. package/dist/utils/dynamic-compression.js +0 -298
  230. package/dist/utils/http2-multiplexing.js +0 -319
  231. package/dist/utils/index.d.ts +0 -6
  232. package/dist/utils/index.d.ts.map +0 -1
  233. package/dist/utils/index.js +0 -6
  234. package/dist/utils/index.js.map +0 -1
  235. package/dist/utils/lazy-auth.js +0 -311
  236. package/dist/utils/model-cache.d.ts +0 -61
  237. package/dist/utils/model-cache.d.ts.map +0 -1
  238. package/dist/utils/model-cache.js +0 -176
  239. package/dist/utils/model-cache.js.map +0 -1
  240. package/dist/utils/server-push.js +0 -251
  241. package/dist/utils/suppress-warnings.d.ts +0 -19
  242. package/dist/utils/suppress-warnings.d.ts.map +0 -1
  243. package/dist/utils/suppress-warnings.js +0 -59
  244. package/dist/utils/suppress-warnings.js.map +0 -1
  245. package/dist/utils/zero-copy-buffer.js +0 -286
  246. package/dist/workers/consolidated-phases.d.ts +0 -40
  247. package/dist/workers/consolidated-phases.d.ts.map +0 -1
  248. package/dist/workers/consolidated-phases.js +0 -497
  249. package/dist/workers/consolidated-phases.js.map +0 -1
  250. package/dist/workers/custom-worker-config.d.ts +0 -133
  251. package/dist/workers/custom-worker-config.d.ts.map +0 -1
  252. package/dist/workers/custom-worker-config.js +0 -215
  253. package/dist/workers/custom-worker-config.js.map +0 -1
  254. package/dist/workers/custom-worker-factory.d.ts +0 -89
  255. package/dist/workers/custom-worker-factory.d.ts.map +0 -1
  256. package/dist/workers/custom-worker-factory.js +0 -404
  257. package/dist/workers/custom-worker-factory.js.map +0 -1
  258. package/dist/workers/dispatch-service.d.ts +0 -123
  259. package/dist/workers/dispatch-service.d.ts.map +0 -1
  260. package/dist/workers/dispatch-service.js +0 -1024
  261. package/dist/workers/dispatch-service.js.map +0 -1
  262. package/dist/workers/hooks-integration.d.ts +0 -79
  263. package/dist/workers/hooks-integration.d.ts.map +0 -1
  264. package/dist/workers/hooks-integration.js +0 -286
  265. package/dist/workers/hooks-integration.js.map +0 -1
  266. package/dist/workers/index.d.ts +0 -42
  267. package/dist/workers/index.d.ts.map +0 -1
  268. package/dist/workers/index.js +0 -52
  269. package/dist/workers/index.js.map +0 -1
  270. package/dist/workers/mcp-tools.d.ts +0 -56
  271. package/dist/workers/mcp-tools.d.ts.map +0 -1
  272. package/dist/workers/mcp-tools.js +0 -359
  273. package/dist/workers/mcp-tools.js.map +0 -1
  274. package/dist/workers/phase-executors.d.ts +0 -22
  275. package/dist/workers/phase-executors.d.ts.map +0 -1
  276. package/dist/workers/phase-executors.js +0 -445
  277. package/dist/workers/phase-executors.js.map +0 -1
  278. package/dist/workers/resource-governor.d.ts +0 -75
  279. package/dist/workers/resource-governor.d.ts.map +0 -1
  280. package/dist/workers/resource-governor.js +0 -187
  281. package/dist/workers/resource-governor.js.map +0 -1
  282. package/dist/workers/ruvector-integration.d.ts +0 -163
  283. package/dist/workers/ruvector-integration.d.ts.map +0 -1
  284. package/dist/workers/ruvector-integration.js +0 -543
  285. package/dist/workers/ruvector-integration.js.map +0 -1
  286. package/dist/workers/ruvector-native-integration.d.ts +0 -91
  287. package/dist/workers/ruvector-native-integration.d.ts.map +0 -1
  288. package/dist/workers/ruvector-native-integration.js +0 -254
  289. package/dist/workers/ruvector-native-integration.js.map +0 -1
  290. package/dist/workers/trigger-detector.d.ts +0 -68
  291. package/dist/workers/trigger-detector.d.ts.map +0 -1
  292. package/dist/workers/trigger-detector.js +0 -281
  293. package/dist/workers/trigger-detector.js.map +0 -1
  294. package/dist/workers/types.d.ts +0 -145
  295. package/dist/workers/types.d.ts.map +0 -1
  296. package/dist/workers/types.js +0 -6
  297. package/dist/workers/types.js.map +0 -1
  298. package/dist/workers/worker-agent-integration.d.ts +0 -140
  299. package/dist/workers/worker-agent-integration.d.ts.map +0 -1
  300. package/dist/workers/worker-agent-integration.js +0 -471
  301. package/dist/workers/worker-agent-integration.js.map +0 -1
  302. package/dist/workers/worker-benchmarks.d.ts +0 -88
  303. package/dist/workers/worker-benchmarks.d.ts.map +0 -1
  304. package/dist/workers/worker-benchmarks.js +0 -452
  305. package/dist/workers/worker-benchmarks.js.map +0 -1
  306. package/dist/workers/worker-registry.d.ts +0 -85
  307. package/dist/workers/worker-registry.d.ts.map +0 -1
  308. package/dist/workers/worker-registry.js +0 -547
  309. package/dist/workers/worker-registry.js.map +0 -1
  310. package/docs/.claude-flow/metrics/agent-metrics.json +0 -1
  311. package/docs/.claude-flow/metrics/performance.json +0 -87
  312. package/docs/.claude-flow/metrics/task-metrics.json +0 -10
  313. package/docs/embeddings/EMBEDDING_GEOMETRY.md +0 -935
  314. /package/.claude/agents/analysis/{analyze-code-quality.md → code-review/analyze-code-quality.md} +0 -0
  315. /package/.claude/agents/architecture/{arch-system-design.md → system-design/arch-system-design.md} +0 -0
  316. /package/.claude/agents/data/{data-ml-model.md → ml/data-ml-model.md} +0 -0
  317. /package/.claude/agents/development/{dev-backend-api.md → backend/dev-backend-api.md} +0 -0
  318. /package/.claude/agents/devops/{ops-cicd-github.md → ci-cd/ops-cicd-github.md} +0 -0
  319. /package/.claude/agents/documentation/{docs-api-openapi.md → api-docs/docs-api-openapi.md} +0 -0
  320. /package/.claude/agents/specialized/{spec-mobile-react-native.md → mobile/spec-mobile-react-native.md} +0 -0
  321. /package/.claude/agents/testing/{tdd-london-swarm.md → unit/tdd-london-swarm.md} +0 -0
  322. /package/.claude/agents/testing/{production-validator.md → validation/production-validator.md} +0 -0
@@ -1 +1 @@
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\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 as any).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\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 +1 @@
1
- {"version":3,"file":"anthropic-to-requesty.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-requesty.ts"],"names":[],"mappings":"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","sourcesContent":["// Anthropic to Requesty Proxy Server\n// Converts Anthropic API format to Requesty 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 AnthropicToRequestyProxy {\n private app: express.Application;\n private requestyApiKey: string;\n private requestyBaseUrl: string;\n private defaultModel: string;\n private capabilities?: ModelCapabilities;\n\n constructor(config: {\n requestyApiKey: string;\n requestyBaseUrl?: string;\n defaultModel?: string;\n capabilities?: ModelCapabilities;\n }) {\n this.app = express();\n this.requestyApiKey = config.requestyApiKey;\n this.requestyBaseUrl = config.requestyBaseUrl || 'https://router.requesty.ai/v1';\n this.defaultModel = config.defaultModel || 'deepseek/deepseek-chat';\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-requesty-proxy' });\n });\n\n // Anthropic Messages API → Requesty Chat Completions\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n console.log('šŸ”µ REQUEST RECEIVED AT PROXY - /v1/messages');\n logger.info('šŸ”µ REQUEST RECEIVED AT PROXY - /v1/messages');\n try {\n const anthropicReq: AnthropicRequest = req.body;\n console.log('šŸ”µ Request body parsed successfully');\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 Requesty 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.requestyApiKey,\n apiKeyPrefix: this.requestyApiKey?.substring(0, 10)\n });\n\n // Forward to Requesty\n const response = await fetch(`${this.requestyBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.requestyApiKey}`,\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('Requesty 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 Requesty response status\n logger.info('=== REQUESTY RESPONSE RECEIVED ===', {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries((response.headers as any).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 // Cap max_tokens at 8192 for OpenAI models via Requesty\n let maxTokens = anthropicReq.max_tokens;\n if (maxTokens && maxTokens > 8192) {\n maxTokens = 8192;\n }\n const openaiReq = {\n model: anthropicReq.model || this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n temperature: anthropicReq.temperature,\n max_tokens: maxTokens\n };\n const response = await this.callRequesty(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 callRequesty(openaiReq: any): Promise<any> {\n // Add timeout for Requesty API calls (60 seconds)\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000);\n\n try {\n const response = await fetch(`${this.requestyBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.requestyApiKey}`,\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 signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Requesty API error: ${error}`);\n }\n\n return response.json();\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === 'AbortError') {\n throw new Error('Requesty API request timed out after 60 seconds');\n }\n throw error;\n }\n }\n\n\n /**\n * Sanitize JSON Schema to be OpenAI-compatible\n * Fixes array properties without items, removes unsupported keywords\n */\n private sanitizeJsonSchema(schema: any, path: string = 'root'): any {\n if (!schema || typeof schema !== 'object') {\n return schema;\n }\n\n // Create a shallow copy to avoid mutations\n const sanitized = { ...schema };\n\n // Fix array types without items\n if (sanitized.type === 'array' && !sanitized.items) {\n logger.warn(`Schema sanitization: Adding missing 'items' for array at ${path}`);\n sanitized.items = { type: 'string' };\n }\n\n // Remove JSON Schema 2020-12 keywords not supported by OpenAI\n const unsupportedKeywords = [\n '$schema', '$id', '$ref', '$defs', 'definitions',\n 'if', 'then', 'else', 'dependentSchemas', 'dependentRequired',\n 'prefixItems', 'unevaluatedItems', 'unevaluatedProperties',\n 'minContains', 'maxContains', 'patternProperties',\n 'additionalItems', 'contains'\n ];\n\n for (const keyword of unsupportedKeywords) {\n if (keyword in sanitized) {\n logger.warn(`Schema sanitization: Removing unsupported keyword '${keyword}' at ${path}`);\n delete sanitized[keyword];\n }\n }\n\n // Recursively sanitize nested properties\n if (sanitized.properties && typeof sanitized.properties === 'object') {\n sanitized.properties = {};\n for (const [key, value] of Object.entries(schema.properties)) {\n sanitized.properties[key] = this.sanitizeJsonSchema(value, `${path}.properties.${key}`);\n }\n }\n\n // Recursively sanitize array items\n if (sanitized.items && typeof sanitized.items === 'object') {\n sanitized.items = this.sanitizeJsonSchema(sanitized.items, `${path}.items`);\n }\n\n // Recursively sanitize allOf, anyOf, oneOf\n for (const combinator of ['allOf', 'anyOf', 'oneOf']) {\n if (Array.isArray(sanitized[combinator])) {\n sanitized[combinator] = sanitized[combinator].map((subschema: any, index: number) =>\n this.sanitizeJsonSchema(subschema, `${path}.${combinator}[${index}]`)\n );\n }\n }\n\n return sanitized;\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: Requesty models use native OpenAI tool calling\n // - If MCP tools are provided, Requesty handles them via function calling\n // - Do NOT inject XML instructions - they cause malformed output\n // - Let Requesty 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 - Requesty 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 let maxTokens = getMaxTokensForModel(finalModel, anthropicReq.max_tokens);\n\n // Cap at 8192 for OpenAI models via Requesty\n if (maxTokens && maxTokens > 8192) {\n maxTokens = 8192;\n }\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 totalTools: anthropicReq.tools.length\n });\n\n // Requesty has strict limits - only send a subset of tools to avoid timeouts\n // Requesty also rejects empty tools arrays, so we either send tools or omit the parameter\n const MAX_TOOLS_FOR_REQUESTY = 10; // Very conservative limit - Requesty timeouts with more\n const toolsToConvert = anthropicReq.tools.slice(0, MAX_TOOLS_FOR_REQUESTY);\n\n if (anthropicReq.tools.length > MAX_TOOLS_FOR_REQUESTY) {\n logger.warn(`Limiting tools to ${MAX_TOOLS_FOR_REQUESTY} for Requesty (${anthropicReq.tools.length} available)`);\n }\n\n // Only set tools if we have at least one (Requesty rejects empty arrays)\n if (toolsToConvert.length > 0) {\n openaiReq.tools = toolsToConvert.map(tool => {\n // Sanitize the input schema to fix array properties without items\n const rawSchema = tool.input_schema || {\n type: 'object',\n properties: {},\n required: []\n };\n const sanitizedSchema = this.sanitizeJsonSchema(rawSchema, `tool.${tool.name}`);\n\n const openaiTool = {\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description || '',\n parameters: sanitizedSchema\n }\n };\n return openaiTool;\n });\n\n logger.info('Forwarding MCP tools to Requesty', {\n toolCount: openaiReq.tools.length,\n toolNames: openaiReq.tools.map(t => t.function.name).slice(0, 5)\n });\n } else {\n logger.info('No tools to send (omitting tools parameter entirely for Requesty)');\n // Don't set openaiReq.tools at all - Requesty rejects empty arrays\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 // Requesty 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 Requesty 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 Requesty proxy started', {\n port,\n requestyBaseUrl: this.requestyBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\nāœ… Anthropic Proxy running at http://localhost:${port}`);\n console.log(` Requesty Base URL: ${this.requestyBaseUrl}`);\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 requestyApiKey = process.env.REQUESTY_API_KEY;\n\n if (!requestyApiKey) {\n console.error('āŒ Error: REQUESTY_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToRequestyProxy({\n requestyApiKey,\n requestyBaseUrl: 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-requesty.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-requesty.ts"],"names":[],"mappings":"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","sourcesContent":["// Anthropic to Requesty Proxy Server\n// Converts Anthropic API format to Requesty 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 AnthropicToRequestyProxy {\n private app: express.Application;\n private requestyApiKey: string;\n private requestyBaseUrl: string;\n private defaultModel: string;\n private capabilities?: ModelCapabilities;\n\n constructor(config: {\n requestyApiKey: string;\n requestyBaseUrl?: string;\n defaultModel?: string;\n capabilities?: ModelCapabilities;\n }) {\n this.app = express();\n this.requestyApiKey = config.requestyApiKey;\n this.requestyBaseUrl = config.requestyBaseUrl || 'https://router.requesty.ai/v1';\n this.defaultModel = config.defaultModel || 'deepseek/deepseek-chat';\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-requesty-proxy' });\n });\n\n // Anthropic Messages API → Requesty Chat Completions\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n console.log('šŸ”µ REQUEST RECEIVED AT PROXY - /v1/messages');\n logger.info('šŸ”µ REQUEST RECEIVED AT PROXY - /v1/messages');\n try {\n const anthropicReq: AnthropicRequest = req.body;\n console.log('šŸ”µ Request body parsed successfully');\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 Requesty 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.requestyApiKey,\n apiKeyPrefix: this.requestyApiKey?.substring(0, 10)\n });\n\n // Forward to Requesty\n const response = await fetch(`${this.requestyBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.requestyApiKey}`,\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('Requesty 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 Requesty response status\n logger.info('=== REQUESTY 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 // Cap max_tokens at 8192 for OpenAI models via Requesty\n let maxTokens = anthropicReq.max_tokens;\n if (maxTokens && maxTokens > 8192) {\n maxTokens = 8192;\n }\n const openaiReq = {\n model: anthropicReq.model || this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n temperature: anthropicReq.temperature,\n max_tokens: maxTokens\n };\n const response = await this.callRequesty(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 callRequesty(openaiReq: any): Promise<any> {\n // Add timeout for Requesty API calls (60 seconds)\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000);\n\n try {\n const response = await fetch(`${this.requestyBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.requestyApiKey}`,\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 signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Requesty API error: ${error}`);\n }\n\n return response.json();\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === 'AbortError') {\n throw new Error('Requesty API request timed out after 60 seconds');\n }\n throw error;\n }\n }\n\n\n /**\n * Sanitize JSON Schema to be OpenAI-compatible\n * Fixes array properties without items, removes unsupported keywords\n */\n private sanitizeJsonSchema(schema: any, path: string = 'root'): any {\n if (!schema || typeof schema !== 'object') {\n return schema;\n }\n\n // Create a shallow copy to avoid mutations\n const sanitized = { ...schema };\n\n // Fix array types without items\n if (sanitized.type === 'array' && !sanitized.items) {\n logger.warn(`Schema sanitization: Adding missing 'items' for array at ${path}`);\n sanitized.items = { type: 'string' };\n }\n\n // Remove JSON Schema 2020-12 keywords not supported by OpenAI\n const unsupportedKeywords = [\n '$schema', '$id', '$ref', '$defs', 'definitions',\n 'if', 'then', 'else', 'dependentSchemas', 'dependentRequired',\n 'prefixItems', 'unevaluatedItems', 'unevaluatedProperties',\n 'minContains', 'maxContains', 'patternProperties',\n 'additionalItems', 'contains'\n ];\n\n for (const keyword of unsupportedKeywords) {\n if (keyword in sanitized) {\n logger.warn(`Schema sanitization: Removing unsupported keyword '${keyword}' at ${path}`);\n delete sanitized[keyword];\n }\n }\n\n // Recursively sanitize nested properties\n if (sanitized.properties && typeof sanitized.properties === 'object') {\n sanitized.properties = {};\n for (const [key, value] of Object.entries(schema.properties)) {\n sanitized.properties[key] = this.sanitizeJsonSchema(value, `${path}.properties.${key}`);\n }\n }\n\n // Recursively sanitize array items\n if (sanitized.items && typeof sanitized.items === 'object') {\n sanitized.items = this.sanitizeJsonSchema(sanitized.items, `${path}.items`);\n }\n\n // Recursively sanitize allOf, anyOf, oneOf\n for (const combinator of ['allOf', 'anyOf', 'oneOf']) {\n if (Array.isArray(sanitized[combinator])) {\n sanitized[combinator] = sanitized[combinator].map((subschema: any, index: number) =>\n this.sanitizeJsonSchema(subschema, `${path}.${combinator}[${index}]`)\n );\n }\n }\n\n return sanitized;\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: Requesty models use native OpenAI tool calling\n // - If MCP tools are provided, Requesty handles them via function calling\n // - Do NOT inject XML instructions - they cause malformed output\n // - Let Requesty 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 - Requesty 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 let maxTokens = getMaxTokensForModel(finalModel, anthropicReq.max_tokens);\n\n // Cap at 8192 for OpenAI models via Requesty\n if (maxTokens && maxTokens > 8192) {\n maxTokens = 8192;\n }\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 totalTools: anthropicReq.tools.length\n });\n\n // Requesty has strict limits - only send a subset of tools to avoid timeouts\n // Requesty also rejects empty tools arrays, so we either send tools or omit the parameter\n const MAX_TOOLS_FOR_REQUESTY = 10; // Very conservative limit - Requesty timeouts with more\n const toolsToConvert = anthropicReq.tools.slice(0, MAX_TOOLS_FOR_REQUESTY);\n\n if (anthropicReq.tools.length > MAX_TOOLS_FOR_REQUESTY) {\n logger.warn(`Limiting tools to ${MAX_TOOLS_FOR_REQUESTY} for Requesty (${anthropicReq.tools.length} available)`);\n }\n\n // Only set tools if we have at least one (Requesty rejects empty arrays)\n if (toolsToConvert.length > 0) {\n openaiReq.tools = toolsToConvert.map(tool => {\n // Sanitize the input schema to fix array properties without items\n const rawSchema = tool.input_schema || {\n type: 'object',\n properties: {},\n required: []\n };\n const sanitizedSchema = this.sanitizeJsonSchema(rawSchema, `tool.${tool.name}`);\n\n const openaiTool = {\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description || '',\n parameters: sanitizedSchema\n }\n };\n return openaiTool;\n });\n\n logger.info('Forwarding MCP tools to Requesty', {\n toolCount: openaiReq.tools.length,\n toolNames: openaiReq.tools.map(t => t.function.name).slice(0, 5)\n });\n } else {\n logger.info('No tools to send (omitting tools parameter entirely for Requesty)');\n // Don't set openaiReq.tools at all - Requesty rejects empty arrays\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 // Requesty 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 Requesty 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 Requesty proxy started', {\n port,\n requestyBaseUrl: this.requestyBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\nāœ… Anthropic Proxy running at http://localhost:${port}`);\n console.log(` Requesty Base URL: ${this.requestyBaseUrl}`);\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 requestyApiKey = process.env.REQUESTY_API_KEY;\n\n if (!requestyApiKey) {\n console.error('āŒ Error: REQUESTY_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToRequestyProxy({\n requestyApiKey,\n requestyBaseUrl: 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,3 +1,4 @@
1
+ import { Response } from 'express';
1
2
  import { QuicConfig } from '../transport/quic.js';
2
3
  import { AnthropicToOpenRouterProxy } from './anthropic-to-openrouter.js';
3
4
  export interface QuicProxyConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"quic-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/quic-proxy.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkC,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElF,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,MAAM,WAAW,eAAe;IAE9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,IAAI,CAAC,EAAE,UAAU,CAAC;IAGlB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,gBAAiB,SAAQ,0BAA0B;IAC9D,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,eAAe,CAAU;gBAErB,MAAM,EAAE,eAAe;IAgBnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;YACW,cAAc;IAsB5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;cACa,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgBjF;;OAEG;YACW,eAAe;IA0E7B;;OAEG;YACW,gBAAgB;IAK9B;;OAEG;IACH,iBAAiB,IAAI,GAAG;IAexB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAWhC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAUzE"}
1
+ {"version":3,"file":"quic-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/quic-proxy.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAW,QAAQ,EAAgB,MAAM,SAAS,CAAC;AACnE,OAAO,EAAkC,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElF,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,MAAM,WAAW,eAAe;IAE9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,IAAI,CAAC,EAAE,UAAU,CAAC;IAGlB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,gBAAiB,SAAQ,0BAA0B;IAC9D,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,eAAe,CAAU;gBAErB,MAAM,EAAE,eAAe;IAgBnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;YACW,cAAc;IAsB5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;cACa,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgBjF;;OAEG;YACW,eAAe;IA0E7B;;OAEG;YACW,gBAAgB;IAK9B;;OAEG;IACH,iBAAiB,IAAI,GAAG;IAexB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAWhC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAUzE"}
@@ -104,8 +104,8 @@ export class QuicEnabledProxy extends AnthropicToOpenRouterProxy {
104
104
  const headerEntries = options.headers instanceof Headers
105
105
  ? Array.from(options.headers.entries())
106
106
  : Object.entries(options.headers);
107
- for (const entry of headerEntries) {
108
- headers[entry[0]] = entry[1];
107
+ for (const [key, value] of headerEntries) {
108
+ headers[key] = value;
109
109
  }
110
110
  }
111
111
  // Convert body to Uint8Array