feihong-code 8.0.0 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/.github/workflows/ci.yml +193 -193
  2. package/CHANGELOG.md +140 -117
  3. package/README.md +656 -636
  4. package/agent-team/.env.example +13 -0
  5. package/agent-team/README.md +42 -0
  6. package/agent-team/agents/__init__.py +0 -0
  7. package/agent-team/agents/l1_acquisition.py +207 -0
  8. package/agent-team/agents/l2_content.py +237 -0
  9. package/agent-team/agents/l3_conversion.py +148 -0
  10. package/agent-team/agents/l4_analysis.py +118 -0
  11. package/agent-team/agents/l5_management.py +52 -0
  12. package/agent-team/agents/registry.py +60 -0
  13. package/agent-team/config.py +39 -0
  14. package/agent-team/core/__init__.py +0 -0
  15. package/agent-team/core/agent.py +73 -0
  16. package/agent-team/core/models.py +347 -0
  17. package/agent-team/core/scheduler.py +150 -0
  18. package/agent-team/core/task.py +121 -0
  19. package/agent-team/feihongzhi.db +0 -0
  20. package/agent-team/llm/__init__.py +12 -0
  21. package/agent-team/llm/base.py +22 -0
  22. package/agent-team/llm/doubao_llm.py +52 -0
  23. package/agent-team/llm/mock_llm.py +42 -0
  24. package/agent-team/main.py +235 -0
  25. package/agent-team/requirements.txt +2 -0
  26. package/agent-team/skill_packager.py +248 -0
  27. package/agent-team/skills/01_AI/350/216/267/345/256/242/347/272/277/347/264/242/351/233/267/350/276/276/SKILL.md +40 -0
  28. package/agent-team/skills/01_AI/350/216/267/345/256/242/347/272/277/347/264/242/351/233/267/350/276/276/run.py +111 -0
  29. package/agent-team/skills/02_AI/351/224/200/345/224/256/350/267/237/350/277/233/351/224/200/345/206/240/SKILL.md +38 -0
  30. package/agent-team/skills/02_AI/351/224/200/345/224/256/350/267/237/350/277/233/351/224/200/345/206/240/run.py +108 -0
  31. package/agent-team/skills/03_/350/257/204/350/256/272/345/214/272/345/225/206/346/234/272/350/257/206/345/210/253/345/256/230/SKILL.md +38 -0
  32. package/agent-team/skills/03_/350/257/204/350/256/272/345/214/272/345/225/206/346/234/272/350/257/206/345/210/253/345/256/230/run.py +106 -0
  33. package/agent-team/skills/04_/345/256/242/346/210/267/350/201/212/345/244/251/346/210/220/344/272/244/345/210/206/346/236/220/345/256/230/SKILL.md +37 -0
  34. package/agent-team/skills/04_/345/256/242/346/210/267/350/201/212/345/244/251/346/210/220/344/272/244/345/210/206/346/236/220/345/256/230/run.py +107 -0
  35. package/agent-team/skills/05_/345/220/214/350/241/214/347/210/206/346/254/276/351/233/267/350/276/276/SKILL.md +38 -0
  36. package/agent-team/skills/05_/345/220/214/350/241/214/347/210/206/346/254/276/351/233/267/350/276/276/run.py +99 -0
  37. package/agent-team/skills/06_/346/257/217/346/227/245/347/262/276/345/207/206/350/216/267/345/256/242/351/200/211/351/242/230/345/256/230/SKILL.md +39 -0
  38. package/agent-team/skills/06_/346/257/217/346/227/245/347/262/276/345/207/206/350/216/267/345/256/242/351/200/211/351/242/230/345/256/230/run.py +103 -0
  39. package/agent-team/skills/07_AI/345/244/226/350/264/270/345/274/200/345/217/221/345/256/242/346/210/267/345/221/230/345/267/245/SKILL.md +39 -0
  40. package/agent-team/skills/07_AI/345/244/226/350/264/270/345/274/200/345/217/221/345/256/242/346/210/267/345/221/230/345/267/245/run.py +103 -0
  41. package/agent-team/skills/08_/345/260/217/347/272/242/344/271/246/347/262/276/345/207/206/350/216/267/345/256/242/345/221/230/345/267/245/SKILL.md +40 -0
  42. package/agent-team/skills/08_/345/260/217/347/272/242/344/271/246/347/262/276/345/207/206/350/216/267/345/256/242/345/221/230/345/267/245/run.py +97 -0
  43. package/agent-team/skills/09_/347/247/201/345/237/237/345/256/242/346/210/267/345/210/206/345/261/202/350/267/237/350/277/233/345/256/230/SKILL.md +38 -0
  44. package/agent-team/skills/09_/347/247/201/345/237/237/345/256/242/346/210/267/345/210/206/345/261/202/350/267/237/350/277/233/345/256/230/run.py +106 -0
  45. package/agent-team/skills/10_GEO/345/225/206/346/234/272/350/257/212/346/226/255/345/256/230/SKILL.md +38 -0
  46. package/agent-team/skills/10_GEO/345/225/206/346/234/272/350/257/212/346/226/255/345/256/230/run.py +108 -0
  47. package/agent-team/skills/11_/344/270/200/344/272/272/345/205/254/345/217/270AI/345/221/230/345/267/245/350/260/203/345/272/246/345/256/230/SKILL.md +37 -0
  48. package/agent-team/skills/11_/344/270/200/344/272/272/345/205/254/345/217/270AI/345/221/230/345/267/245/350/260/203/345/272/246/345/256/230/run.py +111 -0
  49. package/agent-team/skills/12_/350/200/201/346/235/277/347/237/255/350/247/206/351/242/221/350/216/267/345/256/242/350/204/232/346/234/254/345/256/230/SKILL.md +39 -0
  50. package/agent-team/skills/12_/350/200/201/346/235/277/347/237/255/350/247/206/351/242/221/350/216/267/345/256/242/350/204/232/346/234/254/345/256/230/run.py +104 -0
  51. package/agent-team/skills/13_/345/215/232/344/270/273/350/264/246/345/217/267/346/267/261/345/272/246/346/213/206/350/247/243/345/256/230/SKILL.md +37 -0
  52. package/agent-team/skills/13_/345/215/232/344/270/273/350/264/246/345/217/267/346/267/261/345/272/246/346/213/206/350/247/243/345/256/230/run.py +105 -0
  53. package/agent-team/skills/14_AI/347/237/255/350/247/206/351/242/221/350/207/252/345/212/250/345/211/252/350/276/221/345/270/210/SKILL.md +39 -0
  54. package/agent-team/skills/14_AI/347/237/255/350/247/206/351/242/221/350/207/252/345/212/250/345/211/252/350/276/221/345/270/210/run.py +108 -0
  55. package/agent-team/skills/15_/345/205/254/344/274/227/345/217/267/350/207/252/345/212/250/350/277/220/350/220/245/345/217/221/345/270/203/345/256/230/SKILL.md +38 -0
  56. package/agent-team/skills/15_/345/205/254/344/274/227/345/217/267/350/207/252/345/212/250/350/277/220/350/220/245/345/217/221/345/270/203/345/256/230/run.py +105 -0
  57. package/agent-team/skills/16_/350/241/214/344/270/232/346/267/261/345/272/246/345/210/206/346/236/220/345/270/210/SKILL.md +38 -0
  58. package/agent-team/skills/16_/350/241/214/344/270/232/346/267/261/345/272/246/345/210/206/346/236/220/345/270/210/run.py +108 -0
  59. package/agent-team/skills/17_/346/212/225/350/265/204/347/240/224/347/251/266/345/222/250/350/257/242/345/256/230/SKILL.md +38 -0
  60. package/agent-team/skills/17_/346/212/225/350/265/204/347/240/224/347/251/266/345/222/250/350/257/242/345/256/230/run.py +106 -0
  61. package/agent-team/tests/__init__.py +0 -0
  62. package/agent-team/tests/test_core.py +156 -0
  63. package/dist/agent/agent-session.js +103 -0
  64. package/dist/agent/agent-session.js.map +1 -0
  65. package/dist/agent/orchestrator.js +8 -0
  66. package/dist/agent/orchestrator.js.map +1 -1
  67. package/dist/agent/steer.js +52 -0
  68. package/dist/agent/steer.js.map +1 -0
  69. package/dist/cli/index.js +1 -0
  70. package/dist/cli/index.js.map +1 -1
  71. package/dist/cli/node-guard.js +17 -0
  72. package/dist/cli/node-guard.js.map +1 -0
  73. package/dist/cli/run.js +2 -0
  74. package/dist/cli/run.js.map +1 -1
  75. package/dist/cli/version.js +1 -1
  76. package/dist/enterprise/policy.js +40 -17
  77. package/dist/enterprise/policy.js.map +1 -1
  78. package/dist/tools/agents/agents-bridge.js +144 -0
  79. package/dist/tools/agents/agents-bridge.js.map +1 -0
  80. package/dist/tools/desktop/desktop-guard.js +81 -0
  81. package/dist/tools/desktop/desktop-guard.js.map +1 -0
  82. package/dist/tools/desktop/desktop.tool.js +201 -0
  83. package/dist/tools/desktop/desktop.tool.js.map +1 -0
  84. package/dist/tools/desktop/feihong-win.js +163 -0
  85. package/dist/tools/desktop/feihong-win.js.map +1 -0
  86. package/dist/tools/desktop/index.js +37 -0
  87. package/dist/tools/desktop/index.js.map +1 -0
  88. package/dist/tools/index.js +2 -0
  89. package/dist/tools/index.js.map +1 -1
  90. package/dist/tools/mcp/index.js +10 -2
  91. package/dist/tools/mcp/index.js.map +1 -1
  92. package/dist/tools/mcp/mcp-client.js +4 -0
  93. package/dist/tools/mcp/mcp-client.js.map +1 -1
  94. package/dist/tools/sandbox.js +28 -0
  95. package/dist/tools/sandbox.js.map +1 -1
  96. package/dist/web/public/public/css/style.css +1756 -0
  97. package/dist/web/public/public/favicon.svg +11 -0
  98. package/dist/web/public/public/index.html +1246 -0
  99. package/dist/web/public/public/js/api.js +558 -0
  100. package/dist/web/public/public/js/app.js +2233 -0
  101. package/dist/web/public/public/js/mock-api.js +259 -0
  102. package/dist/web/public/public/js/monaco-editor.js +363 -0
  103. package/dist/web/public/public/js/ui.js +2217 -0
  104. package/dist/web/public/public/js/utils.js +214 -0
  105. package/dist/web/public/public/manifest.json +59 -0
  106. package/dist/web/public/public/robots.txt +14 -0
  107. package/dist/web/public/public/service-worker.js +149 -0
  108. package/docs/AI/345/221/230/345/267/245/345/206/233/345/233/242-/346/225/264/345/220/210/350/257/264/346/230/216.md +68 -0
  109. package/docs/API.md +1 -1
  110. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +3 -3
  111. package/docs/P1.1-P3-P5/345/267/245/347/250/213/345/256/236/346/226/275/346/200/273/347/273/223.md +328 -0
  112. package/docs/P5-Pi/345/257/271/347/205/247/350/257/204/346/265/213/346/212/245/345/221/212-mock/346/250/241/345/274/217.json +125 -0
  113. package/docs/P5-Pi/345/257/271/347/205/247/350/257/204/346/265/213/346/212/245/345/221/212-/347/234/237/345/256/236/346/250/241/345/236/213.json +138 -0
  114. package/docs/P5-pi-compare-real-report.json +138 -0
  115. package/docs/P5-pi-compare-report.json +125 -0
  116. package/docs/Pi-Agent/346/216/245/345/205/245/351/243/236/350/231/271Code-MVP/351/233/206/346/210/220/344/272/244/344/273/230/347/211/251.md +355 -0
  117. package/docs/Pi-Agent/346/216/245/345/205/245/351/243/236/350/231/271Code/344/273/267/345/200/274/345/210/206/346/236/220-/345/274/200/345/217/221/346/226/207/346/241/243.md +291 -0
  118. package/docs/Pi-Agent/346/216/245/345/205/245/351/243/236/350/231/271Code/344/273/267/345/200/274/351/207/215/344/274/260-/345/217/257/350/247/206/345/214/226.html +84 -0
  119. package/docs/SWE-bench-300-agnes-2.5-flash-/346/234/200/347/273/210/346/212/245/345/221/212.json +2012 -0
  120. package/docs/SWE-bench-300-agnes-2.5-flash-/350/267/221/345/210/206/346/212/245/345/221/212.md +74 -0
  121. package/docs/SWE-bench-Lite-DeepSeek-V4-Flash-/350/267/221/345/210/206/346/212/245/345/221/212.md +102 -0
  122. package/docs/TECHNICAL-SPECIFICATION.md +66 -0
  123. package/docs/TECHNICAL-SPECIFICATION.pdf +0 -0
  124. package/docs/Windows/346/211/213/350/204/232-POC/346/274/224/347/244/272/350/204/232/346/234/254.md +131 -0
  125. package/docs/Windows/346/211/213/350/204/232/346/216/245/345/205/245/346/214/207/345/215/227.md +181 -0
  126. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246-v8.0.1.md +146 -0
  127. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +1 -1
  128. package/package.json +6 -3
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """同行爆款雷达(05)独立运行器。
4
+
5
+ 由 feihongzhi_agents 导出:自包含、仅标准库,可被其他智能体直接调用或安装为 Skill。
6
+ 用法:
7
+ python3 run.py --input '{"field": "value"}'
8
+ echo '{"field": "value"}' | python3 run.py
9
+ 可选接入真实大模型(设置环境变量后加 --llm):
10
+ LLM_API_KEY=xxx LLM_MODEL=xxx LLM_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
11
+ python3 run.py --llm --input '...'
12
+ """
13
+ import argparse
14
+ import json
15
+ import sys
16
+ import time
17
+ import urllib.request
18
+ import urllib.error
19
+ from datetime import datetime
20
+
21
+ # ------------------------- 内嵌核心逻辑(自动生成) -------------------------
22
+ def run_logic_05(data, llm=None):
23
+ """同行爆款雷达:监控同行爆款,提炼可复制模式。"""
24
+ accounts = data.get("competitor_accounts") or ["同行账号A", "同行账号B"]
25
+ days = int(data.get("days", 7))
26
+ hot = [
27
+ {"title": "工厂老板必看的 3 个获客真相", "views": 128000, "account": accounts[0], "days": days},
28
+ {"title": "我靠评论区捡了 200 个客户", "views": 96000, "account": accounts[-1], "days": days},
29
+ ]
30
+ patterns = ["强反差标题 + 数字钩子", "真实案例收尾 + 行动号召", "评论区互动引导"]
31
+ ai_note = ""
32
+ if llm is not None and getattr(llm, "provider", "mock") != "mock":
33
+ try:
34
+ ai_note = llm.complete(
35
+ f"近 {days} 天爆款 {json.dumps(hot, ensure_ascii=False)},提炼 1 条可复用选题公式,不超过 60 字。",
36
+ system="你是内容增长分析师。")
37
+ except Exception:
38
+ ai_note = ""
39
+ return {"hot_contents": hot, "patterns": patterns, "ai_note": ai_note}
40
+
41
+ # ------------------------- 极简 LLM 客户端(可选) -------------------------
42
+ class _MiniLLM:
43
+ provider = "doubao"
44
+ def __init__(self):
45
+ import os
46
+ self.key = os.environ.get("LLM_API_KEY", "")
47
+ self.model = os.environ.get("LLM_MODEL", "")
48
+ self.base = os.environ.get("LLM_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3").rstrip("/")
49
+ if not self.key or not self.model:
50
+ raise RuntimeError("缺少 LLM_API_KEY / LLM_MODEL 环境变量")
51
+ def complete(self, prompt, system=""):
52
+ msgs = []
53
+ if system:
54
+ msgs.append({"role": "system", "content": system})
55
+ msgs.append({"role": "user", "content": prompt})
56
+ payload = {"model": self.model, "messages": msgs, "temperature": 0.7, "max_tokens": 1024}
57
+ req = urllib.request.Request(
58
+ self.base + "/chat/completions",
59
+ data=json.dumps(payload).encode("utf-8"),
60
+ headers={"Content-Type": "application/json", "Authorization": "Bearer " + self.key},
61
+ method="POST")
62
+ try:
63
+ with urllib.request.urlopen(req, timeout=60) as resp:
64
+ body = json.loads(resp.read().decode("utf-8"))
65
+ except urllib.error.HTTPError as e:
66
+ raise RuntimeError("LLM 调用失败 HTTP %s: %s" % (e.code, e.read().decode("utf-8", errors="ignore")[:200]))
67
+ return body["choices"][0]["message"]["content"].strip()
68
+
69
+ def _load_input(args):
70
+ if args.input:
71
+ return json.loads(args.input)
72
+ if not sys.stdin.isatty():
73
+ raw = sys.stdin.read()
74
+ if raw.strip():
75
+ return json.loads(raw)
76
+ return {}
77
+
78
+ def main():
79
+ ap = argparse.ArgumentParser(description="同行爆款雷达(05)")
80
+ ap.add_argument("--input", help="JSON 输入,如 '{\"topic\": \"AI获客\"}';或经 stdin 传入")
81
+ ap.add_argument("--llm", action="store_true", help="启用真实大模型(需 LLM_API_KEY/LLM_MODEL 环境变量)")
82
+ args = ap.parse_args()
83
+ data = _load_input(args)
84
+ llm = None
85
+ if args.llm:
86
+ try:
87
+ llm = _MiniLLM()
88
+ except Exception as e:
89
+ print(json.dumps({"ok": False, "error": "LLM 初始化失败: " + str(e)}, ensure_ascii=False))
90
+ sys.exit(1)
91
+ try:
92
+ out = run_logic_05(data, llm)
93
+ except Exception as e:
94
+ print(json.dumps({"ok": False, "error": str(e)}, ensure_ascii=False))
95
+ sys.exit(1)
96
+ print(json.dumps({"ok": True, "output": out}, ensure_ascii=False))
97
+
98
+ if __name__ == "__main__":
99
+ main()
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: 06_每日精准获客选题官
3
+ description: 按目标客户画像与行业热点生成每日获客选题。属于L1层,优先级P1。触发场景:用户需要每日精准获客选题官、或涉及persona、hot_topics相关任务时调用。输出:date、topics。
4
+ ---
5
+
6
+ # 06_每日精准获客选题官(06)
7
+
8
+ 按目标客户画像与行业热点生成每日获客选题
9
+
10
+ - **所属层级**:L1(优先级 P1)
11
+
12
+ ## 使用方式
13
+
14
+ ```bash
15
+ # 方式一:命令行参数
16
+ python3 run.py --input '{"persona": "示例输入"}'
17
+
18
+ # 方式二:标准输入
19
+ echo '{"persona": "示例输入"}' | python3 run.py
20
+
21
+ # 接入真实大模型(可选)
22
+ LLM_API_KEY=xxx LLM_MODEL=xxx python3 run.py --llm --input '{"persona": "示例输入"}'
23
+ ```
24
+
25
+ ## 输入字段
26
+
27
+ | 字段 | 说明 |
28
+ |---|---|
29
+ | persona | 目标客户画像 |
30
+ | hot_topics | 行业热点列表 |
31
+
32
+ ## 输出字段
33
+
34
+ - **date**:选题日期
35
+ - **topics**:选题清单
36
+
37
+ ## 安装为 Skill
38
+
39
+ 将本目录(含 SKILL.md 与 run.py)复制到目标 Skill 根目录即可被智能体发现调用。
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """每日精准获客选题官(06)独立运行器。
4
+
5
+ 由 feihongzhi_agents 导出:自包含、仅标准库,可被其他智能体直接调用或安装为 Skill。
6
+ 用法:
7
+ python3 run.py --input '{"field": "value"}'
8
+ echo '{"field": "value"}' | python3 run.py
9
+ 可选接入真实大模型(设置环境变量后加 --llm):
10
+ LLM_API_KEY=xxx LLM_MODEL=xxx LLM_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
11
+ python3 run.py --llm --input '...'
12
+ """
13
+ import argparse
14
+ import json
15
+ import sys
16
+ import time
17
+ import urllib.request
18
+ import urllib.error
19
+ from datetime import datetime
20
+
21
+ # ------------------------- 内嵌核心逻辑(自动生成) -------------------------
22
+ def _ts() -> str:
23
+ return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
24
+
25
+
26
+ def run_logic_06(data, llm=None):
27
+ """每日精准获客选题:按目标客户画像与热点生成选题。"""
28
+ persona = data.get("persona", "工厂老板")
29
+ hot_topics = data.get("hot_topics") or ["AI 获客", "降本增效"]
30
+ topics = [
31
+ {"title": f"AI 如何帮{persona}每天自动获客", "direction": "痛点切入", "reason": f"结合热点「{hot_topics[0]}」"},
32
+ {"title": "一人公司怎么养 17 个 AI 员工", "direction": "案例教学", "reason": "差异化稀缺选题"},
33
+ {"title": "评论区才是最大的金矿", "direction": "方法拆解", "reason": f"呼应热点「{hot_topics[-1]}」"},
34
+ ]
35
+ ai_note = ""
36
+ if llm is not None and getattr(llm, "provider", "mock") != "mock":
37
+ try:
38
+ ai_note = llm.complete(
39
+ f"画像:{persona};热点:{hot_topics}。补充 1 个更高转化率的选题,不超过 60 字。",
40
+ system="你是短视频选题策划专家。")
41
+ except Exception:
42
+ ai_note = ""
43
+ return {"date": _ts()[:10], "topics": topics, "ai_note": ai_note}
44
+
45
+ # ------------------------- 极简 LLM 客户端(可选) -------------------------
46
+ class _MiniLLM:
47
+ provider = "doubao"
48
+ def __init__(self):
49
+ import os
50
+ self.key = os.environ.get("LLM_API_KEY", "")
51
+ self.model = os.environ.get("LLM_MODEL", "")
52
+ self.base = os.environ.get("LLM_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3").rstrip("/")
53
+ if not self.key or not self.model:
54
+ raise RuntimeError("缺少 LLM_API_KEY / LLM_MODEL 环境变量")
55
+ def complete(self, prompt, system=""):
56
+ msgs = []
57
+ if system:
58
+ msgs.append({"role": "system", "content": system})
59
+ msgs.append({"role": "user", "content": prompt})
60
+ payload = {"model": self.model, "messages": msgs, "temperature": 0.7, "max_tokens": 1024}
61
+ req = urllib.request.Request(
62
+ self.base + "/chat/completions",
63
+ data=json.dumps(payload).encode("utf-8"),
64
+ headers={"Content-Type": "application/json", "Authorization": "Bearer " + self.key},
65
+ method="POST")
66
+ try:
67
+ with urllib.request.urlopen(req, timeout=60) as resp:
68
+ body = json.loads(resp.read().decode("utf-8"))
69
+ except urllib.error.HTTPError as e:
70
+ raise RuntimeError("LLM 调用失败 HTTP %s: %s" % (e.code, e.read().decode("utf-8", errors="ignore")[:200]))
71
+ return body["choices"][0]["message"]["content"].strip()
72
+
73
+ def _load_input(args):
74
+ if args.input:
75
+ return json.loads(args.input)
76
+ if not sys.stdin.isatty():
77
+ raw = sys.stdin.read()
78
+ if raw.strip():
79
+ return json.loads(raw)
80
+ return {}
81
+
82
+ def main():
83
+ ap = argparse.ArgumentParser(description="每日精准获客选题官(06)")
84
+ ap.add_argument("--input", help="JSON 输入,如 '{\"topic\": \"AI获客\"}';或经 stdin 传入")
85
+ ap.add_argument("--llm", action="store_true", help="启用真实大模型(需 LLM_API_KEY/LLM_MODEL 环境变量)")
86
+ args = ap.parse_args()
87
+ data = _load_input(args)
88
+ llm = None
89
+ if args.llm:
90
+ try:
91
+ llm = _MiniLLM()
92
+ except Exception as e:
93
+ print(json.dumps({"ok": False, "error": "LLM 初始化失败: " + str(e)}, ensure_ascii=False))
94
+ sys.exit(1)
95
+ try:
96
+ out = run_logic_06(data, llm)
97
+ except Exception as e:
98
+ print(json.dumps({"ok": False, "error": str(e)}, ensure_ascii=False))
99
+ sys.exit(1)
100
+ print(json.dumps({"ok": True, "output": out}, ensure_ascii=False))
101
+
102
+ if __name__ == "__main__":
103
+ main()
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: 07_AI外贸开发客户员工
3
+ description: 外贸场景客户开发与首轮触达。属于L1层,优先级P2。触发场景:用户需要AI外贸开发客户员工、或涉及market、product相关任务时调用。输出:outreach_letter、candidates。
4
+ ---
5
+
6
+ # 07_AI外贸开发客户员工(07)
7
+
8
+ 外贸场景客户开发与首轮触达
9
+
10
+ - **所属层级**:L1(优先级 P2)
11
+
12
+ ## 使用方式
13
+
14
+ ```bash
15
+ # 方式一:命令行参数
16
+ python3 run.py --input '{"market": "示例输入"}'
17
+
18
+ # 方式二:标准输入
19
+ echo '{"market": "示例输入"}' | python3 run.py
20
+
21
+ # 接入真实大模型(可选)
22
+ LLM_API_KEY=xxx LLM_MODEL=xxx python3 run.py --llm --input '{"market": "示例输入"}'
23
+ ```
24
+
25
+ ## 输入字段
26
+
27
+ | 字段 | 说明 |
28
+ |---|---|
29
+ | market | 目标市场 |
30
+ | product | 产品 |
31
+
32
+ ## 输出字段
33
+
34
+ - **outreach_letter**:开发信
35
+ - **candidates**:候选客户
36
+
37
+ ## 安装为 Skill
38
+
39
+ 将本目录(含 SKILL.md 与 run.py)复制到目标 Skill 根目录即可被智能体发现调用。
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """AI外贸开发客户员工(07)独立运行器。
4
+
5
+ 由 feihongzhi_agents 导出:自包含、仅标准库,可被其他智能体直接调用或安装为 Skill。
6
+ 用法:
7
+ python3 run.py --input '{"field": "value"}'
8
+ echo '{"field": "value"}' | python3 run.py
9
+ 可选接入真实大模型(设置环境变量后加 --llm):
10
+ LLM_API_KEY=xxx LLM_MODEL=xxx LLM_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
11
+ python3 run.py --llm --input '...'
12
+ """
13
+ import argparse
14
+ import json
15
+ import sys
16
+ import time
17
+ import urllib.request
18
+ import urllib.error
19
+ from datetime import datetime
20
+
21
+ # ------------------------- 内嵌核心逻辑(自动生成) -------------------------
22
+ def run_logic_07(data, llm=None):
23
+ """外贸客户开发:目标市场客户开发与首轮触达。"""
24
+ market = data.get("market", "东南亚")
25
+ product = data.get("product", "智能家居")
26
+ letter = (
27
+ f"Subject: {product} 供应商直供方案({market})\n\n"
28
+ f"您好,我们专注 {product} 产能与交期,可支持 OEM/ODM,"
29
+ f"首单可样品验证。期待交流。"
30
+ )
31
+ candidates = [
32
+ {"company": f"{market}采购商A", "channel": "展会名录", "priority": "高"},
33
+ {"company": f"{market}渠道商B", "channel": "平台询盘", "priority": "中"},
34
+ ]
35
+ ai_note = ""
36
+ if llm is not None and getattr(llm, "provider", "mock") != "mock":
37
+ try:
38
+ ai_note = llm.complete(
39
+ f"市场 {market}、产品 {product},优化开发信开头两句话,不超过 60 字。",
40
+ system="你是外贸获客专家。")
41
+ except Exception:
42
+ ai_note = ""
43
+ return {"outreach_letter": letter, "candidates": candidates, "compliance": "触达前已过频控与合规检查", "ai_note": ai_note}
44
+
45
+ # ------------------------- 极简 LLM 客户端(可选) -------------------------
46
+ class _MiniLLM:
47
+ provider = "doubao"
48
+ def __init__(self):
49
+ import os
50
+ self.key = os.environ.get("LLM_API_KEY", "")
51
+ self.model = os.environ.get("LLM_MODEL", "")
52
+ self.base = os.environ.get("LLM_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3").rstrip("/")
53
+ if not self.key or not self.model:
54
+ raise RuntimeError("缺少 LLM_API_KEY / LLM_MODEL 环境变量")
55
+ def complete(self, prompt, system=""):
56
+ msgs = []
57
+ if system:
58
+ msgs.append({"role": "system", "content": system})
59
+ msgs.append({"role": "user", "content": prompt})
60
+ payload = {"model": self.model, "messages": msgs, "temperature": 0.7, "max_tokens": 1024}
61
+ req = urllib.request.Request(
62
+ self.base + "/chat/completions",
63
+ data=json.dumps(payload).encode("utf-8"),
64
+ headers={"Content-Type": "application/json", "Authorization": "Bearer " + self.key},
65
+ method="POST")
66
+ try:
67
+ with urllib.request.urlopen(req, timeout=60) as resp:
68
+ body = json.loads(resp.read().decode("utf-8"))
69
+ except urllib.error.HTTPError as e:
70
+ raise RuntimeError("LLM 调用失败 HTTP %s: %s" % (e.code, e.read().decode("utf-8", errors="ignore")[:200]))
71
+ return body["choices"][0]["message"]["content"].strip()
72
+
73
+ def _load_input(args):
74
+ if args.input:
75
+ return json.loads(args.input)
76
+ if not sys.stdin.isatty():
77
+ raw = sys.stdin.read()
78
+ if raw.strip():
79
+ return json.loads(raw)
80
+ return {}
81
+
82
+ def main():
83
+ ap = argparse.ArgumentParser(description="AI外贸开发客户员工(07)")
84
+ ap.add_argument("--input", help="JSON 输入,如 '{\"topic\": \"AI获客\"}';或经 stdin 传入")
85
+ ap.add_argument("--llm", action="store_true", help="启用真实大模型(需 LLM_API_KEY/LLM_MODEL 环境变量)")
86
+ args = ap.parse_args()
87
+ data = _load_input(args)
88
+ llm = None
89
+ if args.llm:
90
+ try:
91
+ llm = _MiniLLM()
92
+ except Exception as e:
93
+ print(json.dumps({"ok": False, "error": "LLM 初始化失败: " + str(e)}, ensure_ascii=False))
94
+ sys.exit(1)
95
+ try:
96
+ out = run_logic_07(data, llm)
97
+ except Exception as e:
98
+ print(json.dumps({"ok": False, "error": str(e)}, ensure_ascii=False))
99
+ sys.exit(1)
100
+ print(json.dumps({"ok": True, "output": out}, ensure_ascii=False))
101
+
102
+ if __name__ == "__main__":
103
+ main()
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: 08_小红书精准获客员工
3
+ description: 小红书内容获客与线索收集。属于L1层,优先级P2。触发场景:用户需要小红书精准获客员工、或涉及category、audience相关任务时调用。输出:note_title、note_body、guide_comment。
4
+ ---
5
+
6
+ # 08_小红书精准获客员工(08)
7
+
8
+ 小红书内容获客与线索收集
9
+
10
+ - **所属层级**:L1(优先级 P2)
11
+
12
+ ## 使用方式
13
+
14
+ ```bash
15
+ # 方式一:命令行参数
16
+ python3 run.py --input '{"category": "示例输入"}'
17
+
18
+ # 方式二:标准输入
19
+ echo '{"category": "示例输入"}' | python3 run.py
20
+
21
+ # 接入真实大模型(可选)
22
+ LLM_API_KEY=xxx LLM_MODEL=xxx python3 run.py --llm --input '{"category": "示例输入"}'
23
+ ```
24
+
25
+ ## 输入字段
26
+
27
+ | 字段 | 说明 |
28
+ |---|---|
29
+ | category | 品类 |
30
+ | audience | 目标人群 |
31
+
32
+ ## 输出字段
33
+
34
+ - **note_title**:笔记标题
35
+ - **note_body**:笔记正文
36
+ - **guide_comment**:评论区引导话术
37
+
38
+ ## 安装为 Skill
39
+
40
+ 将本目录(含 SKILL.md 与 run.py)复制到目标 Skill 根目录即可被智能体发现调用。
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """小红书精准获客员工(08)独立运行器。
4
+
5
+ 由 feihongzhi_agents 导出:自包含、仅标准库,可被其他智能体直接调用或安装为 Skill。
6
+ 用法:
7
+ python3 run.py --input '{"field": "value"}'
8
+ echo '{"field": "value"}' | python3 run.py
9
+ 可选接入真实大模型(设置环境变量后加 --llm):
10
+ LLM_API_KEY=xxx LLM_MODEL=xxx LLM_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
11
+ python3 run.py --llm --input '...'
12
+ """
13
+ import argparse
14
+ import json
15
+ import sys
16
+ import time
17
+ import urllib.request
18
+ import urllib.error
19
+ from datetime import datetime
20
+
21
+ # ------------------------- 内嵌核心逻辑(自动生成) -------------------------
22
+ def run_logic_08(data, llm=None):
23
+ """小红书获客:内容获客与线索收集。"""
24
+ category = data.get("category", "企业服务")
25
+ audience = data.get("audience", "工厂老板")
26
+ note_title = f"做了 3 个月小红书,{audience}客户主动找上门"
27
+ note_body = f"从 0 到 1 用小红书给{category}获客的真实过程:选题、封面、评论区运营三步走。"
28
+ guide_comment = "需要这套《小红书获客 SOP》的朋友,评论区扣「1」,我发你。"
29
+ ai_note = ""
30
+ if llm is not None and getattr(llm, "provider", "mock") != "mock":
31
+ try:
32
+ ai_note = llm.complete(
33
+ f"品类 {category}、受众 {audience},给出 1 个更高点击的标题,不超过 40 字。",
34
+ system="你是小红书内容运营专家。")
35
+ except Exception:
36
+ ai_note = ""
37
+ return {"note_title": note_title, "note_body": note_body, "guide_comment": guide_comment, "ai_note": ai_note}
38
+
39
+ # ------------------------- 极简 LLM 客户端(可选) -------------------------
40
+ class _MiniLLM:
41
+ provider = "doubao"
42
+ def __init__(self):
43
+ import os
44
+ self.key = os.environ.get("LLM_API_KEY", "")
45
+ self.model = os.environ.get("LLM_MODEL", "")
46
+ self.base = os.environ.get("LLM_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3").rstrip("/")
47
+ if not self.key or not self.model:
48
+ raise RuntimeError("缺少 LLM_API_KEY / LLM_MODEL 环境变量")
49
+ def complete(self, prompt, system=""):
50
+ msgs = []
51
+ if system:
52
+ msgs.append({"role": "system", "content": system})
53
+ msgs.append({"role": "user", "content": prompt})
54
+ payload = {"model": self.model, "messages": msgs, "temperature": 0.7, "max_tokens": 1024}
55
+ req = urllib.request.Request(
56
+ self.base + "/chat/completions",
57
+ data=json.dumps(payload).encode("utf-8"),
58
+ headers={"Content-Type": "application/json", "Authorization": "Bearer " + self.key},
59
+ method="POST")
60
+ try:
61
+ with urllib.request.urlopen(req, timeout=60) as resp:
62
+ body = json.loads(resp.read().decode("utf-8"))
63
+ except urllib.error.HTTPError as e:
64
+ raise RuntimeError("LLM 调用失败 HTTP %s: %s" % (e.code, e.read().decode("utf-8", errors="ignore")[:200]))
65
+ return body["choices"][0]["message"]["content"].strip()
66
+
67
+ def _load_input(args):
68
+ if args.input:
69
+ return json.loads(args.input)
70
+ if not sys.stdin.isatty():
71
+ raw = sys.stdin.read()
72
+ if raw.strip():
73
+ return json.loads(raw)
74
+ return {}
75
+
76
+ def main():
77
+ ap = argparse.ArgumentParser(description="小红书精准获客员工(08)")
78
+ ap.add_argument("--input", help="JSON 输入,如 '{\"topic\": \"AI获客\"}';或经 stdin 传入")
79
+ ap.add_argument("--llm", action="store_true", help="启用真实大模型(需 LLM_API_KEY/LLM_MODEL 环境变量)")
80
+ args = ap.parse_args()
81
+ data = _load_input(args)
82
+ llm = None
83
+ if args.llm:
84
+ try:
85
+ llm = _MiniLLM()
86
+ except Exception as e:
87
+ print(json.dumps({"ok": False, "error": "LLM 初始化失败: " + str(e)}, ensure_ascii=False))
88
+ sys.exit(1)
89
+ try:
90
+ out = run_logic_08(data, llm)
91
+ except Exception as e:
92
+ print(json.dumps({"ok": False, "error": str(e)}, ensure_ascii=False))
93
+ sys.exit(1)
94
+ print(json.dumps({"ok": True, "output": out}, ensure_ascii=False))
95
+
96
+ if __name__ == "__main__":
97
+ main()
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: 09_私域客户分层跟进官
3
+ description: 私域客户分层、差异化跟进与维护。属于L3层,优先级P0。触发场景:用户需要私域客户分层跟进官、或涉及customers相关任务时调用。输出:tiers、follow_up_plan。
4
+ ---
5
+
6
+ # 09_私域客户分层跟进官(09)
7
+
8
+ 私域客户分层、差异化跟进与维护
9
+
10
+ - **所属层级**:L3(优先级 P0)
11
+
12
+ ## 使用方式
13
+
14
+ ```bash
15
+ # 方式一:命令行参数
16
+ python3 run.py --input '{"customers": "[{"customer_id":"C1","company_name":"客户A","contact_name":"李总"}]"}'
17
+
18
+ # 方式二:标准输入
19
+ echo '{"customers": "[{"customer_id":"C1","company_name":"客户A","contact_name":"李总"}]"}' | python3 run.py
20
+
21
+ # 接入真实大模型(可选)
22
+ LLM_API_KEY=xxx LLM_MODEL=xxx python3 run.py --llm --input '{"customers": "[{"customer_id":"C1","company_name":"客户A","contact_name":"李总"}]"}'
23
+ ```
24
+
25
+ ## 输入字段
26
+
27
+ | 字段 | 说明 |
28
+ |---|---|
29
+ | customers | 客户列表 |
30
+
31
+ ## 输出字段
32
+
33
+ - **tiers**:分层标签
34
+ - **follow_up_plan**:跟进计划
35
+
36
+ ## 安装为 Skill
37
+
38
+ 将本目录(含 SKILL.md 与 run.py)复制到目标 Skill 根目录即可被智能体发现调用。
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """私域客户分层跟进官(09)独立运行器。
4
+
5
+ 由 feihongzhi_agents 导出:自包含、仅标准库,可被其他智能体直接调用或安装为 Skill。
6
+ 用法:
7
+ python3 run.py --input '{"field": "value"}'
8
+ echo '{"field": "value"}' | python3 run.py
9
+ 可选接入真实大模型(设置环境变量后加 --llm):
10
+ LLM_API_KEY=xxx LLM_MODEL=xxx LLM_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
11
+ python3 run.py --llm --input '...'
12
+ """
13
+ import argparse
14
+ import json
15
+ import sys
16
+ import time
17
+ import urllib.request
18
+ import urllib.error
19
+ from datetime import datetime
20
+
21
+ # ------------------------- 内嵌核心逻辑(自动生成) -------------------------
22
+ def run_logic_09(data, llm=None):
23
+ """私域分层跟进:客户分层、差异化跟进计划。"""
24
+ customers = data.get("customers") or [
25
+ {"customer_id": "C1", "company_name": "客户A", "contact_name": "李总", "contact_phone": "13800000001"},
26
+ {"customer_id": "C2", "company_name": "客户B", "contact_name": "张总", "contact_phone": "13800000002"},
27
+ {"customer_id": "C3", "company_name": "客户C", "contact_name": "陈总", "contact_phone": "13800000003"},
28
+ ]
29
+ tiers = []
30
+ for i, c in enumerate(customers):
31
+ tier = ["A", "B", "C"][i % 3]
32
+ tiers.append({"customer_id": c["customer_id"], "company_name": c["company_name"], "tier": tier})
33
+ plan = [
34
+ {"tier": "A", "action": "每周 1 次价值触达 + 需求深挖", "interval": "7 天"},
35
+ {"tier": "B", "action": "每月 1 次方案更新 + 节点关怀", "interval": "30 天"},
36
+ {"tier": "C", "action": "季度盘点,重新评估意向", "interval": "90 天"},
37
+ ]
38
+ ai_note = ""
39
+ if llm is not None and getattr(llm, "provider", "mock") != "mock":
40
+ try:
41
+ ai_note = llm.complete(
42
+ f"客户列表 {json.dumps(customers, ensure_ascii=False)},给出分层建议说明,不超过 60 字。",
43
+ system="你是私域运营专家。")
44
+ except Exception:
45
+ ai_note = ""
46
+ return {"tiers": tiers, "follow_up_plan": plan, "ai_note": ai_note}
47
+
48
+ # ------------------------- 极简 LLM 客户端(可选) -------------------------
49
+ class _MiniLLM:
50
+ provider = "doubao"
51
+ def __init__(self):
52
+ import os
53
+ self.key = os.environ.get("LLM_API_KEY", "")
54
+ self.model = os.environ.get("LLM_MODEL", "")
55
+ self.base = os.environ.get("LLM_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3").rstrip("/")
56
+ if not self.key or not self.model:
57
+ raise RuntimeError("缺少 LLM_API_KEY / LLM_MODEL 环境变量")
58
+ def complete(self, prompt, system=""):
59
+ msgs = []
60
+ if system:
61
+ msgs.append({"role": "system", "content": system})
62
+ msgs.append({"role": "user", "content": prompt})
63
+ payload = {"model": self.model, "messages": msgs, "temperature": 0.7, "max_tokens": 1024}
64
+ req = urllib.request.Request(
65
+ self.base + "/chat/completions",
66
+ data=json.dumps(payload).encode("utf-8"),
67
+ headers={"Content-Type": "application/json", "Authorization": "Bearer " + self.key},
68
+ method="POST")
69
+ try:
70
+ with urllib.request.urlopen(req, timeout=60) as resp:
71
+ body = json.loads(resp.read().decode("utf-8"))
72
+ except urllib.error.HTTPError as e:
73
+ raise RuntimeError("LLM 调用失败 HTTP %s: %s" % (e.code, e.read().decode("utf-8", errors="ignore")[:200]))
74
+ return body["choices"][0]["message"]["content"].strip()
75
+
76
+ def _load_input(args):
77
+ if args.input:
78
+ return json.loads(args.input)
79
+ if not sys.stdin.isatty():
80
+ raw = sys.stdin.read()
81
+ if raw.strip():
82
+ return json.loads(raw)
83
+ return {}
84
+
85
+ def main():
86
+ ap = argparse.ArgumentParser(description="私域客户分层跟进官(09)")
87
+ ap.add_argument("--input", help="JSON 输入,如 '{\"topic\": \"AI获客\"}';或经 stdin 传入")
88
+ ap.add_argument("--llm", action="store_true", help="启用真实大模型(需 LLM_API_KEY/LLM_MODEL 环境变量)")
89
+ args = ap.parse_args()
90
+ data = _load_input(args)
91
+ llm = None
92
+ if args.llm:
93
+ try:
94
+ llm = _MiniLLM()
95
+ except Exception as e:
96
+ print(json.dumps({"ok": False, "error": "LLM 初始化失败: " + str(e)}, ensure_ascii=False))
97
+ sys.exit(1)
98
+ try:
99
+ out = run_logic_09(data, llm)
100
+ except Exception as e:
101
+ print(json.dumps({"ok": False, "error": str(e)}, ensure_ascii=False))
102
+ sys.exit(1)
103
+ print(json.dumps({"ok": True, "output": out}, ensure_ascii=False))
104
+
105
+ if __name__ == "__main__":
106
+ main()