L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Développement · SKILL.md

worldcup2026-parallel-universe

worldcup2026-parallel-universe

2026世界杯赛后平行宇宙叙事引擎 - 将比赛事实转化为诗意的微小说创作。 当用户想要:创建世界杯/足球相关的微小说叙事、基于比赛事件创作文学内容、使用三元组(entity, event_type, emotion_intensity)生成体育故事、制作世界杯主题的多模态内容(图文结合)时,必须使用此skill。 触发场景:用户提到"世界杯微小说"、"足球叙事"、"平行宇宙故事"、"绝杀进球故事"、"点球大战叙事"、"球员故事创作"等;用户提供(entity, event_type, emotion_intensity)三元组格式;用户想要将体育赛事转化为创意文学内容。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: worldcup2026-parallel-universe description: | 2026世界杯赛后平行宇宙叙事引擎 - 将比赛事实转化为诗意的微小说创作。

当用户想要:创建世界杯/足球相关的微小说叙事、基于比赛事件创作文学内容、使用三元组(entity, event_type, emotion_intensity)生成体育故事、制作世界杯主题的多模态内容(图文结合)时,必须使用此skill。

触发场景:用户提到"世界杯微小说"、"足球叙事"、"平行宇宙故事"、"绝杀进球故事"、"点球大战叙事"、"球员故事创作"等;用户提供(entity, event_type, emotion_intensity)三元组格式;用户想要将体育赛事转化为创意文学内容。

⚠️ 前置检查

执行本 Skill 前必须检查环境变量 AISTUDIO_API_KEY 是否已配置。

检查流程

Step 1: 检查 AISTUDIO_API_KEY 环境变量
   ↓
未配置 → Step 2: 引导用户获取并告知 API Key
   ↓
Step 3: 自动为用户配置 AISTUDIO_API_KEY
   ↓
已配置 → Step 4: 开始执行创作任务

未配置时的处理

如果 AISTUDIO_API_KEY 未配置或为空,必须停止执行并引导用户:

❌ API Key 未配置

本 Skill 需要百度星河社区 API Key 才能运行。

请按以下步骤操作:

  1. 访问 百度星河社区 注册账号
  2. 在个人中心获取 API Key
  3. 告知我您的 API Key,我将为您自动配置

注意:您无需在终端手动设置环境变量,直接告诉我 API Key 即可。

用户告知 API Key 后的处理

用户告知 API Key 后,自动为其配置环境变量:

export AISTUDIO_API_KEY="用户提供的key"

配置完成后确认:

✅ API Key 已配置成功,开始执行创作任务...


WorldCup 2026 Parallel Universe Agent (WP26_PUA)

三元组意图驱动 × 实时联网检索 × 深度创意写作 × 多模态长图渲染 赛后一小时内完成从事实到诗意的全链路自动化创作


核心理念

本Agent将世界杯比赛事件转化为"平行宇宙"式的文学叙事——基于真实赛况事实,但以诗意、文学化的方式重新诠释,创造出既有事实根基又富有艺术想象力的微小说作品。

关键原则:

  • 所有低置信度事实必须"模糊化"处理,确保叙事不会误导读者
  • 产出明确标注为"AI创意叙事,不构成新闻报道"
  • 尊重球员形象,禁止负面人身攻击

环境要求

API 配置

使用本 skill 需要百度星河社区 API Key。

获取 API Key:访问 百度星河社区 注册并获取 API Key

💡 提示:执行 Skill 时会自动检查 API Key,如未配置会引导您设置。

API 端点

配置项值
API Base URLhttps://aistudio.baidu.com/llm/lmapi/v3
创作模型ernie-5.0-thinking-preview(原生全模态大模型)
目标生图模型ernie-image-turbo(通过星河社区调用)
最大输出Token65536

API 调用示例 (OpenAI SDK)

文本生成 API:

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://aistudio.baidu.com/llm/lmapi/v3",
)

# 流式调用
chat_completion = client.chat.completions.create(
    model="ernie-5.0-thinking-preview",
    messages=[{"role": "user", "content": "你的问题"}],
    stream=True,
    extra_body={"web_search": {"enable": True}},
    max_completion_tokens=65536
)

for chunk in chat_completion:
    if not chunk.choices or len(chunk.choices) == 0:
        continue
    # 处理推理内容 (thinking)
    if hasattr(chunk.choices[0].delta, "reasoning_content") and chunk.choices[0].delta.reasoning_content:
        print(chunk.choices[0].delta.reasoning_content, end="", flush=True)
    else:
        print(chunk.choices[0].delta.content, end="", flush=True)

关键参数说明:

参数类型说明
modelstring模型名称:ernie-5.0-thinking-preview
messagesarray对话消息列表
streamboolean是否流式输出,推荐 true
extra_body.web_search.enableboolean是否启用联网搜索
max_completion_tokensinteger最大输出Token数,默认 65536

依赖

pip install openai

依赖 Skills

Skill用途
web-access执行联网检索,获取赛况事实和在地文化信息

三元组意图协议

所有请求必须包含三元组 (entity, event_type, emotion_intensity),这是驱动整条流水线的唯一入口契约。

字段类型说明示例
entitystring核心角色/球队/球员"梅西" / "巴西队" / "姆巴佩"
event_typestring赛事事件类型"绝杀进球" / "点球大战失利" / "退场红牌"
emotion_intensityinteger 0–10情绪强度,驱动叙事视角路由9

⚠️ 情绪方向判断(重要)

同一事件,不同视角的情绪方向完全相反。例如:

  • "姆巴佩帽子戏法" → 法国球迷(正向/喜悦)vs 对手球迷(负向/绝望)
  • "绝杀进球" → 进球方球迷(正向/狂喜)vs 被进球方球迷(负向/心碎)

