diff --git a/app/api/voice/chat/route.ts b/app/api/voice/chat/route.ts index c496ae4..9be54b1 100644 --- a/app/api/voice/chat/route.ts +++ b/app/api/voice/chat/route.ts @@ -164,10 +164,29 @@ export async function POST(req: Request) { break } } catch (e: any) { - console.error('[voice/chat] groq error:', e?.message || e) - const msg = 'Что-то сломалось.' - emitVoice('error', agent, msg) - return NextResponse.json({ error: 'llm_failed', detail: String(e?.message || e), text: msg }, { status: 502 }) + const errStr = String(e?.message || e) + console.error('[voice/chat] groq error:', errStr) + + // tool_use_failed: модель неправильно сформировала tool call — повторить без tools + if (errStr.includes('tool_use_failed') || errStr.includes('Failed to call a function')) { + try { + const c2 = client() + const fallback = await c2.chat.completions.create({ + model: MODEL, + max_tokens: MAX_TOKENS, + messages: apiMessages.slice(0, historyStartLen + 1), + }) + finalText = fallback.choices[0]?.message?.content || '' + console.log('[voice/chat] tool_use_failed fallback ok') + } catch (e2) { + console.error('[voice/chat] fallback failed:', e2) + finalText = 'Не удалось выполнить запрос.' + } + } else { + const msg = 'Что-то сломалось.' + emitVoice('error', agent, msg) + return NextResponse.json({ error: 'llm_failed', detail: errStr, text: msg }, { status: 502 }) + } } if (!finalText.trim()) {