fix: prevent Peg timeout on short coaching prompts
MetaBloom CI / app (push) Canceled after 0s
MetaBloom CI / api (push) Canceled after 0s

This commit is contained in:
AI Company
2026-07-21 22:26:48 +00:00
parent 0c2430ad13
commit 7631caaa4e
2 changed files with 20 additions and 7 deletions
+4 -7
View File
@@ -4,11 +4,8 @@ from .config import Settings
from .schemas import CoachChatIn, CoachChatOut
SYSTEM_PROMPT = """Tu es Peg, coach bien-être chaleureux de MetaBloom. Réponds en français, brièvement et concrètement.
Tu fournis uniquement des conseils généraux sur les habitudes, l'alimentation équilibrée, le sommeil, l'activité douce et la motivation.
Tu ne poses jamais de diagnostic, n'interprètes pas une mesure comme une conclusion médicale, ne prescris aucun traitement et ne proposes jamais de dose, d'arrêt ou de modification de médicament. Ne remplace jamais un médecin.
Si une personne décrit une urgence, des symptômes graves, une hypoglycémie sévère, une détresse ou un danger immédiat, invite-la à appeler immédiatement les urgences locales (15 ou 112 en France) et à ne pas rester seule. Ne poursuis pas le coaching.
Pour toute question clinique ou médicamenteuse, refuse clairement et recommande un médecin ou pharmacien. N'invente aucune donnée. Pose au plus une question utile. Respecte la vie privée et ne demande aucune identité."""
SYSTEM_PROMPT = """Tu es Peg, coach bien-être chaleureux. Réponds en français naturel en 2 à 4 phrases, avec une action simple et concrète.
Reste sur les habitudes générales : alimentation équilibrée, sommeil, activité douce et motivation. Aucun diagnostic, interprétation médicale, médicament, dose ou changement de traitement. Pour une question clinique, recommande un médecin ou pharmacien. En cas d'urgence, indique le 15 ou le 112 en France. N'invente rien et ne demande aucune identité."""
EMERGENCY = re.compile(
r"\b(urgence|inconscient(?:e)?|ne respire|douleur thoracique|convulsion|"
@@ -48,8 +45,8 @@ async def chat_with_peg(data: CoachChatIn, cfg: Settings) -> CoachChatOut:
response = await client.post(
f"{cfg.ai_base_url.rstrip('/')}/chat/completions",
headers=headers,
# Keep answers useful but short so a local CPU model responds reliably.
json={"model": cfg.ai_model, "messages": messages, "temperature": 0.4, "max_tokens": 160},
# A concise prompt and answer keep local CPU inference within the UI timeout.
json={"model": cfg.ai_model, "messages": messages, "temperature": 0.4, "max_tokens": 90},
)
response.raise_for_status()
content = response.json()["choices"][0]["message"]["content"].strip()
+16
View File
@@ -80,6 +80,22 @@ def test_coach_openai_compatible_response(monkeypatch):
assert response.json()["assistant"] == "Peg"
def test_breakfast_suggestion_uses_short_model_request(monkeypatch):
captured = {}
async def fake_post(self, url, **kwargs):
captured.update(kwargs["json"])
request = httpx.Request("POST", url)
return httpx.Response(200, request=request, json={"choices": [{"message": {"content": "Essaie un yaourt nature, des flocons davoine et un fruit."}}]})
monkeypatch.setattr(httpx.AsyncClient, "post", fake_post)
with TestClient(app) as client:
response = client.post("/coach/chat", headers=auth(client), json={"message": "Une idée de petit-déjeuner"})
assert response.status_code == 200
assert response.json()["source"] == "model"
assert captured["max_tokens"] == 90
def test_coach_fallback_when_provider_is_down(monkeypatch):
async def failed_post(self, url, **kwargs):
raise httpx.ConnectError("offline")