判断流程:

  1. 用户明确说明视角 → 直接采用
  2. 用户未明确视角 → 必须询问用户站在哪一方视角
  3. 拆解三元组后 → 必须让用户确认情绪方向

情绪方向定义:

方向说明适用场景
positive正向情绪喜悦、胜利、庆祝、骄傲、感动
negative负向情绪悲伤、失落、遗憾、愤怒、绝望

常见事件的情绪方向参考:

事件类型正向视角(entity方)负向视角(对手方)
绝杀进球胜利狂欢心碎绝望
帽子戏法英雄礼赞无力回天
夺冠时刻巅峰荣耀遗憾落败
点球大战获胜惊险晋级梦碎十二码
红牌退场-(通常为负向)获得优势
小组赛出局-(负向)竞争对手淘汰

情绪强度路由规则:

emotion_intensity叙事视角文风
≥ 8第一人称热血内心独白,高密度感官意象
5–7伪纪实第三人称限知,新闻笔法夹叙事
< 5纯第三人称冷峻疏离感,白描,克制

10步执行工作流

模型调用总览

步骤模型说明
Step 1-9ernie-5.0-thinking-preview创作模型(原生全模态大模型)
Step 10ernie-image-turbo目标生图模型
┌──────────────────────────────────────────────────────────────┐
│  Phase 1 · 意图解构与契约锁定                                 │
│  Step 1 │ Intent_Parser    │ 解析三元组 → conflict_archetype  │
│  Step 2 │ Config_Manager   │ 锁定体裁契约 (300-500字微小说)     │
│         │ 📍 模型: ernie-5.0-thinking-preview                    │
└────────────────────────────┬─────────────────────────────────┘
                             ▼
┌──────────────────────────────────────────────────────────────┐
│  Phase 2 · 逻辑规划与实时搜索                                 │
│  Step 3 │ Logic_Planner    │ 路由叙事视角,配置 pacing_target  │
│         │ 📍 模型: ernie-5.0-thinking-preview                    │
│  Step 4 │ Web_Search       │ 双路检索:赛况事实 + 在地文化      │
│         │ 📍 使用 web-access skill                           │
└────────────────────────────┬─────────────────────────────────┘
                             ▼
┌──────────────────────────────────────────────────────────────┐
│  Phase 3 · 创意生产与多重审计                                 │
│  Step 5 │ Creative_Writer  │ 高质微小说创作 (300-500字)        │
│  Step 6 │ Safety_Guard     │ 合规审查 + 事实置信度核查          │
│  Step 7 │ Reflexion_Critic │ 自评闭环 (σ>0.3 触发局部重写)     │
│         │                  │ 上限3次 → 失败则熔断降级           │
│         │ 📍 模型: ernie-5.0-thinking-preview                    │
└────────────────────────────┬─────────────────────────────────┘
                             ▼
┌──────────────────────────────────────────────────────────────┐
│  Phase 4 · 审美映射与多模态交付                               │
│  Step 8 │ Aesthetic_Mapper │ 色彩/字体/间距映射 + CLIP校准     │
│  Step 9 │ LongImage_Renderer│ 生成图片提示词 (1:1 & 9:16)      │
│         │ 📍 模型: ernie-5.0-thinking-preview                    │
│  Step 10│ MultiModal_Publisher│ 调用生图API生成最终图片        │
│         │ 📍 模型: ernie-image-turbo (目标生图模型)           │
└──────────────────────────────────────────────────────────────┘

Phase 1: 意图解构与契约锁定

Step 1 — 意图深度解析 (Intent_Parser)

解析三元组,提取 conflict_archetype(叙事冲突原型)、psyche_mode(心理模式)与 emotion_direction(情绪方向)。

1.1 情绪方向判断

⚠️ 必须首先判断情绪方向

根据用户输入判断用户站在哪一方视角:

判断依据示例情绪方向
用户明确表达支持方"我们赢了!"、"法国队帽子戏法太牛了"正向
用户明确表达对立面"被绝杀了,心碎"、"我们的点球输了"负向
用户使用第一人称关联 entity"梅西的绝杀"(用户是梅西球迷)正向
用户未明确视角"姆巴佩帽子戏法写个故事"需询问

询问用户示例:

您提到「姆巴佩帽子戏法」,请问您是站在哪一方视角来创作?

  1. 法国队/姆巴佩球迷视角 → 正向情绪(英雄礼赞、胜利狂欢)
  2. 对手球队球迷视角 → 负向情绪(无力回天、绝望心碎)

请告诉我您的视角,我将为您创作相应的叙事。

1.2 冲突原型与心理模式提取

模型调用:ernie-5.0-thinking-preview

冲突原型类型(需结合情绪方向):

情绪方向正向冲突原型负向冲突原型
positivehero_rises(英雄崛起)-
positivelast_stand(最后一战·胜利)-
positiveunderdog_rises(黑马崛起)-
negative-hero_falls(英雄迟暮)
negative-bitter_betrayal(苦涩背叛)
negative-silent_defeat(无声落败)
双向silent_redemption(无声救赎)silent_redemption(无声救赎)

心理模式类型(需结合情绪方向):

情绪方向正向心理模式负向心理模式
positivevolcanic(火山爆发式)-
positivetriumphant(凯旋式)-
positivetranscendent(超然升华式)-
negative-melancholic(忧郁沉思式)
negative-numb(麻木疏离式)
negative-defiant(抗争不屈式)

1.3 用户确认

⚠️ 拆解三元组后,必须让用户确认

确认内容展示:

三元组拆解结果确认

字段值
核心角色姆巴佩
事件类型帽子戏法
情绪强度8
情绪方向正向(法国队球迷视角)
冲突原型hero_rises(英雄崛起)
心理模式volcanic(火山爆发式)

请确认以上拆解是否正确?

  • 确认 → 继续执行
  • 需要调整 → 请告诉我需要修改的内容

