agentic-flow 2.0.1-alpha.5 ā 2.0.1-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentdb/controllers/EmbeddingService.d.ts +37 -0
- package/dist/agentdb/controllers/EmbeddingService.d.ts.map +1 -0
- package/dist/agentdb/controllers/EmbeddingService.js +1 -0
- package/dist/agentdb/controllers/EmbeddingService.js.map +1 -0
- package/dist/billing/mcp/tools.d.ts.map +1 -1
- package/dist/billing/mcp/tools.js +2 -0
- package/dist/billing/mcp/tools.js.map +1 -1
- package/dist/cli/commands/hooks.d.ts +18 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -0
- package/dist/cli/commands/hooks.js +750 -0
- package/dist/cli/commands/hooks.js.map +1 -0
- package/dist/cli-proxy.js +26 -1
- package/dist/cli-proxy.js.map +1 -1
- package/dist/core/agentdb-fast.js +3 -3
- package/dist/core/agentdb-fast.js.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.js +32 -17
- package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
- package/dist/core/attention-native.d.ts +1 -0
- package/dist/core/attention-native.d.ts.map +1 -1
- package/dist/core/attention-native.js +6 -1
- package/dist/core/attention-native.js.map +1 -1
- package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
- package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.d.ts +362 -0
- package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -0
- package/dist/intelligence/RuVectorIntelligence.js +852 -0
- package/dist/intelligence/RuVectorIntelligence.js.map +1 -0
- package/dist/intelligence/index.d.ts +14 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +14 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/llm/RuvLLMOrchestrator.d.ts +184 -0
- package/dist/llm/RuvLLMOrchestrator.d.ts.map +1 -0
- package/dist/llm/RuvLLMOrchestrator.js +442 -0
- package/dist/llm/RuvLLMOrchestrator.js.map +1 -0
- package/dist/llm/index.d.ts +9 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +8 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.js +86 -21
- package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
- package/dist/mcp/fastmcp/servers/hooks-server.d.ts +15 -0
- package/dist/mcp/fastmcp/servers/hooks-server.d.ts.map +1 -0
- package/dist/mcp/fastmcp/servers/hooks-server.js +63 -0
- package/dist/mcp/fastmcp/servers/hooks-server.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts +20 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.js +110 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.js +276 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.d.ts +6 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.js +164 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/index.d.ts +28 -0
- package/dist/mcp/fastmcp/tools/hooks/index.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/index.js +59 -0
- package/dist/mcp/fastmcp/tools/hooks/index.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts +91 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +269 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts +58 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js +416 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts +6 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.js +137 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.js +91 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts +12 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.js +146 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.js +70 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts +14 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.js +121 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.js +171 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/route.d.ts +12 -0
- package/dist/mcp/fastmcp/tools/hooks/route.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/route.js +267 -0
- package/dist/mcp/fastmcp/tools/hooks/route.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.d.ts +46 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.js +159 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.js +151 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.js.map +1 -0
- package/dist/mcp/tools/agent-booster-tools.d.ts +10 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
- package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
- package/dist/mcp/tools/sona-tools.js +15 -3
- package/dist/mcp/tools/sona-tools.js.map +1 -1
- package/dist/memory/SharedMemoryPool.d.ts +16 -3
- package/dist/memory/SharedMemoryPool.d.ts.map +1 -1
- package/dist/memory/SharedMemoryPool.js +33 -1
- package/dist/memory/SharedMemoryPool.js.map +1 -1
- package/dist/middleware/auth.middleware.d.ts +114 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +222 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
- package/dist/optimizations/agent-booster-migration.js.map +1 -1
- package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-gemini.js.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
- package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-requesty.js.map +1 -1
- package/dist/proxy/quic-proxy.d.ts +0 -1
- package/dist/proxy/quic-proxy.d.ts.map +1 -1
- package/dist/proxy/quic-proxy.js +2 -1
- package/dist/proxy/quic-proxy.js.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.d.ts.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.js +12 -1
- package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
- package/dist/reasoningbank/HybridBackend.d.ts +9 -0
- package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
- package/dist/reasoningbank/HybridBackend.js +48 -4
- package/dist/reasoningbank/HybridBackend.js.map +1 -1
- package/dist/reasoningbank/backend-selector.d.ts +1 -1
- package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
- package/dist/reasoningbank/backend-selector.js.map +1 -1
- package/dist/reasoningbank/index-new.d.ts +0 -6
- package/dist/reasoningbank/index-new.d.ts.map +1 -1
- package/dist/reasoningbank/index-new.js +9 -7
- package/dist/reasoningbank/index-new.js.map +1 -1
- package/dist/reasoningbank/index.d.ts +1 -6
- package/dist/reasoningbank/index.d.ts.map +1 -1
- package/dist/reasoningbank/index.js +10 -7
- package/dist/reasoningbank/index.js.map +1 -1
- package/dist/router/providers/onnx-local.d.ts.map +1 -1
- package/dist/router/providers/onnx-local.js +3 -1
- package/dist/router/providers/onnx-local.js.map +1 -1
- package/dist/routing/CircuitBreakerRouter.d.ts +187 -0
- package/dist/routing/CircuitBreakerRouter.d.ts.map +1 -0
- package/dist/routing/CircuitBreakerRouter.js +460 -0
- package/dist/routing/CircuitBreakerRouter.js.map +1 -0
- package/dist/routing/SemanticRouter.d.ts +164 -0
- package/dist/routing/SemanticRouter.d.ts.map +1 -0
- package/dist/routing/SemanticRouter.js +291 -0
- package/dist/routing/SemanticRouter.js.map +1 -0
- package/dist/routing/index.d.ts +12 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +10 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/services/embedding-service.d.ts.map +1 -1
- package/dist/services/embedding-service.js +5 -2
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/sona-agent-training.js +1 -1
- package/dist/services/sona-agent-training.js.map +1 -1
- package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
- package/dist/services/sona-agentdb-integration.js +10 -5
- package/dist/services/sona-agentdb-integration.js.map +1 -1
- package/dist/services/sona-service.d.ts +6 -6
- package/dist/services/sona-service.d.ts.map +1 -1
- package/dist/services/sona-service.js +3 -1
- package/dist/services/sona-service.js.map +1 -1
- package/dist/utils/audit-logger.d.ts +115 -0
- package/dist/utils/audit-logger.d.ts.map +1 -0
- package/dist/utils/audit-logger.js +228 -0
- package/dist/utils/audit-logger.js.map +1 -0
- package/dist/utils/cli.d.ts +1 -1
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +5 -0
- package/dist/utils/cli.js.map +1 -1
- package/dist/utils/input-validator.d.ts +116 -0
- package/dist/utils/input-validator.d.ts.map +1 -0
- package/dist/utils/input-validator.js +299 -0
- package/dist/utils/input-validator.js.map +1 -0
- package/dist/utils/rate-limiter.js +2 -2
- package/dist/utils/rate-limiter.js.map +1 -1
- package/package.json +7 -2
- package/scripts/postinstall.js +68 -0
- package/wasm/reasoningbank/reasoningbank_wasm_bg.js +2 -2
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +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.entries())\n });\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n logger.info('Handling streaming response...');\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const anthropicChunk = this.convertOpenAIStreamToAnthropic(chunk);\n res.write(anthropicChunk);\n }\n\n res.end();\n return null; // Already sent response\n } else {\n logger.info('Handling non-streaming response...');\n // Non-streaming response\n const openaiRes = await response.json();\n\n // VERBOSE LOGGING: Log raw OpenAI response\n logger.info('=== RAW OPENAI RESPONSE ===', {\n id: openaiRes.id,\n model: openaiRes.model,\n choices: openaiRes.choices?.length,\n finishReason: openaiRes.choices?.[0]?.finish_reason,\n hasToolCalls: !!(openaiRes.choices?.[0]?.message?.tool_calls),\n toolCallCount: openaiRes.choices?.[0]?.message?.tool_calls?.length || 0,\n toolCallNames: openaiRes.choices?.[0]?.message?.tool_calls?.map((tc: any) => tc.function.name) || [],\n contentPreview: openaiRes.choices?.[0]?.message?.content?.substring(0, 300),\n usage: openaiRes.usage\n });\n\n const anthropicRes = this.convertOpenAIToAnthropic(openaiRes);\n\n // VERBOSE LOGGING: Log converted Anthropic response\n logger.info('=== CONVERTED ANTHROPIC RESPONSE ===', {\n id: anthropicRes.id,\n model: anthropicRes.model,\n role: anthropicRes.role,\n stopReason: anthropicRes.stop_reason,\n contentBlocks: anthropicRes.content?.length,\n contentTypes: anthropicRes.content?.map((c: any) => c.type),\n toolUseCount: anthropicRes.content?.filter((c: any) => c.type === 'tool_use').length,\n textPreview: anthropicRes.content?.find((c: any) => c.type === 'text')?.text?.substring(0, 200),\n usage: anthropicRes.usage\n });\n\n return anthropicRes;\n }\n }\n\n private async handleEmulatedRequest(\n anthropicReq: AnthropicRequest,\n capabilities: ModelCapabilities\n ): Promise<any> {\n const emulator = new ToolEmulator(\n anthropicReq.tools || [],\n capabilities.emulationStrategy as 'react' | 'prompt'\n );\n\n const lastMessage = anthropicReq.messages[anthropicReq.messages.length - 1];\n const userMessage = typeof lastMessage.content === 'string'\n ? lastMessage.content\n : (lastMessage.content.find(c => c.type === 'text')?.text || '');\n\n const result = await executeEmulation(\n emulator,\n userMessage,\n async (prompt) => {\n // Call model with emulation prompt\n const openaiReq = {\n model: anthropicReq.model || this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n temperature: anthropicReq.temperature,\n max_tokens: anthropicReq.max_tokens\n };\n const response = await this.callOpenRouter(openaiReq);\n return response.choices[0].message.content;\n },\n async (toolCall: ToolCall) => {\n logger.warn(`Tool execution not yet implemented: ${toolCall.name}`);\n return { error: 'Tool execution not implemented in Phase 2' };\n },\n { maxIterations: 5, verbose: process.env.VERBOSE === 'true' }\n );\n\n return {\n id: `emulated_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: result.finalAnswer || 'No response' }],\n model: anthropicReq.model || this.defaultModel,\n stop_reason: 'end_turn',\n usage: { input_tokens: 0, output_tokens: 0 }\n };\n }\n\n private async callOpenRouter(openaiReq: any): Promise<any> {\n const response = await fetch(`${this.openrouterBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.openrouterApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenRouter API error: ${error}`);\n }\n\n return response.json();\n }\n\n\n private convertAnthropicToOpenAI(anthropicReq: AnthropicRequest): OpenAIRequest {\n logger.info('=== STARTING ANTHROPIC TO OPENAI CONVERSION ===');\n const messages: OpenAIMessage[] = [];\n\n // Get model-specific tool instructions\n const modelId = anthropicReq.model || this.defaultModel;\n const provider = this.extractProvider(modelId);\n\n logger.info('Model detection:', {\n requestedModel: anthropicReq.model,\n defaultModel: this.defaultModel,\n finalModelId: modelId,\n extractedProvider: provider\n });\n\n // CRITICAL: OpenRouter models use native OpenAI tool calling\n // - If MCP tools are provided, OpenRouter handles them via function calling\n // - Do NOT inject XML instructions - they cause malformed output\n // - Let OpenRouter models use tools via OpenAI's tool_calls format\n\n let systemContent = '';\n\n // Check if we have MCP tools (function calling)\n const hasMcpTools = anthropicReq.tools && anthropicReq.tools.length > 0;\n\n logger.info('Tool detection:', {\n hasMcpTools,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || []\n });\n\n if (hasMcpTools) {\n // MCP tools present - OpenRouter will handle via function calling\n systemContent = 'You are a helpful AI assistant. When you need to perform actions, use the available tools by calling functions. Always explain what you\\'re doing.';\n logger.info('Using MCP tools system prompt (with function calling support)');\n } else {\n // No tools - simple response mode\n systemContent = 'You are a helpful AI assistant. Provide clear, well-formatted code and explanations.';\n logger.info('Using simple system prompt (no tools)');\n }\n\n if (anthropicReq.system) {\n // System can be string OR array of content blocks\n let originalSystem: string;\n if (typeof anthropicReq.system === 'string') {\n originalSystem = anthropicReq.system;\n } else if (Array.isArray(anthropicReq.system)) {\n // Extract text from content blocks\n originalSystem = anthropicReq.system\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text)\n .join('\\n');\n } else {\n originalSystem = '';\n }\n\n logger.info('Appending original system prompt:', {\n systemType: typeof anthropicReq.system,\n isArray: Array.isArray(anthropicReq.system),\n originalSystemLength: originalSystem.length,\n originalSystemPreview: originalSystem.substring(0, 200)\n });\n\n if (originalSystem) {\n systemContent += '\\n\\n' + originalSystem;\n }\n }\n\n messages.push({\n role: 'system',\n content: systemContent\n });\n\n logger.info('System message created:', {\n systemContentLength: systemContent.length,\n systemContentPreview: systemContent.substring(0, 300)\n });\n\n // Override model - if request has a Claude model, use defaultModel instead\n const requestedModel = anthropicReq.model || '';\n const shouldOverrideModel = requestedModel.startsWith('claude-') || !requestedModel;\n const finalModel = shouldOverrideModel ? this.defaultModel : requestedModel;\n\n // Convert Anthropic messages to OpenAI format\n for (const msg of anthropicReq.messages) {\n let content: string;\n\n if (typeof msg.content === 'string') {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n content = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n content = '';\n }\n\n messages.push({\n role: msg.role as 'user' | 'assistant',\n content\n });\n }\n\n // Get appropriate max_tokens for this model\n const maxTokens = getMaxTokensForModel(finalModel, anthropicReq.max_tokens);\n\n const openaiReq: OpenAIRequest = {\n model: finalModel,\n messages,\n max_tokens: maxTokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n };\n\n // Convert MCP/Anthropic tools to OpenAI tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info('Converting MCP tools to OpenAI format...');\n openaiReq.tools = anthropicReq.tools.map(tool => {\n const openaiTool = {\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description || '',\n parameters: tool.input_schema || {\n type: 'object',\n properties: {},\n required: []\n }\n }\n };\n logger.info(`Converted tool: ${tool.name}`, {\n hasDescription: !!tool.description,\n hasInputSchema: !!tool.input_schema\n });\n return openaiTool;\n });\n\n logger.info('Forwarding MCP tools to OpenRouter', {\n toolCount: openaiReq.tools.length,\n toolNames: openaiReq.tools.map(t => t.function.name)\n });\n } else {\n logger.info('No MCP tools to convert');\n }\n\n logger.info('=== CONVERSION COMPLETE ===', {\n messageCount: openaiReq.messages.length,\n hasMcpTools: !!openaiReq.tools,\n toolCount: openaiReq.tools?.length || 0,\n maxTokens: openaiReq.max_tokens,\n model: openaiReq.model\n });\n\n return openaiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertOpenAIToAnthropic(openaiRes: any): any {\n const choice = openaiRes.choices?.[0];\n if (!choice) {\n throw new Error('No choices in OpenAI response');\n }\n\n const message = choice.message || {};\n const rawText = message.content || choice.text || '';\n const toolCalls = message.tool_calls || [];\n\n logger.info('=== CONVERTING OPENAI TO ANTHROPIC ===', {\n hasMessage: !!message,\n hasContent: !!rawText,\n contentLength: rawText?.length,\n hasToolCalls: toolCalls.length > 0,\n toolCallCount: toolCalls.length,\n finishReason: choice.finish_reason\n });\n\n // CRITICAL: Use ONLY native OpenAI tool_calls format\n // Do NOT parse XML from text - models output malformed XML\n // OpenRouter handles tools via OpenAI function calling standard\n\n const contentBlocks: any[] = [];\n\n // Add tool uses from OpenAI tool_calls (MCP tools via function calling)\n if (toolCalls.length > 0) {\n logger.info('Processing tool calls from OpenAI response...');\n for (const toolCall of toolCalls) {\n try {\n logger.info('Tool call details:', {\n id: toolCall.id,\n name: toolCall.function.name,\n argumentsRaw: toolCall.function.arguments\n });\n\n contentBlocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments || '{}')\n });\n } catch (error) {\n logger.error('Failed to parse tool call arguments', {\n toolCall,\n error: (error as Error).message\n });\n }\n }\n\n logger.info('Converted OpenRouter tool calls to Anthropic format', {\n toolCallCount: toolCalls.length,\n toolNames: toolCalls.map((tc: any) => tc.function.name)\n });\n }\n\n // Add text response if present\n if (rawText && rawText.trim()) {\n logger.info('Adding text content block', {\n textLength: rawText.length,\n textPreview: rawText.substring(0, 200)\n });\n contentBlocks.push({\n type: 'text',\n text: rawText\n });\n }\n\n // If no content blocks, add empty text\n if (contentBlocks.length === 0) {\n logger.warn('No content blocks found, adding empty text block');\n contentBlocks.push({\n type: 'text',\n text: rawText || ''\n });\n }\n\n logger.info('Final content blocks:', {\n blockCount: contentBlocks.length,\n blockTypes: contentBlocks.map(b => b.type)\n });\n\n const result = {\n id: openaiRes.id || `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: openaiRes.model,\n content: contentBlocks,\n stop_reason: this.mapFinishReason(choice.finish_reason),\n usage: {\n input_tokens: openaiRes.usage?.prompt_tokens || 0,\n output_tokens: openaiRes.usage?.completion_tokens || 0\n }\n };\n\n logger.info('Conversion complete, returning Anthropic response');\n return result;\n }\n\n private convertOpenAIStreamToAnthropic(chunk: string): string {\n // Convert OpenAI SSE format to Anthropic SSE format\n const lines = chunk.split('\\n').filter(line => line.trim());\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n continue;\n }\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text: delta.content }\n })}\\n\\n`\n );\n }\n } catch (e) {\n // Ignore parse errors\n }\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private extractProvider(modelId: string): string {\n // Extract provider from model ID (e.g., \"openai/gpt-4\" -> \"openai\")\n const parts = modelId.split('/');\n return parts.length > 1 ? parts[0] : '';\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'stop': 'end_turn',\n 'length': 'max_tokens',\n 'content_filter': 'stop_sequence',\n 'function_call': 'tool_use'\n };\n return mapping[reason || 'stop'] || 'end_turn';\n }\n\n public start(port: number): void {\n this.app.listen(port, () => {\n logger.info('Anthropic to OpenRouter proxy started', {\n port,\n openrouterBaseUrl: this.openrouterBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\nā
Anthropic Proxy running at http://localhost:${port}`);\n console.log(` OpenRouter Base URL: ${this.openrouterBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}`);\n\n if (this.capabilities?.requiresEmulation) {\n console.log(`\\n āļø Tool Emulation: ${this.capabilities.emulationStrategy.toUpperCase()} pattern`);\n console.log(` š Expected reliability: ${this.capabilities.emulationStrategy === 'react' ? '70-85%' : '50-70%'}`);\n }\n console.log('');\n });\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3000');\n const openrouterApiKey = process.env.OPENROUTER_API_KEY;\n\n if (!openrouterApiKey) {\n console.error('ā Error: OPENROUTER_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToOpenRouterProxy({\n openrouterApiKey,\n openrouterBaseUrl: process.env.ANTHROPIC_PROXY_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"anthropic-to-openrouter.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-openrouter.ts"],"names":[],"mappings":"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","sourcesContent":["// Anthropic to OpenRouter Proxy Server\n// Converts Anthropic API format to OpenRouter format\nimport express, { Request, Response, NextFunction } from 'express';\nimport { createProxyMiddleware, Options } from 'http-proxy-middleware';\nimport { logger } from '../utils/logger.js';\nimport { getInstructionsForModel, formatInstructions, taskRequiresFileOps, getMaxTokensForModel } from './provider-instructions.js';\nimport { ModelCapabilities, detectModelCapabilities } from '../utils/modelCapabilities.js';\nimport { ToolEmulator, executeEmulation, ToolCall } from './tool-emulation.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string; [key: string]: any }>;\n}\n\ninterface AnthropicTool {\n name: string;\n description?: string;\n input_schema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n}\n\ninterface AnthropicRequest {\n model?: string;\n messages: AnthropicMessage[];\n max_tokens?: number;\n temperature?: number;\n system?: string | Array<{ type: string; text?: string; [key: string]: any }>; // Can be string OR array of blocks\n stream?: boolean;\n tools?: AnthropicTool[];\n [key: string]: any;\n}\n\ninterface OpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\ninterface OpenAITool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: any;\n };\n}\n\ninterface OpenAIRequest {\n model: string;\n messages: OpenAIMessage[];\n max_tokens?: number;\n temperature?: number;\n stream?: boolean;\n tools?: OpenAITool[];\n [key: string]: any;\n}\n\ninterface OpenAIResponse {\n id: string;\n model: string;\n choices: Array<{\n index: number;\n finish_reason: string;\n message: {\n role: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>;\n };\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\nexport class AnthropicToOpenRouterProxy {\n private app: express.Application;\n private openrouterApiKey: string;\n private openrouterBaseUrl: string;\n private defaultModel: string;\n private capabilities?: ModelCapabilities;\n\n constructor(config: {\n openrouterApiKey: string;\n openrouterBaseUrl?: string;\n defaultModel?: string;\n capabilities?: ModelCapabilities;\n }) {\n this.app = express();\n this.openrouterApiKey = config.openrouterApiKey;\n this.openrouterBaseUrl = config.openrouterBaseUrl || 'https://openrouter.ai/api/v1';\n this.defaultModel = config.defaultModel || 'meta-llama/llama-3.1-8b-instruct';\n this.capabilities = config.capabilities;\n\n // Debug logging\n if (this.capabilities) {\n logger.info('Proxy initialized with capabilities', {\n model: this.defaultModel,\n requiresEmulation: this.capabilities.requiresEmulation,\n strategy: this.capabilities.emulationStrategy\n });\n }\n\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n private setupMiddleware(): void {\n // Parse JSON bodies\n this.app.use(express.json({ limit: '50mb' }));\n\n // Logging middleware\n this.app.use((req: Request, res: Response, next: NextFunction) => {\n logger.debug('Proxy request', {\n method: req.method,\n path: req.path,\n headers: Object.keys(req.headers)\n });\n next();\n });\n }\n\n private setupRoutes(): void {\n // Health check\n this.app.get('/health', (req: Request, res: Response) => {\n res.json({ status: 'ok', service: 'anthropic-to-openrouter-proxy' });\n });\n\n // Anthropic Messages API ā OpenRouter Chat Completions\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n try {\n const anthropicReq: AnthropicRequest = req.body;\n\n // VERBOSE LOGGING: Log incoming Anthropic request\n // Handle system prompt which can be string OR array of content blocks\n const systemPreview = typeof anthropicReq.system === 'string'\n ? anthropicReq.system.substring(0, 200)\n : Array.isArray(anthropicReq.system)\n ? JSON.stringify(anthropicReq.system).substring(0, 200)\n : undefined;\n\n logger.info('=== INCOMING ANTHROPIC REQUEST ===', {\n model: anthropicReq.model,\n systemPrompt: systemPreview,\n systemType: typeof anthropicReq.system,\n messageCount: anthropicReq.messages?.length,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || [],\n maxTokens: anthropicReq.max_tokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n });\n\n // Log first user message for debugging\n if (anthropicReq.messages && anthropicReq.messages.length > 0) {\n const firstMsg = anthropicReq.messages[0];\n logger.info('First user message:', {\n role: firstMsg.role,\n contentPreview: typeof firstMsg.content === 'string'\n ? firstMsg.content.substring(0, 200)\n : JSON.stringify(firstMsg.content).substring(0, 200)\n });\n }\n\n // Route to appropriate handler based on capabilities\n const result = await this.handleRequest(anthropicReq, res);\n if (result) {\n res.json(result);\n }\n } catch (error: any) {\n logger.error('Proxy error', { error: error.message, stack: error.stack });\n res.status(500).json({\n error: {\n type: 'proxy_error',\n message: error.message\n }\n });\n }\n });\n\n // Fallback for other Anthropic API endpoints\n this.app.use((req: Request, res: Response) => {\n logger.warn('Unsupported endpoint', { path: req.path, method: req.method });\n res.status(404).json({\n error: {\n type: 'not_found',\n message: `Endpoint ${req.path} not supported by proxy`\n }\n });\n });\n }\n\n private async handleRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n let model = anthropicReq.model || this.defaultModel;\n\n // If SDK is requesting a Claude model but we're using OpenRouter with a different default,\n // override to use the CLI-specified model\n if (model.startsWith('claude-') && this.defaultModel && !this.defaultModel.startsWith('claude-')) {\n logger.info(`Overriding SDK Claude model ${model} with CLI-specified ${this.defaultModel}`);\n model = this.defaultModel;\n anthropicReq.model = model;\n }\n\n const capabilities = this.capabilities || detectModelCapabilities(model);\n\n // Check if emulation is required\n if (capabilities.requiresEmulation && anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info(`Using tool emulation for model: ${model}`);\n return this.handleEmulatedRequest(anthropicReq, capabilities);\n }\n\n return this.handleNativeRequest(anthropicReq, res);\n }\n\n private async handleNativeRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n // Convert Anthropic format to OpenAI format\n const openaiReq = this.convertAnthropicToOpenAI(anthropicReq);\n\n // VERBOSE LOGGING: Log converted OpenAI request\n logger.info('=== CONVERTED OPENAI REQUEST ===', {\n anthropicModel: anthropicReq.model,\n openaiModel: openaiReq.model,\n messageCount: openaiReq.messages.length,\n systemPrompt: openaiReq.messages[0]?.content?.substring(0, 300),\n toolCount: openaiReq.tools?.length || 0,\n toolNames: openaiReq.tools?.map(t => t.function.name) || [],\n maxTokens: openaiReq.max_tokens,\n apiKeyPresent: !!this.openrouterApiKey,\n apiKeyPrefix: this.openrouterApiKey?.substring(0, 10)\n });\n\n // Forward to OpenRouter\n const response = await fetch(`${this.openrouterBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.openrouterApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n logger.error('OpenRouter API error', { status: response.status, error });\n res.status(response.status).json({\n error: {\n type: 'api_error',\n message: error\n }\n });\n return null;\n }\n\n // VERBOSE LOGGING: Log OpenRouter response status\n logger.info('=== OPENROUTER RESPONSE RECEIVED ===', {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries())\n });\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n logger.info('Handling streaming response...');\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const anthropicChunk = this.convertOpenAIStreamToAnthropic(chunk);\n res.write(anthropicChunk);\n }\n\n res.end();\n return null; // Already sent response\n } else {\n logger.info('Handling non-streaming response...');\n // Non-streaming response\n const openaiRes = await response.json() as OpenAIResponse;\n\n // VERBOSE LOGGING: Log raw OpenAI response\n logger.info('=== RAW OPENAI RESPONSE ===', {\n id: openaiRes.id,\n model: openaiRes.model,\n choices: openaiRes.choices?.length,\n finishReason: openaiRes.choices?.[0]?.finish_reason,\n hasToolCalls: !!(openaiRes.choices?.[0]?.message?.tool_calls),\n toolCallCount: openaiRes.choices?.[0]?.message?.tool_calls?.length || 0,\n toolCallNames: openaiRes.choices?.[0]?.message?.tool_calls?.map((tc: any) => tc.function.name) || [],\n contentPreview: openaiRes.choices?.[0]?.message?.content?.substring(0, 300),\n usage: openaiRes.usage\n });\n\n const anthropicRes = this.convertOpenAIToAnthropic(openaiRes);\n\n // VERBOSE LOGGING: Log converted Anthropic response\n logger.info('=== CONVERTED ANTHROPIC RESPONSE ===', {\n id: anthropicRes.id,\n model: anthropicRes.model,\n role: anthropicRes.role,\n stopReason: anthropicRes.stop_reason,\n contentBlocks: anthropicRes.content?.length,\n contentTypes: anthropicRes.content?.map((c: any) => c.type),\n toolUseCount: anthropicRes.content?.filter((c: any) => c.type === 'tool_use').length,\n textPreview: anthropicRes.content?.find((c: any) => c.type === 'text')?.text?.substring(0, 200),\n usage: anthropicRes.usage\n });\n\n return anthropicRes;\n }\n }\n\n private async handleEmulatedRequest(\n anthropicReq: AnthropicRequest,\n capabilities: ModelCapabilities\n ): Promise<any> {\n const emulator = new ToolEmulator(\n anthropicReq.tools || [],\n capabilities.emulationStrategy as 'react' | 'prompt'\n );\n\n const lastMessage = anthropicReq.messages[anthropicReq.messages.length - 1];\n const userMessage = typeof lastMessage.content === 'string'\n ? lastMessage.content\n : (lastMessage.content.find(c => c.type === 'text')?.text || '');\n\n const result = await executeEmulation(\n emulator,\n userMessage,\n async (prompt) => {\n // Call model with emulation prompt\n const openaiReq = {\n model: anthropicReq.model || this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n temperature: anthropicReq.temperature,\n max_tokens: anthropicReq.max_tokens\n };\n const response = await this.callOpenRouter(openaiReq);\n return response.choices[0].message.content;\n },\n async (toolCall: ToolCall) => {\n logger.warn(`Tool execution not yet implemented: ${toolCall.name}`);\n return { error: 'Tool execution not implemented in Phase 2' };\n },\n { maxIterations: 5, verbose: process.env.VERBOSE === 'true' }\n );\n\n return {\n id: `emulated_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: result.finalAnswer || 'No response' }],\n model: anthropicReq.model || this.defaultModel,\n stop_reason: 'end_turn',\n usage: { input_tokens: 0, output_tokens: 0 }\n };\n }\n\n private async callOpenRouter(openaiReq: any): Promise<any> {\n const response = await fetch(`${this.openrouterBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.openrouterApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenRouter API error: ${error}`);\n }\n\n return response.json();\n }\n\n\n private convertAnthropicToOpenAI(anthropicReq: AnthropicRequest): OpenAIRequest {\n logger.info('=== STARTING ANTHROPIC TO OPENAI CONVERSION ===');\n const messages: OpenAIMessage[] = [];\n\n // Get model-specific tool instructions\n const modelId = anthropicReq.model || this.defaultModel;\n const provider = this.extractProvider(modelId);\n\n logger.info('Model detection:', {\n requestedModel: anthropicReq.model,\n defaultModel: this.defaultModel,\n finalModelId: modelId,\n extractedProvider: provider\n });\n\n // CRITICAL: OpenRouter models use native OpenAI tool calling\n // - If MCP tools are provided, OpenRouter handles them via function calling\n // - Do NOT inject XML instructions - they cause malformed output\n // - Let OpenRouter models use tools via OpenAI's tool_calls format\n\n let systemContent = '';\n\n // Check if we have MCP tools (function calling)\n const hasMcpTools = anthropicReq.tools && anthropicReq.tools.length > 0;\n\n logger.info('Tool detection:', {\n hasMcpTools,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || []\n });\n\n if (hasMcpTools) {\n // MCP tools present - OpenRouter will handle via function calling\n systemContent = 'You are a helpful AI assistant. When you need to perform actions, use the available tools by calling functions. Always explain what you\\'re doing.';\n logger.info('Using MCP tools system prompt (with function calling support)');\n } else {\n // No tools - simple response mode\n systemContent = 'You are a helpful AI assistant. Provide clear, well-formatted code and explanations.';\n logger.info('Using simple system prompt (no tools)');\n }\n\n if (anthropicReq.system) {\n // System can be string OR array of content blocks\n let originalSystem: string;\n if (typeof anthropicReq.system === 'string') {\n originalSystem = anthropicReq.system;\n } else if (Array.isArray(anthropicReq.system)) {\n // Extract text from content blocks\n originalSystem = anthropicReq.system\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text)\n .join('\\n');\n } else {\n originalSystem = '';\n }\n\n logger.info('Appending original system prompt:', {\n systemType: typeof anthropicReq.system,\n isArray: Array.isArray(anthropicReq.system),\n originalSystemLength: originalSystem.length,\n originalSystemPreview: originalSystem.substring(0, 200)\n });\n\n if (originalSystem) {\n systemContent += '\\n\\n' + originalSystem;\n }\n }\n\n messages.push({\n role: 'system',\n content: systemContent\n });\n\n logger.info('System message created:', {\n systemContentLength: systemContent.length,\n systemContentPreview: systemContent.substring(0, 300)\n });\n\n // Override model - if request has a Claude model, use defaultModel instead\n const requestedModel = anthropicReq.model || '';\n const shouldOverrideModel = requestedModel.startsWith('claude-') || !requestedModel;\n const finalModel = shouldOverrideModel ? this.defaultModel : requestedModel;\n\n // Convert Anthropic messages to OpenAI format\n for (const msg of anthropicReq.messages) {\n let content: string;\n\n if (typeof msg.content === 'string') {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n content = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n content = '';\n }\n\n messages.push({\n role: msg.role as 'user' | 'assistant',\n content\n });\n }\n\n // Get appropriate max_tokens for this model\n const maxTokens = getMaxTokensForModel(finalModel, anthropicReq.max_tokens);\n\n const openaiReq: OpenAIRequest = {\n model: finalModel,\n messages,\n max_tokens: maxTokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n };\n\n // Convert MCP/Anthropic tools to OpenAI tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info('Converting MCP tools to OpenAI format...');\n openaiReq.tools = anthropicReq.tools.map(tool => {\n const openaiTool = {\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description || '',\n parameters: tool.input_schema || {\n type: 'object',\n properties: {},\n required: []\n }\n }\n };\n logger.info(`Converted tool: ${tool.name}`, {\n hasDescription: !!tool.description,\n hasInputSchema: !!tool.input_schema\n });\n return openaiTool;\n });\n\n logger.info('Forwarding MCP tools to OpenRouter', {\n toolCount: openaiReq.tools.length,\n toolNames: openaiReq.tools.map(t => t.function.name)\n });\n } else {\n logger.info('No MCP tools to convert');\n }\n\n logger.info('=== CONVERSION COMPLETE ===', {\n messageCount: openaiReq.messages.length,\n hasMcpTools: !!openaiReq.tools,\n toolCount: openaiReq.tools?.length || 0,\n maxTokens: openaiReq.max_tokens,\n model: openaiReq.model\n });\n\n return openaiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertOpenAIToAnthropic(openaiRes: any): any {\n const choice = openaiRes.choices?.[0];\n if (!choice) {\n throw new Error('No choices in OpenAI response');\n }\n\n const message = choice.message || {};\n const rawText = message.content || choice.text || '';\n const toolCalls = message.tool_calls || [];\n\n logger.info('=== CONVERTING OPENAI TO ANTHROPIC ===', {\n hasMessage: !!message,\n hasContent: !!rawText,\n contentLength: rawText?.length,\n hasToolCalls: toolCalls.length > 0,\n toolCallCount: toolCalls.length,\n finishReason: choice.finish_reason\n });\n\n // CRITICAL: Use ONLY native OpenAI tool_calls format\n // Do NOT parse XML from text - models output malformed XML\n // OpenRouter handles tools via OpenAI function calling standard\n\n const contentBlocks: any[] = [];\n\n // Add tool uses from OpenAI tool_calls (MCP tools via function calling)\n if (toolCalls.length > 0) {\n logger.info('Processing tool calls from OpenAI response...');\n for (const toolCall of toolCalls) {\n try {\n logger.info('Tool call details:', {\n id: toolCall.id,\n name: toolCall.function.name,\n argumentsRaw: toolCall.function.arguments\n });\n\n contentBlocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments || '{}')\n });\n } catch (error) {\n logger.error('Failed to parse tool call arguments', {\n toolCall,\n error: (error as Error).message\n });\n }\n }\n\n logger.info('Converted OpenRouter tool calls to Anthropic format', {\n toolCallCount: toolCalls.length,\n toolNames: toolCalls.map((tc: any) => tc.function.name)\n });\n }\n\n // Add text response if present\n if (rawText && rawText.trim()) {\n logger.info('Adding text content block', {\n textLength: rawText.length,\n textPreview: rawText.substring(0, 200)\n });\n contentBlocks.push({\n type: 'text',\n text: rawText\n });\n }\n\n // If no content blocks, add empty text\n if (contentBlocks.length === 0) {\n logger.warn('No content blocks found, adding empty text block');\n contentBlocks.push({\n type: 'text',\n text: rawText || ''\n });\n }\n\n logger.info('Final content blocks:', {\n blockCount: contentBlocks.length,\n blockTypes: contentBlocks.map(b => b.type)\n });\n\n const result = {\n id: openaiRes.id || `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: openaiRes.model,\n content: contentBlocks,\n stop_reason: this.mapFinishReason(choice.finish_reason),\n usage: {\n input_tokens: openaiRes.usage?.prompt_tokens || 0,\n output_tokens: openaiRes.usage?.completion_tokens || 0\n }\n };\n\n logger.info('Conversion complete, returning Anthropic response');\n return result;\n }\n\n private convertOpenAIStreamToAnthropic(chunk: string): string {\n // Convert OpenAI SSE format to Anthropic SSE format\n const lines = chunk.split('\\n').filter(line => line.trim());\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n continue;\n }\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text: delta.content }\n })}\\n\\n`\n );\n }\n } catch (e) {\n // Ignore parse errors\n }\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private extractProvider(modelId: string): string {\n // Extract provider from model ID (e.g., \"openai/gpt-4\" -> \"openai\")\n const parts = modelId.split('/');\n return parts.length > 1 ? parts[0] : '';\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'stop': 'end_turn',\n 'length': 'max_tokens',\n 'content_filter': 'stop_sequence',\n 'function_call': 'tool_use'\n };\n return mapping[reason || 'stop'] || 'end_turn';\n }\n\n public start(port: number): void {\n this.app.listen(port, () => {\n logger.info('Anthropic to OpenRouter proxy started', {\n port,\n openrouterBaseUrl: this.openrouterBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\nā
Anthropic Proxy running at http://localhost:${port}`);\n console.log(` OpenRouter Base URL: ${this.openrouterBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}`);\n\n if (this.capabilities?.requiresEmulation) {\n console.log(`\\n āļø Tool Emulation: ${this.capabilities.emulationStrategy.toUpperCase()} pattern`);\n console.log(` š Expected reliability: ${this.capabilities.emulationStrategy === 'react' ? '70-85%' : '50-70%'}`);\n }\n console.log('');\n });\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3000');\n const openrouterApiKey = process.env.OPENROUTER_API_KEY;\n\n if (!openrouterApiKey) {\n console.error('ā Error: OPENROUTER_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToOpenRouterProxy({\n openrouterApiKey,\n openrouterBaseUrl: process.env.ANTHROPIC_PROXY_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-to-requesty.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-requesty.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic-to-requesty.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-requesty.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;AA4E3F,qBAAa,wBAAwB;IACnC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAoB;gBAE7B,MAAM,EAAE;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,iBAAiB,CAAC;KAClC;IAoBD,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,WAAW;YAyEL,aAAa;YAsBb,mBAAmB;YA8GnB,qBAAqB;YAmDrB,YAAY;IAoC1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAuD1B,OAAO,CAAC,wBAAwB;IAqLhC,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,wBAAwB;IAmGhC,OAAO,CAAC,8BAA8B;IAkCtC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAUhB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAkBjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-to-requesty.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-requesty.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,mDAAmD;AACnD,OAAO,OAA4C,MAAM,SAAS,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAoE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACpI,OAAO,EAAqB,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAY,MAAM,qBAAqB,CAAC;AAoD/E,MAAM,OAAO,wBAAwB;IAC3B,GAAG,CAAsB;IACzB,cAAc,CAAS;IACvB,eAAe,CAAS;IACxB,YAAY,CAAS;IACrB,YAAY,CAAqB;IAEzC,YAAY,MAKX;QACC,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,+BAA+B,CAAC;QACjF,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,wBAAwB,CAAC;QACpE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAExC,gBAAgB;QAChB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBACjD,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB;gBACtD,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB;aAC9C,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEO,eAAe;QACrB,oBAAoB;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9C,qBAAqB;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YAC/D,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE;gBAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,eAAe;QACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACtD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;YAClE,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,YAAY,GAAqB,GAAG,CAAC,IAAI,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBAEnD,kDAAkD;gBAClD,sEAAsE;gBACtE,MAAM,aAAa,GAAG,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ;oBAC3D,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;oBACvC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;wBACpC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;wBACvD,CAAC,CAAC,SAAS,CAAC;gBAEd,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;oBAChD,KAAK,EAAE,YAAY,CAAC,KAAK;oBACzB,YAAY,EAAE,aAAa;oBAC3B,UAAU,EAAE,OAAO,YAAY,CAAC,MAAM;oBACtC,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM;oBAC3C,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;oBAC1C,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;oBACrD,SAAS,EAAE,YAAY,CAAC,UAAU;oBAClC,WAAW,EAAE,YAAY,CAAC,WAAW;oBACrC,MAAM,EAAE,YAAY,CAAC,MAAM;iBAC5B,CAAC,CAAC;gBAEH,uCAAuC;gBACvC,IAAI,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9D,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;wBACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,cAAc,EAAE,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;4BAClD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;4BACpC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;qBACvD,CAAC,CAAC;gBACL,CAAC;gBAED,qDAAqD;gBACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;gBAC3D,IAAI,MAAM,EAAE,CAAC;oBACX,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC1E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE;wBACL,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,KAAK,CAAC,OAAO;qBACvB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6CAA6C;QAC7C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,YAAY,GAAG,CAAC,IAAI,yBAAyB;iBACvD;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,YAA8B,EAAE,GAAa;QACvE,IAAI,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QAEpD,yFAAyF;QACzF,0CAA0C;QAC1C,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACjG,MAAM,CAAC,IAAI,CAAC,+BAA+B,KAAK,uBAAuB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YAC5F,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;YAC1B,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAEzE,iCAAiC;QACjC,IAAI,YAAY,CAAC,iBAAiB,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,YAA8B,EAAE,GAAa;QAC7E,4CAA4C;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAE9D,gDAAgD;QAChD,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;YAC9C,cAAc,EAAE,YAAY,CAAC,KAAK;YAClC,WAAW,EAAE,SAAS,CAAC,KAAK;YAC5B,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;YACvC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YAC/D,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YACvC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;YAC3D,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc;YACpC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,eAAe,mBAAmB,EAAE;YACvE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,cAAc,EAAE;gBAChD,cAAc,EAAE,kBAAkB;gBAClC,cAAc,EAAE,wCAAwC;gBACxD,SAAS,EAAE,cAAc;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;gBAC/B,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gDAAgD;QAChD,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;YAChD,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SACxD,CAAC,CAAC;QAEH,oCAAoC;QACpC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC9C,kBAAkB;YAClB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;YACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,cAAc,GAAG,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;gBAClE,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC5B,CAAC;YAED,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,CAAC,wBAAwB;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAClD,yBAAyB;YACzB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAExC,2CAA2C;YAC3C,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACzC,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM;gBAClC,YAAY,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa;gBACnD,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC;gBAC7D,aAAa,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;gBACvE,aAAa,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;gBACpG,cAAc,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC3E,KAAK,EAAE,SAAS,CAAC,KAAK;aACvB,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;YAE9D,oDAAoD;YACpD,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBAClD,EAAE,EAAE,YAAY,CAAC,EAAE;gBACnB,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,UAAU,EAAE,YAAY,CAAC,WAAW;gBACpC,aAAa,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM;gBAC3C,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC3D,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,MAAM;gBACpF,WAAW,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC/F,KAAK,EAAE,YAAY,CAAC,KAAK;aAC1B,CAAC,CAAC;YAEH,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,YAA8B,EAC9B,YAA+B;QAE/B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAC/B,YAAY,CAAC,KAAK,IAAI,EAAE,EACxB,YAAY,CAAC,iBAAuC,CACrD,CAAC;QAEF,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ;YACzD,CAAC,CAAC,WAAW,CAAC,OAAO;YACrB,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,QAAQ,EACR,WAAW,EACX,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,mCAAmC;YACnC,wDAAwD;YACxD,IAAI,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC;YACxC,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;gBAClC,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YACD,MAAM,SAAS,GAAG;gBAChB,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;gBAC9C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC7C,WAAW,EAAE,YAAY,CAAC,WAAW;gBACrC,UAAU,EAAE,SAAS;aACtB,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACpD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAC7C,CAAC,EACD,KAAK,EAAE,QAAkB,EAAE,EAAE;YAC3B,MAAM,CAAC,IAAI,CAAC,uCAAuC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,OAAO,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;QAChE,CAAC,EACD,EAAE,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,MAAM,EAAE,CAC9D,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE;YAC5B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;YACtE,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;YAC9C,WAAW,EAAE,UAAU;YACvB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;SAC7C,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,SAAc;QACvC,kDAAkD;QAClD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,eAAe,mBAAmB,EAAE;gBACvE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,IAAI,CAAC,cAAc,EAAE;oBAChD,cAAc,EAAE,kBAAkB;oBAClC,cAAc,EAAE,wCAAwC;oBACxD,SAAS,EAAE,cAAc;iBAC1B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;gBAC/B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAGD;;;OAGG;IACK,kBAAkB,CAAC,MAAW,EAAE,OAAe,MAAM;QAC3D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,2CAA2C;QAC3C,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QAEhC,gCAAgC;QAChC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,4DAA4D,IAAI,EAAE,CAAC,CAAC;YAChF,SAAS,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACvC,CAAC;QAED,8DAA8D;QAC9D,MAAM,mBAAmB,GAAG;YAC1B,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;YAChD,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,mBAAmB;YAC7D,aAAa,EAAE,kBAAkB,EAAE,uBAAuB;YAC1D,aAAa,EAAE,aAAa,EAAE,mBAAmB;YACjD,iBAAiB,EAAE,UAAU;SAC9B,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;YAC1C,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,sDAAsD,OAAO,QAAQ,IAAI,EAAE,CAAC,CAAC;gBACzF,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,SAAS,CAAC,UAAU,IAAI,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACrE,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7D,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,IAAI,eAAe,GAAG,EAAE,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,SAAS,CAAC,KAAK,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3D,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC9E,CAAC;QAED,2CAA2C;QAC3C,KAAK,MAAM,UAAU,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YACrD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACzC,SAAS,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,KAAa,EAAE,EAAE,CAClF,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,UAAU,IAAI,KAAK,GAAG,CAAC,CACtE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,wBAAwB,CAAC,YAA8B;QAC7D,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,uCAAuC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC9B,cAAc,EAAE,YAAY,CAAC,KAAK;YAClC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,OAAO;YACrB,iBAAiB,EAAE,QAAQ;SAC5B,CAAC,CAAC;QAEH,2DAA2D;QAC3D,0EAA0E;QAC1E,iEAAiE;QACjE,iEAAiE;QAEjE,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,gDAAgD;QAChD,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAExE,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC7B,WAAW;YACX,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YAC1C,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SACtD,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,gEAAgE;YAChE,aAAa,GAAG,oJAAoJ,CAAC;YACrK,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,aAAa,GAAG,sFAAsF,CAAC;YACvG,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,kDAAkD;YAClD,IAAI,cAAsB,CAAC;YAC3B,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC5C,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC;YACvC,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,mCAAmC;gBACnC,cAAc,GAAG,YAAY,CAAC,MAAM;qBACjC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;qBACpD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBACxB,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,EAAE,CAAC;YACtB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;gBAC/C,UAAU,EAAE,OAAO,YAAY,CAAC,MAAM;gBACtC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;gBAC3C,oBAAoB,EAAE,cAAc,CAAC,MAAM;gBAC3C,qBAAqB,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aACxD,CAAC,CAAC;YAEH,IAAI,cAAc,EAAE,CAAC;gBACnB,aAAa,IAAI,MAAM,GAAG,cAAc,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,mBAAmB,EAAE,aAAa,CAAC,MAAM;YACzC,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;SACtD,CAAC,CAAC;QAEH,2EAA2E;QAC3E,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,mBAAmB,GAAG,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;QACpF,MAAM,UAAU,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;QAE5E,8CAA8C;QAC9C,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,OAAe,CAAC;YAEpB,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YACxB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,mCAAmC;gBACnC,OAAO,GAAG,GAAG,CAAC,OAAO;qBAClB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;qBACtC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBACxB,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,GAAG,CAAC,IAA4B;gBACtC,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,IAAI,SAAS,GAAG,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QAE1E,6CAA6C;QAC7C,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;YAClC,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAkB;YAC/B,KAAK,EAAE,UAAU;YACjB,QAAQ;YACR,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,MAAM,EAAE,YAAY,CAAC,MAAM;SAC5B,CAAC;QAEF,qDAAqD;QACrD,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;gBACtD,UAAU,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM;aACtC,CAAC,CAAC;YAEH,6EAA6E;YAC7E,0FAA0F;YAC1F,MAAM,sBAAsB,GAAG,EAAE,CAAC,CAAC,wDAAwD;YAC3F,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAE3E,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;gBACvD,MAAM,CAAC,IAAI,CAAC,qBAAqB,sBAAsB,kBAAkB,YAAY,CAAC,KAAK,CAAC,MAAM,aAAa,CAAC,CAAC;YACnH,CAAC;YAED,yEAAyE;YACzE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,SAAS,CAAC,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAC1C,kEAAkE;oBAClE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,IAAI;wBACrC,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,EAAE;wBACd,QAAQ,EAAE,EAAE;qBACb,CAAC;oBACF,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAEhF,MAAM,UAAU,GAAG;wBACjB,IAAI,EAAE,UAAmB;wBACzB,QAAQ,EAAE;4BACR,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;4BACnC,UAAU,EAAE,eAAe;yBAC5B;qBACF,CAAC;oBACF,OAAO,UAAU,CAAC;gBACpB,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;oBAC9C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;oBACjC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACjE,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;gBACjF,mEAAmE;YACrE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACzC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;YACvC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK;YAC9B,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YACvC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAI1C,MAAM,QAAQ,GAAU,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,4BAA4B;QAC5B,MAAM,cAAc,GAAG,sDAAsD,CAAC;QAC9E,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;oBACnB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACzB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,2BAA2B;QAC3B,MAAM,aAAa,GAAG,+BAA+B,CAAC;QACtD,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;iBACpB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,sBAAsB;QACtB,MAAM,SAAS,GAAG,2CAA2C,CAAC;QAC9D,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACzB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC;IAEO,wBAAwB,CAAC,SAAc;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;YACpD,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,aAAa,EAAE,OAAO,EAAE,MAAM;YAC9B,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;YAClC,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,YAAY,EAAE,MAAM,CAAC,aAAa;SACnC,CAAC,CAAC;QAEH,qDAAqD;QACrD,2DAA2D;QAC3D,8DAA8D;QAE9D,MAAM,aAAa,GAAU,EAAE,CAAC;QAEhC,wEAAwE;QACxE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC7D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;wBAChC,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;wBAC5B,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS;qBAC1C,CAAC,CAAC;oBAEH,aAAa,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,UAAU;wBAChB,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;wBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;qBACvD,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE;wBAClD,QAAQ;wBACR,KAAK,EAAG,KAAe,CAAC,OAAO;qBAChC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE;gBAC/D,aAAa,EAAE,SAAS,CAAC,MAAM;gBAC/B,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACvC,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aACvC,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAED,uCAAuC;QACvC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YAChE,aAAa,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO,IAAI,EAAE;aACpB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACnC,UAAU,EAAE,aAAa,CAAC,MAAM;YAChC,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG;YACb,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC;YACvD,KAAK,EAAE;gBACL,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;gBACjD,aAAa,EAAE,SAAS,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;aACvD;SACF,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,8BAA8B,CAAC,KAAa;QAClD,oDAAoD;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACtB,eAAe,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;oBAC1D,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;oBAEzC,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;wBACnB,eAAe,CAAC,IAAI,CAClB,qCAAqC,IAAI,CAAC,SAAS,CAAC;4BAClD,IAAI,EAAE,qBAAqB;4BAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;yBACnD,CAAC,MAAM,CACT,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,sBAAsB;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,oEAAoE;QACpE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,CAAC;IAEO,eAAe,CAAC,MAAe;QACrC,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,YAAY;YACtB,gBAAgB,EAAE,eAAe;YACjC,eAAe,EAAE,UAAU;SAC5B,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,IAAY;QACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBACjD,IAAI;gBACJ,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mDAAmD,IAAI,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YAEtD,IAAI,IAAI,CAAC,YAAY,EAAE,iBAAiB,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;gBACrG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,YAAY,CAAC,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,kBAAkB;AAClB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAEpD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,wBAAwB,CAAC;QACzC,cAAc;QACd,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACrD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;KAC1E,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC","sourcesContent":["// Anthropic to 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
|
+
{"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\ninterface OpenAIResponse {\n id: string;\n model: string;\n choices: Array<{\n index: number;\n finish_reason: string;\n message: {\n role: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>;\n };\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\nexport class 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() as OpenAIResponse;\n\n // VERBOSE LOGGING: Log raw OpenAI response\n logger.info('=== RAW OPENAI RESPONSE ===', {\n id: openaiRes.id,\n model: openaiRes.model,\n choices: openaiRes.choices?.length,\n finishReason: openaiRes.choices?.[0]?.finish_reason,\n hasToolCalls: !!(openaiRes.choices?.[0]?.message?.tool_calls),\n toolCallCount: openaiRes.choices?.[0]?.message?.tool_calls?.length || 0,\n toolCallNames: openaiRes.choices?.[0]?.message?.tool_calls?.map((tc: any) => tc.function.name) || [],\n contentPreview: openaiRes.choices?.[0]?.message?.content?.substring(0, 300),\n usage: openaiRes.usage\n });\n\n const anthropicRes = this.convertOpenAIToAnthropic(openaiRes);\n\n // VERBOSE LOGGING: Log converted Anthropic response\n logger.info('=== CONVERTED ANTHROPIC RESPONSE ===', {\n id: anthropicRes.id,\n model: anthropicRes.model,\n role: anthropicRes.role,\n stopReason: anthropicRes.stop_reason,\n contentBlocks: anthropicRes.content?.length,\n contentTypes: anthropicRes.content?.map((c: any) => c.type),\n toolUseCount: anthropicRes.content?.filter((c: any) => c.type === 'tool_use').length,\n textPreview: anthropicRes.content?.find((c: any) => c.type === 'text')?.text?.substring(0, 200),\n usage: anthropicRes.usage\n });\n\n return anthropicRes;\n }\n }\n\n private async handleEmulatedRequest(\n anthropicReq: AnthropicRequest,\n capabilities: ModelCapabilities\n ): Promise<any> {\n const emulator = new ToolEmulator(\n anthropicReq.tools || [],\n capabilities.emulationStrategy as 'react' | 'prompt'\n );\n\n const lastMessage = anthropicReq.messages[anthropicReq.messages.length - 1];\n const userMessage = typeof lastMessage.content === 'string'\n ? lastMessage.content\n : (lastMessage.content.find(c => c.type === 'text')?.text || '');\n\n const result = await executeEmulation(\n emulator,\n userMessage,\n async (prompt) => {\n // Call model with emulation prompt\n // 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quic-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/quic-proxy.ts"],"names":[],"mappings":"
|
|
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;IA2E7B;;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"}
|
package/dist/proxy/quic-proxy.js
CHANGED
|
@@ -105,7 +105,8 @@ export class QuicEnabledProxy extends AnthropicToOpenRouterProxy {
|
|
|
105
105
|
? Array.from(options.headers.entries())
|
|
106
106
|
: Object.entries(options.headers);
|
|
107
107
|
for (const [key, value] of headerEntries) {
|
|
108
|
-
|
|
108
|
+
// Handle both string and string[] header values
|
|
109
|
+
headers[key] = Array.isArray(value) ? value.join(', ') : String(value);
|
|
109
110
|
}
|
|
110
111
|
}
|
|
111
112
|
// Convert body to Uint8Array
|