Card context
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
from typing import List
|
||||
from openai import OpenAI
|
||||
from sqlalchemy.orm import Session
|
||||
@@ -163,6 +165,60 @@ def build_llm_reply(db: Session, student_id: int, user_message: str) -> str:
|
||||
return response.output_text.strip()
|
||||
|
||||
|
||||
def build_lesson_reply(db: Session, student_id: int, user_message: str, lesson_context: str) -> dict:
|
||||
context = get_student_context(db, student_id)
|
||||
response = client.responses.create(
|
||||
model="gpt-4.1-mini",
|
||||
input=[
|
||||
{"role": "system", "content": SYSTEM_PROMPT},
|
||||
{"role": "system", "content": TURN_TAKING_PROMPT},
|
||||
{
|
||||
"role": "system",
|
||||
"content": (
|
||||
"Tu reçois un contexte courant de leçon lié à la card affichée. "
|
||||
"Tu dois parler uniquement de cette card, sauf si l'élève pose une question de clarification immédiate. "
|
||||
"Si la réponse de l'élève montre clairement qu'il a compris la card courante, mets "
|
||||
"`advance_lesson_step` à true. Sinon, mets-le à false. "
|
||||
"Réponds strictement en JSON valide avec les clés `reply` et `advance_lesson_step`. "
|
||||
"`reply` contient uniquement ce que Professeur TOP dit à l'élève, sans JSON visible."
|
||||
),
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": (
|
||||
f"Contexte pédagogique général:\n{context}\n\n"
|
||||
f"Contexte courant de la card affichée:\n{lesson_context}\n\n"
|
||||
f"Message de l'élève:\n{user_message}"
|
||||
),
|
||||
},
|
||||
],
|
||||
temperature=0.4,
|
||||
)
|
||||
raw_text = response.output_text.strip()
|
||||
json_text = raw_text
|
||||
if json_text.startswith("```"):
|
||||
json_text = re.sub(r"^```(?:json)?\s*", "", json_text)
|
||||
json_text = re.sub(r"\s*```$", "", json_text)
|
||||
if "{" in json_text and "}" in json_text:
|
||||
json_text = json_text[json_text.find("{") : json_text.rfind("}") + 1]
|
||||
try:
|
||||
parsed = json.loads(json_text)
|
||||
except json.JSONDecodeError:
|
||||
return {"reply": raw_text, "advance_lesson_step": False}
|
||||
|
||||
reply = str(parsed.get("reply") or "").strip()
|
||||
advance_value = parsed.get("advance_lesson_step")
|
||||
advance_lesson_step = (
|
||||
advance_value
|
||||
if isinstance(advance_value, bool)
|
||||
else str(advance_value).strip().lower() in {"true", "oui", "yes", "1"}
|
||||
)
|
||||
return {
|
||||
"reply": reply or raw_text,
|
||||
"advance_lesson_step": advance_lesson_step,
|
||||
}
|
||||
|
||||
|
||||
def list_tts_profiles() -> list[dict]:
|
||||
return [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user