1.4 输出格式

{
  "entity": "球员/球队名",
  "event_type": "事件类型",
  "emotion_intensity": 0-10,
  "emotion_direction": "positive/negative",
  "conflict_archetype": "冲突原型",
  "psyche_mode": "心理模式",
  "user_perspective": "用户视角说明"
}

Step 2 — 体裁契约锁定 (Config_Manager)

确认输出契约:体裁为社媒微小说,篇幅300-500字,锁定叙事约束参数。

模型调用:ernie-5.0-thinking-preview

输出格式:

{
  "genre": "社媒微小说",
  "length_limit": {"min": 300, "max": 500},
  "pov_mode": "视角模式",
  "forbidden_patterns": ["禁止模式列表"],
  "tone_anchor": "英文基调描述短语"
}

禁止模式:

  • 政治敏感表述、可能引起争议的政治或宗教相关意象
  • 真实球员负面人身攻击
  • 未经证实的伤情细节
  • 低俗、违法或不符合公序良俗的内容
  • 近现代名人肖像(已确认出现在微小说正文中的球员除外)

Phase 2: 逻辑规划与实时搜索

Step 3 — 叙事逻辑规划 (Logic_Planner)

根据 pov_mode 配置叙事节奏目标 pacing_target,确定三幕结构分配。

模型调用:ernie-5.0-thinking-preview

节奏类型:

  • staccato - 断奏式(短促有力)
  • wave - 波浪式(起伏有致)
  • avalanche - 雪崩式(递进爆发)

输出格式:

{
  "act_1_words": 开篇字数,
  "act_2_words": 冲突字数,
  "act_3_words": 结局字数,
  "pacing_target": "节奏类型",
  "sensory_anchors": ["感官锚点1", "感官锚点2", "感官锚点3"],
  "emotion_score_series": [0.3, 0.5, 0.8, 1.0, 0.9]
}

Step 4 — 双路联网检索 (Web_Search)

重要:两路检索必须独立执行,保持事实溯源可追踪。

使用 web-access skill 执行检索

Query-A:赛况事实检索

搜索关键词:{年份}世界杯 {entity} {event_type} 赛况比分 场馆

需要获取:

  • match_score - 比分
  • minute_of_event - 事件发生分钟数
  • venue - 场馆名称
  • attendance - 观众人数
  • key_facts - 关键事实(最多5条)
  • confidence_scores - 每条事实的置信度(0.0-1.0)

Query-B:在地文化细节检索

搜索关键词:{年份}世界杯 举办城市 本地文化 球迷氛围 地标

需要获取:

  • city_name - 城市名
  • local_atmosphere - 本地氛围描述
  • cultural_symbols - 文化符号(3个)
  • crowd_chant_fragment - 球迷口号片段

Phase 3: 创意生产与多重审计

Step 5 — 微小说高质创作 (Creative_Writer)

将 Steps 1–4 所有输出作为上下文,生成 ≤300 字微小说正文。

模型调用:ernie-5.0-thinking-preview

创作规则:

  1. 严格控制在300-500字
  2. 精确遵循 pov_mode 视角
  3. 必须体现 emotion_direction(正向/负向情绪)
  4. 至少嵌入2个 sensory_anchors
  5. confidence_score < 0.6 的事实必须模糊化处理
  6. 遵守三幕字数分配
  7. 绝不使用 forbidden_patterns
  8. 严禁使用以下内容:
    • 可能引起争议的政治、宗教相关意象
    • 低俗、违法或不符合公序良俗的内容
    • 近现代名人肖像(三元组中确认的球员除外)

微小说高质方法论

创作时必须遵循以下8项高质标准,确保微小说品质:

1. 叙事创新性

  • 在经典叙事模式下有新颖变量或独特视角
  • 避免套路化表达,如"他是传奇"等空洞描述
  • 正向示例:"这不是一个进球——这是一个时代的加冕"(将进球升华为时代符号)
  • 负向示例:"他踢进了一个漂亮的球,大家都为他欢呼"(平淡无奇)

2. 剧情紧凑度

  • 无冗余铺垫,每句话都推动叙事
  • 起承转合完整:开篇抛出钩子 → 冲突直接爆发 → 无断层推进 → 结尾留余韵
  • 正向示例:开篇即入高潮情境,结尾留有回味的金句
  • 负向示例:大段背景介绍,结尾仓促收场

3. 核心主题明确

  • 主题清晰(如:英雄迟暮、绝地反击、悲情救赎、荣耀加冕等)
  • 情感内核有共鸣点,传递普世价值
  • 正向示例:39岁最后一战 → 主题"传奇的完整句号"
  • 负向示例:只有事件描述,没有情感内核

4. 情感浓度

  • 有精心设计的情感爆发点
  • 情绪张弛有度,非单一情绪曲线
  • 正向示例:从紧张 → 爆发 → 释放 → 余韵,情绪有层次
  • 负向示例:全篇同一种情绪,无起伏

5. 悬念与张力

  • 开篇设置悬念钩子或结尾留有反转
  • 冲突合乎逻辑,真实自然
  • 正向示例:"我听见自己的心跳"(制造紧张感)→ 结尾"这是活着的味道"(反转升华)
  • 负向示例:平铺直叙,无悬念设计

6. 人物辨识度

  • 核心人物性格鲜明,无模糊感
  • 人物行为符合人设和现实常理
  • 正向示例:通过细节动作展现人物("跪倒在草地上"展现疲惫与释然)
  • 负向示例:人物行为突兀,为推进剧情而降智

7. 语言精炼度

  • 台词/叙述直白精炼,冲击力强
  • 无冗余长句、无过度形容词
  • 有"金句"潜质的句子,利于传播
  • 正向示例:"十二码的距离,却隔着整整一个时代"(精炼有张力)
  • 负向示例:"这是一个非常非常重要的时刻,他的心情非常复杂..."(冗余无力)

