103 lines
3.6 KiB
Python
103 lines
3.6 KiB
Python
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"]
|