from __future__ import annotations import json import httpx from app.modules.data_process.generation import chat_completions_url, generate_model_records def test_chat_completions_url_accepts_host_base_and_complete_url() -> None: assert chat_completions_url("www.caoxiaozhu.com") == ( "https://www.caoxiaozhu.com/v1/chat/completions" ) assert chat_completions_url("https://model.example/v1") == ( "https://model.example/v1/chat/completions" ) complete = "https://model.example/openai/v1/chat/completions" assert chat_completions_url(complete) == complete def test_generate_model_records_uses_prompt_auth_and_stable_split() -> None: requests: list[httpx.Request] = [] progress_updates: list[tuple[int, int]] = [] def handler(request: httpx.Request) -> httpx.Response: requests.append(request) payload = json.loads(request.content) assert payload["model"] == "qwen-plus" assert payload["response_format"] == {"type": "json_object"} assert "客户反馈页面加载慢" in payload["messages"][1]["content"] return httpx.Response( 200, json={ "choices": [ { "message": { "content": json.dumps( { "items": [ { "instruction": "请生成简洁客服回复", "input": "客户反馈页面加载慢", "output": "已收到反馈,我们正在排查。", } ] }, ensure_ascii=False, ) } } ] }, ) client = httpx.Client(transport=httpx.MockTransport(handler)) records = generate_model_records( [{"id": "preview-1", "edited_content": "客户反馈页面加载慢"}], model={ "name": "Qwen", "online_model_name": "qwen-plus", "api_url": "model.example", "api_key": "test-secret", }, config={ "generation_prompt": "请处理:{{ content }}", "json_mode": True, "temperature": 0.2, "max_tokens": 512, }, task_id="task-1", split={"train": 100, "validation": 0, "test": 0}, qa_pairs_per_item=1, client=client, on_progress=lambda processed, total: progress_updates.append((processed, total)), ) assert len(records) == 1 assert records[0]["status"] == "valid" assert records[0]["split"] == "train" assert requests[0].headers["Authorization"] == "Bearer test-secret" assert progress_updates == [(1, 1)] def test_generate_model_records_keeps_partial_failure_for_manual_repair() -> None: client = httpx.Client( transport=httpx.MockTransport( lambda _: httpx.Response(200, json={"choices": [{"message": {"content": "not-json"}}]}) ) ) records = generate_model_records( [{"id": "preview-1", "edited_content": "来源正文"}], model={"name": "model", "api_url": "https://model.example/v1"}, config={"generation_retries": 1}, task_id="task-1", split={"train": 80, "validation": 10, "test": 10}, qa_pairs_per_item=1, client=client, ) assert len(records) == 1 assert records[0]["status"] == "invalid" assert records[0]["error"]