8. 真实感与共情

  • 对话/叙述真实自然,符合人物身份
  • 能触发读者共通情绪,产生"他/她就是我"的代入感
  • 正向示例:"眼泪流进嘴里。咸的。"(感官细节触发共情)
  • 负向示例:生硬说教、脱离现实的台词

情绪方向创作指南:

情绪方向叙事基调感官锚点示例关键词
positive(正向)胜利、喜悦、荣耀、骄傲金色光芒、欢呼声、香槟味道狂喜、巅峰、永恒、传奇
negative(负向)失落、遗憾、悲壮、心碎雨滴、沉默、灰色天空沉默、离别、最后一眼、遗憾

正向情绪示例:

"金色雨从天而降,我听见九万人的咆哮化成一首歌。这不是一个进球——这是一个时代的加冕..."

负向情绪示例:

"雨还在下。我听见自己的心跳,和看台上那片沉默融为一体。十二码的距离,却隔着整整一个时代..."

事实模糊化规则:

confidence_score处理方式示例转换
≥ 0.80直接使用"第89分钟"
0.60–0.79轻度模糊"比赛尾声"
< 0.60强制虚化"某个注定的瞬间"

输出格式:

{
  "novel_text": "微小说正文",
  "word_count": 字数,
  "sensory_anchors_used": ["使用的感官锚点"],
  "fuzzified_facts": ["模糊化处理的事实"],
  "quality_checklist": {
    "narrative_innovation": true/false,
    "plot_compactness": true/false,
    "theme_clarity": true/false,
    "emotional_intensity": true/false,
    "suspension_tension": true/false,
    "character_distinctiveness": true/false,
    "language_precision": true/false,
    "empathy_realism": true/false
  }
}

Step 6 — 安全与置信度审计 (Safety_Guard)

并行执行内容合规审查与事实置信度核查。

模型调用:ernie-5.0-thinking-preview

审计维度:

  • compliance_pass - 合规是否通过
  • forbidden_content_check - 禁止内容检查(政治/宗教争议意象、低俗违法内容、近现代名人肖像)
  • fact_confidence_pass - 事实置信度是否通过
  • overall_pass - 整体是否通过

输出格式:

{
  "compliance_pass": true/false,
  "compliance_issues": ["问题列表"],
  "forbidden_content_check": true/false,
  "forbidden_content_found": ["发现的禁止内容"],
  "fact_confidence_pass": true/false,
  "unfuzzified_risks": ["未模糊化风险"],
  "overall_pass": true/false,
  "audit_note": "审计摘要"
}

Step 7 — Reflexion 闭环自评 (Reflexion_Critic)

对小说进行多维自评,任一核心维度不通过则回流 Step 5。

模型调用:ernie-5.0-thinking-preview

硬性门槛(必须通过,不纳入评分):

  • 字数达标:300-500字,不通过则调整后回流

高质方法论校验维度(按重要性权重):

维度权重评分标准不通过处理
叙事创新性15%是否有新颖变量或独特视角,避免套路化提示创新方向后回流
剧情紧凑度20%是否无冗余铺垫,起承转合完整删减冗余后回流
核心主题明确15%主题是否清晰,情感内核是否有共鸣明确主题后回流
情感层次15%情绪弧线是否完整,情感浓度是否足够,有无层次起伏调整情绪曲线后回流
悬念与张力10%开篇/结尾是否有悬念设计,冲突是否合乎逻辑增加悬念钩子后回流
人物一致性15%人物性格是否鲜明,行为是否符合人设,无突兀反转调整人物细节后回流
语言精炼度5%是否有金句,是否无冗余长句精简语言后回流
真实感与共情5%是否真实自然,能否触发共情增加感官细节后回流

高质评分计算:

quality_score = Σ (维度评分 × 权重)
  • quality_score ≥ 0.75 → 通过
  • 0.60 ≤ quality_score < 0.75 → 需改进后回流
  • quality_score < 0.60 → 熔断,标记 quality_status: "degraded"

熔断规则:最多重试3次,超限则标记 quality_status: "degraded" 直通 Step 8。

输出格式:

{
  "word_count_ok": true/false,
  "quality_score": 0.0-1.0,
  "quality_breakdown": {
    "narrative_innovation": 0.0-1.0,
    "plot_compactness": 0.0-1.0,
    "theme_clarity": 0.0-1.0,
    "emotional_depth": 0.0-1.0,
    "suspension_tension": 0.0-1.0,
    "character_consistency": 0.0-1.0,
    "language_precision": 0.0-1.0,
    "empathy_realism": 0.0-1.0
  },
  "overall_pass": true/false,
  "rewrite_instructions": "重写指令或null",
  "iteration": 当前迭代次数
}

Phase 4: 审美映射与多模态交付

Step 8 — 视觉参数计算 (Aesthetic_Mapper)

将情绪评分序列映射为色彩、字体、间距参数。

模型调用:ernie-5.0-thinking-preview

输出格式:

{
  "dominant_color_hex": "#主色调",
  "secondary_color_hex": "#辅助色",
  "font_weight": "light/regular/bold/heavy",
  "line_spacing_multiplier": 1.0-2.0,
  "landscape_base": "英文视觉背景描述",
  "clip_cosine_score": 0.0-1.0,
  "recalibration_note": "校准说明或null"
}

CLIP校准:cos θ < 0.72 时必须输出 recalibration_note 并重新映射。

Step 9 — 长图渲染 (LongImage_Renderer)

生成双版面图片提示词,用于后续调用生图API。

模型调用:ernie-5.0-thinking-preview(生成图片提示词)

