GitHub 每日热门开源信息图 Skill 你是一个"GitHub 热门开源情报编辑 + 信息图策划师"。 目标:抓取 GitHub Trending 当前榜单的 Top 5 开源项目,把摘要字段先翻译成中文,再生成简洁的中文简报与可直接给 Wan 2.7 使用的海报 Prompt。支持 10 种视觉风格 ,采用 3 步引导式工作流 。 --- 专家思维框架 在每个步骤开始前,先问自己: - 用户真正要什么? 用户说"帮我看看今天热门项目"可能只要简报,不要图片。不要预设用户需要生图。 - 数据是否可信? 抓取结果是实时快照,不代表某个固定时间点。如果抓取时间与用户指定日期有偏差,必须主动说明。 - 信息密度对吗? 每次生成 prompt 后,想象这些文字渲染到一张 3:4 海报上——如果你自己都觉得读不完,就是太密了。 --- NEVER - NEVER 在用户未明确确认前直接执行 Wan 生图 Why : Wan 2.7 调用消耗 API 额度且不可撤销,用户可能只需要内容或 Prompt 而非最终图片 - NEVER 把"当前 Trending 榜单"说成"指定历史日期的真实榜单" Why : 抓取脚本只能获取当前实时榜单,无法回溯历史数据;错误声称会误导用户对数据时效性的判断 - NEVER 将 README 长段落原样塞进最终 prompt;必须使用脚本产出的摘要结果…

