#!/usr/bin/python3.12
"""批量补写缺失的 summary/focus_point（DeepSeek）"""
import json, urllib.request, re, os, time

API_KEY = "sk-00d69ca50b124474b02236121d4cf147"  # deepseek
API_URL = "https://api.deepseek.com/chat/completions"

path = '/data/news/json/yes_data/0827data.json'
d = json.load(open(path))

def call_deepseek(prompt, max_tokens=500, temperature=0.7):
    payload = json.dumps({
        "model": "deepseek-chat",
        "messages": [{"role": "user", "content": prompt}],
        "max_tokens": max_tokens,
        "temperature": temperature
    }).encode()
    req = urllib.request.Request(API_URL, data=payload,
        headers={'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'})
    resp = urllib.request.urlopen(req, timeout=120)
    result = json.loads(resp.read().decode('utf-8'))
    return result['choices'][0]['message']['content'].strip()

# ============ 1. social summary（基于已抓正文） ============
social_facts = {
    0: ("中国对外开放加速迭代升级",
        "新华社：8月26日深圳经济特区建立46周年，浦东开发开放36周年。深圳华强北高峰期单日境外客流突破8000人次；今年上半年深圳实际使用外资超320亿元，同比增长超50%，APEC成员经济体占93.6%。浦东制度型开放战略任务落地率超95%，170项经验全国复制推广，计划到2028年服务贸易规模突破1400亿美元。"),
    1: ("中科通量推出OmniMate BOX，以\"边缘智算主机+存量屏幕\"模式降低AI数字员工落地门槛",
        "雷峰网：中科通量推出OmniMate BOX轻量版AI数字员工，采用边缘智算主机+音视频外设+存量显示终端分体式架构，HDMI直连网点已有电视/广告机/触控屏，无需场地改造。搭载国产RISC-V架构12核CPU、INT8 200 TOPS算力，本地闭环不依赖外网。面向通信营业厅、银行网点、汽车4S店等场景，闲时广告+忙时服务自动切换。"),
    2: ("腾讯高管回应「腾讯做 AI 慢了」质疑，提出熬得久才有机会抓住持续出现的新机遇",
        "腾讯集团高级执行副总裁汤道生在内部刊物《知点》发文回应\"腾讯做AI慢了\"质疑：混元大模型多次重构，混元Hy3在同等参数中效果突出，但公司算力严重不足拖慢了模型训练与产品发展。他表示起得早也许不是最关键，AI下半场才刚开始，大模型竞赛是马拉松，熬得久才有机会抓住持续出现的新机遇。"),
    3: ("熊友军：具身智能的ChatGPT前夜已到",
        "蓝鲸财经对话北京人形机器人创新中心CEO熊友军：他将当下行业阶段定义为具身智能\"ChatGPT时刻\"的前夜。企业要回答的问题不再是能不能做，而是能不能稳定地做、划算地做。行业重复建设问题突出，应打造操作系统级基础底座让企业少重复造轮子。创新中心有上市计划。"),
    4: ("第二届世界人形机器人运动会落幕 发布多项重磅成果",
        "中新网：8月26日晚第二届世界人形机器人运动会在北京国家速滑馆闭幕。赛迪研究院、北奥集团联合多家头部企业发布全球首个世界级人形机器人运动会全量数据集，总时长超2500小时，覆盖工业、商超、餐饮、汽车充电等12个场景。五大揭榜计划面向全球发出邀约，机器人进校园活动启动，明年8月第三届将如期举办。"),
}

for idx in range(5):
    title, facts = social_facts[idx]
    prompt = f"""请根据以下新闻事实，写一条摘要（35-55字，包含具体数据或动作，从正文提炼，不要标题扩写，不要以"近日""日前"开头，中文）：

标题：{title}
事实：{facts}

摘要："""
    try:
        summ = call_deepseek(prompt, max_tokens=200)
        print(f'social[{idx}] summary: {summ}')
        for s in d:
            if s.get('name') == 'social_hotspots':
                s['list'][idx]['summary'] = summ
                break
    except Exception as e:
        print(f'social[{idx}] summary 失败: {e}')
    time.sleep(1)

# ============ 2. focus_point 批量（social 5 + vehicle 5 + hyundai 6） ============
fp_items = []
for s in d:
    name = s.get('name')
    for i, it in enumerate(s.get('list', [])):
        if not it.get('focus_point') and name in ('social_hotspots', 'vehicle_hotspots', 'hyundai_buzz_topics_domestic', 'hyundai_buzz_topics_international'):
            fp_items.append((name, i, it.get('title', ''), it.get('summary', '')[:80]))

print(f'\n需补 focus_point: {len(fp_items)} 条')

for name, i, title, summary in fp_items:
    prompt = f"""请写一条营销启示focus_point，20-35字，站在现代汽车营销角度，从中提炼可借鉴的营销思路。
要求：以「可借鉴」「可参考」「不妨」「建议」等柔和词开头，避免使用「应」字。
标题：{title}
摘要：{summary[:80]}

focus_point："""
    try:
        fp = call_deepseek(prompt, max_tokens=100, temperature=0.7)
        # 清理引号
        fp = fp.replace('"', '').replace('"', '').replace('\n', '').strip()
        # 校验：≤35字、以柔和词开头、不含「应」
        content = re.sub(r'[；，。、：""''（）()]', '', fp)
        if len(content) > 35:
            fp = fp[:35]
            print(f'  ⚠️ {name}[{i}] 超长截断: {fp}')
        ok_start = any(fp.startswith(w) for w in ['可借鉴', '可参考', '不妨', '建议'])
        if not ok_start:
            print(f'  ⚠️ {name}[{i}] 开头不合规: {fp[:30]}')
        print(f'{name}[{i}] fp: {fp}')
        for s in d:
            if s.get('name') == name:
                s['list'][i]['focus_point'] = fp
                break
    except Exception as e:
        print(f'{name}[{i}] focus 失败: {e}')
    time.sleep(1)

json.dump(d, open(path, 'w'), ensure_ascii=False, indent=2)
print('\n✅ 已保存')

# 校验
d = json.load(open(path))
missing = 0
for s in d:
    name = s.get('name')
    for i, it in enumerate(s.get('list', [])):
        if not it.get('summary') or not it.get('focus_point'):
            missing += 1
            print(f'  ⚠️ 仍缺失 [{name}][{i}] summary={bool(it.get("summary"))} focus={bool(it.get("focus_point"))}')
print(f'缺失总数: {missing}')