重要提示:

  • ernie-image-turbo 对中文理解能力更强,所有图片提示词必须使用中文撰写
  • 图片必须能体现出核心事件(如"绝杀进球"、"点球大战失利"、"帽子戏法"等),通过视觉元素传达事件性质
  • ⚠️ 文生图模型无法精确渲染文字,微小说原文文字将在 Step 10 通过代码叠加到图片上

参考文档:撰写提示词时请参考 image_prompt_guide.md,确保提示词清晰、优质、符合文生图最佳实践。

图片高质方法论

生成图片提示词时必须遵循以下6项高质标准:

1. 场景辨识度

  • 每个核心场景具备独特的视觉基调,能让观众在3秒内识别场景功能
  • 场景布局打破陈规,在常规场景中加入具有设计感的视觉锚点
  • 正向示例:深紫色渐变背景+金色光芒洒落(独特视觉基调)
  • 负向示例:普通体育场照片(缺乏辨识度)

2. 场景叙事功能

  • 场景设计不仅是背景,需具备推动叙事的功能或暗示人物处境
  • 通过空间结构传达情绪氛围
  • 正向示例:空旷球门+孤独背影暗示失利与孤独
  • 负向示例:场景与事件/情绪无关联

3. 视觉构图简洁

  • 画面构图简洁有力,剔除干扰剧情表达的冗余元素
  • 核心信息始终处于视觉焦点
  • 正向示例:画面中央呈现球员剪影,背景虚化
  • 负向示例:画面元素过多,视觉焦点分散

4. 情绪色彩统一

  • 全图色调风格保持高度统一,通过色相传达情感倾向
  • 主色调与情绪方向匹配(正向→暖色/金色,负向→冷色/灰暗)
  • 正向示例:正向情绪用深红/金色,负向情绪用灰蓝/银白
  • 负向示例:色彩与情绪方向冲突

5. 视觉钩子设计

  • 图片具有冲击力的视觉元素,形成强烈的视觉留存
  • 包含利于传播的"高光时刻"或名场面
  • 正向示例:金色光芒喷涌、球员剪影双臂张开
  • 负向示例:平淡无奇,无记忆点

6. 光影层次丰富

  • 利用明暗对比塑造氛围或烘托情绪
  • 关键区域光影设计合理,增强画面张力
  • 正向示例:聚光灯效果突出主体,背景渐暗
  • 负向示例:画面平面化,无光影层次

核心事件与情绪方向视觉化

图片必须体现三元组中的 event_type 和 emotion_direction,通过视觉元素传达事件性质和情绪方向:

正向情绪(positive)视觉元素:

核心事件视觉元素色彩基调
绝杀进球(进球方)球员剪影、金色光芒、胜利姿态、欢腾人群深红/金色
帽子戏法(进球方)三颗足球、庆祝动作、聚光灯、金色数字"3"深紫/金色
夺冠时刻举起奖杯、金色雨、国旗飘扬、烟火金色/翠绿
点球大战获胜拥抱庆祝、晋级横幅、惊险逃生后的狂喜蓝色/金色

负向情绪(negative)视觉元素:

核心事件视觉元素色彩基调
绝杀进球(被进球方)孤独背影、沉默的球场、黯淡灯光灰蓝/暗色
帽子戏法(对手方)无力回天、空旷球门、绝望眼神灰色/暗紫
点球大战失利孤独背影、空旷球门、雨滴、点球点灰蓝/银白
红牌退场红色卡片、离场背影、孤独通道灰色/暗红
小组赛出局低头沉默、更衣室背影、空荡球场灰蓝/暗色

⚠️ 重要:同一事件根据 emotion_direction 选择完全不同的视觉元素和色彩基调。

1:1 方图 (1024×1024)

  • 社媒方图,朋友圈/Instagram
  • 必须体现核心事件(通过主体意象、视觉元素)
  • 背景纹理与核心事件呼应,传达情绪氛围
  • 纯视觉呈现,无文字

9:16 竖版长图 (1024×1820)

  • 微博/小红书/Story
  • 生成纯背景图片,为后续文字叠加预留空间
  • 背景需体现核心事件(通过视觉元素暗示事件性质)
  • 背景设计要求:
    • 顶部留有适当空间(便于叠加标题)
    • 中央区域相对简洁(便于叠加正文)
    • 底部保留空间标注元数据
    • 整体色调与文字形成对比(确保叠加后文字清晰可读)

图片生成提示词结构(中文):

方图提示词:

一张方形海报,
[主色调]渐变背景,[辅助色]光晕点缀,
画面中央呈现[核心事件的视觉表现],
[背景描述],
[风格关键词],[情绪关键词],[核心事件关键词],
高清,编辑品质,2026年世界杯主题

长图提示词(纯背景,不含文字):

一张竖版长图海报,
[主色调]背景,[辅助色]点缀,
画面呈现[核心事件的视觉表现]作为背景,
顶部和中央区域留有简洁空间,
[背景描述]作为微妙的纹理,
[风格关键词],[情绪关键词],[核心事件关键词],
高清,编辑品质,2026年世界杯主题

提示词撰写要点:

  1. 核心事件视觉化:必须包含能体现事件性质的视觉元素
  2. 明确描述画面主体和背景
  3. 指定色彩基调(主色、辅助色)
  4. 情绪关键词(如"热血"、"诗意"、"疏离")
  5. 风格关键词(如"极简"、"editorial"、"电影感")
  6. 长图不要求嵌入文字,文字将在 Step 10 通过代码叠加
  7. 严禁使用以下内容:
    • 可能引起争议的政治、宗教相关意象
    • 低俗、违法或不符合公序良俗的内容
    • 近现代名人肖像(三元组中确认的球员除外)

Step 10 — 最终多模态交付 (MultiModal_Publisher)

聚合所有步骤输出,调用生图API生成图片,叠加微小说文字和免责声明,组装结构化交付包。

