feat: 纯生产脚本更新
This commit is contained in:
50
app/main.py
50
app/main.py
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user