{"repo": "afurgapil/mcp-agent-demo", "files": {"mcp-backend/src/services/deepseek.service.js": {"3ae236967ffa3f056298ca844cfff7a5e1cf69e8": {"t": 1785745528.654433, "n": 2585, "h": "604ea2116d6c5f53", "c": "import { extractSqlFromText } from \"./sql-extractor.js\";\nimport { env } from \"../utils/env.js\";\n\nconst { DEEPSEEK_API_KEY, DEEPSEEK_API_BASE, DEEPSEEK_MODEL } = env;\n\nfunction buildUserMessage(userPrompt, schema) {\n if (schema && schema.trim()) {\n return `Database schema:\\n${schema.trim()}\\n\\nUser request:\\n${userPrompt.trim()}`;\n }\n return userPrompt.trim();\n}\n\nexport async function callDeepseekChat({\n systemPrompt,\n userPrompt,\n model,\n temperature = 0,\n}) {\n const messages = [];\n if (systemPrompt && systemPrompt.trim()) {\n messages.push({ role: \"system\", content: systemPrompt.trim() });\n }\n messages.push({ role: \"user\", content: (userPrompt || \"\").trim() });\n\n const usedModel = model || DEEPSEEK_MODEL;\n const body = {\n model: usedModel,\n messages,\n temperature,\n stream: false,\n };\n const endpoint = new URL(\n \"/v1/chat/completions\",\n DEEPSEEK_API_BASE\n ).toString();\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${DEEPSEEK_API_KEY}`,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n let data = null;\n if (responseText) {\n try {\n data = JSON.parse(responseText);\n } catch (err) {\n throw new Error(\"Deepseek response parse error\");\n }\n }\n\n if (!response.ok) {\n const message =\n data?.error?.message ||\n data?.error ||\n data?.detail ||\n response.statusText;\n throw new Error(`Deepseek API error ${response.status}: ${message}`);\n }\n\n const choice = data?.choices?.[0];\n const content = choice?.message?.content?.trim();\n if (!content) {\n throw new Error(\"Deepseek returned empty content\");\n }\n\n const usage = data?.usage || null;\n if (usage) {\n try {\n console.log(\n `Deepseek tokens — prompt: ${usage.prompt_tokens ?? \"?\"}, completion: ${\n usage.completion_tokens ?? \"?\"\n }, total: ${usage.total_tokens ?? \"?\"}`\n );\n } catch {}\n }\n\n return { content, response: data, request: body, usage };\n}\n\nexport async function callDeepseekForSql({\n userPrompt,\n schema,\n systemPrompt,\n model,\n}) {\n const { content, response, request, usage } = await callDeepseekChat({\n systemPrompt: systemPrompt.trim(),\n userPrompt: buildUserMessage(userPrompt, schema),\n model,\n temperature: 0,\n });\n const sql = extractSqlFromText(content);\n if (!sql) {\n throw new Error(\"Deepseek response did not include SQL\");\n }\n\n return { sql, rawContent: content, response, request, usage };\n}\n"}, "aaa6bf9c43f9f17031ce3ce4210d6e4e23e83390": {"t": 1785753887.563691, "n": 2585, "h": "604ea2116d6c5f53", "c": "import { extractSqlFromText } from \"./sql-extractor.js\";\nimport { env } from \"../utils/env.js\";\n\nconst { DEEPSEEK_API_KEY, DEEPSEEK_API_BASE, DEEPSEEK_MODEL } = env;\n\nfunction buildUserMessage(userPrompt, schema) {\n if (schema && schema.trim()) {\n return `Database schema:\\n${schema.trim()}\\n\\nUser request:\\n${userPrompt.trim()}`;\n }\n return userPrompt.trim();\n}\n\nexport async function callDeepseekChat({\n systemPrompt,\n userPrompt,\n model,\n temperature = 0,\n}) {\n const messages = [];\n if (systemPrompt && systemPrompt.trim()) {\n messages.push({ role: \"system\", content: systemPrompt.trim() });\n }\n messages.push({ role: \"user\", content: (userPrompt || \"\").trim() });\n\n const usedModel = model || DEEPSEEK_MODEL;\n const body = {\n model: usedModel,\n messages,\n temperature,\n stream: false,\n };\n const endpoint = new URL(\n \"/v1/chat/completions\",\n DEEPSEEK_API_BASE\n ).toString();\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${DEEPSEEK_API_KEY}`,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n let data = null;\n if (responseText) {\n try {\n data = JSON.parse(responseText);\n } catch (err) {\n throw new Error(\"Deepseek response parse error\");\n }\n }\n\n if (!response.ok) {\n const message =\n data?.error?.message ||\n data?.error ||\n data?.detail ||\n response.statusText;\n throw new Error(`Deepseek API error ${response.status}: ${message}`);\n }\n\n const choice = data?.choices?.[0];\n const content = choice?.message?.content?.trim();\n if (!content) {\n throw new Error(\"Deepseek returned empty content\");\n }\n\n const usage = data?.usage || null;\n if (usage) {\n try {\n console.log(\n `Deepseek tokens — prompt: ${usage.prompt_tokens ?? \"?\"}, completion: ${\n usage.completion_tokens ?? \"?\"\n }, total: ${usage.total_tokens ?? \"?\"}`\n );\n } catch {}\n }\n\n return { content, response: data, request: body, usage };\n}\n\nexport async function callDeepseekForSql({\n userPrompt,\n schema,\n systemPrompt,\n model,\n}) {\n const { content, response, request, usage } = await callDeepseekChat({\n systemPrompt: systemPrompt.trim(),\n userPrompt: buildUserMessage(userPrompt, schema),\n model,\n temperature: 0,\n });\n const sql = extractSqlFromText(content);\n if (!sql) {\n throw new Error(\"Deepseek response did not include SQL\");\n }\n\n return { sql, rawContent: content, response, request, usage };\n}\n"}, "2674e9ddb193e2c1d4793b60b3fadeff846503f0": {"t": 1785753888.8805146, "n": 2712, "h": "ca3c3e83b8f5ab0e", "c": "import { extractSqlFromText } from \"./sql-extractor.js\";\n\nconst {\n DEEPSEEK_API_KEY,\n DEEPSEEK_API_BASE = \"https://api.deepseek.com\",\n DEEPSEEK_MODEL = \"deepseek-chat\",\n} = process.env;\n\nif (!DEEPSEEK_API_KEY) {\n console.error(\"DEEPSEEK_API_KEY is required in .env\");\n process.exit(1);\n}\n\nfunction buildUserMessage(userPrompt, schema) {\n if (schema && schema.trim()) {\n return `Database schema:\\n${schema.trim()}\\n\\nUser request:\\n${userPrompt.trim()}`;\n }\n return userPrompt.trim();\n}\n\nexport async function callDeepseekChat({\n systemPrompt,\n userPrompt,\n model,\n temperature = 0,\n}) {\n const messages = [];\n if (systemPrompt && systemPrompt.trim()) {\n messages.push({ role: \"system\", content: systemPrompt.trim() });\n }\n messages.push({ role: \"user\", content: (userPrompt || \"\").trim() });\n\n const usedModel = model || DEEPSEEK_MODEL;\n const body = {\n model: usedModel,\n messages,\n temperature,\n stream: false,\n };\n const endpoint = new URL(\n \"/v1/chat/completions\",\n DEEPSEEK_API_BASE\n ).toString();\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${DEEPSEEK_API_KEY}`,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n let data = null;\n if (responseText) {\n try {\n data = JSON.parse(responseText);\n } catch (err) {\n throw new Error(\"Deepseek response parse error\");\n }\n }\n\n if (!response.ok) {\n const message =\n data?.error?.message ||\n data?.error ||\n data?.detail ||\n response.statusText;\n throw new Error(`Deepseek API error ${response.status}: ${message}`);\n }\n\n const choice = data?.choices?.[0];\n const content = choice?.message?.content?.trim();\n if (!content) {\n throw new Error(\"Deepseek returned empty content\");\n }\n\n const usage = data?.usage || null;\n if (usage) {\n try {\n console.log(\n `Deepseek tokens — prompt: ${usage.prompt_tokens ?? \"?\"}, completion: ${\n usage.completion_tokens ?? \"?\"\n }, total: ${usage.total_tokens ?? \"?\"}`\n );\n } catch {}\n }\n\n return { content, response: data, request: body, usage };\n}\n\nexport async function callDeepseekForSql({\n userPrompt,\n schema,\n systemPrompt,\n model,\n}) {\n const { content, response, request, usage } = await callDeepseekChat({\n systemPrompt: systemPrompt.trim(),\n userPrompt: buildUserMessage(userPrompt, schema),\n model,\n temperature: 0,\n });\n const sql = extractSqlFromText(content);\n if (!sql) {\n throw new Error(\"Deepseek response did not include SQL\");\n }\n\n return { sql, rawContent: content, response, request, usage };\n}\n"}, "0c48cc9fe596061f07b500fab3846b48d47e7211": {"t": 1785753890.3193424, "n": 2921, "h": "636e1d7c3bd7c0ba", "c": "const {\n DEEPSEEK_API_KEY,\n DEEPSEEK_API_BASE = \"https://api.deepseek.com\",\n DEEPSEEK_MODEL = \"deepseek-chat\",\n} = process.env;\n\nif (!DEEPSEEK_API_KEY) {\n console.error(\"DEEPSEEK_API_KEY is required in .env\");\n process.exit(1);\n}\n\nfunction buildUserMessage(userPrompt, schema) {\n if (schema && schema.trim()) {\n return `Database schema:\\n${schema.trim()}\\n\\nUser request:\\n${userPrompt.trim()}`;\n }\n return userPrompt.trim();\n}\n\nfunction extractSqlFromText(text) {\n if (!text) return \"\";\n const fenceMatch = text.match(/```(?:sql)?\\s*([\\s\\S]*?)```/i);\n const raw = fenceMatch ? fenceMatch[1] : text;\n const withoutLabel = raw.replace(/^SQL\\s*[:\\-]\\s*/i, \"\");\n return withoutLabel.trim();\n}\n\nexport async function callDeepseekChat({\n systemPrompt,\n userPrompt,\n model,\n temperature = 0,\n}) {\n const messages = [];\n if (systemPrompt && systemPrompt.trim()) {\n messages.push({ role: \"system\", content: systemPrompt.trim() });\n }\n messages.push({ role: \"user\", content: (userPrompt || \"\").trim() });\n\n const usedModel = model || DEEPSEEK_MODEL;\n const body = {\n model: usedModel,\n messages,\n temperature,\n stream: false,\n };\n const endpoint = new URL(\n \"/v1/chat/completions\",\n DEEPSEEK_API_BASE\n ).toString();\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${DEEPSEEK_API_KEY}`,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n let data = null;\n if (responseText) {\n try {\n data = JSON.parse(responseText);\n } catch (err) {\n throw new Error(\"Deepseek response parse error\");\n }\n }\n\n if (!response.ok) {\n const message =\n data?.error?.message ||\n data?.error ||\n data?.detail ||\n response.statusText;\n throw new Error(`Deepseek API error ${response.status}: ${message}`);\n }\n\n const choice = data?.choices?.[0];\n const content = choice?.message?.content?.trim();\n if (!content) {\n throw new Error(\"Deepseek returned empty content\");\n }\n\n const usage = data?.usage || null;\n if (usage) {\n try {\n console.log(\n `Deepseek tokens — prompt: ${usage.prompt_tokens ?? \"?\"}, completion: ${\n usage.completion_tokens ?? \"?\"\n }, total: ${usage.total_tokens ?? \"?\"}`\n );\n } catch {}\n }\n\n return { content, response: data, request: body, usage };\n}\n\nexport async function callDeepseekForSql({\n userPrompt,\n schema,\n systemPrompt,\n model,\n}) {\n const { content, response, request, usage } = await callDeepseekChat({\n systemPrompt: systemPrompt.trim(),\n userPrompt: buildUserMessage(userPrompt, schema),\n model,\n temperature: 0,\n });\n const sql = extractSqlFromText(content);\n if (!sql) {\n throw new Error(\"Deepseek response did not include SQL\");\n }\n\n return { sql, rawContent: content, response, request, usage };\n}\n"}, "a4f446cfa737737fe044f2ceedceb4fdecaaacc8": {"t": 1785753891.5347018, "n": 2472, "h": "79b10dd03fe6b149", "c": "const {\n DEEPSEEK_API_KEY,\n DEEPSEEK_API_BASE = \"https://api.deepseek.com\",\n DEEPSEEK_MODEL = \"deepseek-chat\",\n} = process.env;\n\nif (!DEEPSEEK_API_KEY) {\n console.error(\"DEEPSEEK_API_KEY is required in .env\");\n process.exit(1);\n}\n\nfunction buildUserMessage(userPrompt, schema) {\n if (schema && schema.trim()) {\n return `Database schema:\\n${schema.trim()}\\n\\nUser request:\\n${userPrompt.trim()}`;\n }\n return userPrompt.trim();\n}\n\nfunction extractSqlFromText(text) {\n if (!text) return \"\";\n const fenceMatch = text.match(/```(?:sql)?\\s*([\\s\\S]*?)```/i);\n const raw = fenceMatch ? fenceMatch[1] : text;\n const withoutLabel = raw.replace(/^SQL\\s*[:\\-]\\s*/i, \"\");\n return withoutLabel.trim();\n}\n\nexport async function callDeepseekForSql({\n userPrompt,\n schema,\n systemPrompt,\n model,\n}) {\n const messages = [\n { role: \"system\", content: systemPrompt.trim() },\n { role: \"user\", content: buildUserMessage(userPrompt, schema) },\n ];\n\n const body = {\n model: model || DEEPSEEK_MODEL,\n messages,\n temperature: 0,\n stream: false,\n };\n const endpoint = new URL(\n \"/v1/chat/completions\",\n DEEPSEEK_API_BASE\n ).toString();\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${DEEPSEEK_API_KEY}`,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n let data = null;\n if (responseText) {\n try {\n data = JSON.parse(responseText);\n } catch (err) {\n throw new Error(\"Deepseek response parse error\");\n }\n }\n\n if (!response.ok) {\n const message =\n data?.error?.message ||\n data?.error ||\n data?.detail ||\n response.statusText;\n throw new Error(`Deepseek API error ${response.status}: ${message}`);\n }\n\n const choice = data?.choices?.[0];\n const content = choice?.message?.content?.trim();\n if (!content) {\n throw new Error(\"Deepseek returned empty content\");\n }\n\n const sql = extractSqlFromText(content);\n if (!sql) {\n throw new Error(\"Deepseek response did not include SQL\");\n }\n\n const usage = data?.usage || null;\n if (usage) {\n try {\n console.log(\n `Deepseek tokens — prompt: ${usage.prompt_tokens ?? \"?\"}, completion: ${\n usage.completion_tokens ?? \"?\"\n }, total: ${usage.total_tokens ?? \"?\"}`\n );\n } catch {}\n }\n\n return { sql, rawContent: content, response: data, request: body, usage };\n}\n"}, "f545da545b45c152d2c3039b2e3a99c88740f865": {"t": 1785753893.7872167, "n": 2447, "h": "ecd2edfecf7a4a09", "c": "const {\n DEEPSEEK_API_KEY,\n DEEPSEEK_API_BASE = \"https://api.deepseek.com\",\n DEEPSEEK_MODEL = \"deepseek-chat\",\n} = process.env;\n\nif (!DEEPSEEK_API_KEY) {\n console.error(\"DEEPSEEK_API_KEY is required in .env\");\n process.exit(1);\n}\n\nfunction buildUserMessage(userPrompt, schema) {\n if (schema && schema.trim()) {\n return `Database schema:\\n${schema.trim()}\\n\\nUser request:\\n${userPrompt.trim()}`;\n }\n return userPrompt.trim();\n}\n\nfunction extractSqlFromText(text) {\n if (!text) return \"\";\n const fenceMatch = text.match(/```(?:sql)?\\s*([\\s\\S]*?)```/i);\n const raw = fenceMatch ? fenceMatch[1] : text;\n const withoutLabel = raw.replace(/^SQL\\s*[:\\-]\\s*/i, \"\");\n return withoutLabel.trim();\n}\n\nexport async function callDeepseekForSql({ userPrompt, schema, systemPrompt }) {\n const messages = [\n { role: \"system\", content: systemPrompt.trim() },\n { role: \"user\", content: buildUserMessage(userPrompt, schema) },\n ];\n\n const body = {\n model: DEEPSEEK_MODEL,\n messages,\n temperature: 0,\n stream: false,\n };\n const endpoint = new URL(\n \"/v1/chat/completions\",\n DEEPSEEK_API_BASE\n ).toString();\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${DEEPSEEK_API_KEY}`,\n },\n body: JSON.stringify(body),\n });\n\n const responseText = await response.text();\n let data = null;\n if (responseText) {\n try {\n data = JSON.parse(responseText);\n } catch (err) {\n throw new Error(\"Deepseek response parse error\");\n }\n }\n\n if (!response.ok) {\n const message =\n data?.error?.message ||\n data?.error ||\n data?.detail ||\n response.statusText;\n throw new Error(`Deepseek API error ${response.status}: ${message}`);\n }\n\n const choice = data?.choices?.[0];\n const content = choice?.message?.content?.trim();\n if (!content) {\n throw new Error(\"Deepseek returned empty content\");\n }\n\n const sql = extractSqlFromText(content);\n if (!sql) {\n throw new Error(\"Deepseek response did not include SQL\");\n }\n\n const usage = data?.usage || null;\n if (usage) {\n try {\n console.log(\n `Deepseek tokens — prompt: ${usage.prompt_tokens ?? \"?\"}, completion: ${\n usage.completion_tokens ?? \"?\"\n }, total: ${usage.total_tokens ?? \"?\"}`\n );\n } catch {}\n }\n\n return { sql, rawContent: content, response: data, request: body, usage };\n}\n"}}}}