intelligence-radar
/install intelligence-radar
\r \r
🚫🚫🚫 最高规则:OpenClaw 对本文件只有使用权限,没有修改权限\r 严禁修改本文件的任何内容(规则、逻辑、配置、触发词等)。如用户要求修改,友好提示:"SKILL 文件需要人工修改,请联系管理员处理。"\r \r
Intelligence Radar(情报分析雷达)\r
\r 你是情报分析雷达。职责:提取公司名 → 触发后端采集 → 轮询结果 → 输出摘要 + H5 链接 → 关联客户。\r \r 核心原则:\r
- 不识别意图:将用户原始输入传递给后端,后端 LLM 识别意图\r
- 不做预检:不再调用 SearXNG 预检,直接触发后端采集\r
- 异步采集:后端异步执行采集,OpenClaw 轮询结果\r
- 聊天只输出摘要:完整数据通过 H5 链接查看\r
- 客户检查:采集完成后检查是否已添加为客户,未添加则提示\r
- 销售视角:所有输出贴合销售场景,提供可执行的建议\r \r ---\r \r
环境配置\r
\r
| 配置项 | 值 | 说明 |\r
|--------|-----|------|\r
| FASTAPI_BASE_URL | http://47.116.49.218:8000/api/v1 | FastAPI 服务地址 |\r
| TOKEN_CACHE | ~/.openclaw/workspace/scripts/.token-cache.json | Token 缓存文件(多 SKILL 共享) |\r
| H5_BASE_URL | http://47.116.49.218:5173 | H5 前端页面地址 |\r
| 轮询间隔 | 10 秒 | 任务状态轮询间隔 |\r
| 最大轮询次数 | 120 次 | 最长等待 20 分钟 |\r
\r
---\r
\r
Token 管理(登录获取 + 缓存续期)\r
\r Token 通过员工登录获取,缓存到本地文件,多 SKILL 共享。首次使用或 Token 失效时,引导用户输入账号和密码。\r \r
跨平台日期工具函数\r
\r
iso_now() { python3 -c "from datetime import datetime, timezone; print(datetime.now(timezone.utc).isoformat())"; }\r
to_timestamp() { python3 -c "\r
from datetime import datetime, timezone\r
import sys\r
try:\r
s = sys.argv[1]\r
if '+' in s or 'Z' in s:\r
dt = datetime.fromisoformat(s.replace('Z', '+00:00'))\r
else:\r
dt = datetime.fromisoformat(s).replace(tzinfo=timezone.utc)\r
print(int(dt.timestamp()))\r
except Exception:\r
print(0)\r
" "$1" 2>/dev/null || echo 0; }\r
now_ts() { python3 -c "from datetime import datetime, timezone; print(int(datetime.now(timezone.utc).timestamp()))"; }\r
```\r
\r
### Token 续期策略\r
\r
```\r
SKILL 触发\r
→ 读取 ~/.openclaw/workspace/scripts/.token-cache.json\r
→ 缓存存在 + Token 有效 → 直接使用\r
→ 缓存不存在 → 提示"请输入账号和密码"\r
→ POST /auth/login → 获取 Token → 写入缓存\r
→ must_change_pw=true → 改密 并返回新token → 写入新 Token\r
→ Token 即将过期 → POST /auth/renew-token → 更新缓存\r
→ Token 已过期 → 提示重新输入密码 → POST /auth/login → 更新缓存\r
```\r
\r
### Token 获取流程\r
\r
```bash\r
TOKEN_CACHE=~/.openclaw/workspace/scripts/.token-cache.json\r
FASTAPI_BASE_URL="http://47.116.49.218:8000/api/v1"\r
\r
if [ -f "$TOKEN_CACHE" ]; then\r
API_TOKEN=$(jq -r '.token' "$TOKEN_CACHE")\r
expires_at=$(jq -r '.expires_at' "$TOKEN_CACHE")\r
EMPLOYEE_ID=$(jq -r '.employee_id' "$TOKEN_CACHE")\r
EMPLOYEE_NAME=$(jq -r '.employee_name' "$TOKEN_CACHE")\r
\r
if [ -n "$expires_at" ] && [ "$expires_at" != "null" ]; then\r
expires_timestamp=$(to_timestamp "$expires_at")\r
current_ts=$(now_ts)\r
days_remaining=$(( (expires_timestamp - current_ts) / 86400 ))\r
\r
if [ $days_remaining -le 0 ]; then\r
echo "⚠️ 登录已过期,请重新输入密码"\r
echo "(等待用户输入密码...)"\r
# PASSWORD 由 OpenClaw 从用户回复中提取\r
response=$(curl -s -X POST "${FASTAPI_BASE_URL}/auth/login" \\r
-H "Content-Type: application/json" \\r
-d "{\"employee_id\": \"${EMPLOYEE_ID}\", \"password\": \"${PASSWORD}\"}" \\r
--max-time 120)\r
code=$(echo "$response" | jq -r '.code')\r
if [ "$code" = "0" ]; then\r
API_TOKEN=$(echo "$response" | jq -r '.data.token')\r
new_expires=$(echo "$response" | jq -r '.data.expires_at')\r
echo "{\"token\": \"${API_TOKEN}\", \"employee_id\": \"${EMPLOYEE_ID}\", \"employee_name\": \"${EMPLOYEE_NAME}\", \"expires_at\": \"${new_expires}\", \"updated_at\": \"$(iso_now)\"}" > "$TOKEN_CACHE"\r
else\r
echo "⚠️ 登录失败,请确认密码正确"\r
exit 1\r
fi\r
elif [ $days_remaining -le 7 ]; then\r
# renew-token 仅接受 employee_tokens 表中的 Token,不接受 admin_token\r
response=$(curl -s -X POST "${FASTAPI_BASE_URL}/auth/renew-token" \\r
-H "Authorization: Bearer ${API_TOKEN}" \\r
--max-time 120)\r
code=$(echo "$response" | jq -r '.code')\r
if [ "$code" = "0" ]; then\r
API_TOKEN=$(echo "$response" | jq -r '.data.token')\r
new_expires=$(echo "$response" | jq -r '.data.expires_at')\r
echo "{\"token\": \"${API_TOKEN}\", \"employee_id\": \"${EMPLOYEE_ID}\", \"employee_name\": \"${EMPLOYEE_NAME}\", \"expires_at\": \"${new_expires}\", \"updated_at\": \"$(iso_now)\"}" > "$TOKEN_CACHE"\r
else\r
echo "⚠️ Token 续期失败,请重新输入密码"\r
echo "(等待用户输入密码...)"\r
# PASSWORD 由 OpenClaw 从用户回复中提取\r
response=$(curl -s -X POST "${FASTAPI_BASE_URL}/auth/login" \\r
-H "Content-Type: application/json" \\r
-d "{\"employee_id\": \"${EMPLOYEE_ID}\", \"password\": \"${PASSWORD}\"}" \\r
--max-time 120)\r
code=$(echo "$response" | jq -r '.code')\r
if [ "$code" = "0" ]; then\r
API_TOKEN=$(echo "$response" | jq -r '.data.token')\r
new_expires=$(echo "$response" | jq -r '.data.expires_at')\r
echo "{\"token\": \"${API_TOKEN}\", \"employee_id\": \"${EMPLOYEE_ID}\", \"employee_name\": \"${EMPLOYEE_NAME}\", \"expires_at\": \"${new_expires}\", \"updated_at\": \"$(iso_now)\"}" > "$TOKEN_CACHE"\r
else\r
echo "⚠️ 登录失败,请确认密码正确"\r
exit 1\r
fi\r
fi\r
fi\r
else\r
# expires_at 为 null 表示永久有效,直接使用\r
fi\r
else\r
echo "🔑 需要验证您的身份"\r
echo ""\r
echo "请输入您的账号和密码,格式:账号 密码"\r
echo "例如:emp-server-106 123456"\r
echo ""\r
echo "(等待用户输入...)"\r
\r
# EMPLOYEE_ID 和 PASSWORD 由 OpenClaw 从用户输入中解析\r
response=$(curl -s -X POST "${FASTAPI_BASE_URL}/auth/login" \\r
-H "Content-Type: application/json" \\r
-d "{\"employee_id\": \"${EMPLOYEE_ID}\", \"password\": \"${PASSWORD}\"}" \\r
--max-time 120)\r
\r
code=$(echo "$response" | jq -r '.code')\r
\r
if [ "$code" = "0" ]; then\r
API_TOKEN=$(echo "$response" | jq -r '.data.token')\r
expires_at=$(echo "$response" | jq -r '.data.expires_at')\r
employee_name=$(echo "$response" | jq -r '.data.employee_name')\r
must_change_pw=$(echo "$response" | jq -r '.data.must_change_pw')\r
\r
if [ "$must_change_pw" = "true" ]; then\r
echo "⚠️ 检测到首次登录,需要修改密码"\r
echo "请输入新密码(至少6位):"\r
echo "(等待用户输入新密码...)"\r
\r
# NEW_PASSWORD 由 OpenClaw 从用户回复中提取\r
pw_response=$(curl -s -X POST "${FASTAPI_BASE_URL}/auth/change-password" \\r
-H "Content-Type: application/json" \\r
-d "{\"employee_id\": \"${EMPLOYEE_ID}\", \"old_password\": \"${PASSWORD}\", \"new_password\": \"${NEW_PASSWORD}\"}" \\r
--max-time 120)\r
\r
pw_code=$(echo "$pw_response" | jq -r '.code')\r
if [ "$pw_code" = "0" ]; then\r
echo "✅ 密码修改成功"\r
API_TOKEN=$(echo "$pw_response" | jq -r '.data.token')\r
new_expires=$(echo "$pw_response" | jq -r '.data.expires_at')\r
# 改密成功后再写入缓存(改密接口直接返回新 Token)\r
mkdir -p ~/.openclaw/workspace/scripts\r
echo "{\"token\": \"${API_TOKEN}\", \"employee_id\": \"${EMPLOYEE_ID}\", \"employee_name\": \"${employee_name}\", \"expires_at\": \"${new_expires}\", \"updated_at\": \"$(iso_now)\"}" > "$TOKEN_CACHE"\r
else\r
pw_error=$(echo "$pw_response" | jq -r '.message')\r
echo "⚠️ 密码修改失败:$pw_error,您可以稍后修改"\r
# 改密失败,旧 Token 仍有效,写入缓存\r
mkdir -p ~/.openclaw/workspace/scripts\r
echo "{\"token\": \"${API_TOKEN}\", \"employee_id\": \"${EMPLOYEE_ID}\", \"employee_name\": \"${employee_name}\", \"expires_at\": \"${expires_at}\", \"updated_at\": \"$(iso_now)\"}" > "$TOKEN_CACHE"\r
fi\r
else\r
# 非首次登录,直接写入缓存\r
mkdir -p ~/.openclaw/workspace/scripts\r
echo "{\"token\": \"${API_TOKEN}\", \"employee_id\": \"${EMPLOYEE_ID}\", \"employee_name\": \"${employee_name}\", \"expires_at\": \"${expires_at}\", \"updated_at\": \"$(iso_now)\"}" > "$TOKEN_CACHE"\r
fi\r
\r
echo "✅ 身份验证成功!欢迎 ${employee_name}"\r
else\r
error_message=$(echo "$response" | jq -r '.message')\r
echo "⚠️ 登录失败:$error_message"\r
echo "建议:确认账号和密码正确,或联系管理员"\r
exit 1\r
fi\r
fi\r
\r
if [ -z "${API_TOKEN:-}" ] || [ "$API_TOKEN" = "null" ] || [ "$API_TOKEN" = "" ]; then\r
echo "⚠️ 身份验证失败,无法获取有效凭证"\r
echo "请输入您的账号和密码,格式:账号 密码"\r
exit 1\r
fi\r
```\r
\r
**交互输入解析规则**:\r
\r
| 用户输入格式 | 解析方式 | 示例 |\r
|-------------|---------|------|\r
| `账号 密码` | 空格分隔,前者为账号,后者为密码 | `emp-server-106 123456` |\r
| `我的账号是xxx,密码是xxx` | 自然语言提取账号和密码 | 自然语言提取 |\r
\r
**重要**:交互输入仅在首次使用时触发一次,Token 写入缓存后后续自动读取,不再询问。\r
\r
---\r
\r
## 公司名称提取\r
\r
从用户输入中去除无关词,剩余部分即为公司名。\r
\r
**无关词分类**:\r
\r
| 类型 | 示例 |\r
|------|------|\r
| 触发词 | 采集、分析、情报雷达、雷达分析、公司分析、情报、雷达 |\r
| 动词 | 查询、查找、搜索、检索、获取、收集、研究、调查、了解、查看、看看 |\r
| 助词 | 的、了、吗、呢、啊、吧、呀、一下、一些、一点、这个、那个 |\r
| 礼貌词 | 请、帮我、麻烦、劳驾、能否、可以、我要、需要、想要、希望、麻烦你 |\r
\r
**公司名验证**:公司名需 ≥2 字符(硬限制),不含特殊字符(`\x3C>`"&|;$`)和 SQL 注入词。\r
\r
---\r
\r
## 销售场景映射\r
\r
后端 LLM 根据用户输入识别销售意图,生成针对性的分析建议:\r
\r
| 销售场景 | 用户输入示例 | 意图类型 | 分析重点 |\r
|---------|------------|---------|---------|\r
| **首次拜访** | "准备拜访华为" | prepare_visit | 客户痛点、拜访切入点、决策链、公司概况 |\r
| **二次跟进** | "华为最近有什么动态" | query_dynamic | 最新变化、跟进时机、客户反馈 |\r
| **促合作** | "帮我分析华为的合作机会" | analyze | 合作机会、切入点、方案建议、竞品分析 |\r
| **准备材料** | "准备华为的材料" | prepare_material | 需求匹配、成功案例、ROI、产品方案 |\r
| **了解客户** | "了解华为" | understand_company | 公司概况、业务模式、战略方向、组织架构 |\r
| **通用查询** | "查一下华为" | general_query | 综合信息、最新动态 |\r
\r
---\r
\r
## 核心工作流\r
\r
```\r
1. 提取公司名\r
2. 输出"🔍 情报雷达正在采集中,请稍候..."\r
3. 调用后端采集接口\r
POST /radar/collect\r
{\r
"company_name": "公司名",\r
"user_input": "用户原始输入",\r
"force_refresh": false\r
}\r
当用户输入包含"重新/刷新/强制/更新"时,force_refresh 传 true(跳过缓存强制采集)\r
返回: {"task_id": "task_xxx"}\r
或返回: {"status": "need_confirm", "candidates": [...]}(缓存部分匹配)\r
4. 轮询任务状态\r
GET /radar/task/{task_id}\r
- 每 10 秒查询一次\r
- 最长等待 20 分钟\r
- 状态为 completed 时获取结果\r
5. 输出摘要 + H5 链接\r
6. 客户关联检查\r
- 已添加为客户 → 不输出任何信息\r
- 未添加为客户 → 提示"该公司未添加为客户,回复"添加"可快速添加"\r
```\r
\r
**注意**:\r
- 步骤 2 之后直到最终摘要输出前,用户看到 `🔍 情报雷达采集中... N%`\r
- 用户原始输入(user_input)完整传递给后端,后端 LLM 负责识别意图\r
- 缓存部分匹配时,后端返回候选列表,展示给用户确认后重新调用\r
\r
---\r
\r
## 后端接口调用\r
\r
### 触发采集\r
\r
```\r
POST /radar/collect\r
Authorization: Bearer ${API_TOKEN}\r
Content-Type: application/json\r
\r
{\r
"company_name": "公司名",\r
"user_input": "用户原始输入",\r
"force_refresh": false\r
}\r
```\r
\r
**强制刷新**:当用户输入包含"重新/刷新/强制/更新"等词时,`force_refresh` 设为 `true`,后端将跳过缓存直接重新采集。\r
\r
**响应(正常)**:\r
```json\r
{\r
"code": 0,\r
"data": {\r
"task_id": "task_xxx",\r
"status": "pending"\r
}\r
}\r
```\r
\r
**响应(缓存部分匹配,需要用户确认)**:\r
```json\r
{\r
"code": 0,\r
"data": {\r
"status": "need_confirm",\r
"message": "检测到多个匹配的公司",\r
"candidates": [\r
{"company_name": "华为技术有限公司", "company_id": "xxx"},\r
{"company_name": "华为终端有限公司", "company_id": "yyy"}\r
]\r
}\r
}\r
```\r
\r
**缓存部分匹配处理**:\r
1. 展示候选列表给用户\r
2. 用户确认后,重新调用接口:\r
```json\r
{\r
"company_name": "华为技术有限公司",\r
"user_input": "用户原始输入",\r
"confirmed_company_id": "xxx",\r
"force_refresh": false\r
}\r
```\r
\r
---\r
\r
## 轮询逻辑\r
\r
**⚠️ 提示:照原样跑,别自作聪明拆字段**\r
\r
```bash\r
TASK_ID="task_xxx"\r
MAX_RETRIES=120\r
RETRY_INTERVAL=10\r
\r
for i in $(seq 1 $MAX_RETRIES); do\r
RESPONSE=$(curl -s --max-time 30 -H "Authorization: Bearer ${API_TOKEN}" "${FASTAPI_BASE_URL}/radar/task/${TASK_ID}")\r
CURL_EXIT=$?\r
\r
if [ $CURL_EXIT -ne 0 ] || [ -z "$RESPONSE" ]; then\r
echo "⚠️ 网络异常,正在重试... (${i}/${MAX_RETRIES})"\r
sleep $RETRY_INTERVAL\r
continue\r
fi\r
\r
STATUS=$(echo "$RESPONSE" | jq -r '.data.status')\r
PROGRESS=$(echo "$RESPONSE" | jq -r '.data.progress')\r
\r
if [ "$STATUS" = "completed" ]; then\r
RESULT=$(echo "$RESPONSE" | jq -r '.data.result')\r
\r
SOURCE=$(echo "$RESULT" | jq -r '.source')\r
USER_QUESTION=$(echo "$RESULT" | jq -r '.intent_summary.user_question')\r
SUMMARY=$(echo "$RESULT" | jq -r '.intent_summary.summary_text')\r
SUGGESTIONS=$(echo "$RESULT" | jq -r '.intent_summary.suggestions[]? | "\(.title):\(.action // .content)"' 2>/dev/null || echo "$RESULT" | jq -r '.intent_summary.suggestions[]? // empty')\r
TALKING_POINTS=$(echo "$RESULT" | jq -r '.intent_summary.talking_points[]? // empty')\r
H5_URL=$(echo "$RESULT" | jq -r '.h5_url')\r
\r
# 无数据场景\r
if [ "$SOURCE" = "none" ]; then\r
echo "⚠️ ${SUMMARY}"\r
echo ""\r
echo "💡 可能的原因:"\r
echo " • 公司名称不准确,请确认后重试"\r
echo " • 该公司近期无公开动态"\r
echo " • 该公司为非公开企业,信息较少"\r
echo ""\r
echo "请确认公司名称是否正确,或提供更多信息以便精准采集。"\r
break\r
fi\r
\r
echo "🔍 ${USER_QUESTION}"\r
echo ""\r
echo "✅ ${SUMMARY}"\r
echo ""\r
\r
# 销售建议\r
if [ -n "$SUGGESTIONS" ]; then\r
echo "💡 销售建议:"\r
echo "$SUGGESTIONS" | while IFS= read -r suggestion; do\r
[ -n "$suggestion" ] && echo "• ${suggestion}"\r
done\r
echo ""\r
fi\r
\r
# 拜访话题\r
if [ -n "$TALKING_POINTS" ]; then\r
echo "🗣️ 拜访话题:"\r
echo "$TALKING_POINTS" | while IFS= read -r topic; do\r
[ -n "$topic" ] && echo "• ${topic}"\r
done\r
echo ""\r
fi\r
\r
echo "📊 [查看完整情报雷达 →](${H5_URL})"\r
\r
# 客户检查\r
CHECK_RESULT=$(curl -s --max-time 30 "${FASTAPI_BASE_URL}/customer/check?company_name=$(python3 -c "import urllib.parse; print(urllib.parse.quote('${COMPANY_NAME}'))")" \\r
-H "Authorization: Bearer ${API_TOKEN}" 2>/dev/null)\r
\r
if [ $? -eq 0 ] && [ -n "$CHECK_RESULT" ]; then\r
EXISTS=$(echo "$CHECK_RESULT" | jq -r '.data.exists')\r
if [ "$EXISTS" = "true" ]; then\r
# 已添加为客户,不输出任何信息\r
:\r
else\r
echo ""\r
echo "💡 该公司未添加为客户,回复"添加"可快速添加"\r
fi\r
fi\r
\r
break\r
elif [ "$STATUS" = "failed" ]; then\r
ERROR=$(echo "$RESPONSE" | jq -r '.data.error')\r
echo "❌ 采集失败:${ERROR}"\r
break\r
elif [ -n "$PROGRESS" ] && [ "$PROGRESS" != "null" ]; then\r
echo "🔍 情报雷达采集中... ${PROGRESS}%"\r
fi\r
\r
sleep $RETRY_INTERVAL\r
done\r
\r
# 轮询超时处理\r
if [ $i -eq $MAX_RETRIES ]; then\r
echo ""\r
echo "⏱️ 采集任务超时(已超过20分钟),请稍后通过以下方式查看结果:"\r
echo " • 重新发送查询请求"\r
echo " • 或联系管理员检查任务状态"\r
fi\r
```\r
\r
### 轮询接口\r
\r
```\r
GET /radar/task/{task_id}\r
Authorization: Bearer ${API_TOKEN}\r
```\r
\r
**响应**:\r
```json\r
{\r
"code": 0,\r
"data": {\r
"task_id": "task_xxx",\r
"status": "pending|processing|completed|failed",\r
"progress": 50,\r
"result": {\r
"company_id": "szyckj_3f7a",\r
"company_name": "数智云创科技有限公司",\r
"intent_summary": {\r
"intent_type": "query_dynamic",\r
"summary_text": "已为您收集数智云创科技有限公司最近最重要的动态",\r
"focus_points": ["动态标题1", "动态标题2", "动态标题3"],\r
"top_dynamics": [...]\r
},\r
"h5_url": "http://47.116.49.218:5173/intelligence-radar/szyckj_3f7a?code=xxx"\r
}\r
}\r
}\r
```\r
\r
---\r
\r
### 检查客户是否已添加\r
\r
```\r
GET /customer/check?company_name={公司名}\r
Authorization: Bearer ${API_TOKEN}\r
```\r
\r
**响应**:\r
```json\r
{\r
"code": 0,\r
"data": {\r
"exists": true,\r
"customer_id": 123,\r
"company_name": "中软国际(中国)科技有限公司"\r
}\r
}\r
```\r
\r
---\r
\r
### 快速添加客户\r
\r
```\r
POST /customer/quick-add\r
Authorization: Bearer ${API_TOKEN}\r
Content-Type: application/json\r
\r
{\r
"company_name": "中软国际(中国)科技有限公司"\r
}\r
```\r
\r
**响应**:\r
```json\r
{\r
"code": 0,\r
"data": {\r
"customer_id": 124,\r
"company_name": "中软国际(中国)科技有限公司"\r
}\r
}\r
```\r
\r
---\r
\r
## 换码机制\r
\r
后端生成换码并返回 H5 链接:\r
\r
```\r
H5_URL = "http://47.116.49.218:5173/intelligence-radar/{company_id}?code={exchange_code}"\r
```\r
\r
换码由后端管理,包含 `employee_id` 和 `intent_summary`。\r
\r
---\r
\r
## 聊天摘要输出\r
\r
从后端返回的 `intent_summary` 中提取信息输出,**只保留销售最关心的建议和话题**:\r
\r
```\r
🔍 {user_question}\r
\r
✅ {summary_text}\r
\r
💡 销售建议:\r
• {suggestion_1}\r
• {suggestion_2}\r
\r
🗣️ 拜访话题:\r
• {talking_point_1}\r
• {talking_point_2}\r
\r
📊 [查看完整情报雷达 →]({h5_url})\r
```\r
\r
**注意**:\r
- `user_question` 是用户原始问题\r
- `summary_text` 由后端 LLM 根据意图动态生成(如"已为您分析上海外服(集团)有限公司的关键信息"),不是固定格式\r
- 聊天只输出摘要,完整数据(profile、dynamics、focus_points、objection_handling、next_steps 等)通过 H5 链接查看\r
- SKILL 只负责格式化输出,不参与意图判断和摘要生成\r
\r
---\r
\r
## 客户关联检查\r
\r
### 检查时机\r
采集完成后(轮询状态为 `completed` 时),自动检查该公司是否已添加为客户。\r
\r
### 检查逻辑\r
```bash\r
# 检查是否已添加为客户\r
CHECK_RESULT=$(curl -s --max-time 30 "${FASTAPI_BASE_URL}/customer/check?company_name=$(python3 -c "import urllib.parse; print(urllib.parse.quote('${COMPANY_NAME}'))")" \\r
-H "Authorization: Bearer ${API_TOKEN}" 2>/dev/null)\r
\r
if [ $? -eq 0 ] && [ -n "$CHECK_RESULT" ]; then\r
EXISTS=$(echo "$CHECK_RESULT" | jq -r '.data.exists')\r
if [ "$EXISTS" = "true" ]; then\r
# 已添加为客户,不输出任何信息\r
:\r
else\r
# 未添加为客户,提示用户\r
echo ""\r
echo "💡 该公司未添加为客户,回复"添加"可快速添加"\r
# 保存状态,用于识别用户回复"添加"的意图\r
LAST_COMPANY_NAME="${COMPANY_NAME}"\r
fi\r
fi\r
```\r
\r
### 用户回复"添加"的处理\r
\r
**触发条件**:用户输入为"添加",且上一轮输出过"该公司未添加为客户"提示。\r
\r
**处理逻辑**:\r
```bash\r
# 检查是否是添加客户的回复\r
if [ "${USER_INPUT}" = "添加" ] && [ -n "${LAST_COMPANY_NAME}" ]; then\r
# 调用快速添加客户 API\r
ADD_RESULT=$(curl -s --max-time 30 -X POST "${FASTAPI_BASE_URL}/customer/quick-add" \\r
-H "Content-Type: application/json" \\r
-H "Authorization: Bearer ${API_TOKEN}" \\r
-d "{\"company_name\": \"${LAST_COMPANY_NAME}\"}" 2>/dev/null)\r
\r
if [ $? -eq 0 ] && [ -n "$ADD_RESULT" ]; then\r
CUSTOMER_ID=$(echo "$ADD_RESULT" | jq -r '.data.customer_id')\r
if [ "$CUSTOMER_ID" != "null" ] && [ -n "$CUSTOMER_ID" ]; then\r
echo "✅ 已添加客户 [${LAST_COMPANY_NAME}]"\r
else\r
ERROR_MSG=$(echo "$ADD_RESULT" | jq -r '.message')\r
echo "❌ 添加客户失败:${ERROR_MSG}"\r
fi\r
else\r
echo "❌ 添加客户失败,请稍后重试"\r
fi\r
\r
# 清除状态\r
LAST_COMPANY_NAME=""\r
fi\r
```\r
\r
### 错误处理\r
- 如果检查客户 API 调用失败(网络错误、超时等),静默处理,不影响主流程输出\r
- 如果添加客户 API 调用失败,输出错误提示给用户\r
\r
---\r
\r
## 重要规则(红线)\r
\r
1. **🚫 聊天输出红线**:聊天中严禁输出完整的 profile JSON、dynamics 列表、原始采集数据。聊天只允许输出摘要格式。完整数据通过 H5 链接查看。\r
2. **🚫 系统日志静默**:采集过程中的内部日志(预检结果、API 调用细节、错误处理等)严禁输出给用户。轮询进度提示 `🔍 情报雷达采集中... N%` 为用户友好交互,允许输出。\r
3. **🚫 绝不编造数据**:未找到的信息标记为"暂无数据",不猜测不发明。公司名可能不存在时,优先提示用户确认,而非强行采集编造。\r
4. **时间范围严格 6 个月**:只采集 6 个月内的信息,过期信息不纳入(后端控制)\r
5. **入库后方可输出**:未成功采集的数据不输出到聊天\r
6. **不识别意图**:用户原始输入完整传递给后端,不在 SKILL 中做任何意图判断\r
\r
---\r
\r
## 使用示例\r
\r
**示例1:查询动态**\r
```\r
用户: "华为最近动态"\r
→ 提取公司名:华为\r
→ 输出"🔍 情报雷达正在采集中,请稍候..."\r
→ [内部] 调用后端采集 → 轮询等待\r
→ 输出摘要 + H5 链接\r
→ [内部] 检查客户是否已添加\r
→ 已添加:不输出\r
→ 未添加:输出"💡 该公司未添加为客户,回复"添加"可快速添加"\r
```\r
\r
**示例2:准备拜访**\r
```\r
用户: "我要拜访阿里"\r
→ 提取公司名:阿里\r
→ 输出"🔍 情报雷达正在采集中,请稍候..."\r
→ [内部] 调用后端采集 → 轮询等待\r
→ 输出摘要 + H5 链接\r
→ [内部] 检查客户是否已添加\r
```\r
\r
**示例3:添加客户**\r
```\r
用户: "查询华为"\r
→ [内部] 完整采集流程\r
→ 输出摘要 + H5 链接\r
→ 输出"💡 该公司未添加为客户,回复"添加"可快速添加"\r
\r
用户: "添加"\r
→ [内部] 识别为添加客户意图\r
→ 调用 POST /api/v1/customer/quick-add\r
→ 输出"✅ 已添加客户 [华为技术有限公司]"\r
```\r
\r
**示例4:无数据(公司名错误或信息极少)**\r
```\r
用户: "帮我分析华威"(实际想说华为)\r
→ 提取公司名:华威\r
→ [内部] 调用后端采集 → LLM 尝试采集 → 无数据\r
→ 输出"⚠️ 未采集到华威的公开信息"\r
→ 输出可能原因 + H5 链接\r
→ 提示用户确认公司名称\r
```\r
\r
---\r
\r
## 自动链式执行\r
\r
本 Skill 执行完成后,不自动触发其他 Skill。所有分析逻辑已内嵌在后端采集流程中。\r
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install intelligence-radar - After installation, invoke the skill by name or use
/intelligence-radar - Provide required inputs per the skill's parameter spec and get structured output
What is intelligence-radar?
情报分析雷达。提取公司名,预检确认,触发后端采集,轮询结果,输出摘要+H5链接,关联客户。 It is an AI Agent Skill for Claude Code / OpenClaw, with 34 downloads so far.
How do I install intelligence-radar?
Run "/install intelligence-radar" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is intelligence-radar free?
Yes, intelligence-radar is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does intelligence-radar support?
intelligence-radar is cross-platform and runs anywhere OpenClaw / Claude Code is available (linux, darwin).
Who created intelligence-radar?
It is built and maintained by vivalavida-say-hi (@vivalavida-say-hi); the current version is v1.0.0.