{"id":"e5b56db1-3630-4f84-8848-4093afcad2be","entityType":"agent","slug":"clawhub-pe-evolver-voice-wake","name":"jm-call","canonicalUrl":"https://www.xpersona.co/agent/clawhub-pe-evolver-voice-wake","canonicalPath":"/agent/clawhub-pe-evolver-voice-wake","generatedAt":"2026-10-11T20:56:38.206Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T16:54:24.308Z","emptyReason":null},"description":"Speak responses aloud on macOS using the built-in `say` command when user input indicates Voice Wake/voice recognition (for example, messages starting with \"... Skill: jm-call Owner: pe-evolver Summary: Speak responses aloud on macOS using the built-in say command when user input indicates Voice Wake/voice recognition (for example, messages starting with \"... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-03-24T05:50:36.062Z | user - Switched skill focus from \"jm-call\" AI calling to \"voice-wake-say\" for speaking responses aloud on macOS with the say command. - Removed cod","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17e0m57kdjqsap0apqw5jr7fd83gvnw:voice-wake","sourceUrl":"https://clawhub.ai/pe-evolver/voice-wake","homepage":"https://clawhub.ai/pe-evolver/skills/voice-wake","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/pe-evolver/voice-wake","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/pe-evolver/skills/voice-wake","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":44,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Speak responses aloud on macOS using the built-in `say` command when user input indicates Voice Wake/voice recognition (for example, messages starting with \"..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T16:54:24.308Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T16:54:24.308Z","emptyReason":null},"stars":null,"forks":null,"downloads":1024,"packageName":null,"latestVersion":"1.0.3","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T16:54:24.308Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T16:54:24.308Z","lastCrawledAt":"2026-10-11T16:54:24.308Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T16:54:24.308Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.3","createdAt":"2026-03-24T05:50:36.062Z","changelog":"- Switched skill focus from \"jm-call\" AI calling to \"voice-wake-say\" for speaking responses aloud on macOS with the `say` command. - Removed code and documentation related to outbound calling, API references, and scripts. - Added info and workflow for detecting when to use macOS `say` (voice recognition trigger). - Provides strict guidance: only speak if user message starts with \"User talked via voice recognition\". - Added failure handling for when speech output is unavailable. - Now text-only, with optional local speech output on macOS; no longer handles outbound calls.","fileCount":3,"zipByteSize":2369},{"version":"1.0.2","createdAt":"2026-03-24T03:53:07.513Z","changelog":"**Summary:** Skill metadata now standardized and privacy/configuration info clarified. No logic or workflow changes. - Skill name corrected from \"jm-aicall\" to \"yanxi-aicall\"; \"author\" and homepage updated correspondingly. - Added explicit `required_env_vars` and `required_binaries` sections to metadata for easier setup and validation. - Included a machine-readable `privacy` block, specifying PII handling and user consent requirement. - Enhanced documentation about privacy protection, API key configuration methods, and file permissions. - No functional changes to the core call workflow or response logic.","fileCount":5,"zipByteSize":14724},{"version":"1.0.1","createdAt":"2026-03-24T03:39:25.830Z","changelog":"Version 1.0.1 – Changelog - Major update: SKILL.md rewritten with comprehensive documentation and workflow. - Now includes step-by-step instructions for outbound call handling: intent extraction, info collection, confirmation, API invocation, and result processing. - Strong privacy statement: explicit user consent required before calls; clear data usage and retention explanation. - Expanded guidance on information collection, scene-specific questioning, and error/result handling. - Added configuration details for API integration, environment, and security practices. - Enhanced description of applicable scenarios and batch questioning for efficiency.","fileCount":5,"zipByteSize":14323},{"version":"1.0.0","createdAt":"2026-03-24T03:21:53.814Z","changelog":"JM AI Call 3.0.0 introduces a robust workflow and intelligent information collection for outbound call automation. - Improved information extraction and context-aware questioning to reduce follow-up prompts. - Streamlined multi-question prompts to gather all required details in fewer steps. - Dynamic response handling: collects missing info when backend returns parameter errors. - Enhanced user confirmation flow and clear result feedback, including handling risk control blocks. - Supports various call scenarios (appointments, promotions, reminders, inquiries, care calls) without preset limitations.","fileCount":5,"zipByteSize":13176}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17e0m57kdjqsap0apqw5jr7fd83gvnw:voice-wake","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T20:56:38.205Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pe-evolver-voice-wake/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T16:54:24.308Z","emptyReason":null},"readme":"Skill: jm-call\n\nOwner: pe-evolver\n\nSummary: Speak responses aloud on macOS using the built-in `say` command when user input indicates Voice Wake/voice recognition (for example, messages starting with \"...\n\nTags: latest:1.0.3\n\nVersion history:\n\nv1.0.3 | 2026-03-24T05:50:36.062Z | user\n\n- Switched skill focus from \"jm-call\" AI calling to \"voice-wake-say\" for speaking responses aloud on macOS with the `say` command.\n- Removed code and documentation related to outbound calling, API references, and scripts.\n- Added info and workflow for detecting when to use macOS `say` (voice recognition trigger).\n- Provides strict guidance: only speak if user message starts with \"User talked via voice recognition\".\n- Added failure handling for when speech output is unavailable.\n- Now text-only, with optional local speech output on macOS; no longer handles outbound calls.\n\nv1.0.2 | 2026-03-24T03:53:07.513Z | user\n\n**Summary:**  \nSkill metadata now standardized and privacy/configuration info clarified. No logic or workflow changes.\n\n- Skill name corrected from \"jm-aicall\" to \"yanxi-aicall\"; \"author\" and homepage updated correspondingly.\n- Added explicit `required_env_vars` and `required_binaries` sections to metadata for easier setup and validation.\n- Included a machine-readable `privacy` block, specifying PII handling and user consent requirement.\n- Enhanced documentation about privacy protection, API key configuration methods, and file permissions.\n- No functional changes to the core call workflow or response logic.\n\nv1.0.1 | 2026-03-24T03:39:25.830Z | user\n\nVersion 1.0.1 – Changelog\n\n- Major update: SKILL.md rewritten with comprehensive documentation and workflow.\n- Now includes step-by-step instructions for outbound call handling: intent extraction, info collection, confirmation, API invocation, and result processing.\n- Strong privacy statement: explicit user consent required before calls; clear data usage and retention explanation.\n- Expanded guidance on information collection, scene-specific questioning, and error/result handling.\n- Added configuration details for API integration, environment, and security practices.\n- Enhanced description of applicable scenarios and batch questioning for efficiency.\n\nv1.0.0 | 2026-03-24T03:21:53.814Z | user\n\nJM AI Call 3.0.0 introduces a robust workflow and intelligent information collection for outbound call automation.\n\n- Improved information extraction and context-aware questioning to reduce follow-up prompts.\n- Streamlined multi-question prompts to gather all required details in fewer steps.\n- Dynamic response handling: collects missing info when backend returns parameter errors.\n- Enhanced user confirmation flow and clear result feedback, including handling risk control blocks.\n- Supports various call scenarios (appointments, promotions, reminders, inquiries, care calls) without preset limitations.\n\nArchive index:\n\nArchive v1.0.3: 3 files, 2369 bytes\n\nFiles: _meta.json (129b), skill-card.md (1860b), SKILL.md (1877b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: voice-wake-say\ndescription: Speak responses aloud on macOS using the built-in `say` command when user input indicates Voice Wake/voice recognition (for example, messages starting with \"User talked via voice recognition on <device>\").\n---\n\n# Voice Wake Say\n\n## Overview\nUse macOS `say` to read the assistant's response out loud whenever the conversation came from Voice Wake/voice recognition. Do **not** use the `tts` tool (it calls cloud providers).\n\n## When to Use `say` (CHECK EVERY MESSAGE INDIVIDUALLY)\n\n**IF** the user message STARTS WITH: `User talked via voice recognition`\n- **Step 1:** Acknowledge with `say` first (so the user knows you heard them)\n- **Step 2:** Then perform the task\n- **Step 3:** Optionally speak again when done if it makes sense\n\n**IF** the user message does NOT start with that exact phrase\n- THEN: Do NOT use `say`. Text-only response only.\n\n**Critical:**\n- Check EACH message individually — context does NOT carry over\n- The trigger phrase must be at the VERY START of the message\n- For tasks that take time, acknowledge FIRST so the user knows you're working\n\n## Workflow\n1) Detect Voice Wake context\n- Trigger ONLY when the latest user/system message STARTS WITH `User talked via voice recognition`\n- If the message instructs \"repeat prompt first\", keep that behavior in the response.\n\n2) Prepare spoken text\n- Use the final response text as the basis.\n- Strip markdown/code blocks; if the response is long or code-heavy, speak a short summary and mention that details are on screen.\n\n3) Speak with `say` (local macOS TTS)\n```bash\nprintf '%s' \"$SPOKEN_TEXT\" | say\n```\n\nOptional controls (use only if set):\n```bash\nprintf '%s' \"$SPOKEN_TEXT\" | say -v \"$SAY_VOICE\"\nprintf '%s' \"$SPOKEN_TEXT\" | say -r \"$SAY_RATE\"\n```\n\n## Failure handling\n- If `say` is unavailable or errors, still send the text response and note that TTS failed.\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn7e9w2zb20pqv6p0wwd0nexw182nfxw\",\n  \"slug\": \"voice-wake\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1774331436062\n}\n\nFile v1.0.3:skill-card.md\n\n## Description:\n\nSpeak responses aloud on macOS using the built-in `say` command when user input indicates Voice Wake/voice recognition.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[pe-evolver](https://clawhub.ai/user/pe-evolver)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and external users use this skill to have an agent speak responses aloud on macOS only when a Voice Wake trigger is present, while keeping normal typed interactions text-only.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Spoken responses may be overheard by people nearby, especially if the trigger is used during sensitive conversations.\n\nMitigation: Use the Voice Wake trigger only in private environments for sensitive content; otherwise rely on the text response.\n\nRisk: The skill depends on the local macOS `say` command and cannot provide speech output when that command is unavailable or fails.\n\nMitigation: Continue with the text response and note the speech failure so the user still receives the answer.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/pe-evolver/skills/voice-wake)\n- [Publisher profile](https://clawhub.ai/user/pe-evolver)\n\n## Skill Output:\n\n**Output Type(s):** [text, shell commands, guidance]\n\n**Output Format:** [Markdown with inline bash commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May trigger local macOS speech output with `say` when the required Voice Wake phrase starts the user message.]\n\n## Skill Version(s):\n\n1.0.3 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.2: 5 files, 14724 bytes\n\nFiles: references/api-reference.md (3642b), scripts/make-call.sh (4836b), scripts/query-call.sh (22172b), SKILL.md (13717b), _meta.json (129b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: yanxi-aicall\ndescription: AI-powered outbound calling service. Use when user expresses intent to make phone calls (e.g., \"help me call xxx to book a table\", \"call customer about promotion\", \"remind user about payment\"). Collects call information and delegates prompt generation to backend.\nversion: 3.1.0\nauthor: yanxi\nlicense: MIT\nhomepage: https://yanxi-aicall.jd.com/\nrequired_env_vars:\n  - name: YANXI_API_KEY\n    description: API key for Yanxi AI Call service (apply at https://yanxi-aigc-uat.jd.com/jimi/mine/api-center)\n    required: true\n  - name: YANXI_BASE_URL\n    description: API base URL (optional, defaults to https://yanxi-ai-api.jd.com)\n    required: false\nrequired_binaries:\n  - curl\n  - jq\nprivacy:\n  pii_transmitted: true\n  pii_stored_locally: true\n  third_party_api: Yanxi AI Call (JD.com)\n  user_consent_required: true\n---\n\n# Yanxi AI Call - 智能外呼服务\n\n用户有打电话意图 → 意图提取 → 信息收集 → 确认 → 调用外呼 → 检查结果 → 补充信息（如需）\n\n---\n\n## ⚠️ 隐私声明与用户确认\n\n**重要：在调用外呼接口前，必须向用户展示确认卡片并获得明确同意。**\n\n### 数据收集与传输\n\n本 skill 会收集以下信息并发送到 Yanxi AI 外呼服务：\n\n| 数据类型 | 用途 | 是否传输 | 是否本地存储 |\n|----------|------|----------|--------------|\n| 电话号码 | 外呼目标号码 | ✓ | ✓ |\n| 对话上下文 | AI 理解通话目的 | ✓ | ✓ |\n| 通话记录 | 状态和日志 | - | ✓ |\n\n### 第三方服务\n\n- **API 提供方**：Yanxi AI Call（京东言犀智能外呼平台）\n- **API 端点**：`https://yanxi-ai-api.jd.com`\n- **隐私政策**：https://yanxi-aicall.jd.com/privacy\n- **API Key 申请**：https://yanxi-aigc-uat.jd.com/jimi/mine/api-center\n\n### 本地数据保留\n\n- 请求记录：`memory/yanxi-calls/requests.jsonl`\n- 通话日志：`memory/yanxi-calls/costs.jsonl`\n- 这两个文件包含 PII（电话号码、对话内容），用户可随时删除\n\n### 用户确认流程\n\n在信息收集完毕后，**必须**展示确认卡片：\n\n```markdown\n📞 外呼确认\n\n对象：{Who}\n电话：{Phone}\n目的：{What}\n\n⚠️ 以下信息将发送到 Yanxi AI 外呼服务（京东言犀平台）：\n• 电话号码：{Phone}\n• 对话内容：{对话摘要}\n\n确认拨打？（回复\"确认\"或\"取消\"）\n```\n\n**仅在用户明确确认后才执行外呼。**\n\n---\n\n## 🎯 触发条件\n\n当用户表达以下意图时触发：\n\n- \"帮我给xxx打个电话预约个位子\"\n- \"给老客户打电话推销活动\"\n- \"打电话提醒用户还款\"\n- \"帮我问下我父亲最近身体怎么样\"\n- \"给客户打电话确认预约时间\"\n\n**关键词**：打电话、致电、外呼、电话通知、电话确认\n\n---\n\n## 📋 步骤 1：意图提取\n\n从用户输入中提取核心信息：\n\n| 要素 | 说明 | 示例 |\n|------|------|------|\n| **Who** | 打给谁（名称/关系/机构） | 蜀九香、我爸、老客户 |\n| **Phone** | 电话号码 | 18033009923 |\n| **What** | 外呼目的 | 预约位子、推销活动、问身体状况 |\n\n---\n\n## 📝 步骤 2：信息收集\n\n**目标：一次收集尽可能多的信息，减少后续追问次数。**\n\n### 信息收集清单\n\n根据外呼目的，智能判断需要收集哪些信息：\n\n#### 基础信息（必问）\n\n| 信息项 | 说明 | 追问方式 |\n|--------|------|----------|\n| **Who** | 被叫方名称/关系 | \"请问打给谁？\" |\n| **Phone** | 电话号码 | \"请问对方电话是多少？\" |\n| **What** | 外呼目的 | \"请问打电话主要想说什么？\" |\n\n#### 时间信息（涉及时间时追问）\n\n| 信息项 | 适用场景 | 追问方式 |\n|--------|----------|----------|\n| **When** | 预约、提醒、限时活动 | \"请问是什么时间？\" |\n| **Deadline** | 限时事项 | \"有截止时间吗？\" |\n\n#### 地点信息（涉及地点时追问）\n\n| 信息项 | 适用场景 | 追问方式 |\n|--------|----------|----------|\n| **Where** | 预约、上门服务 | \"请问地址是哪里？\" |\n\n#### 业务信息（根据目的追问）\n\n| 信息项 | 适用场景 | 追问方式 |\n|--------|----------|----------|\n| **Details** | 具体事项描述 | \"能具体说说是什么事吗？\" |\n| **KeyPoints** | 推销、活动、通知 | \"有什么需要特别强调的点吗？\" |\n| **SpecialNeeds** | 预约、服务 | \"有什么特殊要求或注意事项吗？\" |\n| **PeopleCount** | 预约用餐、活动 | \"请问几个人？\" |\n| **Duration** | 咨询、调查 | \"大概需要多长时间？\" |\n\n#### 备用信息（可选）\n\n| 信息项 | 说明 | 追问方式 |\n|--------|------|----------|\n| **ContactName** | 被叫方称呼 | \"请问对方怎么称呼？\" |\n| **AltPhone** | 备用电话 | \"有备用联系电话吗？\" |\n| **Notes** | 其他备注 | \"还有其他需要注意的吗？\" |\n\n---\n\n### 信息收集策略\n\n#### 按场景智能追问\n\n**预约类**（预约位子、预约安装、预约服务）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问预约什么时间？\n2. 请问预约在哪个地点？（如不明确）\n3. 请问几个人/需要什么服务？\n4. 有什么特殊要求吗？\n```\n\n**推销/活动类**（推销产品、活动通知、促销推广）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问是什么产品/活动？\n2. 有什么核心卖点或优惠吗？\n3. 活动时间是多久？\n4. 希望客户怎么参与？（下单/到店/链接）\n```\n\n**咨询类**（解答问题、确认信息、回访）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问具体想咨询/确认什么？\n2. 有什么参考资料吗？（如需要）\n3. 大概需要聊多久？\n```\n\n**提醒类**（还款提醒、预约提醒、到期提醒）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问提醒的具体事项是什么？\n2. 关键时间节点是？\n3. 如果对方没接电话怎么处理？（短信/再打）\n```\n\n**关怀类**（问候家人、客户回访）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问对方怎么称呼？\n2. 有什么特别想聊的话题吗？\n3. 需要了解什么信息吗？\n```\n\n**健康关怀类**（问候身体状况）\n```\n已了解：{Who}，{What}\n追问（后端可能要求）：\n1. 基础病史：对方有什么基础疾病吗？\n2. 用药情况：最近在吃什么药吗？\n3. 家属联系方式：有其他家属联系方式吗？\n```\n\n#### 一次追问多个问题\n\n为减少对话轮次，采用批量追问策略：\n\n```markdown\n用户：帮我给蜀九香打个电话预约位子\n\n助手：好的，我帮您预约蜀九香。请补充以下信息：\n1. 预约什么时间？（比如：今天晚上7点）\n2. 几位用餐？\n3. 有什么特殊要求吗？（包间、靠窗等）\n```\n\n#### 已知信息复用\n\n如果对话上下文中已包含信息，不要重复追问：\n\n```markdown\n用户：帮我给我爸打电话问下身体怎么样，电话是138xxxx\n\n助手：好的，帮您给父亲打电话问候身体。\n请问有什么特别想问的吗？比如最近的睡眠、饮食？\n```\n\n---\n\n## ✅ 步骤 3：信息确认（必须）\n\n**⚠️ 重要：在调用外呼接口前，必须向用户展示确认卡片并获得明确同意。**\n\n收集完毕后，展示确认卡片：\n\n```markdown\n📞 外呼确认\n\n对象：{Who}（{ContactName}）\n电话：{Phone}\n目的：{What}\n\n详细信息：\n• 时间：{When}\n• 地点：{Where}\n• 具体事项：{Details}\n• 特殊要求：{SpecialNeeds}\n\n⚠️ 以下信息将发送到 Yanxi AI 外呼服务（京东言犀平台）：\n• 电话号码：{Phone}\n• 对话内容：{对话摘要}\n\n确认拨打？（回复\"确认\"或\"取消\"）\n```\n\n**用户确认后才可进入下一步。如果用户取消，则终止流程。**\n\n---\n\n## 🚀 步骤 4：调用外呼接口\n\n### 构建请求参数\n\n```json\n{\n  \"phone\": \"18033009923\",\n  \"messages\": [\n    \"用户: 帮我给蜀九香打个电话预约位子\",\n    \"助手: 好的，请补充以下信息：\\n1. 预约什么时间？\\n2. 几位用餐？\\n3. 有什么特殊要求吗？\",\n    \"用户: 今天晚上7点，4个人，要个包间\"\n  ]\n}\n```\n\n**messages 说明**：\n- 包含用户与助手之间的完整对话上下文\n- 后端根据上下文生成 prompt\n- 格式为字符串数组：`\"角色: 内容\"`\n\n### 执行调用\n\n```bash\ncd ~/.openclaw/skills/yanxi-aicall\n./scripts/make-call.sh --phone \"{电话}\" --messages '[\"用户: ...\", \"助手: ...\", \"用户: ...\"]'\n```\n\n---\n\n## 🔄 步骤 5：处理返回结果\n\n### 返回格式\n\n**成功响应**：\n```json\n{\n  \"code\": \"10000\",\n  \"result\": \"成功\",\n  \"data\": \"12331@e561a4397b2a402488f2-638cd593f315\"\n}\n```\n\n**失败响应**：\n```json\n{\n  \"code\": \"190001\",\n  \"result\": \"风控校验不通过不能外呼,风控拦截信息：1001涉政\"\n}\n```\n\n### code 说明\n\n| code | 说明 | 处理方式 |\n|------|------|----------|\n| **10000** | 成功 | 告知用户，返回 data 中的 request_id |\n| **190001** | 风控拦截 | **不再重试**，告知用户风控原因 |\n| 其他 | 失败 | 根据 `result` 提示用户 |\n\n### 风控拦截处理\n\n当 `code` 为 `190001` 时，表示被风控系统拦截：\n\n```json\n{\n  \"code\": \"190001\",\n  \"result\": \"风控校验不通过不能外呼,风控拦截信息：1001涉政\"\n}\n```\n\n此时告知用户：\n```\n外呼被风控拦截：{result}\n请更换通话内容或联系管理员。\n```\n\n**注意**：风控拦截后不要重试，直接结束流程。\n\n### 其他失败处理\n\n当 `code` 为其他值时，根据 `result` 或 `message` 字段判断原因：\n\n**缺少必填参数（code: \"430004\"）**：\n```json\n{\n  \"code\": \"430004\",\n  \"message\": \"外呼缺少场景必填参数: [\\\"基础病史\\\",\\\"用药情况\\\",\\\"家属联系方式\\\"]\"\n}\n```\n\n此时追问用户缺失的参数：\n```\n还需要补充以下信息：\n1. 基础病史：对方有什么基础疾病吗？\n2. 用药情况：最近在吃什么药吗？\n3. 家属联系方式：有其他家属联系方式吗？\n```\n\n用户补充后，更新 messages 并重新调用。\n\n**系统异常（code: \"130003\"）**：\n```json\n{\n  \"code\": \"130003\",\n  \"message\": \"调用业务系统异常\"\n}\n```\n\n此时提示用户稍后重试。\n\n---\n\n## 📊 步骤 6：查询通话结果\n\n外呼发起后，可查询通话结果：\n\n```bash\n./scripts/query-call.sh --request-id \"{request_id}\"\n```\n\n话单位置：`memory/yanxi-calls/costs.jsonl`\n\n---\n\n## 📁 文件结构\n\n```\nyanxi-aicall/\n├── SKILL.md                    # 本文件（工作流）\n├── scripts/\n│   ├── make-call.sh            # 执行外呼\n│   └── query-call.sh           # 查询结果\n├── references/\n│   └── api-reference.md        # API 文档\n└── memory/\n    └── yanxi-calls/\n```\n\n---\n\n## 🔄 泛化能力\n\n本 skill 不预设场景类型，通过以下方式实现泛化：\n\n1. **通用信息框架**：Who/What/Phone 为核心，时间/地点/详情为扩展\n2. **智能追问**：根据外呼目的判断需要收集的信息\n3. **批量收集**：一次追问多个问题，减少对话轮次\n4. **对话传递**：完整 messages 传给后端，由后端理解场景\n5. **动态补充**：根据后端返回的 `result` 动态追问缺失信息\n\n适用场景包括但不限于：\n- 预约场景（预约位子、预约安装）\n- 推销场景（活动推广、产品营销）\n- 咨询场景（解答问题、确认信息）\n- 提醒场景（还款提醒、预约提醒）\n- 关怀场景（问候家人、客户回访）\n- 其他任意外呼需求\n\n---\n\n## ⚙️ 配置\n\n### 前置要求\n\n本 skill 需要以下工具：\n- `curl` - HTTP 客户端（用于 API 请求）\n- `jq` - JSON 处理器（用于解析响应）\n\n### 环境变量（必需）\n\n| 变量名 | 必需 | 说明 | 默认值 |\n|--------|------|------|--------|\n| `YANXI_API_KEY` | ✓ | API 密钥（申请地址见下方） | - |\n| `YANXI_BASE_URL` | - | API 地址 | `https://yanxi-ai-api.jd.com` |\n\n### 配置方式\n\n**推荐：环境变量**（更安全）\n\n```bash\n# 添加到 ~/.zshrc 或 ~/.bashrc\nexport YANXI_API_KEY=\"your-api-key\"\n\n# 可选：自定义 API 地址\nexport YANXI_BASE_URL=\"https://yanxi-ai-api.jd.com\"\n```\n\n**备选：配置文件**\n\n```bash\n# 创建配置目录\nmkdir -p ~/.openclaw/secrets\n\n# 创建配置文件（注意设置权限）\ncat > ~/.openclaw/secrets/yanxi.json << 'EOF'\n{\n  \"api_key\": \"your-api-key\",\n  \"base_url\": \"https://yanxi-ai-api.jd.com\"\n}\nEOF\n\n# 必须设置权限，防止其他用户读取\nchmod 600 ~/.openclaw/secrets/yanxi.json\n```\n\n### API Key 申请\n\n1. 访问：https://yanxi-aigc-uat.jd.com/jimi/mine/api-center\n2. 登录京东账号\n3. 创建 API Key\n\n### 内部测试环境\n\n如果是京东内部用户，可使用测试环境：\n\n```bash\nexport YANXI_BASE_URL=\"http://pre-yanxi-ai-api.jd.local\"\n```\n\n**注意**：测试环境仅供内部开发测试使用，生产环境请使用默认地址。\n\n---\n\n## 🔒 数据安全建议\n\n### 凭据安全\n\n1. **优先使用环境变量**：避免将 API Key 存储在文件中\n2. **文件权限**：如果使用配置文件，务必设置 `chmod 600`\n3. **不要提交到代码仓库**：将 `yanxi.json` 添加到 `.gitignore`\n\n### 隐私保护\n\n1. **定期清理日志**：删除 `memory/yanxi-calls/` 目录下的文件\n2. **最小权限原则**：只收集必要的外呼信息\n3. **敏感信息**：避免在对话中传递健康、金融等敏感信息，除非用户明确同意\n\n### 本地日志\n\n以下文件包含 PII（电话号码、对话内容）：\n- `memory/yanxi-calls/requests.jsonl` - 外呼请求记录\n- `memory/yanxi-calls/costs.jsonl` - 通话日志\n\n**用户可随时删除这些文件以清除历史记录。**\n\n---\n\n## 📚 更多参考\n\n- API 详细文档：`references/api-reference.md`\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn7e9w2zb20pqv6p0wwd0nexw182nfxw\",\n  \"slug\": \"voice-wake\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1774324387513\n}\n\nFile v1.0.2:references/api-reference.md\n\n# Yanxi AI Call API Reference\n\n## 认证\n\n所有请求需要 Header：\n```\nContent-Type: application/json\nX-Access-Key: {API_KEY}\n```\n\n## 创建外呼\n\n**Endpoint:** `POST /api/voice_call/llmSceneCall`\n**Base URL:** `http://pre-yanxi-ai-api.jd.local`\n\n**请求参数：**\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| phone | string | 是 | 目标电话号码 |\n| messages | string[] | 是 | 对话上下文数组，格式：`[\"用户: ...\", \"助手: ...\"]` |\n\n**请求示例：**\n\n```json\n{\n  \"phone\": \"18033009923\",\n  \"messages\": [\n    \"用户: 帮我给蜀九香打个电话预约位子\",\n    \"助手: 好的，请问预约什么时间？几位用餐？\",\n    \"用户: 今天晚上7点，4个人\"\n  ]\n}\n```\n\n**响应：**\n\n**成功响应**：\n```json\n{\n  \"code\": \"10000\",\n  \"result\": \"成功\",\n  \"data\": \"12331@e561a4397b2a402488f2-638cd593f315\"\n}\n```\n\n**失败响应**：\n```json\n{\n  \"code\": \"190001\",\n  \"result\": \"风控校验不通过不能外呼,风控拦截信息：1001涉政\"\n}\n```\n\n**code 说明：**\n\n| code | 说明 | 处理方式 |\n|------|------|----------|\n| **10000** | 成功 | 使用 data 中的 request_id 查询结果 |\n| **190001** | 风控拦截 | **不再重试**，告知用户风控原因 |\n| 其他 | 失败 | 根据 result 判断原因 |\n\n**常见错误码：**\n\n| 错误码 | 说明 | 解决方案 |\n|--------|------|----------|\n| 130003 | 调用业务系统异常 | 稍后重试 |\n| 190001 | 风控拦截 | 更换通话内容或联系管理员 |\n\n## 查询通话记录\n\n**Endpoint:** `POST /api/voice_call/llmSceneCallResult`\n**Base URL:** `http://pre-yanxi-ai-api.jd.local`\n\n**请求参数：**\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| reqId | string | 是 | 创建外呼返回的 request_id |\n| phone | string | 是 | 目标电话号码 |\n\n**请求示例：**\n\n```json\n{\n  \"reqId\": \"2417278@uZGMSV5JDKEMJp67wOd93Q==\",\n  \"phone\": \"18033009923\"\n}\n```\n\n**响应：**\n\n**成功响应**：\n```json\n{\n  \"code\": \"10000\",\n  \"result\": \"成功\",\n  \"data\": {\n    \"phone\": \"18033009923\",\n    \"status\": \"5\",\n    \"statusDesc\": \"已接通\",\n    \"category\": \"CONNECTED\",\n    \"callStartTime\": \"2026-03-20 15:51:17\",\n    \"chatLogs\": [\n      {\"role\": \"BOT\", \"content\": \"您好...\", \"msgTime\": \"2026-03-20 15:51:23\"},\n      {\"role\": \"USER\", \"content\": \"你好\", \"msgTime\": \"2026-03-20 15:51:31\"}\n    ],\n    \"sid\": \"900581c1a8904c55b298d1e8ee53fd5d@1_1484459148920758272_2417278\"\n  }\n}\n```\n\n**失败响应**：\n```json\n{\n  \"code\": \"140004\",\n  \"result\": \"查询记录不存在\"\n}\n```\n\n**code 说明：**\n\n| code | 说明 | 处理方式 |\n|------|------|----------|\n| **10000** | 成功 | 解析 data 中的通话信息 |\n| 其他 | 失败 | 根据 result 判断原因 |\n```\n\n**通话状态码说明（data.status）：**\n\n| status | statusDesc | 说明 |\n|--------|------------|------|\n| 1 | 待呼叫 | 排队中 |\n| 13 | 呼叫中 | 正在拨打电话 |\n| **5** | 已接通 | 对话完成，无需再查询 |\n| 8 | 占线/无人接听 | 呼叫失败 |\n\n**category 说明：**\n\n| category | 说明 |\n|----------|------|\n| WAITING | 待呼叫 |\n| CALLING | 呼叫中 |\n| CONNECTED | 已接通 - 对话完成 |\n| UN_CONNECTED | 未接通 |\n\n## 配置\n\nAPI Key 存放位置（二选一）：\n\n1. 环境变量：`YANXI_API_KEY`\n2. 配置文件：`~/.openclaw/secrets/yanxi.json`\n\n```json\n{\n  \"api_key\": \"your-api-key\",\n  \"base_url\": \"http://pre-yanxi-ai-api.jd.local\"\n}\n```\n\n## 错误码\n\n| 错误码 | 说明 | 解决方案 |\n|--------|------|----------|\n| 401 | API Key 无效 | 检查配置 |\n| 429 | 频率限制 | 降低请求频率 |\n| 500 | 服务器错误 | 稍后重试 |\n\nArchive v1.0.1: 5 files, 14323 bytes\n\nFiles: references/api-reference.md (3642b), scripts/make-call.sh (4836b), scripts/query-call.sh (22172b), SKILL.md (12634b), _meta.json (129b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: jm-aicall\ndescription: AI-powered outbound calling service. Use when user expresses intent to make phone calls (e.g., \"help me call xxx to book a table\", \"call customer about promotion\", \"remind user about payment\"). Collects call information and delegates prompt generation to backend.\nversion: 3.1.0\nauthor: jm\nlicense: MIT\nhomepage: https://yanxi-aicall.jd.com/\n---\n\n# Yanxi AI Call - 智能外呼服务\n\n用户有打电话意图 → 意图提取 → 信息收集 → 确认 → 调用外呼 → 检查结果 → 补充信息（如需）\n\n---\n\n## ⚠️ 隐私声明与用户确认\n\n**重要：在调用外呼接口前，必须向用户展示确认卡片并获得明确同意。**\n\n### 数据收集与传输\n\n本 skill 会收集以下信息并发送到 Yanxi AI 外呼服务：\n\n| 数据类型 | 用途 | 是否传输 | 是否本地存储 |\n|----------|------|----------|--------------|\n| 电话号码 | 外呼目标号码 | ✓ | ✓ |\n| 对话上下文 | AI 理解通话目的 | ✓ | ✓ |\n| 通话记录 | 状态和日志 | - | ✓ |\n\n### 第三方服务\n\n- **API 提供方**：Yanxi AI Call（京东言犀智能外呼平台）\n- **API 端点**：`https://yanxi-ai-api.jd.com`\n- **隐私政策**：https://yanxi-aicall.jd.com/privacy\n- **API Key 申请**：https://yanxi-aigc-uat.jd.com/jimi/mine/api-center\n\n### 本地数据保留\n\n- 请求记录：`memory/yanxi-calls/requests.jsonl`\n- 通话日志：`memory/yanxi-calls/costs.jsonl`\n- 这两个文件包含 PII（电话号码、对话内容），用户可随时删除\n\n### 用户确认流程\n\n在信息收集完毕后，**必须**展示确认卡片：\n\n```markdown\n📞 外呼确认\n\n对象：{Who}\n电话：{Phone}\n目的：{What}\n\n⚠️ 以下信息将发送到 Yanxi AI 外呼服务（京东言犀平台）：\n• 电话号码：{Phone}\n• 对话内容：{对话摘要}\n\n确认拨打？（回复\"确认\"或\"取消\"）\n```\n\n**仅在用户明确确认后才执行外呼。**\n\n---\n\n## 🎯 触发条件\n\n当用户表达以下意图时触发：\n\n- \"帮我给xxx打个电话预约个位子\"\n- \"给老客户打电话推销活动\"\n- \"打电话提醒用户还款\"\n- \"帮我问下我父亲最近身体怎么样\"\n- \"给客户打电话确认预约时间\"\n\n**关键词**：打电话、致电、外呼、电话通知、电话确认\n\n---\n\n## 📋 步骤 1：意图提取\n\n从用户输入中提取核心信息：\n\n| 要素 | 说明 | 示例 |\n|------|------|------|\n| **Who** | 打给谁（名称/关系/机构） | 蜀九香、我爸、老客户 |\n| **Phone** | 电话号码 | 18033009923 |\n| **What** | 外呼目的 | 预约位子、推销活动、问身体状况 |\n\n---\n\n## 📝 步骤 2：信息收集\n\n**目标：一次收集尽可能多的信息，减少后续追问次数。**\n\n### 信息收集清单\n\n根据外呼目的，智能判断需要收集哪些信息：\n\n#### 基础信息（必问）\n\n| 信息项 | 说明 | 追问方式 |\n|--------|------|----------|\n| **Who** | 被叫方名称/关系 | \"请问打给谁？\" |\n| **Phone** | 电话号码 | \"请问对方电话是多少？\" |\n| **What** | 外呼目的 | \"请问打电话主要想说什么？\" |\n\n#### 时间信息（涉及时间时追问）\n\n| 信息项 | 适用场景 | 追问方式 |\n|--------|----------|----------|\n| **When** | 预约、提醒、限时活动 | \"请问是什么时间？\" |\n| **Deadline** | 限时事项 | \"有截止时间吗？\" |\n\n#### 地点信息（涉及地点时追问）\n\n| 信息项 | 适用场景 | 追问方式 |\n|--------|----------|----------|\n| **Where** | 预约、上门服务 | \"请问地址是哪里？\" |\n\n#### 业务信息（根据目的追问）\n\n| 信息项 | 适用场景 | 追问方式 |\n|--------|----------|----------|\n| **Details** | 具体事项描述 | \"能具体说说是什么事吗？\" |\n| **KeyPoints** | 推销、活动、通知 | \"有什么需要特别强调的点吗？\" |\n| **SpecialNeeds** | 预约、服务 | \"有什么特殊要求或注意事项吗？\" |\n| **PeopleCount** | 预约用餐、活动 | \"请问几个人？\" |\n| **Duration** | 咨询、调查 | \"大概需要多长时间？\" |\n\n#### 备用信息（可选）\n\n| 信息项 | 说明 | 追问方式 |\n|--------|------|----------|\n| **ContactName** | 被叫方称呼 | \"请问对方怎么称呼？\" |\n| **AltPhone** | 备用电话 | \"有备用联系电话吗？\" |\n| **Notes** | 其他备注 | \"还有其他需要注意的吗？\" |\n\n---\n\n### 信息收集策略\n\n#### 按场景智能追问\n\n**预约类**（预约位子、预约安装、预约服务）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问预约什么时间？\n2. 请问预约在哪个地点？（如不明确）\n3. 请问几个人/需要什么服务？\n4. 有什么特殊要求吗？\n```\n\n**推销/活动类**（推销产品、活动通知、促销推广）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问是什么产品/活动？\n2. 有什么核心卖点或优惠吗？\n3. 活动时间是多久？\n4. 希望客户怎么参与？（下单/到店/链接）\n```\n\n**咨询类**（解答问题、确认信息、回访）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问具体想咨询/确认什么？\n2. 有什么参考资料吗？（如需要）\n3. 大概需要聊多久？\n```\n\n**提醒类**（还款提醒、预约提醒、到期提醒）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问提醒的具体事项是什么？\n2. 关键时间节点是？\n3. 如果对方没接电话怎么处理？（短信/再打）\n```\n\n**关怀类**（问候家人、客户回访）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问对方怎么称呼？\n2. 有什么特别想聊的话题吗？\n3. 需要了解什么信息吗？\n```\n\n**健康关怀类**（问候身体状况）\n```\n已了解：{Who}，{What}\n追问（后端可能要求）：\n1. 基础病史：对方有什么基础疾病吗？\n2. 用药情况：最近在吃什么药吗？\n3. 家属联系方式：有其他家属联系方式吗？\n```\n\n#### 一次追问多个问题\n\n为减少对话轮次，采用批量追问策略：\n\n```markdown\n用户：帮我给蜀九香打个电话预约位子\n\n助手：好的，我帮您预约蜀九香。请补充以下信息：\n1. 预约什么时间？（比如：今天晚上7点）\n2. 几位用餐？\n3. 有什么特殊要求吗？（包间、靠窗等）\n```\n\n#### 已知信息复用\n\n如果对话上下文中已包含信息，不要重复追问：\n\n```markdown\n用户：帮我给我爸打电话问下身体怎么样，电话是138xxxx\n\n助手：好的，帮您给父亲打电话问候身体。\n请问有什么特别想问的吗？比如最近的睡眠、饮食？\n```\n\n---\n\n## ✅ 步骤 3：信息确认（必须）\n\n**⚠️ 重要：在调用外呼接口前，必须向用户展示确认卡片并获得明确同意。**\n\n收集完毕后，展示确认卡片：\n\n```markdown\n📞 外呼确认\n\n对象：{Who}（{ContactName}）\n电话：{Phone}\n目的：{What}\n\n详细信息：\n• 时间：{When}\n• 地点：{Where}\n• 具体事项：{Details}\n• 特殊要求：{SpecialNeeds}\n\n⚠️ 以下信息将发送到 Yanxi AI 外呼服务（京东言犀平台）：\n• 电话号码：{Phone}\n• 对话内容：{对话摘要}\n\n确认拨打？（回复\"确认\"或\"取消\"）\n```\n\n**用户确认后才可进入下一步。如果用户取消，则终止流程。**\n\n---\n\n## 🚀 步骤 4：调用外呼接口\n\n### 构建请求参数\n\n```json\n{\n  \"phone\": \"18033009923\",\n  \"messages\": [\n    \"用户: 帮我给蜀九香打个电话预约位子\",\n    \"助手: 好的，请补充以下信息：\\n1. 预约什么时间？\\n2. 几位用餐？\\n3. 有什么特殊要求吗？\",\n    \"用户: 今天晚上7点，4个人，要个包间\"\n  ]\n}\n```\n\n**messages 说明**：\n- 包含用户与助手之间的完整对话上下文\n- 后端根据上下文生成 prompt\n- 格式为字符串数组：`\"角色: 内容\"`\n\n### 执行调用\n\n```bash\ncd ~/.openclaw/skills/yanxi-aicall\n./scripts/make-call.sh --phone \"{电话}\" --messages '[\"用户: ...\", \"助手: ...\", \"用户: ...\"]'\n```\n\n---\n\n## 🔄 步骤 5：处理返回结果\n\n### 返回格式\n\n**成功响应**：\n```json\n{\n  \"code\": \"10000\",\n  \"result\": \"成功\",\n  \"data\": \"12331@e561a4397b2a402488f2-638cd593f315\"\n}\n```\n\n**失败响应**：\n```json\n{\n  \"code\": \"190001\",\n  \"result\": \"风控校验不通过不能外呼,风控拦截信息：1001涉政\"\n}\n```\n\n### code 说明\n\n| code | 说明 | 处理方式 |\n|------|------|----------|\n| **10000** | 成功 | 告知用户，返回 data 中的 request_id |\n| **190001** | 风控拦截 | **不再重试**，告知用户风控原因 |\n| 其他 | 失败 | 根据 `result` 提示用户 |\n\n### 风控拦截处理\n\n当 `code` 为 `190001` 时，表示被风控系统拦截：\n\n```json\n{\n  \"code\": \"190001\",\n  \"result\": \"风控校验不通过不能外呼,风控拦截信息：1001涉政\"\n}\n```\n\n此时告知用户：\n```\n外呼被风控拦截：{result}\n请更换通话内容或联系管理员。\n```\n\n**注意**：风控拦截后不要重试，直接结束流程。\n\n### 其他失败处理\n\n当 `code` 为其他值时，根据 `result` 或 `message` 字段判断原因：\n\n**缺少必填参数（code: \"430004\"）**：\n```json\n{\n  \"code\": \"430004\",\n  \"message\": \"外呼缺少场景必填参数: [\\\"基础病史\\\",\\\"用药情况\\\",\\\"家属联系方式\\\"]\"\n}\n```\n\n此时追问用户缺失的参数：\n```\n还需要补充以下信息：\n1. 基础病史：对方有什么基础疾病吗？\n2. 用药情况：最近在吃什么药吗？\n3. 家属联系方式：有其他家属联系方式吗？\n```\n\n用户补充后，更新 messages 并重新调用。\n\n**系统异常（code: \"130003\"）**：\n```json\n{\n  \"code\": \"130003\",\n  \"message\": \"调用业务系统异常\"\n}\n```\n\n此时提示用户稍后重试。\n\n---\n\n## 📊 步骤 6：查询通话结果\n\n外呼发起后，可查询通话结果：\n\n```bash\n./scripts/query-call.sh --request-id \"{request_id}\"\n```\n\n话单位置：`memory/yanxi-calls/costs.jsonl`\n\n---\n\n## 📁 文件结构\n\n```\nyanxi-aicall/\n├── SKILL.md                    # 本文件（工作流）\n├── scripts/\n│   ├── make-call.sh            # 执行外呼\n│   └── query-call.sh           # 查询结果\n├── references/\n│   └── api-reference.md        # API 文档\n└── memory/\n    └── yanxi-calls/\n```\n\n---\n\n## 🔄 泛化能力\n\n本 skill 不预设场景类型，通过以下方式实现泛化：\n\n1. **通用信息框架**：Who/What/Phone 为核心，时间/地点/详情为扩展\n2. **智能追问**：根据外呼目的判断需要收集的信息\n3. **批量收集**：一次追问多个问题，减少对话轮次\n4. **对话传递**：完整 messages 传给后端，由后端理解场景\n5. **动态补充**：根据后端返回的 `result` 动态追问缺失信息\n\n适用场景包括但不限于：\n- 预约场景（预约位子、预约安装）\n- 推销场景（活动推广、产品营销）\n- 咨询场景（解答问题、确认信息）\n- 提醒场景（还款提醒、预约提醒）\n- 关怀场景（问候家人、客户回访）\n- 其他任意外呼需求\n\n---\n\n## ⚙️ 配置\n\n### 前置要求\n\n本 skill 需要以下工具（已声明）：\n- `curl` - HTTP 客户端\n- `jq` - JSON 处理器\n\n### 环境变量\n\n| 变量名 | 必需 | 说明 | 默认值 |\n|--------|------|------|--------|\n| `YANXI_API_KEY` | ✓ | API 密钥 | - |\n| `YANXI_BASE_URL` | - | API 地址 | `https://yanxi-ai-api.jd.com` |\n\n### 配置方式\n\n**方式一：环境变量**\n```bash\nexport YANXI_API_KEY=\"your-api-key\"\n# 可选：自定义 API 地址\nexport YANXI_BASE_URL=\"https://yanxi-ai-api.jd.com\"\n```\n\n**方式二：配置文件**（推荐）\n```bash\n# 创建配置目录\nmkdir -p ~/.openclaw/secrets\n\n# 创建配置文件\ncat > ~/.openclaw/secrets/yanxi.json << 'EOF'\n{\n  \"api_key\": \"your-api-key\",\n  \"base_url\": \"https://yanxi-ai-api.jd.com\"\n}\nEOF\n\n# 设置权限\nchmod 600 ~/.openclaw/secrets/yanxi.json\n```\n\n### API Key 申请\n\n1. 访问：https://yanxi-aigc-uat.jd.com/jimi/mine/api-center\n2. 登录京东账号\n3. 创建 API Key\n\n### 内部测试环境\n\n如果是京东内部用户，可使用测试环境：\n\n```bash\nexport YANXI_BASE_URL=\"http://pre-yanxi-ai-api.jd.local\"\n```\n\n**注意**：测试环境仅供内部开发测试使用，生产环境请使用默认地址。\n\n---\n\n## 🔒 数据安全建议\n\n1. **定期清理日志**：删除 `memory/yanxi-calls/` 目录下的文件\n2. **保护 API Key**：不要将 API Key 提交到代码仓库\n3. **最小权限原则**：只收集必要的外呼信息\n4. **敏感信息**：避免在对话中传递健康、金融等敏感信息，除非用户明确同意\n\n---\n\n## 📚 更多参考\n\n- API 详细文档：`references/api-reference.md`\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7e9w2zb20pqv6p0wwd0nexw182nfxw\",\n  \"slug\": \"voice-wake\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1774323565830\n}\n\nFile v1.0.1:references/api-reference.md\n\n# Yanxi AI Call API Reference\n\n## 认证\n\n所有请求需要 Header：\n```\nContent-Type: application/json\nX-Access-Key: {API_KEY}\n```\n\n## 创建外呼\n\n**Endpoint:** `POST /api/voice_call/llmSceneCall`\n**Base URL:** `http://pre-yanxi-ai-api.jd.local`\n\n**请求参数：**\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| phone | string | 是 | 目标电话号码 |\n| messages | string[] | 是 | 对话上下文数组，格式：`[\"用户: ...\", \"助手: ...\"]` |\n\n**请求示例：**\n\n```json\n{\n  \"phone\": \"18033009923\",\n  \"messages\": [\n    \"用户: 帮我给蜀九香打个电话预约位子\",\n    \"助手: 好的，请问预约什么时间？几位用餐？\",\n    \"用户: 今天晚上7点，4个人\"\n  ]\n}\n```\n\n**响应：**\n\n**成功响应**：\n```json\n{\n  \"code\": \"10000\",\n  \"result\": \"成功\",\n  \"data\": \"12331@e561a4397b2a402488f2-638cd593f315\"\n}\n```\n\n**失败响应**：\n```json\n{\n  \"code\": \"190001\",\n  \"result\": \"风控校验不通过不能外呼,风控拦截信息：1001涉政\"\n}\n```\n\n**code 说明：**\n\n| code | 说明 | 处理方式 |\n|------|------|----------|\n| **10000** | 成功 | 使用 data 中的 request_id 查询结果 |\n| **190001** | 风控拦截 | **不再重试**，告知用户风控原因 |\n| 其他 | 失败 | 根据 result 判断原因 |\n\n**常见错误码：**\n\n| 错误码 | 说明 | 解决方案 |\n|--------|------|----------|\n| 130003 | 调用业务系统异常 | 稍后重试 |\n| 190001 | 风控拦截 | 更换通话内容或联系管理员 |\n\n## 查询通话记录\n\n**Endpoint:** `POST /api/voice_call/llmSceneCallResult`\n**Base URL:** `http://pre-yanxi-ai-api.jd.local`\n\n**请求参数：**\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| reqId | string | 是 | 创建外呼返回的 request_id |\n| phone | string | 是 | 目标电话号码 |\n\n**请求示例：**\n\n```json\n{\n  \"reqId\": \"2417278@uZGMSV5JDKEMJp67wOd93Q==\",\n  \"phone\": \"18033009923\"\n}\n```\n\n**响应：**\n\n**成功响应**：\n```json\n{\n  \"code\": \"10000\",\n  \"result\": \"成功\",\n  \"data\": {\n    \"phone\": \"18033009923\",\n    \"status\": \"5\",\n    \"statusDesc\": \"已接通\",\n    \"category\": \"CONNECTED\",\n    \"callStartTime\": \"2026-03-20 15:51:17\",\n    \"chatLogs\": [\n      {\"role\": \"BOT\", \"content\": \"您好...\", \"msgTime\": \"2026-03-20 15:51:23\"},\n      {\"role\": \"USER\", \"content\": \"你好\", \"msgTime\": \"2026-03-20 15:51:31\"}\n    ],\n    \"sid\": \"900581c1a8904c55b298d1e8ee53fd5d@1_1484459148920758272_2417278\"\n  }\n}\n```\n\n**失败响应**：\n```json\n{\n  \"code\": \"140004\",\n  \"result\": \"查询记录不存在\"\n}\n```\n\n**code 说明：**\n\n| code | 说明 | 处理方式 |\n|------|------|----------|\n| **10000** | 成功 | 解析 data 中的通话信息 |\n| 其他 | 失败 | 根据 result 判断原因 |\n```\n\n**通话状态码说明（data.status）：**\n\n| status | statusDesc | 说明 |\n|--------|------------|------|\n| 1 | 待呼叫 | 排队中 |\n| 13 | 呼叫中 | 正在拨打电话 |\n| **5** | 已接通 | 对话完成，无需再查询 |\n| 8 | 占线/无人接听 | 呼叫失败 |\n\n**category 说明：**\n\n| category | 说明 |\n|----------|------|\n| WAITING | 待呼叫 |\n| CALLING | 呼叫中 |\n| CONNECTED | 已接通 - 对话完成 |\n| UN_CONNECTED | 未接通 |\n\n## 配置\n\nAPI Key 存放位置（二选一）：\n\n1. 环境变量：`YANXI_API_KEY`\n2. 配置文件：`~/.openclaw/secrets/yanxi.json`\n\n```json\n{\n  \"api_key\": \"your-api-key\",\n  \"base_url\": \"http://pre-yanxi-ai-api.jd.local\"\n}\n```\n\n## 错误码\n\n| 错误码 | 说明 | 解决方案 |\n|--------|------|----------|\n| 401 | API Key 无效 | 检查配置 |\n| 429 | 频率限制 | 降低请求频率 |\n| 500 | 服务器错误 | 稍后重试 |\n\nArchive v1.0.0: 5 files, 13176 bytes\n\nFiles: references/api-reference.md (3642b), scripts/make-call.sh (4779b), scripts/query-call.sh (22115b), SKILL.md (9615b), _meta.json (129b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: jm-call\ndescription: AI-powered outbound calling service. Use when user expresses intent to make phone calls (e.g., \"help me call xxx to book a table\", \"call customer about promotion\", \"remind user about payment\"). Collects call information and delegates prompt generation to backend.\nversion: 3.0.0\nauthor: jm\n---\n\n# JM AI Call - 智能外呼服务\n\n用户有打电话意图 → 意图提取 → 信息收集 → 确认 → 调用外呼 → 检查结果 → 补充信息（如需）\n\n---\n\n## 🎯 触发条件\n\n当用户表达以下意图时触发：\n\n- \"帮我给xxx打个电话预约个位子\"\n- \"给老客户打电话推销活动\"\n- \"打电话提醒用户还款\"\n- \"帮我问下我父亲最近身体怎么样\"\n- \"给客户打电话确认预约时间\"\n\n**关键词**：打电话、致电、外呼、电话通知、电话确认\n\n---\n\n## 📋 步骤 1：意图提取\n\n从用户输入中提取核心信息：\n\n| 要素 | 说明 | 示例 |\n|------|------|------|\n| **Who** | 打给谁（名称/关系/机构） | 蜀九香、我爸、老客户 |\n| **Phone** | 电话号码 | 18033009923 |\n| **What** | 外呼目的 | 预约位子、推销活动、问身体状况 |\n\n---\n\n## 📝 步骤 2：信息收集\n\n**目标：一次收集尽可能多的信息，减少后续追问次数。**\n\n### 信息收集清单\n\n根据外呼目的，智能判断需要收集哪些信息：\n\n#### 基础信息（必问）\n\n| 信息项 | 说明 | 追问方式 |\n|--------|------|----------|\n| **Who** | 被叫方名称/关系 | \"请问打给谁？\" |\n| **Phone** | 电话号码 | \"请问对方电话是多少？\" |\n| **What** | 外呼目的 | \"请问打电话主要想说什么？\" |\n\n#### 时间信息（涉及时间时追问）\n\n| 信息项 | 适用场景 | 追问方式 |\n|--------|----------|----------|\n| **When** | 预约、提醒、限时活动 | \"请问是什么时间？\" |\n| **Deadline** | 限时事项 | \"有截止时间吗？\" |\n\n#### 地点信息（涉及地点时追问）\n\n| 信息项 | 适用场景 | 追问方式 |\n|--------|----------|----------|\n| **Where** | 预约、上门服务 | \"请问地址是哪里？\" |\n\n#### 业务信息（根据目的追问）\n\n| 信息项 | 适用场景 | 追问方式 |\n|--------|----------|----------|\n| **Details** | 具体事项描述 | \"能具体说说是什么事吗？\" |\n| **KeyPoints** | 推销、活动、通知 | \"有什么需要特别强调的点吗？\" |\n| **SpecialNeeds** | 预约、服务 | \"有什么特殊要求或注意事项吗？\" |\n| **PeopleCount** | 预约用餐、活动 | \"请问几个人？\" |\n| **Duration** | 咨询、调查 | \"大概需要多长时间？\" |\n\n#### 备用信息（可选）\n\n| 信息项 | 说明 | 追问方式 |\n|--------|------|----------|\n| **ContactName** | 被叫方称呼 | \"请问对方怎么称呼？\" |\n| **AltPhone** | 备用电话 | \"有备用联系电话吗？\" |\n| **Notes** | 其他备注 | \"还有其他需要注意的吗？\" |\n\n---\n\n### 信息收集策略\n\n#### 按场景智能追问\n\n**预约类**（预约位子、预约安装、预约服务）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问预约什么时间？\n2. 请问预约在哪个地点？（如不明确）\n3. 请问几个人/需要什么服务？\n4. 有什么特殊要求吗？\n```\n\n**推销/活动类**（推销产品、活动通知、促销推广）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问是什么产品/活动？\n2. 有什么核心卖点或优惠吗？\n3. 活动时间是多久？\n4. 希望客户怎么参与？（下单/到店/链接）\n```\n\n**咨询类**（解答问题、确认信息、回访）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问具体想咨询/确认什么？\n2. 有什么参考资料吗？（如需要）\n3. 大概需要聊多久？\n```\n\n**提醒类**（还款提醒、预约提醒、到期提醒）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问提醒的具体事项是什么？\n2. 关键时间节点是？\n3. 如果对方没接电话怎么处理？（短信/再打）\n```\n\n**关怀类**（问候家人、客户回访）\n```\n已了解：{Who}，{What}\n追问：\n1. 请问对方怎么称呼？\n2. 有什么特别想聊的话题吗？\n3. 需要了解什么信息吗？\n```\n\n**健康关怀类**（问候身体状况）\n```\n已了解：{Who}，{What}\n追问（后端可能要求）：\n1. 基础病史：对方有什么基础疾病吗？\n2. 用药情况：最近在吃什么药吗？\n3. 家属联系方式：有其他家属联系方式吗？\n```\n\n#### 一次追问多个问题\n\n为减少对话轮次，采用批量追问策略：\n\n```markdown\n用户：帮我给蜀九香打个电话预约位子\n\n助手：好的，我帮您预约蜀九香。请补充以下信息：\n1. 预约什么时间？（比如：今天晚上7点）\n2. 几位用餐？\n3. 有什么特殊要求吗？（包间、靠窗等）\n```\n\n#### 已知信息复用\n\n如果对话上下文中已包含信息，不要重复追问：\n\n```markdown\n用户：帮我给我爸打电话问下身体怎么样，电话是138xxxx\n\n助手：好的，帮您给父亲打电话问候身体。\n请问有什么特别想问的吗？比如最近的睡眠、饮食？\n```\n\n---\n\n## ✅ 步骤 3：信息确认\n\n收集完毕后，展示确认卡片：\n\n```markdown\n📞 外呼确认\n\n对象：{Who}（{ContactName}）\n电话：{Phone}\n目的：{What}\n\n详细信息：\n• 时间：{When}\n• 地点：{Where}\n• 具体事项：{Details}\n• 特殊要求：{SpecialNeeds}\n\n确认拨打？\n```\n\n用户确认后进入下一步。\n\n---\n\n## 🚀 步骤 4：调用外呼接口\n\n### 构建请求参数\n\n```json\n{\n  \"phone\": \"18033009923\",\n  \"messages\": [\n    \"用户: 帮我给蜀九香打个电话预约位子\",\n    \"助手: 好的，请补充以下信息：\\n1. 预约什么时间？\\n2. 几位用餐？\\n3. 有什么特殊要求吗？\",\n    \"用户: 今天晚上7点，4个人，要个包间\"\n  ]\n}\n```\n\n**messages 说明**：\n- 包含用户与助手之间的完整对话上下文\n- 后端根据上下文生成 prompt\n- 格式为字符串数组：`\"角色: 内容\"`\n\n### 执行调用\n\n```bash\ncd ~/.openclaw/skills/yanxi-aicall\n./scripts/make-call.sh --phone \"{电话}\" --messages '[\"用户: ...\", \"助手: ...\", \"用户: ...\"]'\n```\n\n---\n\n## 🔄 步骤 5：处理返回结果\n\n### 返回格式\n\n**成功响应**：\n```json\n{\n  \"code\": \"10000\",\n  \"result\": \"成功\",\n  \"data\": \"12331@e561a4397b2a402488f2-638cd593f315\"\n}\n```\n\n**失败响应**：\n```json\n{\n  \"code\": \"190001\",\n  \"result\": \"风控校验不通过不能外呼,风控拦截信息：1001涉政\"\n}\n```\n\n### code 说明\n\n| code | 说明 | 处理方式 |\n|------|------|----------|\n| **10000** | 成功 | 告知用户，返回 data 中的 request_id |\n| **190001** | 风控拦截 | **不再重试**，告知用户风控原因 |\n| 其他 | 失败 | 根据 `result` 提示用户 |\n\n### 风控拦截处理\n\n当 `code` 为 `190001` 时，表示被风控系统拦截：\n\n```json\n{\n  \"code\": \"190001\",\n  \"result\": \"风控校验不通过不能外呼,风控拦截信息：1001涉政\"\n}\n```\n\n此时告知用户：\n```\n外呼被风控拦截：{result}\n请更换通话内容或联系管理员。\n```\n\n**注意**：风控拦截后不要重试，直接结束流程。\n\n### 其他失败处理\n\n当 `code` 为其他值时，根据 `result` 或 `message` 字段判断原因：\n\n**缺少必填参数（code: \"430004\"）**：\n```json\n{\n  \"code\": \"430004\",\n  \"message\": \"外呼缺少场景必填参数: [\\\"基础病史\\\",\\\"用药情况\\\",\\\"家属联系方式\\\"]\"\n}\n```\n\n此时追问用户缺失的参数：\n```\n还需要补充以下信息：\n1. 基础病史：对方有什么基础疾病吗？\n2. 用药情况：最近在吃什么药吗？\n3. 家属联系方式：有其他家属联系方式吗？\n```\n\n用户补充后，更新 messages 并重新调用。\n\n**系统异常（code: \"130003\"）**：\n```json\n{\n  \"code\": \"130003\",\n  \"message\": \"调用业务系统异常\"\n}\n```\n\n此时提示用户稍后重试。\n\n---\n\n## 📊 步骤 6：查询通话结果\n\n外呼发起后，可查询通话结果：\n\n```bash\n./scripts/query-call.sh --request-id \"{request_id}\"\n```\n\n话单位置：`memory/yanxi-calls/costs.jsonl`\n\n---\n\n## 📁 文件结构\n\n```\nyanxi-aicall/\n├── SKILL.md                    # 本文件（工作流）\n├── scripts/\n│   ├── make-call.sh            # 执行外呼\n│   └── query-call.sh           # 查询结果\n├── references/\n│   └── api-reference.md        # API 文档\n└── memory/\n    └── yanxi-calls/\n```\n\n---\n\n## 🔄 泛化能力\n\n本 skill 不预设场景类型，通过以下方式实现泛化：\n\n1. **通用信息框架**：Who/What/Phone 为核心，时间/地点/详情为扩展\n2. **智能追问**：根据外呼目的判断需要收集的信息\n3. **批量收集**：一次追问多个问题，减少对话轮次\n4. **对话传递**：完整 messages 传给后端，由后端理解场景\n5. **动态补充**：根据后端返回的 `result` 动态追问缺失信息\n\n适用场景包括但不限于：\n- 预约场景（预约位子、预约安装）\n- 推销场景（活动推广、产品营销）\n- 咨询场景（解答问题、确认信息）\n- 提醒场景（还款提醒、预约提醒）\n- 关怀场景（问候家人、客户回访）\n- 其他任意外呼需求\n\n---\n\n## ⚙️ 配置\n\nAPI Key 申请：https://yanxi-aigc-uat.jd.com/jimi/mine/api-center\n\n配置方式（二选一）：\n1. 环境变量：`export YANXI_API_KEY=\"your-key\"`\n2. 配置文件：`~/.openclaw/secrets/yanxi.json`\n\n```json\n{\n  \"api_key\": \"your-api-key\",\n  \"base_url\": \"http://pre-yanxi-ai-api.jd.local\"\n}\n```\n\n---\n\n## 📚 更多参考\n\n- API 详细文档：`references/api-reference.md`\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7e9w2zb20pqv6p0wwd0nexw182nfxw\",\n  \"slug\": \"voice-wake\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1774322513814\n}\n\nFile v1.0.0:references/api-reference.md\n\n# Yanxi AI Call API Reference\n\n## 认证\n\n所有请求需要 Header：\n```\nContent-Type: application/json\nX-Access-Key: {API_KEY}\n```\n\n## 创建外呼\n\n**Endpoint:** `POST /api/voice_call/llmSceneCall`\n**Base URL:** `http://pre-yanxi-ai-api.jd.local`\n\n**请求参数：**\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| phone | string | 是 | 目标电话号码 |\n| messages | string[] | 是 | 对话上下文数组，格式：`[\"用户: ...\", \"助手: ...\"]` |\n\n**请求示例：**\n\n```json\n{\n  \"phone\": \"18033009923\",\n  \"messages\": [\n    \"用户: 帮我给蜀九香打个电话预约位子\",\n    \"助手: 好的，请问预约什么时间？几位用餐？\",\n    \"用户: 今天晚上7点，4个人\"\n  ]\n}\n```\n\n**响应：**\n\n**成功响应**：\n```json\n{\n  \"code\": \"10000\",\n  \"result\": \"成功\",\n  \"data\": \"12331@e561a4397b2a402488f2-638cd593f315\"\n}\n```\n\n**失败响应**：\n```json\n{\n  \"code\": \"190001\",\n  \"result\": \"风控校验不通过不能外呼,风控拦截信息：1001涉政\"\n}\n```\n\n**code 说明：**\n\n| code | 说明 | 处理方式 |\n|------|------|----------|\n| **10000** | 成功 | 使用 data 中的 request_id 查询结果 |\n| **190001** | 风控拦截 | **不再重试**，告知用户风控原因 |\n| 其他 | 失败 | 根据 result 判断原因 |\n\n**常见错误码：**\n\n| 错误码 | 说明 | 解决方案 |\n|--------|------|----------|\n| 130003 | 调用业务系统异常 | 稍后重试 |\n| 190001 | 风控拦截 | 更换通话内容或联系管理员 |\n\n## 查询通话记录\n\n**Endpoint:** `POST /api/voice_call/llmSceneCallResult`\n**Base URL:** `http://pre-yanxi-ai-api.jd.local`\n\n**请求参数：**\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| reqId | string | 是 | 创建外呼返回的 request_id |\n| phone | string | 是 | 目标电话号码 |\n\n**请求示例：**\n\n```json\n{\n  \"reqId\": \"2417278@uZGMSV5JDKEMJp67wOd93Q==\",\n  \"phone\": \"18033009923\"\n}\n```\n\n**响应：**\n\n**成功响应**：\n```json\n{\n  \"code\": \"10000\",\n  \"result\": \"成功\",\n  \"data\": {\n    \"phone\": \"18033009923\",\n    \"status\": \"5\",\n    \"statusDesc\": \"已接通\",\n    \"category\": \"CONNECTED\",\n    \"callStartTime\": \"2026-03-20 15:51:17\",\n    \"chatLogs\": [\n      {\"role\": \"BOT\", \"content\": \"您好...\", \"msgTime\": \"2026-03-20 15:51:23\"},\n      {\"role\": \"USER\", \"content\": \"你好\", \"msgTime\": \"2026-03-20 15:51:31\"}\n    ],\n    \"sid\": \"900581c1a8904c55b298d1e8ee53fd5d@1_1484459148920758272_2417278\"\n  }\n}\n```\n\n**失败响应**：\n```json\n{\n  \"code\": \"140004\",\n  \"result\": \"查询记录不存在\"\n}\n```\n\n**code 说明：**\n\n| code | 说明 | 处理方式 |\n|------|------|----------|\n| **10000** | 成功 | 解析 data 中的通话信息 |\n| 其他 | 失败 | 根据 result 判断原因 |\n```\n\n**通话状态码说明（data.status）：**\n\n| status | statusDesc | 说明 |\n|--------|------------|------|\n| 1 | 待呼叫 | 排队中 |\n| 13 | 呼叫中 | 正在拨打电话 |\n| **5** | 已接通 | 对话完成，无需再查询 |\n| 8 | 占线/无人接听 | 呼叫失败 |\n\n**category 说明：**\n\n| category | 说明 |\n|----------|------|\n| WAITING | 待呼叫 |\n| CALLING | 呼叫中 |\n| CONNECTED | 已接通 - 对话完成 |\n| UN_CONNECTED | 未接通 |\n\n## 配置\n\nAPI Key 存放位置（二选一）：\n\n1. 环境变量：`YANXI_API_KEY`\n2. 配置文件：`~/.openclaw/secrets/yanxi.json`\n\n```json\n{\n  \"api_key\": \"your-api-key\",\n  \"base_url\": \"http://pre-yanxi-ai-api.jd.local\"\n}\n```\n\n## 错误码\n\n| 错误码 | 说明 | 解决方案 |\n|--------|------|----------|\n| 401 | API Key 无效 | 检查配置 |\n| 429 | 频率限制 | 降低请求频率 |\n| 500 | 服务器错误 | 稍后重试 |","readmeExcerpt":"Skill: jm-call Owner: pe-evolver Summary: Speak responses aloud on macOS using the built-in say command when user input indicates Voice Wake/voice recognition (for example, messages starting with \"... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-03-24T05:50:36.062Z | user - Switched skill focus from \"jm-call\" AI calling to \"voice-wake-say\" for speaking responses aloud on macOS with the say command. - Removed cod","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"printf '%s' \"$SPOKEN_TEXT\" | say"},{"language":"bash","snippet":"printf '%s' \"$SPOKEN_TEXT\" | say -v \"$SAY_VOICE\"\nprintf '%s' \"$SPOKEN_TEXT\" | say -r \"$SAY_RATE\""},{"language":"markdown","snippet":"📞 外呼确认\n\n对象：{Who}\n电话：{Phone}\n目的：{What}\n\n⚠️ 以下信息将发送到 Yanxi AI 外呼服务（京东言犀平台）：\n• 电话号码：{Phone}\n• 对话内容：{对话摘要}\n\n确认拨打？（回复\"确认\"或\"取消\"）"},{"language":"text","snippet":"已了解：{Who}，{What}\n追问：\n1. 请问预约什么时间？\n2. 请问预约在哪个地点？（如不明确）\n3. 请问几个人/需要什么服务？\n4. 有什么特殊要求吗？"},{"language":"text","snippet":"已了解：{Who}，{What}\n追问：\n1. 请问是什么产品/活动？\n2. 有什么核心卖点或优惠吗？\n3. 活动时间是多久？\n4. 希望客户怎么参与？（下单/到店/链接）"},{"language":"text","snippet":"已了解：{Who}，{What}\n追问：\n1. 请问具体想咨询/确认什么？\n2. 有什么参考资料吗？（如需要）\n3. 大概需要聊多久？"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: voice-wake-say\ndescription: Speak responses aloud on macOS using the built-in `say` command when user input indicates Voice Wake/voice recognition (for example, messages starting with \"User talked via voice recognition on <device>\").\n---\n\n# Voice Wake Say\n\n## Overview\nUse macOS `say` to read the assistant's response out loud whenever the conversation came from Voice Wake/voice recognition. Do **not** use the `tts` tool (it calls cloud providers).\n\n## When to Use `say` (CHECK EVERY MESSAGE INDIVIDUALLY)\n\n**IF** the user message STARTS WITH: `User talked via voice recognition`\n- **Step 1:** Acknowledge with `say` first (so the user knows you heard them)\n- **Step 2:** Then perform the task\n- **Step 3:** Optionally speak again when done if it makes sense\n\n**IF** the user message does NOT start with that exact phrase\n- THEN: Do NOT use `say`. Text-only response only.\n\n**Critical:**\n- Check EACH message individually — context does NOT carry over\n- The trigger phrase must be at the VERY START of the message\n- For tasks that take time, acknowledge FIRST so the user knows you're working\n\n## Workflow\n1) Detect Voice Wake context\n- Trigger ONLY when the latest user/system message STARTS WITH `User talked via voice recognition`\n- If the message instructs \"repeat prompt first\", keep that behavior in the response.\n\n2) Prepare spoken text\n- Use the final response text as the basis.\n- Strip markdown/code blocks; if the response is long or code-heavy, speak a short summary and mention that details are on screen.\n\n3) Speak with `say` (local macOS TTS)\n```bash\nprintf '%s' \"$SPOKEN_TEXT\" | say\n```\n\nOptional controls (use only if set):\n```bash\nprintf '%s' \"$SPOKEN_TEXT\" | say -v \"$SAY_VOICE\"\nprintf '%s' \"$SPOKEN_TEXT\" | say -r \"$SAY_RATE\"\n```\n\n## Failure handling\n- If `say` is unavailable or errors, still send the text response and note that TTS failed."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7e9w2zb20pqv6p0wwd0nexw182nfxw\",\n  \"slug\": \"voice-wake\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1774331436062\n}"},{"path":"skill-card.md","content":"## Description:\n\nSpeak responses aloud on macOS using the built-in `say` command when user input indicates Voice Wake/voice recognition.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[pe-evolver](https://clawhub.ai/user/pe-evolver)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and external users use this skill to have an agent speak responses aloud on macOS only when a Voice Wake trigger is present, while keeping normal typed interactions text-only.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Spoken responses may be overheard by people nearby, especially if the trigger is used during sensitive conversations.\n\nMitigation: Use the Voice Wake trigger only in private environments for sensitive content; otherwise rely on the text response.\n\nRisk: The skill depends on the local macOS `say` command and cannot provide speech output when that command is unavailable or fails.\n\nMitigation: Continue with the text response and note the speech failure so the user still receives the answer.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/pe-evolver/skills/voice-wake)\n- [Publisher profile](https://clawhub.ai/user/pe-evolver)\n\n## Skill Output:\n\n**Output Type(s):** [text, shell commands, guidance]\n\n**Output Format:** [Markdown with inline bash commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May trigger local macOS speech output with `say` when the required Voice Wake phrase starts the user message.]\n\n## Skill Version(s):\n\n1.0.3 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Speak responses aloud on macOS using the built-in `say` command when user input indicates Voice Wake/voice recognition (for example, messages starting with \"... Skill: jm-call Owner: pe-evolver Summary: Speak responses aloud on macOS using the built-in say command when user input indicates Voice Wake/voice recognition (for example, messages starting with \"... Tags: latest:1.0.3 Version history: v1.0.3 | 2026-03-24T05:50:36.062Z | user - Switched skill focus from \"jm-call\" AI calling to \"voice-wake-say\" for speaking responses aloud on macOS with the say command. - Removed cod","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1233,"uniquenessScore":48,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T16:54:24.308Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T16:54:24.308Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:56:38.206Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}