Files

1 line
6.4 KiB
JSON

{"repo": "carlosibnz97/llm-router", "files": {".env.example": {"04ca1e696d74704ca1c2cf2cf4f1d73c260a3068": {"t": 1785745147.0995262, "n": 706, "h": "98858f01beb35435", "c": "###> LLM Router Configuration ###\n\n# App\nAPP_ENV=dev\nAPP_SECRET=change-this-to-a-random-string\n\n# Database\nDATABASE_URL=\"mysql://llm_router:password@db:3306/llm_router?serverVersion=8.0\"\n\n# AI Providers — Add your API keys\nOPENAI_API_KEY=sk-your-openai-key\nANTHROPIC_API_KEY=sk-ant-your-anthropic-key\nDEEPSEEK_API_KEY=sk-your-deepseek-key\n\n# Cache\nCACHE_ENABLED=true\nCACHE_TTL=3600\nCACHE_ADAPTER=filesystem # filesystem | redis\nREDIS_URL=redis://redis:6379\n\n# Rate Limiting\nRATE_LIMIT_PER_MINUTE=60\nRATE_LIMIT_PER_DAY=5000\n\n# Logging\nLOG_LEVEL=info\nLOG_REQUESTS=true\n\n# Routing Strategy: cost_optimized | quality_first | balanced\nDEFAULT_ROUTING_STRATEGY=cost_optimized\n\n###< LLM Router Configuration ###\n"}}, "config/services.yaml": {"04ca1e696d74704ca1c2cf2cf4f1d73c260a3068": {"t": 1785745225.643378, "n": 1094, "h": "bb7412de507b35a8", "c": "services:\n _defaults:\n autowire: true\n autoconfigure: true\n\n App\\:\n resource: '../src/'\n exclude:\n - '../src/DependencyInjection/'\n - '../src/Entity/'\n - '../src/Kernel.php'\n\n # Providers\n App\\Service\\Provider\\OpenAIProvider:\n arguments:\n $apiKey: '%env(OPENAI_API_KEY)%'\n\n App\\Service\\Provider\\AnthropicProvider:\n arguments:\n $apiKey: '%env(ANTHROPIC_API_KEY)%'\n\n App\\Service\\Provider\\DeepSeekProvider:\n arguments:\n $apiKey: '%env(DEEPSEEK_API_KEY)%'\n\n # Router\n App\\Service\\Router\\ModelRouter:\n arguments:\n $configPath: '%kernel.project_dir%/config/routing_rules.yaml'\n calls:\n - addProvider: ['@App\\Service\\Provider\\OpenAIProvider']\n - addProvider: ['@App\\Service\\Provider\\AnthropicProvider']\n - addProvider: ['@App\\Service\\Provider\\DeepSeekProvider']\n\n # Cost Tracker\n App\\Service\\CostTracker:\n arguments:\n $configPath: '%kernel.project_dir%/config/routing_rules.yaml'\n"}}, "docker-compose.yml": {"04ca1e696d74704ca1c2cf2cf4f1d73c260a3068": {"t": 1785745268.0899212, "n": 1296, "h": "b6da94c0fba564fa", "c": "services:\n app:\n build:\n context: .\n dockerfile: docker/php/Dockerfile\n container_name: llm-router-app\n restart: unless-stopped\n volumes:\n - app_code:/var/www/html\n depends_on:\n - db\n environment:\n - APP_ENV=${APP_ENV:-dev}\n - APP_SECRET=${APP_SECRET:-changeme123}\n - DATABASE_URL=${DATABASE_URL:-mysql://llm_router:password@db:3306/llm_router}\n - OPENAI_API_KEY=${OPENAI_API_KEY:-}\n - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-}\n networks:\n - llm-router\n\n nginx:\n image: nginx:alpine\n container_name: llm-router-nginx\n restart: unless-stopped\n ports:\n - \"8080:80\"\n volumes:\n - app_code:/var/www/html\n - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf\n depends_on:\n - app\n networks:\n - llm-router\n\n db:\n image: mysql:8.0\n container_name: llm-router-db\n restart: unless-stopped\n environment:\n MYSQL_ROOT_PASSWORD: rootpassword\n MYSQL_DATABASE: llm_router\n MYSQL_USER: llm_router\n MYSQL_PASSWORD: password\n volumes:\n - db_data:/var/lib/mysql\n ports:\n - \"3307:3306\"\n networks:\n - llm-router\n\nvolumes:\n app_code:\n db_data:\n\nnetworks:\n llm-router:\n driver: bridge\n"}}, "src/Service/Provider/DeepSeekProvider.php": {"04ca1e696d74704ca1c2cf2cf4f1d73c260a3068": {"t": 1785746150.439329, "n": 2608, "h": "21ebfbd51d2bd28f", "c": "<?php\n\nnamespace App\\Service\\Provider;\n\nuse Symfony\\Contracts\\HttpClient\\HttpClientInterface;\nuse Psr\\Log\\LoggerInterface;\n\n/**\n * DeepSeek uses the OpenAI-compatible API format.\n */\nclass DeepSeekProvider implements ProviderInterface\n{\n private const BASE_URL = 'https://api.deepseek.com/v1';\n\n public function __construct(\n private readonly HttpClientInterface $httpClient,\n private readonly LoggerInterface $logger,\n private readonly string $apiKey,\n ) {}\n\n public function complete(string $model, string $message, string $systemPrompt = '', array $options = []): array\n {\n $startTime = microtime(true);\n\n $messages = [];\n if ($systemPrompt !== '') {\n $messages[] = ['role' => 'system', 'content' => $systemPrompt];\n }\n $messages[] = ['role' => 'user', 'content' => $message];\n\n $body = [\n 'model' => $model,\n 'messages' => $messages,\n 'max_tokens' => $options['max_tokens'] ?? 2000,\n ];\n\n if (isset($options['temperature'])) {\n $body['temperature'] = $options['temperature'];\n }\n\n try {\n $response = $this->httpClient->request('POST', self::BASE_URL . '/chat/completions', [\n 'headers' => [\n 'Authorization' => 'Bearer ' . $this->apiKey,\n 'Content-Type' => 'application/json',\n ],\n 'json' => $body,\n 'timeout' => $options['timeout'] ?? 30,\n ]);\n\n $data = $response->toArray();\n $latencyMs = (int) ((microtime(true) - $startTime) * 1000);\n\n return [\n 'content' => $data['choices'][0]['message']['content'] ?? '',\n 'tokens_input' => $data['usage']['prompt_tokens'] ?? 0,\n 'tokens_output' => $data['usage']['completion_tokens'] ?? 0,\n 'model' => $data['model'] ?? $model,\n 'latency_ms' => $latencyMs,\n ];\n } catch (\\Throwable $e) {\n $this->logger->error('DeepSeek API error', [\n 'model' => $model,\n 'error' => $e->getMessage(),\n ]);\n throw new ProviderException('DeepSeek', $e->getMessage(), $e->getCode(), $e);\n }\n }\n\n public function getName(): string\n {\n return 'deepseek';\n }\n\n public function isAvailable(): bool\n {\n return $this->apiKey !== '' && $this->apiKey !== 'sk-your-deepseek-key';\n }\n\n public function getSupportedModels(): array\n {\n return ['deepseek-chat'];\n }\n}\n"}}}}