|
|
@@ -0,0 +1,630 @@
|
|
|
+{
|
|
|
+ "registry_version": "external_data_sources.v1",
|
|
|
+ "updated_at": "2026-06-07",
|
|
|
+ "purpose": "机器可读的外部数据源总表,供程序、脚本和审查流程查询 ContentFindAgent 可以读取、待接入或明确不能当作已接入的数据来源。",
|
|
|
+ "authority_note": "外部数据源以本文件为机器可读索引;详细中文说明见 00_数据接口总览.md;CFA 自有 DB 表和 runtime 字段见 ../数据库字段总览/content_agent_schema_registry.json。",
|
|
|
+ "status_legend": {
|
|
|
+ "verified": "已有 DB / API 只读验证或旧版实测结果。",
|
|
|
+ "v1_active": "V1 主链路使用或必须接入的来源。",
|
|
|
+ "source_only": "已有配置或源码线索,但当前未作为主链路实连。",
|
|
|
+ "fixture_only": "只用于本地回归、fixture 或兼容导出,不作为生产事实来源。",
|
|
|
+ "blocked": "因 key、token、权限或副作用限制未实连。",
|
|
|
+ "missing": "缺真实接口、真实 key、稳定字段或可用配置。",
|
|
|
+ "deprecated_reference_only": "历史迁移对照,不能作为新版证据来源。"
|
|
|
+ },
|
|
|
+ "source_type_legend": {
|
|
|
+ "mysql_table": "MySQL 表。",
|
|
|
+ "postgres_table": "PostgreSQL 表。",
|
|
|
+ "odps_table": "ODPS / MaxCompute 表。",
|
|
|
+ "http_api": "HTTP API。",
|
|
|
+ "local_json": "本地 JSON 文件,只能作为 fixture、兼容导出或回放材料。",
|
|
|
+ "capability": "能力或外部系统入口,不一定是单一表或单一 API。",
|
|
|
+ "gap": "产品方向存在,但当前没有可用真实来源。"
|
|
|
+ },
|
|
|
+ "access_mode_legend": {
|
|
|
+ "read": "只读。",
|
|
|
+ "read_write": "可读写。",
|
|
|
+ "planned_read": "计划读取,当前未接入代码主链路。",
|
|
|
+ "not_connected": "当前不可连接或不应接入。"
|
|
|
+ },
|
|
|
+ "source_id_prefixes": {
|
|
|
+ "SRC": "数据源与种子。",
|
|
|
+ "QRY": "搜索意图。",
|
|
|
+ "PLT": "平台接入。",
|
|
|
+ "JDG": "判断与回扣。",
|
|
|
+ "WALK": "游走扩展。",
|
|
|
+ "ASSET": "结果沉淀。",
|
|
|
+ "LEARN": "策略学习。",
|
|
|
+ "GAP": "明确缺口。"
|
|
|
+ },
|
|
|
+ "sources": [
|
|
|
+ {
|
|
|
+ "source_id": "SRC_DEMAND_CONTENT_MYSQL",
|
|
|
+ "display_name": "DemandAgent 需求池 MySQL 单表",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified", "v1_active"],
|
|
|
+ "system": "content-deconstruction-supply",
|
|
|
+ "table_or_endpoint": "demand_content",
|
|
|
+ "access_mode": "read",
|
|
|
+ "usage_stages": ["source_seed", "search_intent", "learning_review"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [
|
|
|
+ "content_agent/business_modules/source_seed/source_context.py",
|
|
|
+ "content_agent/integrations/demand_source.py",
|
|
|
+ "content_agent/run_service.py",
|
|
|
+ "content_agent/schemas.py"
|
|
|
+ ],
|
|
|
+ "required_env_vars": [
|
|
|
+ "CONTENT_SUPPLY_DB_HOST",
|
|
|
+ "CONTENT_SUPPLY_DB_PORT",
|
|
|
+ "CONTENT_SUPPLY_DB_NAME",
|
|
|
+ "CONTENT_SUPPLY_DB_USER",
|
|
|
+ "CONTENT_SUPPLY_DB_PASSWORD"
|
|
|
+ ],
|
|
|
+ "input_fields": ["id", "merge_leve2", "name", "reason", "suggestion", "ext_data", "score", "dt", "create_time", "update_time"],
|
|
|
+ "required_payload_paths": ["ext_data.evidence_pack"],
|
|
|
+ "output_fields": ["demand_content_id", "evidence_pack", "seed_terms", "source_post_id", "itemset_ids"],
|
|
|
+ "v1_boundary": "真实需求领取读取 demand_content.ext_data.evidence_pack;显式 demand_content_id、run_label、无 selector 默认 pg_pattern_v2 + passed 首条记录均由 CFA 自己的 DB env 接入。本地 JSON 只作 fixture / 回放。",
|
|
|
+ "secret_policy": "只登记 env key,不记录密码。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "SRC_DEMAND_CONTENT_LOCAL_JSON",
|
|
|
+ "display_name": "DemandAgent 本地 demand_content.json",
|
|
|
+ "source_type": "local_json",
|
|
|
+ "status": ["verified", "fixture_only"],
|
|
|
+ "system": "DemandAgentNew local_json",
|
|
|
+ "table_or_endpoint": "examples/demand/test_output_data/{run_id}/demand_content.json",
|
|
|
+ "access_mode": "read",
|
|
|
+ "usage_stages": ["source_seed", "search_intent"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [
|
|
|
+ "content_agent/business_modules/source_seed/source_context.py",
|
|
|
+ "tests/fixtures/real_case_source/source_context.json"
|
|
|
+ ],
|
|
|
+ "required_env_vars": [],
|
|
|
+ "input_fields": ["merge_leve2", "name", "reason", "suggestion", "score", "ext_data"],
|
|
|
+ "required_payload_paths": ["ext_data.evidence_pack"],
|
|
|
+ "output_fields": ["source_context.json", "pattern_seed_pack.json"],
|
|
|
+ "v1_boundary": "本地回归可用;生产读取和 P0F 应直接使用 MySQL demand_content,本地 JSON 不作为生产事实来源。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "SRC_WORKFLOW_DECODE_TASK_RESULT",
|
|
|
+ "display_name": "历史 Case 解构结果表",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "content-deconstruction-supply",
|
|
|
+ "table_or_endpoint": "workflow_decode_task_result",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["source_seed", "search_intent", "pattern_recall"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["CONTENT_SUPPLY_DB_*"],
|
|
|
+ "input_fields": ["channel_content_id"],
|
|
|
+ "output_fields": ["title", "body_text", "images", "video_url", "channel", "purpose_points", "key_points", "inspiration_points", "topic_fusion_result"],
|
|
|
+ "v1_boundary": "可解释历史 Case,不替代 PG Pattern V2 evidence_pack。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "SRC_PG_PATTERN_ITEMSET",
|
|
|
+ "display_name": "PG Pattern V2 itemset 与支撑素材",
|
|
|
+ "source_type": "postgres_table",
|
|
|
+ "status": ["verified", "v1_active"],
|
|
|
+ "system": "open_aigc.public",
|
|
|
+ "table_or_endpoint": "pattern_itemset, pattern_itemset_post, pattern_itemset_item",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["source_seed", "search_intent", "pattern_recall", "learning_review"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["OPEN_AIGC_PG_*", "PGVECTOR_DSN", "DATA_ENGINEERING_OPEN_AIGC_PG_DSN"],
|
|
|
+ "input_fields": ["execution_id", "itemset_id", "mining_config_id", "scope"],
|
|
|
+ "output_fields": ["support", "absolute_support", "matched_post_ids", "itemset_items", "category_id", "category_path", "element_name"],
|
|
|
+ "v1_boundary": "新版 evidence_pack 的正式 Pattern 主事实来源。CFA 可通过 DemandAgent evidence_pack 间接消费,不应临时回旧 MySQL 兜底。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "SRC_PG_PATTERN_CATEGORY",
|
|
|
+ "display_name": "PG Pattern V2 分类快照",
|
|
|
+ "source_type": "postgres_table",
|
|
|
+ "status": ["verified", "v1_active"],
|
|
|
+ "system": "open_aigc.public",
|
|
|
+ "table_or_endpoint": "pattern_mining_category",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["source_seed", "pattern_recall", "learning_review"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["OPEN_AIGC_PG_*", "PGVECTOR_DSN", "DATA_ENGINEERING_OPEN_AIGC_PG_DSN"],
|
|
|
+ "input_fields": ["execution_id", "id", "path", "source_type"],
|
|
|
+ "output_fields": ["name", "description", "category_nature", "level", "parent_id", "element_count"],
|
|
|
+ "v1_boundary": "解释 PG Pattern V2 分类路径,不直接召回平台内容。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "SRC_PG_PATTERN_ELEMENT",
|
|
|
+ "display_name": "PG Pattern V2 元素快照",
|
|
|
+ "source_type": "postgres_table",
|
|
|
+ "status": ["verified", "v1_active"],
|
|
|
+ "system": "open_aigc.public",
|
|
|
+ "table_or_endpoint": "pattern_mining_element",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["source_seed", "pattern_recall", "learning_review"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["OPEN_AIGC_PG_*", "PGVECTOR_DSN", "DATA_ENGINEERING_OPEN_AIGC_PG_DSN"],
|
|
|
+ "input_fields": ["execution_id", "post_id", "source_table", "source_element_id", "element_type", "element_sub_type", "name"],
|
|
|
+ "output_fields": ["category_path", "point_type", "point_text", "element_name"],
|
|
|
+ "v1_boundary": "用于 PG Pattern V2 解释和新发现内容回扣判断。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "SRC_OPEN_AIGC_POST",
|
|
|
+ "display_name": "上游历史内容素材表",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "open_aigc",
|
|
|
+ "table_or_endpoint": "post",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["source_seed", "learning_review"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["OPEN_AIGC_MYSQL_*"],
|
|
|
+ "input_fields": ["post_id", "platform", "merge_leve1", "merge_leve2", "import_date"],
|
|
|
+ "output_fields": ["title", "body_text", "platform_account_id", "platform_account_name", "publish_timestamp", "like_count", "comment_count", "collect_count", "images"],
|
|
|
+ "v1_boundary": "上游素材理解来源,不是当前 CFA 主链路平台召回。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "SRC_OPEN_AIGC_TOPIC_POINT_ELEMENT",
|
|
|
+ "display_name": "上游选题点元素表",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "open_aigc",
|
|
|
+ "table_or_endpoint": "post_decode_topic_point_element",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["source_seed", "pattern_recall", "learning_review"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["OPEN_AIGC_MYSQL_*"],
|
|
|
+ "input_fields": ["post_id", "topic_point_id", "element_type", "element_sub_type"],
|
|
|
+ "output_fields": ["element_name", "element_description", "element_source", "element_reason"],
|
|
|
+ "v1_boundary": "用于理解上游元素,不替代 workflow_decode_task_result。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "SRC_OPEN_AIGC_SCRIPT_ELEMENT",
|
|
|
+ "display_name": "上游脚本段落元素表",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "open_aigc",
|
|
|
+ "table_or_endpoint": "post_script_paragraph_field_element",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["source_seed", "learning_review"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["OPEN_AIGC_MYSQL_*"],
|
|
|
+ "input_fields": ["post_id", "paragraph_id", "field_type", "element_type", "element_sub_type"],
|
|
|
+ "output_fields": ["element_name", "element_description"],
|
|
|
+ "v1_boundary": "策略学习和素材理解来源。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "SRC_OLD_MYSQL_TOPIC_PATTERN",
|
|
|
+ "display_name": "旧 MySQL topic_pattern 兼容层",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified", "deprecated_reference_only"],
|
|
|
+ "system": "open_aigc_pattern",
|
|
|
+ "table_or_endpoint": "topic_pattern_element, topic_pattern_itemset, topic_pattern_category",
|
|
|
+ "access_mode": "not_connected",
|
|
|
+ "usage_stages": ["migration_reference"],
|
|
|
+ "owner_module": "数据源与种子模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["OPEN_AIGC_PATTERN_DB_*", "PATTERN_GLOBAL_DB_*", "CONTENTFIND_PATTERN_DB_*"],
|
|
|
+ "input_fields": ["execution_id", "itemset_id", "category_id"],
|
|
|
+ "output_fields": ["historical_pattern_fields"],
|
|
|
+ "v1_boundary": "只作历史迁移对照,不能进入新版 evidence_pack,不能作为 PG Pattern V2 兜底。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "PLT_DOUYIN_KEYWORD",
|
|
|
+ "display_name": "Crawapi 抖音关键词搜索",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["verified", "v1_active"],
|
|
|
+ "system": "Crawapi Douyin",
|
|
|
+ "table_or_endpoint": "/crawler/dou_yin/keyword",
|
|
|
+ "access_mode": "read",
|
|
|
+ "usage_stages": ["platform_access", "content_discovery"],
|
|
|
+ "owner_module": "平台接入模块",
|
|
|
+ "current_code_refs": ["content_agent/integrations/douyin.py", "content_agent/business_modules/platform_access.py"],
|
|
|
+ "required_env_vars": ["CONTENTFIND_API_CRAWAPI_BASE_URL", "CONTENTFIND_DOUYIN_*"],
|
|
|
+ "input_fields": ["keyword", "content_type", "sort_type", "publish_time", "cursor", "account_id"],
|
|
|
+ "output_fields": ["platform_content_id", "desc", "author", "platform_author_id", "statistics", "has_more", "next_cursor"],
|
|
|
+ "v1_boundary": "V1 real 模式已接关键词搜索一页结果;默认每个 search_query 小预算处理。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "PLT_DOUYIN_DETAIL",
|
|
|
+ "display_name": "Crawapi 抖音内容详情",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "Crawapi Douyin",
|
|
|
+ "table_or_endpoint": "/crawler/dou_yin/detail",
|
|
|
+ "access_mode": "read",
|
|
|
+ "usage_stages": ["platform_access", "content_discovery"],
|
|
|
+ "owner_module": "平台接入模块",
|
|
|
+ "current_code_refs": ["content_agent/integrations/douyin.py", "content_agent/business_modules/platform_access.py"],
|
|
|
+ "required_env_vars": ["CONTENTFIND_API_CRAWAPI_BASE_URL", "CONTENTFIND_DOUYIN_*"],
|
|
|
+ "input_fields": ["content_id"],
|
|
|
+ "output_fields": ["channel_content_id", "content_link", "title", "body_text", "topic_list", "content_type", "video_url_list", "multi_bitrate", "image_url_list", "channel_account_id", "channel_account_name", "like_count", "comment_count", "share_count", "collect_count", "publish_timestamp", "is_original", "has_more", "next_cursor"],
|
|
|
+ "v1_boundary": "2026-06-11 真实 smoke 已确认 code=0,归一化结构(channel_content_id/channel_account_id)与搜索 raw 结构字段名不同;无翻页(has_more=false);view_count/play_count 实测 null;视频下载需 iOS UA + Referer=https://www.douyin.com/。历史漏登,本次补齐。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "PLT_DOUYIN_AUTHOR_WORKS",
|
|
|
+ "display_name": "Crawapi 抖音账号作品",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "Crawapi Douyin",
|
|
|
+ "table_or_endpoint": "/crawler/dou_yin/blogger",
|
|
|
+ "access_mode": "read",
|
|
|
+ "usage_stages": ["walk_strategy", "content_discovery"],
|
|
|
+ "owner_module": "平台接入模块",
|
|
|
+ "current_code_refs": [
|
|
|
+ "content_agent/integrations/douyin.py::CrawapiDouyinClient.fetch_author_works"
|
|
|
+ ],
|
|
|
+ "required_env_vars": ["CONTENTFIND_API_CRAWAPI_BASE_URL", "CONTENTFIND_DOUYIN_*"],
|
|
|
+ "input_fields": ["account_id", "sort_type", "cursor"],
|
|
|
+ "output_fields": ["platform_content_id", "desc", "author", "statistics", "has_more", "next_cursor"],
|
|
|
+ "v1_boundary": "P6 作者边使用;作品仍需逐条 Pattern 回扣和规则判断。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "PLT_DOUYIN_CONTENT_PROFILE",
|
|
|
+ "display_name": "热点宝内容点赞画像",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["verified", "v1_active"],
|
|
|
+ "system": "Crawapi Douyin",
|
|
|
+ "table_or_endpoint": "/crawler/dou_yin/re_dian_bao/video_like_portrait",
|
|
|
+ "access_mode": "read",
|
|
|
+ "usage_stages": ["platform_access", "content_discovery", "rule_judgment"],
|
|
|
+ "owner_module": "平台接入模块",
|
|
|
+ "current_code_refs": ["content_agent/integrations/douyin.py"],
|
|
|
+ "required_env_vars": ["CONTENTFIND_API_CRAWAPI_BASE_URL", "CONTENTFIND_DOUYIN_*"],
|
|
|
+ "input_fields": ["content_id", "need_age", "need_gender", "need_province"],
|
|
|
+ "output_fields": ["age_profile", "gender_profile", "province_profile", "percentage", "preference"],
|
|
|
+ "v1_boundary": "作为内容 50+ 画像信号,不直接代表内容质量。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "PLT_DOUYIN_AUTHOR_PROFILE",
|
|
|
+ "display_name": "热点宝账号画像",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "Crawapi Douyin",
|
|
|
+ "table_or_endpoint": "/crawler/dou_yin/re_dian_bao/account_fans_portrait",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["walk_strategy", "rule_judgment"],
|
|
|
+ "owner_module": "平台接入模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["CONTENTFIND_API_CRAWAPI_BASE_URL", "CONTENTFIND_DOUYIN_*"],
|
|
|
+ "input_fields": ["account_id", "need_age", "need_gender", "need_province"],
|
|
|
+ "output_fields": ["age_profile", "gender_profile", "province_profile", "percentage", "preference"],
|
|
|
+ "v1_boundary": "作者强不代表作品必然强;V1 不做账号画像兜底。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "PLT_DOUYIN_HOT_RANK",
|
|
|
+ "display_name": "今日热榜",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "Crawapi Hot Rank",
|
|
|
+ "table_or_endpoint": "/crawler/jin_ri_re_bang/content_rank",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["source_seed", "search_intent"],
|
|
|
+ "owner_module": "平台接入模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["CONTENTFIND_API_CRAWAPI_BASE_URL", "CONTENTFIND_HOT_TOPIC_PATH"],
|
|
|
+ "input_fields": ["sort_type", "cursor"],
|
|
|
+ "output_fields": ["source", "jump_url", "type", "rankList.title", "rankList.heat", "has_more", "next_cursor"],
|
|
|
+ "v1_boundary": "热点只做探索入口,不等于最终内容源。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "PLT_TIKHUB_SEARCH_FALLBACK",
|
|
|
+ "display_name": "TikHub 抖音搜索备用通道",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["blocked", "missing"],
|
|
|
+ "system": "TikHub",
|
|
|
+ "table_or_endpoint": "TIKHUB_DOUYIN_SEARCH_PATH",
|
|
|
+ "access_mode": "not_connected",
|
|
|
+ "usage_stages": ["platform_access"],
|
|
|
+ "owner_module": "平台接入模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["TIKHUB_API_KEY", "TIKHUB_BASE_URL", "TIKHUB_DOUYIN_SEARCH_PATH"],
|
|
|
+ "input_fields": ["keyword", "cursor", "sort_type", "publish_time", "filter_duration", "content_type", "search_id", "backtrace"],
|
|
|
+ "output_fields": ["business_data", "next_page", "backtrace"],
|
|
|
+ "v1_boundary": "缺 key,不能写成已接入。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "JDG_DECODE_API",
|
|
|
+ "display_name": "内容解构接口",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["source_only"],
|
|
|
+ "system": "Aiddit AIGC Decode",
|
|
|
+ "table_or_endpoint": "https://aigc-api.aiddit.com/aigc/api/task/decode, https://aigc-api.aiddit.com/aigc/api/task/decode/result",
|
|
|
+ "access_mode": "read",
|
|
|
+ "usage_stages": ["pattern_recall", "rule_judgment"],
|
|
|
+ "owner_module": "发现内容与证据模块",
|
|
|
+ "current_code_refs": [
|
|
|
+ "content_agent/integrations/decode_api.py::AigcDecodeClient",
|
|
|
+ "content_agent/business_modules/content_discovery/pattern_recall/decode.py::decode_content"
|
|
|
+ ],
|
|
|
+ "required_env_vars": [],
|
|
|
+ "input_fields": ["platform_content_id", "platform_content_url", "configId"],
|
|
|
+ "output_fields": ["decode_status", "purpose_points", "key_points", "inspiration_points", "topic_fusion_result"],
|
|
|
+ "v1_boundary": "当前 CFA 主链路尚未接入;Pattern 回扣必须依赖解构强证据词。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "JDG_CATEGORY_MATCH_PATHS",
|
|
|
+ "display_name": "分类树 match-paths",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["verified", "source_only"],
|
|
|
+ "system": "Aiddit Library",
|
|
|
+ "table_or_endpoint": "https://library.aiddit.com/api/search/categories/match-paths/v2",
|
|
|
+ "access_mode": "read",
|
|
|
+ "usage_stages": ["pattern_recall", "rule_judgment"],
|
|
|
+ "owner_module": "发现内容与证据模块",
|
|
|
+ "current_code_refs": [
|
|
|
+ "content_agent/integrations/category_match.py::CategoryMatchClient.match_paths",
|
|
|
+ "content_agent/business_modules/content_discovery/pattern_recall/category_match.py::match_decode_terms"
|
|
|
+ ],
|
|
|
+ "required_env_vars": [],
|
|
|
+ "input_fields": ["source_type", "top_k", "min_score", "items.term", "items.description"],
|
|
|
+ "output_fields": ["matched_category_paths", "score", "matched_terms"],
|
|
|
+ "v1_boundary": "在线向量匹配结果会漂移;2026-06-08 已确认当前 endpoint 为 v2,不能把某次分数写成稳定业务合同。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "QRY_OPENROUTER",
|
|
|
+ "display_name": "OpenRouter LLM 能力",
|
|
|
+ "source_type": "capability",
|
|
|
+ "status": ["source_only"],
|
|
|
+ "system": "OpenRouter",
|
|
|
+ "table_or_endpoint": "chat completion / tool use",
|
|
|
+ "access_mode": "not_connected",
|
|
|
+ "usage_stages": ["search_intent", "rule_judgment"],
|
|
|
+ "owner_module": "搜索意图模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["OPEN_ROUTER_API_KEY", "OPENROUTER_API_KEY", "OPENROUTER_BASE_URL"],
|
|
|
+ "input_fields": ["model", "messages", "tools", "system", "max_tokens", "temperature"],
|
|
|
+ "output_fields": ["content", "tool_calls", "usage", "finish_reason"],
|
|
|
+ "v1_boundary": "本轮只做 key metadata 探测;真实生成必须另开预算和策略开关。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "ASSET_DEMAND_FIND_CONTENT_RESULT",
|
|
|
+ "display_name": "旧版内容结果沉淀表",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "content-deconstruction-supply",
|
|
|
+ "table_or_endpoint": "demand_find_content_result",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["asset_commit", "learning_review"],
|
|
|
+ "owner_module": "结果沉淀与来源反查模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["CONTENT_SUPPLY_DB_*"],
|
|
|
+ "input_fields": ["run_id", "query", "rank_no", "channel", "platform_content_id", "demand_content_id"],
|
|
|
+ "output_fields": ["video_url", "title", "author_name", "author_id", "process_trace", "crawler_plan_id", "produce_plan_id", "publish_plan_id", "web_html_url"],
|
|
|
+ "v1_boundary": "旧版只沉淀最终内容,不保存全量发现内容和结构化淘汰原因。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "ASSET_DEMAND_FIND_AUTHOR",
|
|
|
+ "display_name": "旧版作者资产表",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "content-deconstruction-supply",
|
|
|
+ "table_or_endpoint": "demand_find_author",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["walk_strategy", "asset_commit", "learning_review"],
|
|
|
+ "owner_module": "结果沉淀与来源反查模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["CONTENT_SUPPLY_DB_*"],
|
|
|
+ "input_fields": ["author_id", "author_name", "author_link", "content_tags", "channel"],
|
|
|
+ "output_fields": ["elderly_ratio", "elderly_tgi", "is_good", "remark"],
|
|
|
+ "v1_boundary": "历史作者参考不进入 P6 V1 默认边;作者资产启用等 P6 作者边实现后再处理。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "LEARN_DEMAND_FIND_TASK",
|
|
|
+ "display_name": "旧版任务级 run_context 表",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "content-deconstruction-supply",
|
|
|
+ "table_or_endpoint": "demand_find_task",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["learning_review"],
|
|
|
+ "owner_module": "策略学习模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["CONTENT_SUPPLY_DB_*"],
|
|
|
+ "input_fields": ["run_id", "demand_content_id", "status", "created_at", "token_coast"],
|
|
|
+ "output_fields": ["task_status", "cost", "demand_relation"],
|
|
|
+ "v1_boundary": "只能看任务级结果,不能还原全量发现内容过程。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "LEARN_DEMAND_TASK_OPRATE",
|
|
|
+ "display_name": "旧版调度和预算开关表",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["source_only"],
|
|
|
+ "system": "content-deconstruction-supply",
|
|
|
+ "table_or_endpoint": "demand_task_oprate",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["learning_review", "policy_version"],
|
|
|
+ "owner_module": "策略学习模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["CONTENT_SUPPLY_DB_*"],
|
|
|
+ "input_fields": ["is_open", "day_limit_coast", "update_time"],
|
|
|
+ "output_fields": ["enabled", "daily_budget"],
|
|
|
+ "v1_boundary": "策略控制数据,不是学习结论。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "ASSET_AIGC_PLAN_DETAIL",
|
|
|
+ "display_name": "AIGC 后处理计划详情",
|
|
|
+ "source_type": "http_api",
|
|
|
+ "status": ["source_only", "blocked"],
|
|
|
+ "system": "AIGC plan",
|
|
|
+ "table_or_endpoint": "produce plan detail / crawler plan / publish plan",
|
|
|
+ "access_mode": "not_connected",
|
|
|
+ "usage_stages": ["asset_commit", "publish_job"],
|
|
|
+ "owner_module": "结果沉淀与来源反查模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["AIGC_TOKEN", "CONTENTFIND_API_AIGC_TOKEN", "CONTENTFIND_API_READONLY_TOKEN", "CONTENTFIND_AIGC_READONLY_PRODUCE_PLAN_ID"],
|
|
|
+ "input_fields": ["platform_content_id", "merge_leve2", "produce_plan_id", "account_id", "sort_type"],
|
|
|
+ "output_fields": ["crawler_plan_id", "produce_plan_id", "produce_plan_name", "publish_plan_id"],
|
|
|
+ "v1_boundary": "写侧有副作用;V1 已拍板不自动触发发布接口。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "ASSET_OSS_LOG_HTML",
|
|
|
+ "display_name": "OSS 过程可视化链接",
|
|
|
+ "source_type": "capability",
|
|
|
+ "status": ["source_only", "blocked", "missing"],
|
|
|
+ "system": "Aliyun OSS",
|
|
|
+ "table_or_endpoint": "OSS object storage",
|
|
|
+ "access_mode": "not_connected",
|
|
|
+ "usage_stages": ["asset_commit", "run_record"],
|
|
|
+ "owner_module": "运行记录模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["ALIYUN_OSS_ACCESS_KEY_ID", "ALIYUN_OSS_ACCESS_KEY_SECRET", "ALIYUN_OSS_BUCKET", "ALIYUN_OSS_REGION", "ALIYUN_OSS_PREFIX", "ALIYUN_OSS_PUBLIC_BASE_URL"],
|
|
|
+ "input_fields": ["html_path", "object_key", "task_id"],
|
|
|
+ "output_fields": ["web_html_url"],
|
|
|
+ "v1_boundary": "缺真实 OSS 配置;不能写成已接入。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "LEARN_ODPS_DEMAND_POOL",
|
|
|
+ "display_name": "ODPS 需求池表现参考",
|
|
|
+ "source_type": "odps_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "ODPS",
|
|
|
+ "table_or_endpoint": "dwd_multi_demand_pool_di",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["learning_review"],
|
|
|
+ "owner_module": "策略学习模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["ODPS_ACCESS_ID", "ODPS_ACCESS_KEY", "ODPS_ENDPOINT", "ODPS_PROJECT"],
|
|
|
+ "input_fields": ["strategy", "demand_id", "demand_name", "weight", "type", "video_count", "video_list", "extend", "dt"],
|
|
|
+ "output_fields": ["demand_performance", "video_list"],
|
|
|
+ "v1_boundary": "表现参考,不是实时判断输入。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "LEARN_ODPS_FEATURE_POINT",
|
|
|
+ "display_name": "ODPS 特征点表现参考",
|
|
|
+ "source_type": "odps_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "ODPS",
|
|
|
+ "table_or_endpoint": "feature_point_data",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["learning_review"],
|
|
|
+ "owner_module": "策略学习模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["ODPS_ACCESS_ID", "ODPS_ACCESS_KEY", "ODPS_ENDPOINT", "ODPS_PROJECT"],
|
|
|
+ "input_fields": ["特征点", "分发视频量", "vid_list", "dt"],
|
|
|
+ "output_fields": ["曝光", "回流", "播放", "视频列表"],
|
|
|
+ "v1_boundary": "用于后续策略学习,不是 V1 实时评分表。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "LEARN_LOGHUB_VIDEO_DIMENSION",
|
|
|
+ "display_name": "视频表现宽表",
|
|
|
+ "source_type": "odps_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "loghubods",
|
|
|
+ "table_or_endpoint": "video_dimension_detail_add_column",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["learning_review"],
|
|
|
+ "owner_module": "策略学习模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["ODPS_ACCESS_ID", "ODPS_ACCESS_KEY", "ODPS_ENDPOINT", "ODPS_PROJECT"],
|
|
|
+ "input_fields": ["视频id", "视频地址", "标题", "一级品类", "二级品类", "上传渠道", "dt"],
|
|
|
+ "output_fields": ["曝光", "播放", "回流", "标签"],
|
|
|
+ "v1_boundary": "宽表只列策略学习关键字段。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "LEARN_GLOBAL_TAXONOMY",
|
|
|
+ "display_name": "open_aigc 全局分类与元素",
|
|
|
+ "source_type": "mysql_table",
|
|
|
+ "status": ["verified"],
|
|
|
+ "system": "open_aigc",
|
|
|
+ "table_or_endpoint": "global_category, global_element, element_classification_mapping",
|
|
|
+ "access_mode": "planned_read",
|
|
|
+ "usage_stages": ["pattern_recall", "learning_review"],
|
|
|
+ "owner_module": "策略学习模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": ["OPEN_AIGC_MYSQL_*"],
|
|
|
+ "input_fields": ["stable_id", "name", "source_type", "path", "source_element_id", "post_id", "classification_path"],
|
|
|
+ "output_fields": ["category_tree", "global_element", "classification_mapping"],
|
|
|
+ "v1_boundary": "长期概念分类来源;不替代在线 match-paths。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "GAP_XIAOHONGSHU_PLATFORM",
|
|
|
+ "display_name": "小红书笔记、作者、话题接口",
|
|
|
+ "source_type": "gap",
|
|
|
+ "status": ["missing"],
|
|
|
+ "system": "xiaohongshu",
|
|
|
+ "table_or_endpoint": "not_available",
|
|
|
+ "access_mode": "not_connected",
|
|
|
+ "usage_stages": ["platform_access", "walk_strategy"],
|
|
|
+ "owner_module": "平台接入模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": [],
|
|
|
+ "input_fields": [],
|
|
|
+ "output_fields": [],
|
|
|
+ "v1_boundary": "产品可以设计,但技术文档不能写成已接入。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "GAP_OTHER_PLATFORMS",
|
|
|
+ "display_name": "快手、B站、视频号、票圈等平台",
|
|
|
+ "source_type": "gap",
|
|
|
+ "status": ["missing"],
|
|
|
+ "system": "multi_platform",
|
|
|
+ "table_or_endpoint": "not_available",
|
|
|
+ "access_mode": "not_connected",
|
|
|
+ "usage_stages": ["platform_access"],
|
|
|
+ "owner_module": "平台接入模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": [],
|
|
|
+ "input_fields": [],
|
|
|
+ "output_fields": [],
|
|
|
+ "v1_boundary": "暂时不能复用抖音字段口径。"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "source_id": "GAP_RELATED_DISCOVERY",
|
|
|
+ "display_name": "相关搜索、视频 tag、共创作者、相似作者、相似内容",
|
|
|
+ "source_type": "gap",
|
|
|
+ "status": ["missing"],
|
|
|
+ "system": "platform_related_discovery",
|
|
|
+ "table_or_endpoint": "not_available",
|
|
|
+ "access_mode": "not_connected",
|
|
|
+ "usage_stages": ["walk_strategy"],
|
|
|
+ "owner_module": "游走策略模块",
|
|
|
+ "current_code_refs": [],
|
|
|
+ "required_env_vars": [],
|
|
|
+ "input_fields": [],
|
|
|
+ "output_fields": [],
|
|
|
+ "v1_boundary": "可作为游走方向,但必须标为待验证。"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "stage_index": {
|
|
|
+ "source_seed": ["SRC_DEMAND_CONTENT_MYSQL", "SRC_DEMAND_CONTENT_LOCAL_JSON", "SRC_WORKFLOW_DECODE_TASK_RESULT", "SRC_PG_PATTERN_ITEMSET", "SRC_PG_PATTERN_CATEGORY", "SRC_PG_PATTERN_ELEMENT", "SRC_OPEN_AIGC_POST", "SRC_OPEN_AIGC_TOPIC_POINT_ELEMENT", "SRC_OPEN_AIGC_SCRIPT_ELEMENT", "PLT_DOUYIN_HOT_RANK"],
|
|
|
+ "search_intent": ["SRC_DEMAND_CONTENT_MYSQL", "SRC_DEMAND_CONTENT_LOCAL_JSON", "SRC_PG_PATTERN_ITEMSET", "QRY_OPENROUTER"],
|
|
|
+ "platform_access": ["PLT_DOUYIN_KEYWORD", "PLT_DOUYIN_DETAIL", "PLT_DOUYIN_AUTHOR_WORKS", "PLT_DOUYIN_CONTENT_PROFILE", "PLT_DOUYIN_AUTHOR_PROFILE", "PLT_TIKHUB_SEARCH_FALLBACK", "GAP_XIAOHONGSHU_PLATFORM", "GAP_OTHER_PLATFORMS"],
|
|
|
+ "content_discovery": ["PLT_DOUYIN_KEYWORD", "PLT_DOUYIN_DETAIL", "PLT_DOUYIN_CONTENT_PROFILE"],
|
|
|
+ "pattern_recall": ["JDG_DECODE_API", "JDG_CATEGORY_MATCH_PATHS", "SRC_WORKFLOW_DECODE_TASK_RESULT", "SRC_PG_PATTERN_ITEMSET", "SRC_PG_PATTERN_CATEGORY", "SRC_PG_PATTERN_ELEMENT", "LEARN_GLOBAL_TAXONOMY"],
|
|
|
+ "rule_judgment": ["PLT_DOUYIN_CONTENT_PROFILE", "PLT_DOUYIN_AUTHOR_PROFILE", "JDG_DECODE_API", "JDG_CATEGORY_MATCH_PATHS"],
|
|
|
+ "walk_strategy": ["PLT_DOUYIN_AUTHOR_WORKS", "ASSET_DEMAND_FIND_AUTHOR", "GAP_RELATED_DISCOVERY", "GAP_XIAOHONGSHU_PLATFORM"],
|
|
|
+ "asset_commit": ["ASSET_DEMAND_FIND_CONTENT_RESULT", "ASSET_DEMAND_FIND_AUTHOR", "ASSET_AIGC_PLAN_DETAIL", "ASSET_OSS_LOG_HTML"],
|
|
|
+ "learning_review": ["LEARN_DEMAND_FIND_TASK", "LEARN_DEMAND_TASK_OPRATE", "ASSET_DEMAND_FIND_CONTENT_RESULT", "ASSET_DEMAND_FIND_AUTHOR", "LEARN_ODPS_DEMAND_POOL", "LEARN_ODPS_FEATURE_POINT", "LEARN_LOGHUB_VIDEO_DIMENSION", "LEARN_GLOBAL_TAXONOMY", "SRC_PG_PATTERN_ITEMSET"]
|
|
|
+ },
|
|
|
+ "status_index": {
|
|
|
+ "v1_active": ["SRC_DEMAND_CONTENT_MYSQL", "SRC_DEMAND_CONTENT_LOCAL_JSON", "SRC_PG_PATTERN_ITEMSET", "SRC_PG_PATTERN_CATEGORY", "SRC_PG_PATTERN_ELEMENT", "PLT_DOUYIN_KEYWORD", "PLT_DOUYIN_CONTENT_PROFILE"],
|
|
|
+ "verified": ["SRC_DEMAND_CONTENT_MYSQL", "SRC_DEMAND_CONTENT_LOCAL_JSON", "SRC_WORKFLOW_DECODE_TASK_RESULT", "SRC_PG_PATTERN_ITEMSET", "SRC_PG_PATTERN_CATEGORY", "SRC_PG_PATTERN_ELEMENT", "SRC_OPEN_AIGC_POST", "SRC_OPEN_AIGC_TOPIC_POINT_ELEMENT", "SRC_OPEN_AIGC_SCRIPT_ELEMENT", "SRC_OLD_MYSQL_TOPIC_PATTERN", "PLT_DOUYIN_KEYWORD", "PLT_DOUYIN_DETAIL", "PLT_DOUYIN_AUTHOR_WORKS", "PLT_DOUYIN_CONTENT_PROFILE", "PLT_DOUYIN_AUTHOR_PROFILE", "PLT_DOUYIN_HOT_RANK", "JDG_CATEGORY_MATCH_PATHS", "ASSET_DEMAND_FIND_CONTENT_RESULT", "ASSET_DEMAND_FIND_AUTHOR", "LEARN_DEMAND_FIND_TASK", "LEARN_ODPS_DEMAND_POOL", "LEARN_ODPS_FEATURE_POINT", "LEARN_LOGHUB_VIDEO_DIMENSION", "LEARN_GLOBAL_TAXONOMY"],
|
|
|
+ "missing_or_blocked": ["PLT_TIKHUB_SEARCH_FALLBACK", "ASSET_AIGC_PLAN_DETAIL", "ASSET_OSS_LOG_HTML", "GAP_XIAOHONGSHU_PLATFORM", "GAP_OTHER_PLATFORMS", "GAP_RELATED_DISCOVERY"]
|
|
|
+ },
|
|
|
+ "env_var_index": {
|
|
|
+ "CONTENT_SUPPLY_DB_*": ["SRC_DEMAND_CONTENT_MYSQL", "SRC_WORKFLOW_DECODE_TASK_RESULT", "ASSET_DEMAND_FIND_CONTENT_RESULT", "ASSET_DEMAND_FIND_AUTHOR", "LEARN_DEMAND_FIND_TASK", "LEARN_DEMAND_TASK_OPRATE"],
|
|
|
+ "OPEN_AIGC_PG_*": ["SRC_PG_PATTERN_ITEMSET", "SRC_PG_PATTERN_CATEGORY", "SRC_PG_PATTERN_ELEMENT"],
|
|
|
+ "OPEN_AIGC_MYSQL_*": ["SRC_OPEN_AIGC_POST", "SRC_OPEN_AIGC_TOPIC_POINT_ELEMENT", "SRC_OPEN_AIGC_SCRIPT_ELEMENT", "LEARN_GLOBAL_TAXONOMY"],
|
|
|
+ "CONTENTFIND_API_CRAWAPI_BASE_URL": ["PLT_DOUYIN_KEYWORD", "PLT_DOUYIN_DETAIL", "PLT_DOUYIN_AUTHOR_WORKS", "PLT_DOUYIN_CONTENT_PROFILE", "PLT_DOUYIN_AUTHOR_PROFILE", "PLT_DOUYIN_HOT_RANK"],
|
|
|
+ "TIKHUB_API_KEY": ["PLT_TIKHUB_SEARCH_FALLBACK"],
|
|
|
+ "OPENROUTER_API_KEY": ["QRY_OPENROUTER"],
|
|
|
+ "AIGC_TOKEN": ["ASSET_AIGC_PLAN_DETAIL"],
|
|
|
+ "ALIYUN_OSS_*": ["ASSET_OSS_LOG_HTML"],
|
|
|
+ "ODPS_*": ["LEARN_ODPS_DEMAND_POOL", "LEARN_ODPS_FEATURE_POINT", "LEARN_LOGHUB_VIDEO_DIMENSION"]
|
|
|
+ },
|
|
|
+ "validation_rules": [
|
|
|
+ "每个 source_id 必须唯一。",
|
|
|
+ "status 只能使用 status_legend 中登记的值。",
|
|
|
+ "source_type 只能使用 source_type_legend 中登记的值。",
|
|
|
+ "required_env_vars 只登记变量名或通配符,不登记 secret 值。",
|
|
|
+ "deprecated_reference_only 的来源不能作为 v1_active 来源。",
|
|
|
+ "missing 或 blocked 的来源不能写成已接入。"
|
|
|
+ ]
|
|
|
+}
|