feat: 纯生产脚本更新

This commit is contained in:
Daniel
2026-04-28 12:10:27 +08:00
parent 2dc7f2e19c
commit 04f26bdaaf
6 changed files with 226 additions and 13 deletions

View File

@@ -30,6 +30,8 @@ from app.schemas import (
WechatBindingRequest,
WechatPublishRequest,
WechatSwitchRequest,
VipRechargeRequest,
VipToggleRequest,
)
from app.services.ai_rewriter import AIRewriter
from app.services.im import IMPublisher
@@ -82,6 +84,37 @@ def _require_user(request: Request) -> dict | None:
return u
def _platform_model_cfg() -> dict:
return {
"api_key": settings.platform_openai_api_key or "",
"base_url": settings.platform_openai_base_url or "",
"model": settings.platform_openai_model,
"image_model": settings.platform_openai_image_model,
"timeout_sec": float(settings.platform_openai_timeout),
"max_output_tokens": int(settings.platform_openai_max_output_tokens),
"max_retries": int(settings.platform_openai_max_retries),
"model_name": "平台模型",
}
def _select_model_cfg(user_id: int, prefer_vip: bool = True) -> tuple[dict | None, str]:
vip = users.get_vip_status(user_id)
if prefer_vip and vip.get("vip_enabled") and int(vip.get("token_balance") or 0) > 0:
cfg = _platform_model_cfg()
if cfg.get("api_key"):
return cfg, "vip"
cfg = users.get_active_ai_model(user_id)
return cfg, "user"
def _estimate_rewrite_cost(req: RewriteRequest, result) -> int:
src_chars = len((req.source_text or "").strip())
out_chars = len((result.body_markdown or "").strip()) + len((result.title or "").strip()) + len((result.summary or "").strip())
total_chars = max(1, src_chars + out_chars)
blocks = (total_chars + 999) // 1000
return int(blocks * max(1, int(settings.vip_rewrite_token_per_1k_chars)))
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
if not _current_user(request):
@@ -129,12 +162,14 @@ async def api_config(request: Request):
provider = "dashscope" if "dashscope.aliyuncs.com" in base else "openai_compatible"
host = urlparse(base).netloc if base else ""
model_name = (model_cfg or {}).get("model") or None
image_model_name = (model_cfg or {}).get("image_model") or settings.openai_image_model
timeout_sec = (model_cfg or {}).get("timeout_sec") or None
max_output_tokens = (model_cfg or {}).get("max_output_tokens") or None
key_configured = bool((model_cfg or {}).get("api_key"))
return {
"openai_configured": key_configured,
"openai_model": model_name,
"openai_image_model": image_model_name,
"provider": provider,
"base_url_host": host or None,
"openai_timeout_sec": timeout_sec,
@@ -158,6 +193,7 @@ async def auth_me(request: Request):
"wechat_accounts": bindings,
"active_ai_model": users.get_active_ai_model(user["id"]),
"ai_models": users.list_ai_models(user["id"]),
"vip": users.get_vip_status(user["id"]),
}
@@ -176,6 +212,7 @@ async def auth_register(req: AuthCredentialRequest, response: Response):
return {"ok": False, "detail": "注册失败:账号库异常,请稍后重试"}
if not user:
return {"ok": False, "detail": "用户名已存在"}
users.ensure_trial_tokens(user["id"], settings.vip_trial_tokens)
ttl = _session_ttl(bool(req.remember_me))
token = users.create_session(user["id"], ttl_seconds=ttl)
response.set_cookie(
@@ -188,7 +225,7 @@ async def auth_register(req: AuthCredentialRequest, response: Response):
)
return {
"ok": True,
"detail": "注册并登录成功,请保存重置码",
"detail": "注册并登录成功,已赠送试用 token请保存重置码",
"user": {"id": user["id"], "username": user["username"]},
"reset_code": user.get("reset_code", ""),
}
@@ -358,6 +395,7 @@ async def auth_ai_model_add(req: AIModelCreateRequest, request: Request):
api_key=api_key,
base_url=(req.base_url or "").strip(),
model=model,
image_model=(req.image_model or "").strip(),
timeout_sec=max(10.0, float(req.timeout_sec or 120.0)),
max_output_tokens=max(256, int(req.max_output_tokens or 8192)),
max_retries=max(0, int(req.max_retries or 0)),
@@ -416,6 +454,7 @@ async def rewrite(req: RewriteRequest, request: Request):
"openai_timeout": settings.openai_timeout,
"openai_max_output_tokens": settings.openai_max_output_tokens,
"openai_max_retries": settings.openai_max_retries,
"openai_image_model": settings.openai_image_model,
}
try:
settings.openai_api_key = model_cfg.get("api_key") or ""
@@ -432,6 +471,7 @@ async def rewrite(req: RewriteRequest, request: Request):
settings.openai_timeout = backup["openai_timeout"]
settings.openai_max_output_tokens = backup["openai_max_output_tokens"]
settings.openai_max_retries = backup["openai_max_retries"]
settings.openai_image_model = backup["openai_image_model"]
tr = result.trace or {}
logger.info(
"api_rewrite_out rid=%s mode=%s duration_ms=%s quality_notes=%d trace_steps=%s soft_accept=%s",
@@ -567,6 +607,7 @@ async def generate_wechat_cover(req: WechatCoverGenerateRequest, request: Reques
"openai_timeout": settings.openai_timeout,
"openai_max_output_tokens": settings.openai_max_output_tokens,
"openai_max_retries": settings.openai_max_retries,
"openai_image_model": settings.openai_image_model,
}
try:
if model_cfg:
@@ -576,6 +617,7 @@ async def generate_wechat_cover(req: WechatCoverGenerateRequest, request: Reques
settings.openai_timeout = float(model_cfg.get("timeout_sec") or 120.0)
settings.openai_max_output_tokens = int(model_cfg.get("max_output_tokens") or 8192)
settings.openai_max_retries = int(model_cfg.get("max_retries") or 0)
settings.openai_image_model = (model_cfg.get("image_model") or "").strip() or backup["openai_image_model"]
else:
settings.openai_api_key = ""
settings.openai_base_url = ""
@@ -583,6 +625,7 @@ async def generate_wechat_cover(req: WechatCoverGenerateRequest, request: Reques
settings.openai_timeout = 120.0
settings.openai_max_output_tokens = 8192
settings.openai_max_retries = 0
settings.openai_image_model = backup["openai_image_model"]
out = await PosterMaterialService(wechat).generate_cover(req, request_id=rid, account=binding)
finally:
settings.openai_api_key = backup["openai_api_key"]
@@ -591,6 +634,7 @@ async def generate_wechat_cover(req: WechatCoverGenerateRequest, request: Reques
settings.openai_timeout = backup["openai_timeout"]
settings.openai_max_output_tokens = backup["openai_max_output_tokens"]
settings.openai_max_retries = backup["openai_max_retries"]
settings.openai_image_model = backup["openai_image_model"]
logger.info(
"api_wechat_cover_generate_out rid=%s ok=%s thumb=%s note=%s warnings=%d",
rid,
@@ -648,6 +692,7 @@ async def generate_posters(req: PosterGenerateRequest, request: Request):
"openai_timeout": settings.openai_timeout,
"openai_max_output_tokens": settings.openai_max_output_tokens,
"openai_max_retries": settings.openai_max_retries,
"openai_image_model": settings.openai_image_model,
}
try:
if model_cfg:
@@ -657,6 +702,7 @@ async def generate_posters(req: PosterGenerateRequest, request: Request):
settings.openai_timeout = float(model_cfg.get("timeout_sec") or 120.0)
settings.openai_max_output_tokens = int(model_cfg.get("max_output_tokens") or 8192)
settings.openai_max_retries = int(model_cfg.get("max_retries") or 0)
settings.openai_image_model = (model_cfg.get("image_model") or "").strip() or backup["openai_image_model"]
else:
settings.openai_api_key = ""
settings.openai_base_url = ""
@@ -664,6 +710,7 @@ async def generate_posters(req: PosterGenerateRequest, request: Request):
settings.openai_timeout = 120.0
settings.openai_max_output_tokens = 8192
settings.openai_max_retries = 0
settings.openai_image_model = backup["openai_image_model"]
out = await PosterMaterialService(wechat).generate(req, request_id=rid, account=binding)
finally:
settings.openai_api_key = backup["openai_api_key"]
@@ -672,6 +719,7 @@ async def generate_posters(req: PosterGenerateRequest, request: Request):
settings.openai_timeout = backup["openai_timeout"]
settings.openai_max_output_tokens = backup["openai_max_output_tokens"]
settings.openai_max_retries = backup["openai_max_retries"]
settings.openai_image_model = backup["openai_image_model"]
logger.info(
"api_poster_generate_out rid=%s ok=%s posters=%d warnings=%d",
rid,