fix:优化当前的项目

This commit is contained in:
Daniel
2026-04-28 18:36:38 +08:00
parent 04f26bdaaf
commit f47453a656
22 changed files with 3671 additions and 89 deletions

View File

@@ -108,6 +108,10 @@ class AIRewriter:
def __init__(self) -> None:
self._client = None
self._prefer_chat_first = False
self._usage_prompt_tokens = 0
self._usage_completion_tokens = 0
self._usage_total_tokens = 0
self._usage_calls = 0
if settings.openai_api_key:
base_url = settings.openai_base_url or ""
self._prefer_chat_first = "dashscope.aliyuncs.com" in base_url
@@ -128,6 +132,22 @@ class AIRewriter:
else:
logger.warning("AIRewriter_init openai_key_missing=1 rewrite_will_use_fallback_only=1")
def _accumulate_usage(self, usage: Any) -> None:
if usage is None:
return
data = usage.model_dump() if hasattr(usage, "model_dump") else usage
if not isinstance(data, dict):
return
prompt = int(data.get("prompt_tokens") or data.get("input_tokens") or 0)
completion = int(data.get("completion_tokens") or data.get("output_tokens") or 0)
total = int(data.get("total_tokens") or 0)
if total <= 0:
total = max(0, prompt + completion)
self._usage_prompt_tokens += max(0, prompt)
self._usage_completion_tokens += max(0, completion)
self._usage_total_tokens += max(0, total)
self._usage_calls += 1
def rewrite(self, req: RewriteRequest, request_id: str = "") -> RewriteResponse:
cleaned_source = self._clean_source(req.source_text)
started = time.monotonic()
@@ -256,6 +276,12 @@ class AIRewriter:
)
trace["quality_issues_final"] = final_issues
if not final_issues:
trace["usage"] = {
"prompt_tokens": int(self._usage_prompt_tokens),
"completion_tokens": int(self._usage_completion_tokens),
"total_tokens": int(self._usage_total_tokens),
"model_calls": int(self._usage_calls),
}
trace["duration_ms"] = round((time.monotonic() - started) * 1000, 1)
trace["mode"] = "ai"
logger.info(
@@ -266,6 +292,12 @@ class AIRewriter:
return RewriteResponse(**normalized, mode="ai", quality_notes=[], trace=trace)
# 模型已返回有效 JSON默认「软接受」——仍视为 AI 洗稿,质检问题写入 quality_notes避免误用模板稿
if settings.ai_soft_accept and self._model_output_usable(normalized):
trace["usage"] = {
"prompt_tokens": int(self._usage_prompt_tokens),
"completion_tokens": int(self._usage_completion_tokens),
"total_tokens": int(self._usage_total_tokens),
"model_calls": int(self._usage_calls),
}
trace["duration_ms"] = round((time.monotonic() - started) * 1000, 1)
trace["mode"] = "ai"
trace["quality_soft_accept"] = True
@@ -669,6 +701,7 @@ class AIRewriter:
msg = (choice.message.content if choice else "") or ""
fr = getattr(choice, "finish_reason", None) if choice else None
usage = getattr(completion, "usage", None)
self._accumulate_usage(usage)
udump = (
usage.model_dump()
if usage is not None and hasattr(usage, "model_dump")
@@ -755,6 +788,7 @@ class AIRewriter:
text={"format": {"type": "json_object"}},
timeout=timeout_sec,
)
self._accumulate_usage(getattr(completion, "usage", None))
output_text = completion.output_text or ""
ms = (time.monotonic() - t0) * 1000
logger.info(