add training configuration APIs

This commit is contained in:
刘金宝
2026-06-05 12:57:02 +08:00
parent 7f1803f9fa
commit 41a2851120
14 changed files with 1541 additions and 10 deletions
+52 -1
View File
@@ -89,18 +89,46 @@ def run_api_contract_tests() -> None:
assert "/api/v1/imports/case-sql/apply" not in openapi_payload["paths"]
assert "/api/v1/cases/{case_id}/delete-preview" not in openapi_payload["paths"]
assert "delete" not in openapi_payload["paths"]["/api/v1/cases/{case_id}"]
assert "/api/v1/training-config/recommended" in openapi_payload["paths"]
assert "/api/v1/training-config/options" in openapi_payload["paths"]
assert "/api/v1/sessions/{session_id}/hints/stream" in openapi_payload["paths"]
assert "/api/v1/sessions/{session_id}/physical-exams" in openapi_payload["paths"]
assert "/api/v1/sessions/{session_id}/auxiliary-exams" in openapi_payload["paths"]
assert "/api/v1/sessions/{session_id}/physical-exams/{item_code}" in openapi_payload["paths"]
assert "/api/v1/sessions/{session_id}/auxiliary-exams/{item_code}" in openapi_payload["paths"]
cases = client.get("/api/v1/cases", headers=headers)
assert cases.status_code == 200
case_id = cases.json()["data"]["items"][0]["id"]
recommended_config = client.get(f"/api/v1/training-config/recommended?case_id={case_id}", headers=headers)
assert recommended_config.status_code == 200
assert recommended_config.json()["data"]["recommended"]["visit_environment"] == "outpatient"
assert recommended_config.json()["data"]["recommended_labels"]["visit_environment"] == "门诊"
config_options = client.get(f"/api/v1/training-config/options?case_id={case_id}", headers=headers)
assert config_options.status_code == 200
assert config_options.json()["data"]["options"]["personality"]
created = client.post(
"/api/v1/sessions",
headers=headers,
json={"case_id": case_id, "training_type": "diagnosis_treatment", "mode": "practice", "score_type": "percentage"},
json={
"case_id": case_id,
"training_type": "diagnosis_treatment",
"mode": "practice",
"score_type": "percentage",
"patient_config": {
"visit_environment": "outpatient",
"age_group": "youth",
"education_level": "higher",
"personality": "calm",
},
},
)
assert created.status_code == 200
session_id = created.json()["data"]["session_id"]
assert created.json()["data"]["patient_config"]["labels"]["personality"] == "平和"
cross_user = client.get(
f"/api/v1/sessions/{session_id}/order-items",
@@ -120,6 +148,18 @@ def run_api_contract_tests() -> None:
assert order_two.status_code == 200
assert order_two.json()["data"]["already_ordered"] is True
physical_list = client.get(f"/api/v1/sessions/{session_id}/physical-exams", headers=headers)
assert physical_list.status_code == 200
assert "items" in physical_list.json()["data"]
auxiliary_list = client.get(f"/api/v1/sessions/{session_id}/auxiliary-exams", headers=headers)
assert auxiliary_list.status_code == 200
assert any(item["item_code"] == "blood_routine" for item in auxiliary_list.json()["data"]["items"])
auxiliary_result = client.post(f"/api/v1/sessions/{session_id}/auxiliary-exams/blood_routine", headers=headers)
assert auxiliary_result.status_code == 200
assert auxiliary_result.json()["data"]["already_ordered"] is True
practice_hint_session = client.post(
"/api/v1/sessions",
headers=headers,
@@ -136,6 +176,17 @@ def run_api_contract_tests() -> None:
assert hint.json()["data"]["hints"]
assert "recommended_orders" in hint.json()["data"]
with client.stream(
"POST",
f"/api/v1/sessions/{practice_hint_session_id}/hints/stream",
headers=headers,
json={"scope": "current_conversation"},
) as hint_stream:
assert hint_stream.status_code == 200
hint_stream_text = "".join(hint_stream.iter_text())
assert "event: hint_delta" in hint_stream_text
assert "event: hint_done" in hint_stream_text
teaching = client.post(
"/api/v1/sessions",
headers=headers,
+12
View File
@@ -28,6 +28,7 @@ from app.schemas.session import (
SubmitDiagnosisRequest,
SubmitTreatmentRequest,
)
from app.schemas.training_config import PatientConfig
from app.services.evaluation_service import EvaluationService
from app.services.order_service import OrderService
from app.services.pdf_export_service import PdfExportService
@@ -56,10 +57,17 @@ async def run_demo_flow() -> None:
training_type="diagnosis_treatment",
mode="practice",
score_type="percentage",
patient_config=PatientConfig(
visit_environment="outpatient",
age_group="youth",
education_level="higher",
personality="calm",
),
),
)
db.commit()
assert created.status == "inquiry"
assert created.patient_config["labels"]["visit_environment"] == "门诊"
chat = await session_service.chat(ctx, created.session_id, ChatRequest(message="孩子最高体温多少?").message)
db.commit()
@@ -68,6 +76,10 @@ async def run_demo_flow() -> None:
order = order_service.create_order(created.session_id, ctx.user_id, CreateOrderRequest(item_code="chest_xray").item_code)
db.commit()
assert order.is_key is True
auxiliary_items = order_service.list_auxiliary_exam_items(created.session_id, ctx.user_id)
assert any(item.item_code == "chest_xray" for item in auxiliary_items.items)
physical_items = order_service.list_physical_exam_items(created.session_id, ctx.user_id)
assert physical_items.items == [] or all(item.item_code != "chest_xray" for item in physical_items.items)
tool_count_before = len([item for item in runtime_memory.get_messages(f"mem:{created.session_code}") if item.get("role") == "tool"])
duplicate_order = order_service.create_order(created.session_id, ctx.user_id, "chest_xray")