⚠️ 执行流程(必须按顺序完成):

Step 10.1: 生成方图 (1:1) 和长图 (9:16) ─────────→ 获取 image_1x1_url 和 image_9x16_url
                    │
                    ▼
Step 10.1.1: ⚠️ 用户确认与反馈循环 ─────────────────→ 用户满意后继续
                    │
                    ▼
Step 10.2.1: 为方图叠加免责声明 ──────────────────→ 获取 image_1x1_final_path
                    │
                    ▼
Step 10.2.2: 为长图叠加微小说文字 + 免责声明 ──────→ 获取 image_9x16_final_path
                    │
                    ▼
Step 10.3: 组装最终输出 ─────────────────────────→ 返回完整 JSON

⚠️ 关键提醒:

  • Step 10.1.1 不可跳过:图片生成后必须让用户确认满意度,不满意则重新生成
  • Step 10.2 不可跳过:所有图片必须叠加免责声明,长图还需叠加微小说文字
  • 免责声明:所有图片底部居中必须注明"AI创意叙事,不构成新闻报道"
  • 文字颜色必须正确:根据 Step 8 的 dominant_color_hex 自动判断使用白色或黑色文字
  • 验证输出:确认最终图片文件存在且文字清晰可读

10.1 图片生成

模型调用:ernie-image-turbo(目标生图模型)

API 调用方式 (OpenAI SDK):

import base64
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://aistudio.baidu.com/llm/lmapi/v3",
)

response = client.images.generate(
    model="ernie-image-turbo",
    prompt="图片描述提示词",
    n=1,
    response_format="url",  # 或 "b64_json"
    size="1024x1024",
    extra_body={
        "seed": 42,
        "use_pe": True,
        "num_inference_steps": 8,
        "guidance_scale": 1.0
    }
)

# 获取图片 URL
image_url = response.data[0].url

10.1.1 用户确认与反馈循环 ⚠️ 必须执行

⚠️ 此步骤不可跳过!图片生成后必须让用户确认满意度。

图片生成完成后,必须向用户展示生成的图片并收集反馈。

执行流程:

Step 1: 展示生成的图片给用户
        ↓
Step 2: 询问用户满意度
        ↓
Step 3a: 用户满意 → 继续执行 Step 10.2
        ↓
Step 3b: 用户不满意 → 收集反馈意见 → 重新生成图片
        ↓
        重试(最多3次,超限提示用户)

用户确认询问模板:

图片已生成完成!

请查看上方图片,您对生成的效果满意吗?

  1. 满意 → 我将继续完成后续步骤(叠加文字、组装最终输出)
  2. 不满意 → 请告诉我您希望调整的地方(如:色彩、构图、氛围、风格等),我将重新生成

请回复您的选择或反馈意见。

反馈处理流程:

用户反馈类型处理方式
用户回复"满意"/"可以"/"继续"等肯定词继续执行 Step 10.2
用户回复具体修改意见收集反馈,调整 Step 9 的图片提示词,重新调用 Step 10.1
用户回复"不满意"但无具体意见询问具体调整方向(色彩/构图/氛围/风格)

重试规则:

  • 最多重试3次图片生成
  • 每次重试需根据用户反馈调整提示词
  • 超过3次仍不满意 → 提示用户:"已达到最大重试次数(3次),建议您接受当前效果或稍后重新开始创作。"

⚠️ 禁止行为:

  • 禁止在用户未确认满意的情况下直接跳到 Step 10.2
  • 禁止假设用户满意而不询问

10.2 图片后处理:叠加免责声明 + 长图文字叠加 ⚠️ 必须执行

⚠️ 此步骤不可遗漏!所有图片必须叠加免责声明,长图还需叠加微小说文字。

文生图模型无法精确渲染文字,需通过代码在生成的图片上叠加内容。

执行顺序:

Step 10.2.1: 为方图 (1:1) 叠加免责声明
        ↓
Step 10.2.2: 为长图 (9:16) 叠加微小说文字 + 免责声明
        ↓
Step 10.3: 组装最终输出

免责声明要求:

  • 内容:"AI创意叙事,不构成新闻报道"
  • 位置:底部居中
  • 样式:小字号(12px),半透明灰色,不干扰主视觉
  • 适用范围:所有生成的图片(方图和长图)

执行检查清单(执行前必须确认):

  • 已获取方图和长图的背景图片 URL
  • 已准备好微小说原文(novel_text)
  • 已确定背景主色调(来自 Step 8 的 dominant_color_hex)
  • 已选择与背景形成高对比的文字颜色

文字颜色选择规则(根据背景色调自动判断):

背景主色调文字颜色RGB 值判断逻辑
深色(深红、深紫、深蓝、灰蓝等)白色(255, 255, 255)背景亮度 < 128
浅色(白、淡黄、淡蓝等)黑色(0, 0, 0)背景亮度 ≥ 128
不确定时白色带描边白色文字 + 黑色描边确保可读性

完整代码示例(直接执行):

from PIL import Image, ImageDraw, ImageFont
import requests
from io import BytesIO
import textwrap

DISCLAIMER_TEXT = "AI创意叙事,不构成新闻报道"

def calculate_brightness(hex_color: str) -> float:
    """计算颜色亮度(0-255)"""
    hex_color = hex_color.lstrip('#')
    r, g, b = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
    return (r * 299 + g * 587 + b * 114) / 1000

def get_font(font_size: int) -> ImageFont:
    """获取可用的中文字体"""
    font_paths = [
        "/System/Library/Fonts/PingFang.ttc",  # macOS
        "/System/Library/Fonts/STHeiti Light.ttc",  # macOS 备选
        "/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc",  # Linux
        "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",  # Linux 备选
        "/Windows/Fonts/msyh.ttc",  # Windows 微软雅黑
        "NotoSansSC-Regular.otf",  # 当前目录
    ]
    for font_path in font_paths:
        try:
            return ImageFont.truetype(font_path, font_size)
        except:
            continue
    return ImageFont.load_default()

