{"repo": "adityars07/voxel", "files": {"backend/providers/DeepSeekProvider.js": {"b8e022e764a8008a95c285bbc2f275d68ab60380": {"t": 1785745544.8881001, "n": 1792, "h": "35351eeec18ab168", "c": "const LLMProvider = require('./LLMProvider');\n\n/**\n * DeepSeekProvider — direct integration with official DeepSeek API.\n *\n * Uses the OpenAI-compatible endpoint: https://api.deepseek.com\n */\nclass DeepSeekProvider extends LLMProvider {\n constructor() {\n super('DeepSeek');\n\n const apiKey = process.env.DEEPSEEK_API_KEY;\n if (!apiKey) {\n throw new Error('DEEPSEEK_API_KEY environment variable is not set.');\n }\n\n // Lazy-load openai SDK\n const OpenAI = require('openai');\n this.client = new OpenAI({\n baseURL: 'https://api.deepseek.com',\n apiKey,\n });\n\n this.defaultModel = 'deepseek-chat';\n }\n\n /** @override */\n async chat(messages, options = {}) {\n const {\n model = this.defaultModel,\n temperature = 0.7,\n maxTokens = 8000,\n responseFormat,\n } = options;\n\n const requestBody = {\n model,\n messages,\n temperature,\n max_tokens: maxTokens,\n };\n\n if (responseFormat) {\n requestBody.response_format = responseFormat;\n }\n\n try {\n const completion = await this.client.chat.completions.create(requestBody);\n\n const choice = completion.choices?.[0];\n if (!choice) {\n throw new Error('DeepSeek returned no choices.');\n }\n\n return {\n content: choice.message?.content || '',\n reasoningContent: choice.message?.reasoning_content || null,\n usage: completion.usage || null,\n model: completion.model || model,\n finishReason: choice.finish_reason,\n };\n } catch (err) {\n const enriched = new Error(`[DeepSeek/${model}] ${err.message || 'Unknown error'}`);\n enriched.status = err.status || err.statusCode;\n enriched.originalError = err;\n throw enriched;\n }\n }\n}\n\nmodule.exports = DeepSeekProvider;\n"}}}}