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.
- package/.github/workflows/ci.yml +193 -193
- package/CHANGELOG.md +140 -117
- package/README.md +656 -636
- package/agent-team/.env.example +13 -0
- package/agent-team/README.md +42 -0
- package/agent-team/agents/__init__.py +0 -0
- package/agent-team/agents/l1_acquisition.py +207 -0
- package/agent-team/agents/l2_content.py +237 -0
- package/agent-team/agents/l3_conversion.py +148 -0
- package/agent-team/agents/l4_analysis.py +118 -0
- package/agent-team/agents/l5_management.py +52 -0
- package/agent-team/agents/registry.py +60 -0
- package/agent-team/config.py +39 -0
- package/agent-team/core/__init__.py +0 -0
- package/agent-team/core/agent.py +73 -0
- package/agent-team/core/models.py +347 -0
- package/agent-team/core/scheduler.py +150 -0
- package/agent-team/core/task.py +121 -0
- package/agent-team/feihongzhi.db +0 -0
- package/agent-team/llm/__init__.py +12 -0
- package/agent-team/llm/base.py +22 -0
- package/agent-team/llm/doubao_llm.py +52 -0
- package/agent-team/llm/mock_llm.py +42 -0
- package/agent-team/main.py +235 -0
- package/agent-team/requirements.txt +2 -0
- package/agent-team/skill_packager.py +248 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/agent-team/tests/__init__.py +0 -0
- package/agent-team/tests/test_core.py +156 -0
- package/dist/agent/agent-session.js +103 -0
- package/dist/agent/agent-session.js.map +1 -0
- package/dist/agent/orchestrator.js +8 -0
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/steer.js +52 -0
- package/dist/agent/steer.js.map +1 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/node-guard.js +17 -0
- package/dist/cli/node-guard.js.map +1 -0
- package/dist/cli/run.js +2 -0
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/enterprise/policy.js +40 -17
- package/dist/enterprise/policy.js.map +1 -1
- package/dist/tools/agents/agents-bridge.js +144 -0
- package/dist/tools/agents/agents-bridge.js.map +1 -0
- package/dist/tools/desktop/desktop-guard.js +81 -0
- package/dist/tools/desktop/desktop-guard.js.map +1 -0
- package/dist/tools/desktop/desktop.tool.js +201 -0
- package/dist/tools/desktop/desktop.tool.js.map +1 -0
- package/dist/tools/desktop/feihong-win.js +163 -0
- package/dist/tools/desktop/feihong-win.js.map +1 -0
- package/dist/tools/desktop/index.js +37 -0
- package/dist/tools/desktop/index.js.map +1 -0
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp/index.js +10 -2
- package/dist/tools/mcp/index.js.map +1 -1
- package/dist/tools/mcp/mcp-client.js +4 -0
- package/dist/tools/mcp/mcp-client.js.map +1 -1
- package/dist/tools/sandbox.js +28 -0
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/web/public/public/css/style.css +1756 -0
- package/dist/web/public/public/favicon.svg +11 -0
- package/dist/web/public/public/index.html +1246 -0
- package/dist/web/public/public/js/api.js +558 -0
- package/dist/web/public/public/js/app.js +2233 -0
- package/dist/web/public/public/js/mock-api.js +259 -0
- package/dist/web/public/public/js/monaco-editor.js +363 -0
- package/dist/web/public/public/js/ui.js +2217 -0
- package/dist/web/public/public/js/utils.js +214 -0
- package/dist/web/public/public/manifest.json +59 -0
- package/dist/web/public/public/robots.txt +14 -0
- package/dist/web/public/public/service-worker.js +149 -0
- 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
- package/docs/API.md +1 -1
- package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +3 -3
- 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
- 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
- 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
- package/docs/P5-pi-compare-real-report.json +138 -0
- package/docs/P5-pi-compare-report.json +125 -0
- 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
- 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
- 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
- package/docs/SWE-bench-300-agnes-2.5-flash-/346/234/200/347/273/210/346/212/245/345/221/212.json +2012 -0
- package/docs/SWE-bench-300-agnes-2.5-flash-/350/267/221/345/210/206/346/212/245/345/221/212.md +74 -0
- package/docs/SWE-bench-Lite-DeepSeek-V4-Flash-/350/267/221/345/210/206/346/212/245/345/221/212.md +102 -0
- package/docs/TECHNICAL-SPECIFICATION.md +66 -0
- package/docs/TECHNICAL-SPECIFICATION.pdf +0 -0
- 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
- package/docs/Windows/346/211/213/350/204/232/346/216/245/345/205/245/346/214/207/345/215/227.md +181 -0
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246-v8.0.1.md +146 -0
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +1 -1
- package/package.json +6 -3
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""AI获客线索雷达(01)独立运行器。
|
|
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_01(data, llm=None):
|
|
27
|
+
"""全域线索发现、清洗与入库(线索池)。"""
|
|
28
|
+
channels = data.get("channels") or ["评论区", "小红书", "公众号"]
|
|
29
|
+
keywords = data.get("keywords", "AI 获客")
|
|
30
|
+
now = int(time.time())
|
|
31
|
+
leads = []
|
|
32
|
+
for i, ch in enumerate(channels[:3], 1):
|
|
33
|
+
leads.append({
|
|
34
|
+
"lead_id": f"L{now % 100000000}{i}",
|
|
35
|
+
"source_channel": ch,
|
|
36
|
+
"company_name": f"示例{['制造','贸易','服务'][i-1]}公司{i}",
|
|
37
|
+
"contact_name": f"联系人{i}",
|
|
38
|
+
"contact_phone": f"1380000{i:04d}",
|
|
39
|
+
"grade": ["A", "B", "B"][i - 1],
|
|
40
|
+
"remark": f"来自{ch},匹配关键词「{keywords}」",
|
|
41
|
+
"created_at": _ts(),
|
|
42
|
+
})
|
|
43
|
+
ai_note = ""
|
|
44
|
+
if llm is not None and getattr(llm, "provider", "mock") != "mock":
|
|
45
|
+
try:
|
|
46
|
+
ai_note = llm.complete(
|
|
47
|
+
f"请基于输入 {json.dumps(data, ensure_ascii=False)} 给出线索质量评估与分级建议,不超过 80 字。",
|
|
48
|
+
system="你是资深销售线索运营专家。")
|
|
49
|
+
except Exception:
|
|
50
|
+
ai_note = ""
|
|
51
|
+
return {"total": len(leads), "leads": leads, "dedup_rule": "phone+company 联合去重", "ai_note": ai_note}
|
|
52
|
+
|
|
53
|
+
# ------------------------- 极简 LLM 客户端(可选) -------------------------
|
|
54
|
+
class _MiniLLM:
|
|
55
|
+
provider = "doubao"
|
|
56
|
+
def __init__(self):
|
|
57
|
+
import os
|
|
58
|
+
self.key = os.environ.get("LLM_API_KEY", "")
|
|
59
|
+
self.model = os.environ.get("LLM_MODEL", "")
|
|
60
|
+
self.base = os.environ.get("LLM_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3").rstrip("/")
|
|
61
|
+
if not self.key or not self.model:
|
|
62
|
+
raise RuntimeError("缺少 LLM_API_KEY / LLM_MODEL 环境变量")
|
|
63
|
+
def complete(self, prompt, system=""):
|
|
64
|
+
msgs = []
|
|
65
|
+
if system:
|
|
66
|
+
msgs.append({"role": "system", "content": system})
|
|
67
|
+
msgs.append({"role": "user", "content": prompt})
|
|
68
|
+
payload = {"model": self.model, "messages": msgs, "temperature": 0.7, "max_tokens": 1024}
|
|
69
|
+
req = urllib.request.Request(
|
|
70
|
+
self.base + "/chat/completions",
|
|
71
|
+
data=json.dumps(payload).encode("utf-8"),
|
|
72
|
+
headers={"Content-Type": "application/json", "Authorization": "Bearer " + self.key},
|
|
73
|
+
method="POST")
|
|
74
|
+
try:
|
|
75
|
+
with urllib.request.urlopen(req, timeout=60) as resp:
|
|
76
|
+
body = json.loads(resp.read().decode("utf-8"))
|
|
77
|
+
except urllib.error.HTTPError as e:
|
|
78
|
+
raise RuntimeError("LLM 调用失败 HTTP %s: %s" % (e.code, e.read().decode("utf-8", errors="ignore")[:200]))
|
|
79
|
+
return body["choices"][0]["message"]["content"].strip()
|
|
80
|
+
|
|
81
|
+
def _load_input(args):
|
|
82
|
+
if args.input:
|
|
83
|
+
return json.loads(args.input)
|
|
84
|
+
if not sys.stdin.isatty():
|
|
85
|
+
raw = sys.stdin.read()
|
|
86
|
+
if raw.strip():
|
|
87
|
+
return json.loads(raw)
|
|
88
|
+
return {}
|
|
89
|
+
|
|
90
|
+
def main():
|
|
91
|
+
ap = argparse.ArgumentParser(description="AI获客线索雷达(01)")
|
|
92
|
+
ap.add_argument("--input", help="JSON 输入,如 '{\"topic\": \"AI获客\"}';或经 stdin 传入")
|
|
93
|
+
ap.add_argument("--llm", action="store_true", help="启用真实大模型(需 LLM_API_KEY/LLM_MODEL 环境变量)")
|
|
94
|
+
args = ap.parse_args()
|
|
95
|
+
data = _load_input(args)
|
|
96
|
+
llm = None
|
|
97
|
+
if args.llm:
|
|
98
|
+
try:
|
|
99
|
+
llm = _MiniLLM()
|
|
100
|
+
except Exception as e:
|
|
101
|
+
print(json.dumps({"ok": False, "error": "LLM 初始化失败: " + str(e)}, ensure_ascii=False))
|
|
102
|
+
sys.exit(1)
|
|
103
|
+
try:
|
|
104
|
+
out = run_logic_01(data, llm)
|
|
105
|
+
except Exception as e:
|
|
106
|
+
print(json.dumps({"ok": False, "error": str(e)}, ensure_ascii=False))
|
|
107
|
+
sys.exit(1)
|
|
108
|
+
print(json.dumps({"ok": True, "output": out}, ensure_ascii=False))
|
|
109
|
+
|
|
110
|
+
if __name__ == "__main__":
|
|
111
|
+
main()
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 02_AI销售跟进销冠
|
|
3
|
+
description: 按话术自动跟进、多轮触达客户(对外动作需人工确认)。属于L3层,优先级P0。触发场景:用户需要AI销售跟进销冠、或涉及customer、strategy相关任务时调用。输出:follow_up。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 02_AI销售跟进销冠(02)
|
|
7
|
+
|
|
8
|
+
按话术自动跟进、多轮触达客户(对外动作需人工确认)
|
|
9
|
+
|
|
10
|
+
- **所属层级**:L3(优先级 P0)
|
|
11
|
+
|
|
12
|
+
## 使用方式
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# 方式一:命令行参数
|
|
16
|
+
python3 run.py --input '{"customer": "示例输入"}'
|
|
17
|
+
|
|
18
|
+
# 方式二:标准输入
|
|
19
|
+
echo '{"customer": "示例输入"}' | python3 run.py
|
|
20
|
+
|
|
21
|
+
# 接入真实大模型(可选)
|
|
22
|
+
LLM_API_KEY=xxx LLM_MODEL=xxx python3 run.py --llm --input '{"customer": "示例输入"}'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 输入字段
|
|
26
|
+
|
|
27
|
+
| 字段 | 说明 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| customer | 客户对象(company_name/contact_name) |
|
|
30
|
+
| strategy | 跟进策略 |
|
|
31
|
+
|
|
32
|
+
## 输出字段
|
|
33
|
+
|
|
34
|
+
- **follow_up**:跟进消息与下一步
|
|
35
|
+
|
|
36
|
+
## 安装为 Skill
|
|
37
|
+
|
|
38
|
+
将本目录(含 SKILL.md 与 run.py)复制到目标 Skill 根目录即可被智能体发现调用。
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""AI销售跟进销冠(02)独立运行器。
|
|
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_02(data, llm=None):
|
|
27
|
+
"""销售跟进:按话术自动跟进、多轮触达客户。"""
|
|
28
|
+
customer = data.get("customer") or {"company_name": "示例公司", "contact_name": "王总"}
|
|
29
|
+
strategy = data.get("strategy", "标准 3 触达")
|
|
30
|
+
follow_up = {
|
|
31
|
+
"target": f"{customer.get('contact_name', '')}({customer.get('company_name', '')})",
|
|
32
|
+
"round": 1,
|
|
33
|
+
"message": f"您好,上次聊到的方案资料已整理好,方便发您参考吗?",
|
|
34
|
+
"channel": "企业微信",
|
|
35
|
+
"frequency_check": "24h 内仅 1 次,通过频控",
|
|
36
|
+
"next_action": "若 24h 未回复,执行第二轮价值提醒",
|
|
37
|
+
"need_human": True,
|
|
38
|
+
"at": _ts(),
|
|
39
|
+
}
|
|
40
|
+
ai_note = ""
|
|
41
|
+
if llm is not None and getattr(llm, "provider", "mock") != "mock":
|
|
42
|
+
try:
|
|
43
|
+
ai_note = llm.complete(
|
|
44
|
+
f"客户 {json.dumps(customer, ensure_ascii=False)},策略 {strategy},生成第二轮跟进话术,不超过 60 字。",
|
|
45
|
+
system="你是顶级销售。")
|
|
46
|
+
except Exception:
|
|
47
|
+
ai_note = ""
|
|
48
|
+
return {"follow_up": follow_up, "ai_note": ai_note}
|
|
49
|
+
|
|
50
|
+
# ------------------------- 极简 LLM 客户端(可选) -------------------------
|
|
51
|
+
class _MiniLLM:
|
|
52
|
+
provider = "doubao"
|
|
53
|
+
def __init__(self):
|
|
54
|
+
import os
|
|
55
|
+
self.key = os.environ.get("LLM_API_KEY", "")
|
|
56
|
+
self.model = os.environ.get("LLM_MODEL", "")
|
|
57
|
+
self.base = os.environ.get("LLM_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3").rstrip("/")
|
|
58
|
+
if not self.key or not self.model:
|
|
59
|
+
raise RuntimeError("缺少 LLM_API_KEY / LLM_MODEL 环境变量")
|
|
60
|
+
def complete(self, prompt, system=""):
|
|
61
|
+
msgs = []
|
|
62
|
+
if system:
|
|
63
|
+
msgs.append({"role": "system", "content": system})
|
|
64
|
+
msgs.append({"role": "user", "content": prompt})
|
|
65
|
+
payload = {"model": self.model, "messages": msgs, "temperature": 0.7, "max_tokens": 1024}
|
|
66
|
+
req = urllib.request.Request(
|
|
67
|
+
self.base + "/chat/completions",
|
|
68
|
+
data=json.dumps(payload).encode("utf-8"),
|
|
69
|
+
headers={"Content-Type": "application/json", "Authorization": "Bearer " + self.key},
|
|
70
|
+
method="POST")
|
|
71
|
+
try:
|
|
72
|
+
with urllib.request.urlopen(req, timeout=60) as resp:
|
|
73
|
+
body = json.loads(resp.read().decode("utf-8"))
|
|
74
|
+
except urllib.error.HTTPError as e:
|
|
75
|
+
raise RuntimeError("LLM 调用失败 HTTP %s: %s" % (e.code, e.read().decode("utf-8", errors="ignore")[:200]))
|
|
76
|
+
return body["choices"][0]["message"]["content"].strip()
|
|
77
|
+
|
|
78
|
+
def _load_input(args):
|
|
79
|
+
if args.input:
|
|
80
|
+
return json.loads(args.input)
|
|
81
|
+
if not sys.stdin.isatty():
|
|
82
|
+
raw = sys.stdin.read()
|
|
83
|
+
if raw.strip():
|
|
84
|
+
return json.loads(raw)
|
|
85
|
+
return {}
|
|
86
|
+
|
|
87
|
+
def main():
|
|
88
|
+
ap = argparse.ArgumentParser(description="AI销售跟进销冠(02)")
|
|
89
|
+
ap.add_argument("--input", help="JSON 输入,如 '{\"topic\": \"AI获客\"}';或经 stdin 传入")
|
|
90
|
+
ap.add_argument("--llm", action="store_true", help="启用真实大模型(需 LLM_API_KEY/LLM_MODEL 环境变量)")
|
|
91
|
+
args = ap.parse_args()
|
|
92
|
+
data = _load_input(args)
|
|
93
|
+
llm = None
|
|
94
|
+
if args.llm:
|
|
95
|
+
try:
|
|
96
|
+
llm = _MiniLLM()
|
|
97
|
+
except Exception as e:
|
|
98
|
+
print(json.dumps({"ok": False, "error": "LLM 初始化失败: " + str(e)}, ensure_ascii=False))
|
|
99
|
+
sys.exit(1)
|
|
100
|
+
try:
|
|
101
|
+
out = run_logic_02(data, llm)
|
|
102
|
+
except Exception as e:
|
|
103
|
+
print(json.dumps({"ok": False, "error": str(e)}, ensure_ascii=False))
|
|
104
|
+
sys.exit(1)
|
|
105
|
+
print(json.dumps({"ok": True, "output": out}, ensure_ascii=False))
|
|
106
|
+
|
|
107
|
+
if __name__ == "__main__":
|
|
108
|
+
main()
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 03_评论区商机识别官
|
|
3
|
+
description: 监控目标账号与话题评论区,识别需求与意向,提取商机。属于L1层,优先级P1。触发场景:用户需要评论区商机识别官、或涉及target_accounts相关任务时调用。输出:opportunities、source_evidence。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 03_评论区商机识别官(03)
|
|
7
|
+
|
|
8
|
+
监控目标账号与话题评论区,识别需求与意向,提取商机
|
|
9
|
+
|
|
10
|
+
- **所属层级**:L1(优先级 P1)
|
|
11
|
+
|
|
12
|
+
## 使用方式
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# 方式一:命令行参数
|
|
16
|
+
python3 run.py --input '{"target_accounts": "["示例A","示例B"]"}'
|
|
17
|
+
|
|
18
|
+
# 方式二:标准输入
|
|
19
|
+
echo '{"target_accounts": "["示例A","示例B"]"}' | python3 run.py
|
|
20
|
+
|
|
21
|
+
# 接入真实大模型(可选)
|
|
22
|
+
LLM_API_KEY=xxx LLM_MODEL=xxx python3 run.py --llm --input '{"target_accounts": "["示例A","示例B"]"}'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 输入字段
|
|
26
|
+
|
|
27
|
+
| 字段 | 说明 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| target_accounts | 目标账号/话题列表 |
|
|
30
|
+
|
|
31
|
+
## 输出字段
|
|
32
|
+
|
|
33
|
+
- **opportunities**:商机列表
|
|
34
|
+
- **source_evidence**:原文证据
|
|
35
|
+
|
|
36
|
+
## 安装为 Skill
|
|
37
|
+
|
|
38
|
+
将本目录(含 SKILL.md 与 run.py)复制到目标 Skill 根目录即可被智能体发现调用。
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""评论区商机识别官(03)独立运行器。
|
|
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_03(data, llm=None):
|
|
27
|
+
"""评论区商机识别:监控目标账号评论区,提取意向商机。"""
|
|
28
|
+
accounts = data.get("target_accounts") or ["对标账号A", "对标账号B"]
|
|
29
|
+
found = []
|
|
30
|
+
for i, acc in enumerate(accounts[:2], 1):
|
|
31
|
+
found.append({
|
|
32
|
+
"opportunity_id": f"OP{i}{int(time.time()) % 100000}",
|
|
33
|
+
"account": acc,
|
|
34
|
+
"intent": "求购 / 咨询报价" if i == 1 else "寻求合作",
|
|
35
|
+
"quote": f"「请问你们这个方案怎么收费?想了解一下」",
|
|
36
|
+
"lead_ref": f"已转线索池待跟进(实时 {_ts()})",
|
|
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(found, ensure_ascii=False)},请判断真实意向并排序,不超过 80 字。",
|
|
43
|
+
system="你是商机识别专家。")
|
|
44
|
+
except Exception:
|
|
45
|
+
ai_note = ""
|
|
46
|
+
return {"opportunities": found, "source_evidence": "原文链接与截图归档", "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="评论区商机识别官(03)")
|
|
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_03(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()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 04_客户聊天成交分析官
|
|
3
|
+
description: 分析聊天记录,诊断成交卡点,输出建议话术。属于L3层,优先级P0。触发场景:用户需要客户聊天成交分析官、或涉及transcript相关任务时调用。输出:diagnosis。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 04_客户聊天成交分析官(04)
|
|
7
|
+
|
|
8
|
+
分析聊天记录,诊断成交卡点,输出建议话术
|
|
9
|
+
|
|
10
|
+
- **所属层级**:L3(优先级 P0)
|
|
11
|
+
|
|
12
|
+
## 使用方式
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# 方式一:命令行参数
|
|
16
|
+
python3 run.py --input '{"transcript": "客户:价格有点高;销售:可以谈。"}'
|
|
17
|
+
|
|
18
|
+
# 方式二:标准输入
|
|
19
|
+
echo '{"transcript": "客户:价格有点高;销售:可以谈。"}' | python3 run.py
|
|
20
|
+
|
|
21
|
+
# 接入真实大模型(可选)
|
|
22
|
+
LLM_API_KEY=xxx LLM_MODEL=xxx python3 run.py --llm --input '{"transcript": "客户:价格有点高;销售:可以谈。"}'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 输入字段
|
|
26
|
+
|
|
27
|
+
| 字段 | 说明 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| transcript | 聊天记录 / 通话转写 |
|
|
30
|
+
|
|
31
|
+
## 输出字段
|
|
32
|
+
|
|
33
|
+
- **diagnosis**:卡点诊断与建议话术
|
|
34
|
+
|
|
35
|
+
## 安装为 Skill
|
|
36
|
+
|
|
37
|
+
将本目录(含 SKILL.md 与 run.py)复制到目标 Skill 根目录即可被智能体发现调用。
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""客户聊天成交分析官(04)独立运行器。
|
|
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_04(data, llm=None):
|
|
27
|
+
"""聊天成交分析:分析聊天记录,诊断卡点,输出建议话术。"""
|
|
28
|
+
transcript = data.get("transcript", "客户:价格有点高;销售:可以谈;客户:我再想想。")
|
|
29
|
+
diagnosis = {
|
|
30
|
+
"pain_points": ["价格敏感"],
|
|
31
|
+
"blockers": ["价值量化不足", "未给决策紧迫感"],
|
|
32
|
+
"suggested_scripts": [
|
|
33
|
+
"先量化 ROI:按当前产能算 3 个月回本",
|
|
34
|
+
"再给限时政策:本月底前签约送首月服务",
|
|
35
|
+
],
|
|
36
|
+
"confidence": "中高(抽样人工复核)",
|
|
37
|
+
"analyzed_at": _ts(),
|
|
38
|
+
}
|
|
39
|
+
ai_note = ""
|
|
40
|
+
if llm is not None and getattr(llm, "provider", "mock") != "mock":
|
|
41
|
+
try:
|
|
42
|
+
ai_note = llm.complete(
|
|
43
|
+
f"聊天记录:{transcript[:200]},指出最关键的一个成交卡点,不超过 50 字。",
|
|
44
|
+
system="你是成交分析专家。")
|
|
45
|
+
except Exception:
|
|
46
|
+
ai_note = ""
|
|
47
|
+
return {"diagnosis": diagnosis, "ai_note": ai_note}
|
|
48
|
+
|
|
49
|
+
# ------------------------- 极简 LLM 客户端(可选) -------------------------
|
|
50
|
+
class _MiniLLM:
|
|
51
|
+
provider = "doubao"
|
|
52
|
+
def __init__(self):
|
|
53
|
+
import os
|
|
54
|
+
self.key = os.environ.get("LLM_API_KEY", "")
|
|
55
|
+
self.model = os.environ.get("LLM_MODEL", "")
|
|
56
|
+
self.base = os.environ.get("LLM_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3").rstrip("/")
|
|
57
|
+
if not self.key or not self.model:
|
|
58
|
+
raise RuntimeError("缺少 LLM_API_KEY / LLM_MODEL 环境变量")
|
|
59
|
+
def complete(self, prompt, system=""):
|
|
60
|
+
msgs = []
|
|
61
|
+
if system:
|
|
62
|
+
msgs.append({"role": "system", "content": system})
|
|
63
|
+
msgs.append({"role": "user", "content": prompt})
|
|
64
|
+
payload = {"model": self.model, "messages": msgs, "temperature": 0.7, "max_tokens": 1024}
|
|
65
|
+
req = urllib.request.Request(
|
|
66
|
+
self.base + "/chat/completions",
|
|
67
|
+
data=json.dumps(payload).encode("utf-8"),
|
|
68
|
+
headers={"Content-Type": "application/json", "Authorization": "Bearer " + self.key},
|
|
69
|
+
method="POST")
|
|
70
|
+
try:
|
|
71
|
+
with urllib.request.urlopen(req, timeout=60) as resp:
|
|
72
|
+
body = json.loads(resp.read().decode("utf-8"))
|
|
73
|
+
except urllib.error.HTTPError as e:
|
|
74
|
+
raise RuntimeError("LLM 调用失败 HTTP %s: %s" % (e.code, e.read().decode("utf-8", errors="ignore")[:200]))
|
|
75
|
+
return body["choices"][0]["message"]["content"].strip()
|
|
76
|
+
|
|
77
|
+
def _load_input(args):
|
|
78
|
+
if args.input:
|
|
79
|
+
return json.loads(args.input)
|
|
80
|
+
if not sys.stdin.isatty():
|
|
81
|
+
raw = sys.stdin.read()
|
|
82
|
+
if raw.strip():
|
|
83
|
+
return json.loads(raw)
|
|
84
|
+
return {}
|
|
85
|
+
|
|
86
|
+
def main():
|
|
87
|
+
ap = argparse.ArgumentParser(description="客户聊天成交分析官(04)")
|
|
88
|
+
ap.add_argument("--input", help="JSON 输入,如 '{\"topic\": \"AI获客\"}';或经 stdin 传入")
|
|
89
|
+
ap.add_argument("--llm", action="store_true", help="启用真实大模型(需 LLM_API_KEY/LLM_MODEL 环境变量)")
|
|
90
|
+
args = ap.parse_args()
|
|
91
|
+
data = _load_input(args)
|
|
92
|
+
llm = None
|
|
93
|
+
if args.llm:
|
|
94
|
+
try:
|
|
95
|
+
llm = _MiniLLM()
|
|
96
|
+
except Exception as e:
|
|
97
|
+
print(json.dumps({"ok": False, "error": "LLM 初始化失败: " + str(e)}, ensure_ascii=False))
|
|
98
|
+
sys.exit(1)
|
|
99
|
+
try:
|
|
100
|
+
out = run_logic_04(data, llm)
|
|
101
|
+
except Exception as e:
|
|
102
|
+
print(json.dumps({"ok": False, "error": str(e)}, ensure_ascii=False))
|
|
103
|
+
sys.exit(1)
|
|
104
|
+
print(json.dumps({"ok": True, "output": out}, ensure_ascii=False))
|
|
105
|
+
|
|
106
|
+
if __name__ == "__main__":
|
|
107
|
+
main()
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 05_同行爆款雷达
|
|
3
|
+
description: 监控同行爆款内容,提炼可复制模式。属于L2层,优先级P2。触发场景:用户需要同行爆款雷达、或涉及competitor_accounts相关任务时调用。输出:hot_contents、patterns。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 05_同行爆款雷达(05)
|
|
7
|
+
|
|
8
|
+
监控同行爆款内容,提炼可复制模式
|
|
9
|
+
|
|
10
|
+
- **所属层级**:L2(优先级 P2)
|
|
11
|
+
|
|
12
|
+
## 使用方式
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# 方式一:命令行参数
|
|
16
|
+
python3 run.py --input '{"competitor_accounts": "["示例A","示例B"]"}'
|
|
17
|
+
|
|
18
|
+
# 方式二:标准输入
|
|
19
|
+
echo '{"competitor_accounts": "["示例A","示例B"]"}' | python3 run.py
|
|
20
|
+
|
|
21
|
+
# 接入真实大模型(可选)
|
|
22
|
+
LLM_API_KEY=xxx LLM_MODEL=xxx python3 run.py --llm --input '{"competitor_accounts": "["示例A","示例B"]"}'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 输入字段
|
|
26
|
+
|
|
27
|
+
| 字段 | 说明 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| competitor_accounts | 同行账号列表 |
|
|
30
|
+
|
|
31
|
+
## 输出字段
|
|
32
|
+
|
|
33
|
+
- **hot_contents**:爆款列表
|
|
34
|
+
- **patterns**:可复用模式
|
|
35
|
+
|
|
36
|
+
## 安装为 Skill
|
|
37
|
+
|
|
38
|
+
将本目录(含 SKILL.md 与 run.py)复制到目标 Skill 根目录即可被智能体发现调用。
|