def add_disclaimer(img: Image.Image, brightness: float) -> Image.Image:
    """
    在图片底部居中添加免责声明

    Args:
        img: PIL Image 对象
        brightness: 背景亮度值

    Returns:
        添加了免责声明的图片
    """
    draw = ImageDraw.Draw(img)
    width, height = img.size

    # 免责声明样式:小字号,半透明灰色,不干扰主视觉
    disclaimer_font_size = 12
    disclaimer_font = get_font(disclaimer_font_size)

    # 根据背景亮度选择免责声明颜色(灰色系,半透明效果)
    if brightness < 128:
        disclaimer_color = (180, 180, 180, 200)  # 浅灰色(深色背景用)
    else:
        disclaimer_color = (100, 100, 100, 200)  # 深灰色(浅色背景用)

    # 计算免责声明位置(底部居中,距底部20px)
    bbox = draw.textbbox((0, 0), DISCLAIMER_TEXT, font=disclaimer_font)
    text_width = bbox[2] - bbox[0]
    x = (width - text_width) // 2
    y = height - 35  # 距底部35px,留出一定边距

    # 绘制免责声明
    draw.text((x, y), DISCLAIMER_TEXT, font=disclaimer_font, fill=disclaimer_color[:3])

    return img

def process_square_image(
    image_url: str,
    dominant_color_hex: str,
    output_path: str = "/tmp/final_1x1.png"
) -> str:
    """
    为方图叠加免责声明

    Args:
        image_url: 生成的方图URL
        dominant_color_hex: 背景主色调(来自Step 8,如 "#1a1a2e")
        output_path: 输出图片路径

    Returns:
        输出图片路径
    """
    # 下载图片
    response = requests.get(image_url)
    img = Image.open(BytesIO(response.content))

    # 计算背景亮度
    brightness = calculate_brightness(dominant_color_hex)

    # 添加免责声明
    img = add_disclaimer(img, brightness)

    # 保存结果
    img.save(output_path)
    print(f"✅ 方图免责声明叠加完成: {output_path}")

    return output_path

def overlay_text_on_image(
    image_url: str,
    novel_text: str,
    dominant_color_hex: str,
    output_path: str = "/tmp/final_9x16.png"
) -> str:
    """
    在生成的长图上叠加微小说文字 + 免责声明

    ⚠️ 此函数必须执行,不可跳过

    Args:
        image_url: 生成的背景图片URL
        novel_text: 微小说原文(300-500字)
        dominant_color_hex: 背景主色调(来自Step 8,如 "#1a1a2e")
        output_path: 输出图片路径

    Returns:
        输出图片路径
    """
    # 1. 下载背景图片
    response = requests.get(image_url)
    img = Image.open(BytesIO(response.content))
    draw = ImageDraw.Draw(img)

    # 2. 根据背景亮度自动选择文字颜色
    brightness = calculate_brightness(dominant_color_hex)
    text_color = (255, 255, 255) if brightness < 128 else (0, 0, 0)

    # 3. 字体设置
    font_size = 24
    line_height = int(font_size * 1.8)  # 行间距
    margin = 50

    font = get_font(font_size)

    # 4. 自动换行处理(每行约25个中文字符)
    chars_per_line = 25
    lines = textwrap.wrap(novel_text, width=chars_per_line)

    # 5. 绘制微小说文字
    y_position = margin
    for line in lines:
        draw.text((margin, y_position), line, font=font, fill=text_color)
        y_position += line_height

    # 6. 叠加免责声明(底部居中)
    img = add_disclaimer(img, brightness)

    # 7. 保存结果
    img.save(output_path)
    print(f"✅ 长图文字叠加完成,已保存至: {output_path}")
    print(f"   - 背景亮度: {brightness:.1f}")
    print(f"   - 微小说文字颜色: {'白色' if text_color == (255, 255, 255) else '黑色'}")
    print(f"   - 总行数: {len(lines)}")
    print(f"   - 免责声明: 已叠加")

    return output_path

# ========== 执行示例 ==========

# 方图处理(仅叠加免责声明)
# final_1x1_path = process_square_image(
#     image_url="方图URL",
#     dominant_color_hex="#1a1a2e"  # 来自 Step 8
# )

# 长图处理(叠加微小说文字 + 免责声明)
# final_9x16_path = overlay_text_on_image(
#     image_url="长图URL",
#     novel_text="微小说正文...",
#     dominant_color_hex="#1a1a2e"  # 来自 Step 8
# )

执行后验证:

  • 方图已叠加免责声明(底部居中,清晰可见)
  • 长图已叠加微小说文字(清晰可读)
  • 长图已叠加免责声明(底部居中,清晰可见)
  • 文字颜色与背景形成足够对比
  • 排版整齐,无文字溢出
  • 免责声明不影响主视觉美观度

常见问题修复:

问题原因解决方案
文字不可见颜色与背景相近切换文字颜色(白↔黑)或添加描边
文字溢出字号过大或行数过多减小字号至 20px 或增加每行字符数
字体缺失系统无指定字体使用上述代码中的字体路径列表
排版混乱未正确换行使用 textwrap.wrap() 确保自动换行
免责声明不清晰颜色对比不足调整免责声明颜色为更明显的灰色

文字叠加参数标准值:

参数标准值说明
微小说字体思源黑体 / PingFang SC清晰易读的中文字体
微小说字号24px300-500字篇幅最佳
行间距1.8倍字号阅读舒适
微小说文字颜色自动判断根据背景亮度选择白/黑
边距50px四周留白
每行字符25个中文字确保排版整齐
免责声明字号12px小字号,不干扰主视觉
免责声明颜色半透明灰色根据背景亮度调整深浅
免责声明位置底部居中距底部35px

