""" scripts/verify_real_text_gen.py — 真实文案生成验收脚本 调 LLM 用素颜霜产品数据生成3条,原文打印给北哥人工核查。 用法:cd backend && python3 scripts/verify_real_text_gen.py 读取 .env 里的 CODEPROXY_BASE_URL + CODEPROXY_KEY(中转站) """ import json import os import sys import httpx from pathlib import Path from dotenv import load_dotenv sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 加载 .env env_path = Path(__file__).parent.parent / ".env" load_dotenv(env_path) from app.services.ai_engine._text_prompt import COPY_SYSTEM, build_prompt, parse_json_array # 素颜霜产品数据(方法验证用,不依赖 DB) PRODUCT = { "name": "素颜霜", "category": "美妆护肤", "selling_points": ["遮瑕提亮", "持妆全天", "养肤成分温和"], "style_tone": "素人分享、真实不浮夸", "text_angles": ["痛点切入", "成分党", "使用场景", "质地肤感", "平价替代"], "brand_keyword": "XX素颜霜", "custom_prompt": "", } COUNT = 3 def main(): # 主通道 apiports(实测真实可用,模型见 /v1/models) base_url = (os.environ.get("APIPORTS_BASE_URL") or "").rstrip("/") api_key = os.environ.get("APIPORTS_KEY", "") # apiports 无 gpt-4o-mini,文案用 claude-sonnet-4-5(中文质量好) model = os.environ.get("MODEL_TEXT", "claude-sonnet-4-5") if not base_url or not api_key: print("[ERROR] .env 缺少 APIPORTS_BASE_URL 或 APIPORTS_KEY") sys.exit(1) user_prompt = build_prompt(PRODUCT, COUNT) print("=" * 60) print("SYSTEM PROMPT(前300字):") print(COPY_SYSTEM[:300], "...") print("=" * 60) print("USER PROMPT(完整):") print(user_prompt) print("=" * 60) print(f"调用 {base_url} 模型={model} 生成 {COUNT} 条文案...") resp = httpx.post( f"{base_url}/chat/completions", headers={"Authorization": f"Bearer {api_key}"}, json={ "model": model, "messages": [ {"role": "system", "content": COPY_SYSTEM}, {"role": "user", "content": user_prompt}, ], "temperature": 0.9, "max_tokens": 3000, }, timeout=120, ) resp.raise_for_status() raw = resp.json()["choices"][0]["message"]["content"] print("\n===== 原始输出(供北哥核查)=====") print(raw) copies = parse_json_array(raw) if copies: print(f"\n===== 解析成功,共 {len(copies)} 条 =====") for i, c in enumerate(copies): print(f"\n--- 第{i+1}条 [{c.get('angle','')}] ---") print(f"标题:{c.get('title')}") print(f"正文({len(c.get('content',''))}字):\n{c.get('content')}") print(f"标签:{c.get('tags')}") print(f"封面大字:{c.get('coverTitle')}") else: print("\n[WARN] JSON 解析失败,请人工看原始输出") if __name__ == "__main__": main()