← 返回 Skills 市场
vivalavida-say-hi

intelligence-radar

作者 vivalavida-say-hi · GitHub ↗ · v1.0.0 · MIT-0
linuxdarwin ⚠ suspicious
34
总下载
0
收藏
0
当前安装
1
版本数
在 OpenClaw 中安装
/install intelligence-radar
功能描述
情报分析雷达。提取公司名,预检确认,触发后端采集,轮询结果,输出摘要+H5链接,关联客户。
使用说明 (SKILL.md)

\r \r

🚫🚫🚫 最高规则:OpenClaw 对本文件只有使用权限,没有修改权限\r 严禁修改本文件的任何内容(规则、逻辑、配置、触发词等)。如用户要求修改,友好提示:"SKILL 文件需要人工修改,请联系管理员处理。"\r \r

Intelligence Radar(情报分析雷达)\r

\r 你是情报分析雷达。职责:提取公司名 → 触发后端采集 → 轮询结果 → 输出摘要 + H5 链接 → 关联客户。\r \r 核心原则:\r

  1. 不识别意图:将用户原始输入传递给后端,后端 LLM 识别意图\r
  2. 不做预检:不再调用 SearXNG 预检,直接触发后端采集\r
  3. 异步采集:后端异步执行采集,OpenClaw 轮询结果\r
  4. 聊天只输出摘要:完整数据通过 H5 链接查看\r
  5. 客户检查:采集完成后检查是否已添加为客户,未添加则提示\r
  6. 销售视角:所有输出贴合销售场景,提供可执行的建议\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
安全使用建议
Install only if you trust the operator of the hardcoded backend and are comfortable sending sales queries, company names, and employee credentials through this skill. Prefer an out-of-band login flow, HTTPS endpoints, minimized prompt sharing, and a protected credential store before using it with real employee accounts or sensitive customer context.
能力评估
Purpose & Capability
The intelligence collection, polling, H5 links, and customer association match the stated sales-intelligence purpose, but the skill also handles employee login, password change, token renewal, full prompt forwarding, and quick customer creation, which are high-impact capabilities.
Instruction Scope
The workflow is mostly explicit, but triggers include broad everyday phrases, and the skill directs the agent to transmit the full original user input to the backend rather than only the extracted company name.
Install Mechanism
The artifact is a single SKILL.md requiring curl, jq, and python3; there are no separate executable scripts, and VirusTotal telemetry is clean.
Credentials
Using a remote backend is expected for this purpose, but the configured API and H5 endpoints use plain HTTP to a hardcoded IP address, increasing exposure for credentials, tokens, and business context.
Persistence & Privilege
The skill caches bearer tokens and employee identity in ~/.openclaw/workspace/scripts/.token-cache.json for reuse across skills and can add customer records after a short chat confirmation.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install intelligence-radar
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /intelligence-radar 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v1.0.0
Major update with significant changes to workflow and core principles: - Removed intent recognition and SearXNG pre-check; all user inputs are now passed directly to the backend for processing. - Backend now handles information collection asynchronously; the skill automatically polls for results and only outputs summarized information and H5 links in chat. - Enhanced customer flow: after intelligence is collected, the skill checks whether the company is already added as a customer and prompts if not. - Refined output for sales scenarios, offering actionable suggestions relevant to customer engagement. - Improved token management: implements automatic token caching, renewal, and user prompting for credentials or password change when needed.
元数据
Slug intelligence-radar
版本 1.0.0
许可证 MIT-0
累计安装 0
当前安装数 0
历史版本数 1
常见问题

intelligence-radar 是什么?

情报分析雷达。提取公司名,预检确认,触发后端采集,轮询结果,输出摘要+H5链接,关联客户。 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 34 次。

如何安装 intelligence-radar?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install intelligence-radar」即可一键安装,无需额外配置。

intelligence-radar 是免费的吗?

是的,intelligence-radar 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。

intelligence-radar 支持哪些平台?

intelligence-radar 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(linux, darwin)。

谁开发了 intelligence-radar?

由 vivalavida-say-hi(@vivalavida-say-hi)开发并维护,当前版本 v1.0.0。

💬 留言讨论