\n match = re.match(direct_pattern, input_str)\n if match:\n width = int(match.group(1))\n height = int(match.group(2))\n \n if not (768*768 \u003c= width * height \u003c= 2048*2048):\n raise ValueError(f\"Total pixel count must be within the range [768*768, 2048*2048], i.e., [{768*768}, {2048*2048}]. Current: {width}*{height}: {width*height}\")\n \n aspect_ratio = width / height\n if not (1/8 \u003c= aspect_ratio \u003c= 8):\n raise ValueError(f\"Aspect ratio must be within the range [1:8, 8:1]. Current: {aspect_ratio:.2f}\")\n \n return f\"{width}*{height}\"\n \n # Mode 2: K + aspect ratio (e.g., \"2K 3:4\", \"1K 16:9\")\n k_ratio_pattern = r'^([124])k\\s*(\\d+):(\\d+)

GitHub 每日热门开源信息图 Skill 你是一个"GitHub 热门开源情报编辑 + 信息图策划师"。 目标:抓取 GitHub Trending 当前榜单的 Top 5 开源项目,把摘要字段先翻译成中文,再生成简洁的中文简报与可直接给 Wan 2.7 使用的海报 Prompt。支持 10 种视觉风格 ,采用 3 步引导式工作流 。 --- 专家思维框架 在每个步骤开始前,先问自己: - 用户真正要什么? 用户说"帮我看看今天热门项目"可能只要简报,不要图片。不要预设用户需要生图。 - 数据是否可信? 抓取结果是实时快照,不代表某个固定时间点。如果抓取时间与用户指定日期有偏差,必须主动说明。 - 信息密度对吗? 每次生成 prompt 后,想象这些文字渲染到一张 3:4 海报上——如果你自己都觉得读不完,就是太密了。 --- NEVER - NEVER 在用户未明确确认前直接执行 Wan 生图 Why : Wan 2.7 调用消耗 API 额度且不可撤销,用户可能只需要内容或 Prompt 而非最终图片 - NEVER 把"当前 Trending 榜单"说成"指定历史日期的真实榜单" Why : 抓取脚本只能获取当前实时榜单,无法回溯历史数据;错误声称会误导用户对数据时效性的判断 - NEVER 将 README 长段落原样塞进最终 prompt;必须使用脚本产出的摘要结果…

\n match = re.match(k_ratio_pattern, input_str)\n if match:\n k_value = int(match.group(1))\n ratio_w = int(match.group(2))\n ratio_h = int(match.group(3))\n \n \n total_pixels = min(max((k_value * 1024) ** 2, 1024*1024), 2048*2048)\n base_unit = (total_pixels / (ratio_w * ratio_h)) ** 0.5\n width = int(round(base_unit * ratio_w))\n height = int(round(base_unit * ratio_h))\n\n # Ensure it is even (required by some models)\n width = width if width % 2 == 0 else width - 1\n height = height if height % 2 == 0 else height - 1\n\n if not (768*768 \u003c= width * height \u003c= 2048*2048):\n raise ValueError(f\"Total pixel count must be within the range [768*768, 2048*2048], i.e., [{768*768}, {2048*2048}]. Calculated resolution is out of range: {width}*{height}: {width*height}\")\n \n aspect_ratio = width / height\n if not (1/8 \u003c= aspect_ratio \u003c= 8):\n raise ValueError(f\"Aspect ratio must be within the range [1:8, 8:1]. Current: {aspect_ratio:.2f}\")\n \n return f\"{width}*{height}\"\n \n # Mode 3: K value only (e.g., \"1K\", \"2K\"), defaulting to a 1:1 aspect ratio\n k_only_pattern = r'^([12])k

GitHub 每日热门开源信息图 Skill 你是一个"GitHub 热门开源情报编辑 + 信息图策划师"。 目标:抓取 GitHub Trending 当前榜单的 Top 5 开源项目,把摘要字段先翻译成中文,再生成简洁的中文简报与可直接给 Wan 2.7 使用的海报 Prompt。支持 10 种视觉风格 ,采用 3 步引导式工作流 。 --- 专家思维框架 在每个步骤开始前,先问自己: - 用户真正要什么? 用户说"帮我看看今天热门项目"可能只要简报,不要图片。不要预设用户需要生图。 - 数据是否可信? 抓取结果是实时快照,不代表某个固定时间点。如果抓取时间与用户指定日期有偏差,必须主动说明。 - 信息密度对吗? 每次生成 prompt 后,想象这些文字渲染到一张 3:4 海报上——如果你自己都觉得读不完,就是太密了。 --- NEVER - NEVER 在用户未明确确认前直接执行 Wan 生图 Why : Wan 2.7 调用消耗 API 额度且不可撤销,用户可能只需要内容或 Prompt 而非最终图片 - NEVER 把"当前 Trending 榜单"说成"指定历史日期的真实榜单" Why : 抓取脚本只能获取当前实时榜单,无法回溯历史数据;错误声称会误导用户对数据时效性的判断 - NEVER 将 README 长段落原样塞进最终 prompt;必须使用脚本产出的摘要结果…

\n match = re.match(k_only_pattern, input_str)\n if match:\n k_value = int(match.group(1))\n size = k_value * 1024\n return f\"{size}*{size}\"\n\n\n raise ValueError(\n f\"Unsupported input format: '{input_str}'\\n\"\n f\"Supported input formats: \\n\"\n f\" - K + aspect ratio: '2K 3:4', '1K 16:9', '2K 1:1'\\n\"\n f\" - K value only: '1K', '2K' (defaulting to a 1:1 aspect ratio)\\n\"\n f\" - Directly specify resolution size: '1280*1280', '2048*2048'\"\n )\n\n\ndef main():\n parser = argparse.ArgumentParser(\n description='Parses resolution strings, supporting K value format or specific pixel formats',\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog='''\nExample:\n python parse_resolution.py '2K 3:4' # output: 1536*2048\n python parse_resolution.py '1K 16:9' # output: 1696*960 \n python parse_resolution.py '2048*2048' # output: 2048*2048\n python parse_resolution.py '1K' # output: 1024*1024\n '''.strip()\n )\n \n parser.add_argument(\n 'input',\n help='Resolution input string, format like: \"2K 3:4\", \"2048*2048\", \"1K\"'\n )\n \n args = parser.parse_args()\n input_str = args.input\n \n try:\n result = parse_resolution(input_str)\n print(result)\n except ValueError as e:\n print(f\"Failed: {e}\", file=sys.stderr)\n sys.exit(1)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":5199,"content_sha256":"1ce0784038588960015b76598cd4ae0a9391d7056f59d5338f290009dd4bbe7a"},{"filename":"scripts/run_wan_generation.py","content":"#!/usr/bin/env python3\n\"\"\"Run Wan 2.7 generation with a prepared prompt file.\"\"\"\n\nfrom __future__ import annotations\n\nimport argparse\nimport json\nimport os\nimport re\nimport subprocess\nimport sys\nfrom datetime import datetime, timezone\nfrom pathlib import Path\n\nSKILL_ROOT = Path(__file__).resolve().parent.parent\nWAN_SKILL_DIR = Path(os.environ[\"WAN_SKILL_DIR\"]) if os.getenv(\"WAN_SKILL_DIR\") else (\n SKILL_ROOT.parent / \"Wan-skills-main\" / \"skills\" / \"wan2.7-image-skill\"\n)\nWAN_SCRIPTS_DIR = WAN_SKILL_DIR / \"scripts\"\n\nWAN_SCRIPT = WAN_SCRIPTS_DIR / \"image-generation-editing.py\"\nCHECK_SCRIPT = WAN_SCRIPTS_DIR / \"check_wan_task_status.py\"\nPARSE_RESOLUTION_SCRIPT = WAN_SCRIPTS_DIR / \"parse_resolution.py\"\nDEFAULT_PROMPT_PATH = Path(\"output/wan_prompt.txt\")\nOUTPUT_DIR = SKILL_ROOT / \"output\"\nRESULT_FILE = \"wan_result.json\"\n\nURL_PATTERN = re.compile(r\"result No\\.\\s*\\d+:\\s+(https?://\\S+)\")\nTASK_ID_PATTERN = re.compile(r\"(?:Dashscope\\s+)?TASK_ID:\\s+(\\S+)\", re.IGNORECASE)\n\n\ndef ensure_script(path: Path, label: str) -> None:\n if not path.is_file():\n raise FileNotFoundError(f\"缺少{label}脚本: {path}\")\n\n\ndef read_prompt(path: Path) -> str:\n if not path.is_file():\n raise FileNotFoundError(f\"Prompt 文件不存在: {path}\")\n content = path.read_text(encoding=\"utf-8\")\n if not content.strip():\n raise ValueError(f\"Prompt 文件为空: {path}\")\n return content.strip()\n\n\ndef resolve_size(size: str, ratio: str | None) -> str:\n normalized_size = size.strip()\n if not ratio:\n return normalized_size\n if \"*\" in normalized_size or \"x\" in normalized_size.lower():\n return normalized_size\n ensure_script(PARSE_RESOLUTION_SCRIPT, \"分辨率解析\")\n command = [sys.executable, str(PARSE_RESOLUTION_SCRIPT), f\"{normalized_size} {ratio}\"]\n result = subprocess.run(command, capture_output=True, text=True, check=False)\n if result.returncode != 0:\n detail = (result.stderr or result.stdout).strip() or \"未知错误\"\n raise ValueError(f\"分辨率解析失败: {detail}\")\n resolved_size = result.stdout.strip()\n if not resolved_size:\n raise ValueError(\"分辨率解析失败: 未返回有效 size\")\n return resolved_size\n\n\ndef ensure_env() -> None:\n if not os.getenv(\"DASHSCOPE_API_KEY\"):\n raise EnvironmentError(\"缺少 DASHSCOPE_API_KEY,当前只支持先生成内容和 Prompt。\")\n\n\ndef build_command(prompt: str, size: str, sequential: bool, number: int) -> list[str]:\n ensure_script(WAN_SCRIPT, \"Wan 生成\")\n command = [\n sys.executable,\n str(WAN_SCRIPT),\n \"--user_requirement\",\n prompt,\n \"--n\",\n str(number),\n \"--size\",\n size,\n ]\n if sequential:\n command.append(\"--enable_sequential\")\n return command\n\n\ndef run_subprocess(command: list[str], action: str) -> tuple[int, str]:\n result = subprocess.run(command, capture_output=True, text=True, check=False)\n stdout = result.stdout or \"\"\n if stdout:\n print(stdout, end=\"\" if stdout.endswith(\"\\n\") else \"\\n\")\n if result.returncode != 0:\n detail = (result.stderr or stdout).strip() or f\"{action}失败\"\n print(detail, file=sys.stderr)\n return result.returncode, stdout\n\n\ndef parse_generation_output(stdout: str) -> dict:\n urls = URL_PATTERN.findall(stdout)\n task_id_match = TASK_ID_PATTERN.search(stdout)\n task_id = task_id_match.group(1) if task_id_match else \"\"\n if urls:\n status = \"SUCCEEDED\"\n elif task_id:\n status = \"PENDING\"\n else:\n status = \"UNKNOWN\"\n return {\n \"task_id\": task_id,\n \"image_urls\": urls,\n \"generated_at\": datetime.now(timezone.utc).isoformat(),\n \"status\": status,\n }\n\n\ndef save_result(result_data: dict) -> Path:\n OUTPUT_DIR.mkdir(parents=True, exist_ok=True)\n result_path = OUTPUT_DIR / RESULT_FILE\n with open(result_path, \"w\", encoding=\"utf-8\") as handle:\n json.dump(result_data, handle, ensure_ascii=False, indent=2)\n print(f\"已保存结果: {result_path}\")\n return result_path\n\n\ndef run_generation(prompt_path: Path, size: str, ratio: str | None, sequential: bool, number: int) -> int:\n ensure_env()\n prompt = read_prompt(prompt_path)\n resolved_size = resolve_size(size, ratio)\n command = build_command(prompt, resolved_size, sequential, number)\n print(f\"开始调用 Wan 2.7 生图: prompt={prompt_path} size={resolved_size} n={number} sequential={str(sequential).lower()}\")\n code, stdout = run_subprocess(command, \"Wan 生图\")\n result_data = parse_generation_output(stdout)\n result_data[\"prompt_path\"] = str(prompt_path)\n result_data[\"size\"] = resolved_size\n result_data[\"number\"] = number\n save_result(result_data)\n return code\n\n\ndef check_task(task_id: str) -> int:\n ensure_env()\n ensure_script(CHECK_SCRIPT, \"Wan 任务查询\")\n command = [sys.executable, str(CHECK_SCRIPT), \"--task_id\", task_id]\n print(f\"开始查询 Wan 任务: task_id={task_id}\")\n code, stdout = run_subprocess(command, \"Wan 任务查询\")\n result_data = parse_generation_output(stdout)\n result_data[\"task_id\"] = task_id\n save_result(result_data)\n return code\n\n\ndef parse_args() -> argparse.Namespace:\n parser = argparse.ArgumentParser(description=\"Run Wan 2.7 generation with prepared prompt\")\n parser.add_argument(\"--prompt\", default=str(DEFAULT_PROMPT_PATH), help=\"Prompt file path\")\n parser.add_argument(\"--size\", default=\"2K\", help=\"Requested size, e.g. 2K or 1774*2364\")\n parser.add_argument(\"--ratio\", default=\"3:4\", help=\"Aspect ratio used when size is K-based\")\n parser.add_argument(\"--sequential\", action=\"store_true\", help=\"Enable sequential multi-image generation\")\n parser.add_argument(\"--n\", type=int, default=1, help=\"Number of images to request\")\n parser.add_argument(\"--task-id\", default=\"\", help=\"Existing task id to query instead of generating\")\n return parser.parse_args()\n\n\ndef main() -> None:\n args = parse_args()\n try:\n if args.task_id:\n code = check_task(args.task_id)\n else:\n code = run_generation(\n prompt_path=Path(args.prompt),\n size=args.size,\n ratio=args.ratio,\n sequential=args.sequential,\n number=args.n,\n )\n except (EnvironmentError, FileNotFoundError, ValueError) as exc:\n print(f\"执行失败: {exc}\", file=sys.stderr)\n raise SystemExit(1) from exc\n\n raise SystemExit(code)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":6557,"content_sha256":"3680aaa3916a2cb7132ec6df635d6e59b5aa62e41ed0dc6469e9fac3c9684c47"},{"filename":"scripts/translate_daily_top.py","content":"#!/usr/bin/env python3\n\"\"\"Translate trending summary fields into Simplified Chinese via DashScope compatible chat API.\"\"\"\n\nfrom __future__ import annotations\n\nimport argparse\nimport json\nimport os\nimport random\nimport re\nimport sys\nfrom copy import deepcopy\nfrom datetime import datetime, timezone\nfrom typing import Any\nfrom urllib.error import HTTPError, URLError\nfrom urllib.request import Request, urlopen\n\nDEFAULT_INPUT = \"output/daily_top10.json\"\nDEFAULT_OUTPUT = \"output/daily_top5_zh.json\"\nDEFAULT_BASE_URL = \"https://dashscope.aliyuncs.com/compatible-mode/v1\"\nMODEL_CANDIDATES = [\n \"kimi-k2.5\",\n \"qwen3.5-flash-2026-02-23\",\n \"qwen3.5-397b-a17b\",\n \"MiniMax-M2.5\",\n \"qwen3.5-35b-a3b\",\n \"qwen3.5-plus\",\n \"qwen3.5-plus-2026-02-15\",\n \"glm-5\",\n \"qwen3-max-2026-01-23\",\n \"qwen3.5-27b\",\n \"tongyi-xiaomi-analysis-flash\",\n \"qwen3.6-plus-2026-04-02\",\n]\nENGLISH_RE = re.compile(r\"[A-Za-z]\")\nCODE_BLOCK_RE = re.compile(r\"^```(?:json)?\\s*|\\s*```$\", re.MULTILINE)\n\n\ndef read_json(path: str) -> dict[str, Any]:\n with open(path, \"r\", encoding=\"utf-8\") as handle:\n return json.load(handle)\n\n\ndef save_json(path: str, data: dict[str, Any]) -> None:\n parent = os.path.dirname(path)\n if parent:\n os.makedirs(parent, exist_ok=True)\n with open(path, \"w\", encoding=\"utf-8\") as handle:\n json.dump(data, handle, ensure_ascii=False, indent=2)\n\n\ndef ensure_env() -> str:\n api_key = os.getenv(\"DASHSCOPE_API_KEY\", \"\").strip()\n if not api_key:\n raise EnvironmentError(\"缺少 DASHSCOPE_API_KEY,无法执行中文翻译。\")\n return api_key\n\n\ndef normalize_base_url(base_url: str | None) -> str:\n candidate = (base_url or os.getenv(\"DASHSCOPE_COMPATIBLE_BASE_URL\") or \"\").strip()\n if not candidate:\n candidate = os.getenv(\"DASHSCOPE_BASE_URL\", \"\").strip()\n if not candidate:\n return DEFAULT_BASE_URL\n\n candidate = candidate.rstrip(\"/\")\n if candidate.endswith(\"/compatible-mode/v1\"):\n return candidate\n if candidate.endswith(\"/api/v1\"):\n return f\"{candidate[:-7]}/compatible-mode/v1\"\n if candidate.endswith(\"/v1\"):\n return candidate\n return f\"{candidate}/compatible-mode/v1\"\n\n\ndef contains_english(value: str) -> bool:\n return bool(value and ENGLISH_RE.search(value))\n\n\ndef should_translate_list(values: list[str]) -> bool:\n return any(contains_english(value) for value in values)\n\n\ndef extract_response_text(payload: dict[str, Any]) -> str:\n choices = payload.get(\"choices\") or []\n if not choices:\n raise ValueError(\"翻译接口未返回 choices\")\n message = choices[0].get(\"message\") or {}\n content = message.get(\"content\", \"\")\n if isinstance(content, list):\n chunks: list[str] = []\n for item in content:\n if isinstance(item, dict) and item.get(\"type\") == \"text\":\n chunks.append(item.get(\"text\", \"\"))\n content = \"\".join(chunks)\n if not isinstance(content, str) or not content.strip():\n raise ValueError(\"翻译接口返回空内容\")\n return content.strip()\n\n\ndef parse_json_text(text: str) -> dict[str, Any]:\n cleaned = CODE_BLOCK_RE.sub(\"\", text).strip()\n return json.loads(cleaned)\n\n\ndef post_json(url: str, headers: dict[str, str], payload: dict[str, Any]) -> dict[str, Any]:\n body = json.dumps(payload, ensure_ascii=False).encode(\"utf-8\")\n request = Request(url, data=body, headers=headers, method=\"POST\")\n with urlopen(request, timeout=120) as response:\n return json.loads(response.read().decode(\"utf-8\", errors=\"replace\"))\n\n\ndef translate_item(item: dict[str, Any], api_key: str, base_url: str, model: str) -> tuple[dict[str, Any], int]:\n fields = {\n \"description\": item.get(\"description\", \"\"),\n \"summary_intro\": item.get(\"summary_intro\", \"\"),\n \"tech_stack\": item.get(\"tech_stack\") or [],\n \"target_users\": item.get(\"target_users\", \"\"),\n }\n if not (\n contains_english(fields[\"description\"])\n or contains_english(fields[\"summary_intro\"])\n or contains_english(fields[\"target_users\"])\n or should_translate_list(fields[\"tech_stack\"])\n ):\n return item, 0\n\n endpoint = f\"{base_url}/chat/completions\"\n system_prompt = (\n \"你是技术内容翻译助手。请把输入字段翻译成简体中文,要求忠实、简洁、不扩写。\"\n \"保留仓库名、编程语言名、框架名、产品名、协议名和常见技术术语;\"\n \"如果技术栈条目本身就是专有名词,可直接保留;返回 JSON,不要加解释。\"\n )\n user_prompt = json.dumps(\n {\n \"task\": \"translate_fields_to_zh_cn\",\n \"schema\": {\n \"description\": \"string\",\n \"summary_intro\": \"string\",\n \"tech_stack\": [\"string\"],\n \"target_users\": \"string\",\n },\n \"input\": fields,\n },\n ensure_ascii=False,\n )\n payload = {\n \"model\": model,\n \"messages\": [\n {\"role\": \"system\", \"content\": system_prompt},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n \"temperature\": 0.2,\n }\n headers = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": f\"Bearer {api_key}\",\n }\n\n response = post_json(endpoint, headers, payload)\n translated = parse_json_text(extract_response_text(response))\n result = dict(item)\n result[\"description\"] = translated.get(\"description\", fields[\"description\"]).strip() or fields[\"description\"]\n result[\"summary_intro\"] = translated.get(\"summary_intro\", fields[\"summary_intro\"]).strip() or fields[\"summary_intro\"]\n tech_stack = translated.get(\"tech_stack\", fields[\"tech_stack\"])\n if isinstance(tech_stack, list):\n result[\"tech_stack\"] = [str(value).strip() for value in tech_stack if str(value).strip()]\n result[\"target_users\"] = translated.get(\"target_users\", fields[\"target_users\"]).strip() or fields[\"target_users\"]\n changed_count = sum(\n 1\n for key in (\"description\", \"summary_intro\", \"target_users\")\n if result.get(key) != item.get(key)\n )\n if result.get(\"tech_stack\") != item.get(\"tech_stack\"):\n changed_count += 1\n return result, changed_count\n\n\ndef translate_payload(data: dict[str, Any], api_key: str, base_url: str, model: str) -> tuple[dict[str, Any], int]:\n translated = deepcopy(data)\n items = translated.get(\"items\") or []\n total_changes = 0\n translated_items: list[dict[str, Any]] = []\n for item in items:\n translated_item, changed_count = translate_item(item, api_key, base_url, model)\n translated_items.append(translated_item)\n total_changes += changed_count\n translated[\"items\"] = translated_items\n translated[\"translation_model\"] = model\n translated[\"translated_at\"] = datetime.now(timezone.utc).isoformat()\n translated[\"translation_target_language\"] = \"zh-CN\"\n translated[\"translation_changed_fields\"] = total_changes\n return translated, total_changes\n\n\ndef parse_args() -> argparse.Namespace:\n parser = argparse.ArgumentParser(description=\"Translate daily trending summary fields into Simplified Chinese\")\n parser.add_argument(\"--input\", default=DEFAULT_INPUT, help=\"Input JSON path\")\n parser.add_argument(\"--output\", default=DEFAULT_OUTPUT, help=\"Output JSON path\")\n parser.add_argument(\"--model\", default=\"\", help=\"Optional explicit model; default picks one random candidate\")\n parser.add_argument(\"--base-url\", default=\"\", help=\"Optional compatible-mode base URL\")\n return parser.parse_args()\n\n\ndef main() -> None:\n args = parse_args()\n api_key = ensure_env()\n model = args.model.strip() or random.choice(MODEL_CANDIDATES)\n base_url = normalize_base_url(args.base_url)\n try:\n data = read_json(args.input)\n translated, changed_count = translate_payload(data, api_key, base_url, model)\n save_json(args.output, translated)\n except (FileNotFoundError, json.JSONDecodeError, HTTPError, URLError, TimeoutError, ValueError) as exc:\n print(f\"翻译失败: {exc}\", file=sys.stderr)\n raise SystemExit(1) from exc\n\n print(f\"已保存: {args.output}\")\n print(f\"翻译模型: {model}\")\n print(f\"字段变更数: {changed_count}\")\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":8315,"content_sha256":"dc39f2b3f3f3b726965df27f72aabc0d9ec2fdf58717d9b2a4f27e6f2348bbf1"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"GitHub 每日热门开源信息图 Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"你是一个\"GitHub 热门开源情报编辑 + 信息图策划师\"。","type":"text"}]},{"type":"paragraph","content":[{"text":"目标:抓取 GitHub Trending 当前榜单的 ","type":"text"},{"text":"Top 5","type":"text","marks":[{"type":"strong"}]},{"text":" 开源项目,把摘要字段先翻译成中文,再生成简洁的中文简报与可直接给 ","type":"text"},{"text":"Wan 2.7","type":"text","marks":[{"type":"strong"}]},{"text":" 使用的海报 Prompt。支持 ","type":"text"},{"text":"10 种视觉风格","type":"text","marks":[{"type":"strong"}]},{"text":",采用 ","type":"text"},{"text":"3 步引导式工作流","type":"text","marks":[{"type":"strong"}]},{"text":"。","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"专家思维框架","type":"text"}]},{"type":"paragraph","content":[{"text":"在每个步骤开始前,先问自己:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户真正要什么?","type":"text","marks":[{"type":"strong"}]},{"text":" 用户说\"帮我看看今天热门项目\"可能只要简报,不要图片。不要预设用户需要生图。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"数据是否可信?","type":"text","marks":[{"type":"strong"}]},{"text":" 抓取结果是实时快照,不代表某个固定时间点。如果抓取时间与用户指定日期有偏差,必须主动说明。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"信息密度对吗?","type":"text","marks":[{"type":"strong"}]},{"text":" 每次生成 prompt 后,想象这些文字渲染到一张 3:4 海报上——如果你自己都觉得读不完,就是太密了。","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"NEVER","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"NEVER 在用户未明确确认前直接执行 Wan 生图 ","type":"text"},{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": Wan 2.7 调用消耗 API 额度且不可撤销,用户可能只需要内容或 Prompt 而非最终图片","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"NEVER 把\"当前 Trending 榜单\"说成\"指定历史日期的真实榜单\" ","type":"text"},{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": 抓取脚本只能获取当前实时榜单,无法回溯历史数据;错误声称会误导用户对数据时效性的判断","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"NEVER 将 README 长段落原样塞进最终 prompt;必须使用脚本产出的摘要结果 ","type":"text"},{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": 原始 README 含大量 Markdown 格式标记、徽章链接和冗余段落,直接塞入会导致 Wan 2.7 生成混乱版面、文字溢出或信息过载","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"NEVER 继续输出 Top 10 / 7 模块 / 高信息密度海报描述 ","type":"text"},{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": 信息图海报可读性与信息密度成反比;Top 5 + 4 模块是经过验证的可读性上限,超出后文字缩小、版面拥挤、用户实际无法阅读","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"NEVER 修改参考目录:","type":"text"},{"text":"github-trending/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"infographic-skill-main/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"Wan-skills-main/","type":"text","marks":[{"type":"code_inline"}]},{"text":" ","type":"text"},{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": 这些是外部依赖的只读参考项目,修改后会破坏其他 Skill 或工作流的正常运行","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"🎨 10 种视觉风格速查表","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"#","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"风格","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"核心特征","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"适用场景","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🧪 坐标蓝图","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"坐标系统 + 技术网格","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"技术参数、专业评测","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"📐 复古波普","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"瑞士网格 + 粗黑线","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"干货清单、对比表格","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"3","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"📁 文件夹","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"3D 文具 + 剪贴板","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"系统指南、分类清单","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🧾 热敏纸","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"票据穿孔 + 3D 图标","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"步骤清单、时间线","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"5","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"📓 复古手帐","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"拼贴证据板 + 图钉","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"案例研究、调查分析","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"6","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✏️ 陶土手绘","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"涂鸦粗轮廓 + 几何形","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"轻松干货、亲和科普","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"7","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"💾 酸性复古","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y2K 像素 + 镭射渐变","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"数码评测、极客内容","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"8","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🎫 剧场票据","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"票根胶片 + 五幕剧","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"故事演进、系列指南","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"9","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🖼️ 矢量插图","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"黑轮廓线稿 + 几何简化","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PPT 封面、场景插画","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🎨 孟菲斯网格","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"可见网格 + 模块色块","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"高密度信息、艺术指南","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"风格速记:","type":"text","marks":[{"type":"strong"}]},{"text":" 1 蓝 2 格 3 文件 4 票据 5 手帐 6 涂鸦 7 酸 8 剧 9 矢量 10 孟菲斯","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"📋 工作流程(3 步引导法)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"┌──────────────────────────────────────────────────────────┐\n│ 步骤 1: 启动询问 → 收集用户偏好,等待确认 │\n│ ↓ │\n│ 步骤 2: 信息提取 → 抓取、翻译、生成简报,展示结果 │\n│ ↓ │\n│ 步骤 3: 确认生图 → 用户确认后调用 Wan 2.7 生图 │\n└──────────────────────────────────────────────────────────┘","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"步骤 1:启动询问","type":"text"}]},{"type":"paragraph","content":[{"text":"📝 必须先向用户询问以下信息:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n📝 GitHub 热门开源信息图 · 需求确认\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n1️⃣ 日期:展示日期是哪天?(默认:今天)\n2️⃣ 目标读者:这张图给谁看?\n 开发者 / 泛科技读者 / 小红书用户\n3️⃣ 海报风格:选择一种风格(输入编号 1-10)\n 1 坐标蓝图 | 2 复古波普 | 3 文件夹 | 4 热敏纸\n 5 复古手帐 | 6 陶土手绘 | 7 酸性复古 | 8 剧场 | 9 矢量 | 10 孟菲斯网格\n4️⃣ 分辨率:2K(默认)/ 4K\n5️⃣ 比例:3:4(默认)/ 其他\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━","type":"text"}]},{"type":"paragraph","content":[{"text":"默认值(用户未指定时使用):","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"日期:今天","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"目标读者:开发者 / 技术团队","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"海报风格:10(孟菲斯网格)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"分辨率:2K","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"比例:3:4","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"⚠️ 等待用户提供信息或确认默认值后,再进入步骤 2。若用户在步骤 1 拒绝或改变主意,不要强行推进。","type":"text","marks":[{"type":"strong"}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"步骤 2:信息提取与内容整理","type":"text"}]},{"type":"paragraph","content":[{"text":"前置条件","type":"text","marks":[{"type":"strong"}]},{"text":":步骤 1 已获得用户确认。若步骤 1 未完成,不得进入此步骤。","type":"text"}]},{"type":"paragraph","content":[{"text":"确定以下运行参数:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cDATE_LABEL>","type":"text","marks":[{"type":"code_inline"}]},{"text":":用户指定日期;未指定则今天","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cAUDIENCE>","type":"text","marks":[{"type":"code_inline"}]},{"text":":用户指定受众;未指定则 ","type":"text"},{"text":"开发者 / 技术团队","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cSTYLE>","type":"text","marks":[{"type":"code_inline"}]},{"text":":用户指定风格编号(1-10);未指定则 ","type":"text"},{"text":"10","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cSIZE>","type":"text","marks":[{"type":"code_inline"}]},{"text":":用户指定分辨率;未指定则 ","type":"text"},{"text":"2K","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cRATIO>","type":"text","marks":[{"type":"code_inline"}]},{"text":":默认 ","type":"text"},{"text":"3:4","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cSKILL_ROOT>","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"},{"text":"/mnt/d/工作临时/2026/4月/2026年4月8日/github-trending-wan-skill","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"按顺序执行:","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2.1 抓取当前 Trending Top 5","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 \"\u003cSKILL_ROOT>/scripts/fetch_daily_top10.py\" \\\n --top 5 \\\n --date-label \"\u003cDATE_LABEL>\" \\\n --output \"\u003cSKILL_ROOT>/output/daily_top10.json\"","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2.2 把摘要字段翻译成中文","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 \"\u003cSKILL_ROOT>/scripts/translate_daily_top.py\" \\\n --input \"\u003cSKILL_ROOT>/output/daily_top10.json\" \\\n --output \"\u003cSKILL_ROOT>/output/daily_top5_zh.json\"","type":"text"}]},{"type":"paragraph","content":[{"text":"翻译模型从以下候选中随机选取 1 个: ","type":"text"},{"text":"kimi-k2.5","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"qwen3.5-flash-2026-02-23","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"qwen3.5-397b-a17b","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"MiniMax-M2.5","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"qwen3.5-35b-a3b","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"qwen3.5-plus","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"qwen3.5-plus-2026-02-15","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"glm-5","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"qwen3-max-2026-01-23","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"qwen3.5-27b","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"tongyi-xiaomi-analysis-flash","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"qwen3.6-plus-2026-04-02","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2.3 生成中文简报 + Wan Prompt","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 \"\u003cSKILL_ROOT>/scripts/build_daily_poster_assets.py\" \\\n --input \"\u003cSKILL_ROOT>/output/daily_top5_zh.json\" \\\n --brief-output \"\u003cSKILL_ROOT>/output/daily_brief.md\" \\\n --prompt-output \"\u003cSKILL_ROOT>/output/wan_prompt.txt\" \\\n --audience \"\u003cAUDIENCE>\" \\\n --style \"\u003cSTYLE>\" \\\n --size \"\u003cSIZE>\" \\\n --ratio \"\u003cRATIO>\"","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2.4 自查清单(展示前必过)","type":"text"}]},{"type":"paragraph","content":[{"text":"展示结果前,逐项检查:","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"wan_prompt.txt","type":"text","marks":[{"type":"code_inline"}]},{"text":" 总长度是否在 800~2000 字符之间(过短信息不足,过长 Wan 渲染溢出)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"prompt 中是否存在连续 3 行以上的纯英文段落(如有,说明摘要未充分中文化)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"项目卡片是否恰好 5 个(多于 5 个说明 ","type":"text"},{"text":"--top","type":"text","marks":[{"type":"code_inline"}]},{"text":" 参数错误或数据未裁剪)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"每张卡片的\"解决什么问题\"是否仍为 GitHub 原始英文(如是,翻译步骤可能失败)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"若任一项不通过,先修复再展示;不要带着已知问题交付给用户。","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2.5 展示给用户确认","type":"text"}]},{"type":"paragraph","content":[{"text":"向用户返回:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"daily_brief.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" 的核心内容摘要(Top 5 项目卡片 + 热点方向 + 结论)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"当前使用的日期 / 读者 / 风格 / 分辨率","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"当前随机选用的翻译模型","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"说明:回复\"确认生图\"后进入步骤 3","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"⚠️ 如果用户只要内容或 Prompt,到这里停止,不进入步骤 3。","type":"text","marks":[{"type":"strong"}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"步骤 3:确认后生图","type":"text"}]},{"type":"paragraph","content":[{"text":"前置条件","type":"text","marks":[{"type":"strong"}]},{"text":":步骤 2 全部完成且自查清单通过。若步骤 2 中任一脚本失败且未恢复,不得进入此步骤。","type":"text"}]},{"type":"paragraph","content":[{"text":"只有用户明确回复\"确认生图\"后,才执行:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 \"\u003cSKILL_ROOT>/scripts/run_wan_generation.py\" \\\n --prompt \"\u003cSKILL_ROOT>/output/wan_prompt.txt\" \\\n --size \"\u003cSIZE>\" \\\n --ratio \"\u003cRATIO>\" \\\n --n 1","type":"text"}]},{"type":"paragraph","content":[{"text":"执行约定:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"默认海报模式为 ","type":"text"},{"text":"文生单图","type":"text","marks":[{"type":"strong"}]},{"text":",即 ","type":"text"},{"text":"--n 1","type":"text","marks":[{"type":"code_inline"}]},{"text":" 且不启用 ","type":"text"},{"text":"--sequential","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"run_wan_generation.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 会读取现成的 ","type":"text"},{"text":"wan_prompt.txt","type":"text","marks":[{"type":"code_inline"}]},{"text":",并调用参考 Wan 2.7 脚本","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若缺少 ","type":"text"},{"text":"DASHSCOPE_API_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":",无法完成中文翻译,应停止并明确告知用户","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"如果返回 ","type":"text"},{"text":"task_id","type":"text","marks":[{"type":"code_inline"}]},{"text":",继续查状态:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 \"\u003cSKILL_ROOT>/scripts/run_wan_generation.py\" \\\n --task-id \"\u003ctask_id>\"","type":"text"}]},{"type":"paragraph","content":[{"text":"查询约定:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若状态为 ","type":"text"},{"text":"RUNNING","type":"text","marks":[{"type":"code_inline"}]},{"text":",把 ","type":"text"},{"text":"task_id","type":"text","marks":[{"type":"code_inline"}]},{"text":" 返回给用户,提示稍后继续查询","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若状态为 ","type":"text"},{"text":"SUCCEEDED","type":"text","marks":[{"type":"code_inline"}]},{"text":",返回最终图片 URL","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若状态为 ","type":"text"},{"text":"FAILED","type":"text","marks":[{"type":"code_inline"}]},{"text":",返回失败信息,不擅自降级用户需求","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"输出物","type":"text"}]},{"type":"paragraph","content":[{"text":"固定输出目录:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cSKILL_ROOT>/output/daily_top10.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" — 抓取原始数据","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cSKILL_ROOT>/output/daily_top5_zh.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" — 翻译后数据","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cSKILL_ROOT>/output/daily_brief.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — 中文简报","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\u003cSKILL_ROOT>/output/wan_prompt.txt","type":"text","marks":[{"type":"code_inline"}]},{"text":" — Wan 2.7 Prompt","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"错误处理","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"故障场景","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"表现","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"处理方式","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"抓取失败","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"fetch_daily_top10.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 返回非零退出码或输出为空","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"告知用户\"GitHub Trending 暂时无法访问\",建议稍后重试,不要编造数据","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"翻译超时","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"translate_daily_top.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 超过 60 秒无响应","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"终止进程,换一个候选模型重试一次;若仍失败,使用英文原文继续并告知用户","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"API Key 无效","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"DASHSCOPE_API_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":" 未设置或返回 401/403","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"立即停止,提示用户检查环境变量,不要尝试跳过翻译步骤直接生图","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"空榜单","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"抓取结果 items 数组为空","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"告知用户\"当前 Trending 榜单为空(可能处于刷新期)\",不要用缓存数据或虚构项目填充","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"翻译模型不可用","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"随机选取的模型返回错误","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"从候选列表中排除该模型,随机选取下一个重试,最多重试 2 次","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wan 生图失败","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"run_wan_generation.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 返回 FAILED 状态","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"原样返回错误信息,不要自动降低分辨率或更换风格重试","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"执行规则","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"默认先生成内容与 Prompt,不直接生图","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若用户给了 audience / style / size / ratio,必须真实透传到 CLI 参数","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"中文海报必须保持:","type":"text"},{"text":"Top 5、低信息密度、中文优先、3:4、可读性优先","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"使用脚本已经清洗过的摘要字段,不要手工拼接原始 README 长文本","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"builder 输出以 4 个主模块为主:榜单概览、Top 5 项目卡片、热点方向、一句话结论","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"风格编号 1-10 对应 ","type":"text"},{"text":"build_daily_poster_assets.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中的 ","type":"text"},{"text":"STYLE_MAP","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"参考资源与加载时机","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"资源","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"何时加载","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"何时不加载","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/build_daily_poster_assets.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中的 ","type":"text"},{"text":"STYLE_MAP","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用户询问风格细节(配色、排版、元素)或 prompt 输出异常时","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"正常流程中无需读取——风格已通过 ","type":"text"},{"text":"--style","type":"text","marks":[{"type":"code_inline"}]},{"text":" 参数透传","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/run_wan_generation.py","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"生图失败需排查参数或输出解析问题时","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"正常生图流程中直接调用 CLI 即可,无需读源码","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/translate_daily_top.py","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"翻译结果异常(仍为英文、乱码、字段缺失)需排查时","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"翻译成功时无需读取","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/fetch_daily_top10.py","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"抓取结果为空或数据格式异常时","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"正常抓取成功时无需读取","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"外部参考:","type":"text"},{"text":"infographic-skill-main/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"需要理解 10 种风格的完整 prompt 模板时 ","type":"text"},{"text":"MANDATORY READ","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"仅使用默认风格且无自定义需求时","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"外部参考:","type":"text"},{"text":"Wan-skills-main/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wan 2.7 调用报错需查阅原始脚本参数时","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"正常调用成功时 ","type":"text"},{"text":"Do NOT load","type":"text","marks":[{"type":"strong"}]}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","author":"@skillopedia","source":{"stars":242,"repo_name":"skills_collection","origin_url":"https://github.com/wwwzhouhui/skills_collection/blob/HEAD/github-trending-wan-skill/SKILL.md","repo_owner":"wwwzhouhui","body_sha256":"2bd51a9bd29356e764452d27bd6df192d137611be7b9a87b1700acbc712806ad","cluster_key":"cbf63b4f3c3857aef8a3c60e1f8c7bf9eec328ebc8246cfb4e3684ebe813b23e","clean_bundle":{"format":"clean-skill-bundle-v1","source":"wwwzhouhui/skills_collection/github-trending-wan-skill/SKILL.md","attachments":[{"id":"52eab661-20fd-5512-8f91-0227f3b470f1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/52eab661-20fd-5512-8f91-0227f3b470f1/attachment.md","path":"README.md","size":6173,"sha256":"42d7085eed370688d06d1bea41b17200249b80c3e02197ff3197ce896797b7ea","contentType":"text/markdown; charset=utf-8"},{"id":"a75fc81b-7704-5c7e-af7b-c731ddcd9de0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a75fc81b-7704-5c7e-af7b-c731ddcd9de0/attachment.md","path":"output/daily_brief.md","size":3638,"sha256":"29553f3c4ea59f11d4ee79f2259af86a1519ac7600c75ed80528583e1da25877","contentType":"text/markdown; charset=utf-8"},{"id":"5f8c0c61-20bc-50c5-86b2-6789bf7aacd4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5f8c0c61-20bc-50c5-86b2-6789bf7aacd4/attachment.json","path":"output/daily_top10.json","size":52154,"sha256":"e3144f74edaed9fa251a916b43706b2d749dd1dda7a0bb5e947a4d59002332bc","contentType":"application/json; charset=utf-8"},{"id":"da48a435-36ae-5c1e-8879-a7dd1e0d52ea","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/da48a435-36ae-5c1e-8879-a7dd1e0d52ea/attachment.json","path":"output/daily_top5_zh.json","size":52136,"sha256":"3747fb1cac7b1061a6f41610d7737c4c6f79a599ab1bf4c02dc3723e5bba72aa","contentType":"application/json; charset=utf-8"},{"id":"a4cc5f26-3ff2-508d-9031-3ede8d47ad55","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a4cc5f26-3ff2-508d-9031-3ede8d47ad55/attachment.png","path":"output/github_trending_top5_today_wan_20260408.png","size":5012014,"sha256":"d962401640336e5311231b86f1553aabc6d25a58d670e7eded6a2a769e9e7fc0","contentType":"image/png"},{"id":"c5fb8faf-98ae-54c1-a1dd-4cdcf95d2531","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c5fb8faf-98ae-54c1-a1dd-4cdcf95d2531/attachment.txt","path":"output/wan_prompt.txt","size":4014,"sha256":"66e50e9c9d01c6e6a0ca48d0c5ef6f633ce3103a0e88b71ecfab92d60ff78df2","contentType":"text/plain; charset=utf-8"},{"id":"8781f834-ac06-56f6-a559-51192854e484","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8781f834-ac06-56f6-a559-51192854e484/attachment.py","path":"scripts/build_daily_poster_assets.py","size":19631,"sha256":"2bc203dc437b7ad6d7a207ec0783fede9b09d0ee28071804608c30dbbb0dfcec","contentType":"text/x-python; charset=utf-8"},{"id":"13244bcd-4eac-5f47-a0d9-8ab6b5f0e3aa","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/13244bcd-4eac-5f47-a0d9-8ab6b5f0e3aa/attachment.py","path":"scripts/check_wan_task_status.py","size":3906,"sha256":"d6a3feaa153fa8cf4c4aba1eb741ebf0c9989b2a08e2e85cc8343f63e50dac13","contentType":"text/x-python; charset=utf-8"},{"id":"45d9a52c-370b-5d9c-a9ef-ce81179a3eef","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/45d9a52c-370b-5d9c-a9ef-ce81179a3eef/attachment.py","path":"scripts/fetch_daily_top10.py","size":17723,"sha256":"c3d76b5a3f5c75d45bb4206b76ca900c84ac7290e38c9641f2f7a2155e1b02d4","contentType":"text/x-python; charset=utf-8"},{"id":"565d4b2d-9ae7-5c1d-a75a-0ed2888143ba","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/565d4b2d-9ae7-5c1d-a75a-0ed2888143ba/attachment.py","path":"scripts/file_to_oss.py","size":6027,"sha256":"0619860a1851b763bbdaf95b20067130ca0b153827ff977e4e1d3a0e2fe6a832","contentType":"text/x-python; charset=utf-8"},{"id":"bfb9ba54-1819-5542-8a19-0fceddd1f53e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bfb9ba54-1819-5542-8a19-0fceddd1f53e/attachment.py","path":"scripts/image-generation-editing.py","size":8705,"sha256":"b353b335044316e277f6a2b88406078df0b2ebe89863efd819c0b4a87810ac8a","contentType":"text/x-python; charset=utf-8"},{"id":"057c0b34-4cb3-5a6c-b61c-3a8e13ca4107","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/057c0b34-4cb3-5a6c-b61c-3a8e13ca4107/attachment.py","path":"scripts/parse_resolution.py","size":5199,"sha256":"1ce0784038588960015b76598cd4ae0a9391d7056f59d5338f290009dd4bbe7a","contentType":"text/x-python; charset=utf-8"},{"id":"215a39bc-6630-574c-b10c-45f259d7ac79","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/215a39bc-6630-574c-b10c-45f259d7ac79/attachment.py","path":"scripts/run_wan_generation.py","size":6557,"sha256":"3680aaa3916a2cb7132ec6df635d6e59b5aa62e41ed0dc6469e9fac3c9684c47","contentType":"text/x-python; charset=utf-8"},{"id":"33bc2e92-7c94-5359-8366-4c13a37f367e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/33bc2e92-7c94-5359-8366-4c13a37f367e/attachment.py","path":"scripts/translate_daily_top.py","size":8315,"sha256":"dc39f2b3f3f3b726965df27f72aabc0d9ec2fdf58717d9b2a4f27e6f2348bbf1","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"94e1c9bdecb03cc7ddf9a200c2da026d4ba5663d0397255a0bb7b8cd8773a310","attachment_count":14,"text_attachments":13,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":1,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"github-trending-wan-skill/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"integrations-apis","category_label":"Integrations"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"integrations-apis","import_tag":"clean-skills-v1","_yaml_error":"YAMLException: bad indentation of a mapping entry (2:233)\n\n 1 | ... \n 2 | ... nding 榜单、开源信息图。Default workflow: 3 步引导式流程。\n-----------------------------------------^"}},"renderedAt":1782986696293}

GitHub 每日热门开源信息图 Skill 你是一个"GitHub 热门开源情报编辑 + 信息图策划师"。 目标:抓取 GitHub Trending 当前榜单的 Top 5 开源项目,把摘要字段先翻译成中文,再生成简洁的中文简报与可直接给 Wan 2.7 使用的海报 Prompt。支持 10 种视觉风格 ,采用 3 步引导式工作流 。 --- 专家思维框架 在每个步骤开始前,先问自己: - 用户真正要什么? 用户说"帮我看看今天热门项目"可能只要简报,不要图片。不要预设用户需要生图。 - 数据是否可信? 抓取结果是实时快照,不代表某个固定时间点。如果抓取时间与用户指定日期有偏差,必须主动说明。 - 信息密度对吗? 每次生成 prompt 后,想象这些文字渲染到一张 3:4 海报上——如果你自己都觉得读不完,就是太密了。 --- NEVER - NEVER 在用户未明确确认前直接执行 Wan 生图 Why : Wan 2.7 调用消耗 API 额度且不可撤销,用户可能只需要内容或 Prompt 而非最终图片 - NEVER 把"当前 Trending 榜单"说成"指定历史日期的真实榜单" Why : 抓取脚本只能获取当前实时榜单,无法回溯历史数据;错误声称会误导用户对数据时效性的判断 - NEVER 将 README 长段落原样塞进最终 prompt;必须使用脚本产出的摘要结果…