10.3 最终输出

⚠️ 输出前必须确认:

  • 方图(1:1)已叠加免责声明(底部居中)
  • 长图(9:16)已叠加微小说文字 + 免责声明
  • 文字叠加文件路径已记录
  • 免责声明清晰可见且不影响主视觉美观度

最终输出格式:

{
  "novel_text": "微小说正文",
  "word_count": 字数,
  "image_1x1_url": "方图原始URL",
  "image_1x1_final_path": "方图最终路径(已叠加免责声明,如 /tmp/final_1x1.png)",
  "image_9x16_url": "长图背景URL(生成原始图)",
  "image_9x16_final_path": "长图最终路径(已叠加文字+免责声明,如 /tmp/final_9x16.png)",
  "text_overlay_completed": true,
  "disclaimer_added": true,
  "text_color_used": "white/black",
  "provenance_metadata": {
    "match_source": "事实来源",
    "retrieval_timestamp": "检索时间戳",
    "confidence_summary": "置信度摘要"
  },
  "quality_status": "passed/degraded",
  "disclaimer": "AI创意叙事,不构成新闻报道"
}

或保存 base64 图片

if hasattr(response.data[0], 'b64_json') and response.data[0].b64_json: image_bytes = base64.b64decode(response.data[0].b64_json) with open("output.png", "wb") as f: f.write(image_bytes)


**图片生成参数说明**:

| 参数 | 类型 | 说明 | 推荐值 |
|------|------|------|--------|
| `model` | string | 模型名称 | `ernie-image-turbo` |
| `prompt` | string | 图片描述提示词 | 来自 Step 9 的提示词 |
| `n` | integer | 生成图片数量 (1-4) | `1` |
| `response_format` | string | 返回格式 | `url` 或 `b64_json` |
| `size` | string | 图片尺寸 | 见下方支持列表 |
| `seed` | integer | 随机种子 | `42` |
| `use_pe` | boolean | 使用 Prompt Enhancement | `true` |
| `num_inference_steps` | integer | 推理步数 | `8` |
| `guidance_scale` | float | 引导系数 | `1.0` |

**支持的图片尺寸**:
- `1024x1024` - 方图 (1:1)
- `1376x768` - 横版 (16:9)
- `1264x848` - 横版 (3:2)
- `1200x896` - 横版 (4:3)
- `896x1200` - 竖版 (3:4)
- `848x1264` - 竖版 (2:3)
- `768x1376` - 竖版 (9:16)
- `1024x1820` - 长图 (9:16)

**最终输出格式**:
```json
{
  "novel_text": "微小说正文",
  "word_count": 字数,
  "image_1x1_url_or_base64": "方图URL或Base64",
  "image_9x16_url_or_base64": "长图URL或Base64",
  "provenance_metadata": {
    "match_source": "事实来源",
    "retrieval_timestamp": "检索时间戳",
    "confidence_summary": "置信度摘要"
  },
  "quality_status": "passed/degraded",
  "pipeline_summary": {
    "persona_drift_sigma": 值,
    "emotion_arc_fit": 值,
    "audit_pass": true/false,
    "total_iterations": 迭代次数
  }
}

质量控制机制

Reflexion 闭环

评估维度阈值不通过处理
人设漂移 σ≤ 0.30变异 tone_anchor 参数后回流 Step 5
情绪弧线拟合度≥ 0.70调整三幕字数分配后回流 Step 5
字数达标300-500字调整字数后回流 Step 5
最大重试次数3次超限触发熔断,quality_status: "degraded"

错误处理

HTTP状态码含义处理策略
401API Key 无效中止,提示检查密钥
429限流指数退避重试:1s → 4s → 16s,最多3次
5xx服务端错误指数退避重试3次,失败后降级

输出规范

产物规格用途
微小说正文300-500字中文社媒文案
1:1 方图1024×1024朋友圈 / Instagram
9:16 竖版长图1024×1820微博 / 小红书 / Story
溯源元数据JSON内容审核 / 存档
质量状态标记passed / degraded发布决策参考

使用示例

用户输入:

为梅西在2026世界杯的绝杀进球写一个平行宇宙故事,情绪强度9

三元组解析:

{
  "entity": "梅西",
  "event_type": "绝杀进球",
  "emotion_intensity": 9
}

执行流程:

  1. 解析三元组 → conflict_archetype: silent_redemption, psyche_mode: transcendent
  2. 锁定契约 → pov_mode: 第一人称热血, tone_anchor: breathless, luminous, time-suspended
  3. 规划叙事 → pacing_target: avalanche, 三幕结构 80/140/80 字
  4. 联网检索 → 获取赛况事实 + 达拉斯在地文化
  5. 创作微小说 → 嵌入感官锚点,模糊低置信事实
  6. 安全审计 → 合规检查 + 事实置信度核查
  7. Reflexion自评 → σ=0.18, arc_fit=0.91, 通过
  8. 视觉映射 → 深紫主色调 + 金色点缀
  9. 长图渲染 → 生成方图 + 竖版长图
  10. 交付成品 → 文本 + 图片 + 元数据

注意事项

  1. 事实模糊化:所有 confidence < 0.6 的事实必须虚化处理,确保输出为"有据可依的平行宇宙叙事"
  2. 合规底线:禁止政治敏感、人身攻击内容
  3. 免责声明:所有生成内容需标注"AI创意叙事,不构成新闻报道"
  4. API依赖:需要配置 AISTUDIO_API_KEY 环境变量
  5. 联网检索:使用 web-access skill 执行网络搜索操作

本工具仅供创意写作与体育人文传播用途。 所有生成内容均为 AI 创意叙事,不构成新闻报道,请勿作为事实依据传播。

Skills enregistrées