UNPKG

@inso_web/els-mcp

Version:

MCP-сервер поверх INSO Error Logs Service. Read-only tools (search, analytics, fingerprinting, correlations) для подключения Claude Desktop/Code и ChatGPT к логам ошибок. Streamable HTTP transport + stdio для npx-запуска.

60 lines 2.53 kB
/** * Minimal Mistral Chat Completions client для explain_error. * * Не использует SDK — прямой HTTP, чтобы не тянуть лишнюю зависимость. * Возвращает JSON-объект (response_format=json_object) — caller сам парсит. * * Если `MISTRAL_API_KEY` не задан или ключ-плейсхолдер — возвращаем `null`, * caller тогда отдаёт degraded-response без AI summary. */ const MISTRAL_API_URL = 'https://api.mistral.ai/v1/chat/completions'; const DEFAULT_MODEL = 'mistral-large-latest'; const DEFAULT_MAX_TOKENS = 800; const DEFAULT_TIMEOUT_MS = 25_000; /** * Возвращает JSON-строку content от Mistral, либо `null` при отсутствии ключа / * сетевой ошибке / non-2xx. Caller сам делает JSON.parse и валидирует shape. */ export async function mistralChatJson(apiKey, opts) { if (!apiKey || apiKey.length < 20 || apiKey.startsWith('your_')) { return null; } const model = opts.model ?? process.env.MISTRAL_MODEL ?? DEFAULT_MODEL; const maxTokens = opts.maxTokens ?? DEFAULT_MAX_TOKENS; const temperature = opts.temperature ?? 0.3; try { const response = await fetch(MISTRAL_API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey}`, }, body: JSON.stringify({ model, messages: [ { role: 'system', content: opts.systemPrompt }, { role: 'user', content: opts.userContent }, ], temperature, max_tokens: maxTokens, response_format: { type: 'json_object' }, }), signal: AbortSignal.timeout(DEFAULT_TIMEOUT_MS), }); if (!response.ok) { const body = await response.text().catch(() => ''); opts.log?.warn?.({ status: response.status, body: body.slice(0, 400) }, 'mistral.non_ok'); return null; } const data = (await response.json()); return data.choices?.[0]?.message?.content ?? null; } catch (err) { opts.log?.warn?.({ err: err.message }, 'mistral.error'); return null; } } export function getMistralModel() { return process.env.MISTRAL_MODEL ?? DEFAULT_MODEL; } //# sourceMappingURL=mistralClient.js.map