From be3e4c4e5470f6b8719cea60e7c5a77f1efdf9cd Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Sat, 11 Apr 2026 22:58:50 -0300 Subject: [PATCH] Fix: Handle 'reasoning' field from NVIDIA kimi-k2.5 model --- .../salesianos.gbdialog/start.bas | 12 ++++++++++- src/llm/mod.rs | 21 ++++++++++--------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/botserver-stack/data/system/work/salesianos.gbai/salesianos.gbdialog/start.bas b/botserver-stack/data/system/work/salesianos.gbai/salesianos.gbdialog/start.bas index 896264ff..35e0547e 100644 --- a/botserver-stack/data/system/work/salesianos.gbai/salesianos.gbdialog/start.bas +++ b/botserver-stack/data/system/work/salesianos.gbai/salesianos.gbdialog/start.bas @@ -21,9 +21,19 @@ ADD_SUGGESTION_TOOL "contato_secretaria" AS "Falar com Secretaria" ADD_SUGGESTION_TOOL "segunda_via" AS "Segunda Via de Boleto" ADD_SUGGESTION_TOOL "calendario_letivo" AS "Calendário Letivo" ADD_SUGGESTION_TOOL "outros" AS "Outros" + +ADD SWITCHER "tables" AS "Tabelas" +ADD SWITCHER "infographic" AS "Infográfico" +ADD SWITCHER "cards" AS "Cards" +ADD SWITCHER "list" AS "Lista" +ADD SWITCHER "comparison" AS "Comparação" +ADD SWITCHER "timeline" AS "Timeline" +ADD SWITCHER "markdown" AS "Markdown" +ADD SWITCHER "chart" AS "Gráfico" + REM Validar região para escolha de secretaria. REM Sincronizar as bases entre o Bot e a Org. -TALK "Olá! Sou o assistente virtual da Escola Salesiana. Como posso ajudá-lo hoje com inscrições, visitas, informações sobre cursos, documentos ou calendário letivo?" +TALK "Olá! Sou o assistente virtual da Escola Salesiana. Como posso ajudá-lo hoje com inscrições, visitas, informações sobre cursos, documentos ou calendário letivo? Você pode também escolher formatos de resposta acima da caixa de mensagem." diff --git a/src/llm/mod.rs b/src/llm/mod.rs index 53786650..3df0f086 100644 --- a/src/llm/mod.rs +++ b/src/llm/mod.rs @@ -455,17 +455,18 @@ impl LLMProvider for OpenAIClient { let chunk = chunk_result?; let chunk_str = String::from_utf8_lossy(&chunk); for line in chunk_str.lines() { - if line.starts_with("data: ") && !line.contains("[DONE]") { -if let Ok(data) = serde_json::from_str::(&line[6..]) { - // Handle content (standard) or reasoning_content (NVIDIA reasoning models) - let content = data["choices"][0]["delta"]["content"].as_str() - .or_else(|| data["choices"][0]["delta"]["reasoning_content"].as_str()); - if let Some(content) = content { - let processed = handler.process_content(content); - if !processed.is_empty() { - let _ = tx.send(processed).await; +if line.starts_with("data: ") && !line.contains("[DONE]") { + if let Ok(data) = serde_json::from_str::(&line[6..]) { + // Handle content (standard) or reasoning/reasoning_content (NVIDIA reasoning models) + let content = data["choices"][0]["delta"]["content"].as_str() + .or_else(|| data["choices"][0]["delta"]["reasoning_content"].as_str()) + .or_else(|| data["choices"][0]["delta"]["reasoning"].as_str()); + if let Some(content) = content { + let processed = handler.process_content(content); + if !processed.is_empty() { + let _ = tx.send(processed).await; + } } - } // Handle standard OpenAI tool_calls if let Some(tool_calls) = data["choices"][0]["delta"]["tool_calls"].as_array() {