🚀 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