🚀 feat(ai): atualizar Gemini para 2.5 Pro e suportar respostas multipart do Vertex
- troca o modelo padrao do projeto para gemini-2.5-pro no settings e no .env.example\n- ajusta a cadeia de fallback para priorizar a linha 2.5 antes do 2.0 flash\n- trata respostas do Vertex com multiplos content.parts, combinando texto e function_call sem depender de response.text\n- adiciona cobertura dedicada para garantir o parse correto de respostas mistas do SDKmain
parent
8a00b6a68e
commit
3cf5bf863a
@ -0,0 +1,59 @@
|
||||
import os
|
||||
import unittest
|
||||
from types import SimpleNamespace
|
||||
|
||||
os.environ.setdefault("DEBUG", "false")
|
||||
|
||||
from app.services.ai.llm_service import LLMService
|
||||
|
||||
|
||||
class LLMServiceResponseParsingTests(unittest.TestCase):
|
||||
def test_extract_response_payload_supports_text_and_function_call_in_same_candidate(self):
|
||||
service = LLMService.__new__(LLMService)
|
||||
response = SimpleNamespace(
|
||||
candidates=[
|
||||
SimpleNamespace(
|
||||
content=SimpleNamespace(
|
||||
parts=[
|
||||
SimpleNamespace(text="Legal! Buscando carros de ate 70 mil para voce.", function_call=None),
|
||||
SimpleNamespace(
|
||||
text=None,
|
||||
function_call=SimpleNamespace(
|
||||
name="consultar_estoque",
|
||||
args={"preco_max": 70000.0},
|
||||
),
|
||||
),
|
||||
]
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
payload = service._extract_response_payload(response)
|
||||
|
||||
self.assertEqual(payload["response"], "Legal! Buscando carros de ate 70 mil para voce.")
|
||||
self.assertEqual(
|
||||
payload["tool_call"],
|
||||
{
|
||||
"name": "consultar_estoque",
|
||||
"arguments": {"preco_max": 70000.0},
|
||||
},
|
||||
)
|
||||
|
||||
def test_extract_response_payload_handles_text_only_candidate_without_response_text_accessor(self):
|
||||
service = LLMService.__new__(LLMService)
|
||||
response = SimpleNamespace(
|
||||
candidates=[
|
||||
SimpleNamespace(
|
||||
content=SimpleNamespace(
|
||||
parts=[
|
||||
SimpleNamespace(text="Resposta simples", function_call=None),
|
||||
]
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
payload = service._extract_response_payload(response)
|
||||
|
||||
self.assertEqual(payload, {"response": "Resposta simples", "tool_call": None})
|
||||
Loading…
Reference in New Issue