@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
JavaScript
/**
* 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