Volcengine AI Research Survey
Use this skill to run a real conversational AI Research survey workflow backed by ABCompass.
When to use
Use this skill when the user wants to:
- start a new AI research survey task
- revise an existing research plan
- confirm execution of a generated plan
- check the current plan, progress, or final result
- run concept testing, audience design, questionnaire drafting, or interview-guide generation as a real workflow
Do not use this skill when the user only wants:
- generic brainstorming or ideation with no intention to run a task
- copywriting, translation, polishing, or summarization
- broad market discussion without asking to launch or query the AI Research workflow
- generic platform troubleshooting unrelated to this workflow
Primary command
For every valid workflow turn, run:
python3 scripts/send_survey_message.py --message "<user message>"
This wrapper is the only user-facing entrypoint in this repository. It manages session continuity, API key binding, and production-safe sync transport on top of the canonical ai_research_message tool logic.
Core workflow
- Decide whether the request belongs to the AI Research survey workflow.
- If the request is valid, call
scripts/send_survey_message.py before replying.
- Prefer backend
reply_markdown as the user-facing answer.
- Treat backend
presentation, next_actions, session_event, and capability_hints as the rendering contract.
- If the task is still running, report real progress only. Do not fabricate a finished report.
Read references only when needed:
references/industries.md for industry normalization guidance
references/status-response-rules.md for status-specific handling
references/user-facing-messages.md for wording consistency
Authentication
First-time use requires an API key.
Preferred input methods:
--api-key "<api-key>"
BYTED_AI_RESEARCH_SURVEY_API_KEY
If no API key is available, ask the user to create or view one at:
https://console.volcengine.com/datatester/ai-research/audience/list?tab=apikey
Then ask the user to provide the API key before calling the API. If the wrapper returns AUTH_REQUIRED, do not ask the user to repeat the research request. The pending request can continue directly after key binding.
Parameter guidance
| Category |
Parameters |
When to set |
| Always pass |
--message |
Every call |
| Pass when user provides |
--api-key, --session-id, --force-new-session, --research-method, --language |
User explicitly specifies these values. Note: --api-key is not persisted by the wrapper — the host must retain it in conversation context and pass it on every subsequent call, or guide the user to set the BYTED_AI_RESEARCH_SURVEY_API_KEY environment variable. |
| Pass when host can confidently resolve |
--request-kind, --industry-hint, --normalized-message |
Host has enough context to classify intent or normalize industry. Read references/industries.md for mapping rules. |
Use from next_actions |
All parameters in tool_input |
When the previous response included next_actions, use the pre-built parameters directly. Do not modify or guess. |
| Leave to defaults |
--source-channel, --response-mode, --app-id, --status-only |
Only set when you have a specific reason |
Critical rules
- Never bypass
scripts/send_survey_message.py by manually constructing HTTP requests, curl commands, or calling any API endpoint directly. This wrapper is the only interface to the backend — there are no alternative call paths, sub-agents, or other scripts to try.
- Never expose API keys, request headers, environment-specific headers, environment variable names, curl commands, or internal request traces in user-facing replies. All debugging output is gated behind the wrapper's built-in redaction mechanism.
- Never mention or distinguish between internal environments (such as "testing environment", "production environment", "pre-production", or any environment-specific terminology) in user-facing replies. Runtime profile differences are opaque implementation details.
- Use backend
reply_markdown verbatim as the user-facing answer. Do not compress, rephrase, summarize, or replace it. If reply_markdown is empty, use the fallback message from the response — do not invent content.
- When the response contains
next_actions, use them as the exclusive set of suggested next steps. Each action includes a pre-built tool_input with all necessary parameters. Do not invent actions outside this set.
- Do not invent tool methods, parameters, or session lifecycle events beyond what the wrapper supports.
- Do not force unsupported industries into backend execution. If the industry cannot be confidently mapped, return the unsupported-industry response.
- For confirm, execute, progress, plan, and result queries, always call the wrapper to get the latest backend state. Never answer from memory or cached context.
- Do not narrate internal tool steps (reading files, checking state, retrying requests, switching endpoints) in user-facing replies.
- Treat backend
presentation, session_event, and capability_hints as the rendering contract. Do not invent a parallel workflow.
- Do not claim scheduled follow-up, automatic notifications, or similar host abilities unless the host has actually completed that action and
capability_hints.followup_supported is true.
Forbidden behaviors
These are real failure patterns observed in host integrations. Each one violates a critical rule above.
Do not bypass the wrapper
Bad — the host manually constructed an HTTP request instead of calling the wrapper:
我直接手动拼了请求参数调用接口:curl -X POST "https://..." -H "x-api-key: ..." -d '{"message": "..."}'
Why forbidden: Bypassing the wrapper leaks headers, credentials, and internal URLs. The wrapper handles credential redaction, error recovery, and session management.
Do not expose environment concepts
Bad — the host told the user about internal environments:
先后尝试了测试环境和正式环境的接口都访问失败(测试环境域名解析失败,正式环境接口返回404)
Why forbidden: Internal infrastructure topology is not a user concept. If the wrapper fails, return its error response directly.
Do not leak credentials or request details
Bad — the host showed unredacted API key and internal headers:
-H "x-api-key: 3089e65f8d577071a7c9f7a1ae041716b351ac2a"
-H "x-tt-env: ppe_datarangers"
Why forbidden: API keys must never appear unredacted. Internal request headers are implementation details. Only the wrapper's built-in redaction mechanism may expose request details.
Do not invent alternative calling methods
Bad — the host fabricated a non-existent calling method:
工具:sessions_spawn / 参数:agentId: "byted-airesearch-survey" / 返回错误:{"status": "forbidden"}
Why forbidden: sessions_spawn and agentId do not exist. The only interface is scripts/send_survey_message.py.
Do not improvise on failure
Bad — the host tried alternative paths after the standard call failed:
由于子agent方式被禁止,我就换了手动构造curl的方式直接调用接口
Why forbidden: When the wrapper fails, return its error response. Do not diagnose, retry via alternative paths, or construct manual HTTP requests.
Do not invent next steps beyond next_actions
Bad — the host suggested capabilities that do not exist:
你还可以导出结果为PDF、分享给团队成员、或者设置每周自动调研
Why forbidden: The backend returns next_actions with pre-built parameters for each valid next step. Do not invent capabilities not listed in next_actions.
Do not summarize or compress long reply_markdown
Bad — the host compressed a full plan card into a summary:
方案概览 主题:喜茶芝芝莓莓 / 方式:定性 / 题目数:21 / 预计耗时:1小时
Why forbidden: reply_markdown must be presented verbatim regardless of length. The backend deliberately generates detailed plan cards — compressing them loses critical information like individual questions, audience strategy, and evaluation notes. If the content is long, show it in full.
When the wrapper fails
- Return the wrapper's
reply_markdown directly — it already contains a user-safe error message.
- Do not attempt to diagnose the failure, retry via alternative paths, or construct manual HTTP calls.
- Do not expose HTTP status codes, error payloads, or transport details unless the user has explicitly requested debugging (in which case, let the wrapper handle redaction).
- It is acceptable to say "the request did not succeed" and suggest the user retry later. It is not acceptable to explain internal infrastructure details.
Command examples
# Start a new research conversation
python3 scripts/send_survey_message.py \
--message "Help me run a concept test for a new ready-to-drink tea product" \
--force-new-session
# Start with a normalized industry hint
python3 scripts/send_survey_message.py \
--message "Help me research a new Chagee product launch" \
--industry-hint "现制茶饮" \
--normalized-message "Help me run a concept test for a new freshly made tea product"
# Revise the current plan
python3 scripts/send_survey_message.py \
--message "Change this to a quantitative survey with 400 samples"
# Query current session status directly
python3 scripts/send_survey_message.py \
--message "Check progress" \
--status-only
Final answer rules
- Present user-facing results in natural language, not as a raw JSON dump.
- When backend
reply_markdown is available, prefer it over a rewritten summary.
- When status is
WAITING_CONFIRM, preserve the plan-card structure and invite the user to revise or confirm execution.
- When status is
FINISHED, prefer a report-style answer and include the result link when available.
- When status is
UNSUPPORTED_INDUSTRY, explain the limit clearly and invite the user to revise.
- When status is
FAILED, explain that execution failed and offer retry, revise, or restart options.
- Keep transport sync-only. Prefer
sync_deferred, and use sync_blocking only when the host explicitly needs a blocking response.
1---
2name: byted-airesearch-survey
3description: Launch and continue the Volcengine AI Research survey workflow for concept testing, audience design, questionnaire drafting, interview guide generation, execution confirmation, progress checks, and result queries. Use this skill when the user wants to create, revise, confirm, execute, or follow up on a real AI research survey task in ABCompass instead of doing generic brainstorming, copywriting, translation, summarization, or broad market discussion.
4license: Apache-2.0
5metadata: {"clawdbot":{"emoji":"🧪","homepage":"https://www.volcengine.com/","requires":{"bins":["python3"]},"os":["darwin","linux"]},"openclaw":{"emoji":"🧪","homepage":"https://www.volcengine.com/","requires":{"bins":["python3"]},"os":["darwin","linux"]},"moltbot":{"emoji":"🧪","homepage":"https://www.volcengine.com/","requires":{"bins":["python3"]},"os":["darwin","linux"]}}
6---
7
8# Volcengine AI Research Survey
9
10Use this skill to run a real conversational AI Research survey workflow backed by ABCompass.
11
12## When to use
13
14Use this skill when the user wants to:
15
16- start a new AI research survey task
17- revise an existing research plan
18- confirm execution of a generated plan
19- check the current plan, progress, or final result
20- run concept testing, audience design, questionnaire drafting, or interview-guide generation as a real workflow
21
22Do not use this skill when the user only wants:
23
24- generic brainstorming or ideation with no intention to run a task
25- copywriting, translation, polishing, or summarization
26- broad market discussion without asking to launch or query the AI Research workflow
27- generic platform troubleshooting unrelated to this workflow
28
29## Primary command
30
31For every valid workflow turn, run:
32
33```bash
34python3 scripts/send_survey_message.py --message "<user message>"
35```
36
37This wrapper is the only user-facing entrypoint in this repository. It manages session continuity, API key binding, and production-safe sync transport on top of the canonical `ai_research_message` tool logic.
38
39## Core workflow
40
411. Decide whether the request belongs to the AI Research survey workflow.
422. If the request is valid, call `scripts/send_survey_message.py` before replying.
433. Prefer backend `reply_markdown` as the user-facing answer.
444. Treat backend `presentation`, `next_actions`, `session_event`, and `capability_hints` as the rendering contract.
455. If the task is still running, report real progress only. Do not fabricate a finished report.
46
47Read references only when needed:
48
49- `references/industries.md` for industry normalization guidance
50- `references/status-response-rules.md` for status-specific handling
51- `references/user-facing-messages.md` for wording consistency
52
53## Authentication
54
55First-time use requires an API key.
56
57Preferred input methods:
58
59- `--api-key "<api-key>"`
60- `BYTED_AI_RESEARCH_SURVEY_API_KEY`
61
62If no API key is available, ask the user to create or view one at:
63
64- `https://console.volcengine.com/datatester/ai-research/audience/list?tab=apikey`
65
66Then ask the user to provide the API key before calling the API. If the wrapper returns `AUTH_REQUIRED`, do not ask the user to repeat the research request. The pending request can continue directly after key binding.
67
68## Parameter guidance
69
70| Category | Parameters | When to set |
71|----------|-----------|-------------|
72| Always pass | `--message` | Every call |
73| Pass when user provides | `--api-key`, `--session-id`, `--force-new-session`, `--research-method`, `--language` | User explicitly specifies these values. Note: `--api-key` is not persisted by the wrapper — the host must retain it in conversation context and pass it on every subsequent call, or guide the user to set the `BYTED_AI_RESEARCH_SURVEY_API_KEY` environment variable. |
74| Pass when host can confidently resolve | `--request-kind`, `--industry-hint`, `--normalized-message` | Host has enough context to classify intent or normalize industry. Read `references/industries.md` for mapping rules. |
75| Use from `next_actions` | All parameters in `tool_input` | When the previous response included `next_actions`, use the pre-built parameters directly. Do not modify or guess. |
76| Leave to defaults | `--source-channel`, `--response-mode`, `--app-id`, `--status-only` | Only set when you have a specific reason |
77
78## Critical rules
79
801. Never bypass `scripts/send_survey_message.py` by manually constructing HTTP requests, curl commands, or calling any API endpoint directly. This wrapper is the only interface to the backend — there are no alternative call paths, sub-agents, or other scripts to try.
812. Never expose API keys, request headers, environment-specific headers, environment variable names, curl commands, or internal request traces in user-facing replies. All debugging output is gated behind the wrapper's built-in redaction mechanism.
823. Never mention or distinguish between internal environments (such as "testing environment", "production environment", "pre-production", or any environment-specific terminology) in user-facing replies. Runtime profile differences are opaque implementation details.
834. Use backend `reply_markdown` verbatim as the user-facing answer. Do not compress, rephrase, summarize, or replace it. If `reply_markdown` is empty, use the fallback message from the response — do not invent content.
845. When the response contains `next_actions`, use them as the exclusive set of suggested next steps. Each action includes a pre-built `tool_input` with all necessary parameters. Do not invent actions outside this set.
856. Do not invent tool methods, parameters, or session lifecycle events beyond what the wrapper supports.
867. Do not force unsupported industries into backend execution. If the industry cannot be confidently mapped, return the unsupported-industry response.
878. For confirm, execute, progress, plan, and result queries, always call the wrapper to get the latest backend state. Never answer from memory or cached context.
889. Do not narrate internal tool steps (reading files, checking state, retrying requests, switching endpoints) in user-facing replies.
8910. Treat backend `presentation`, `session_event`, and `capability_hints` as the rendering contract. Do not invent a parallel workflow.
9011. Do not claim scheduled follow-up, automatic notifications, or similar host abilities unless the host has actually completed that action and `capability_hints.followup_supported` is true.
91
92## Forbidden behaviors
93
94These are real failure patterns observed in host integrations. Each one violates a critical rule above.
95
96### Do not bypass the wrapper
97
98Bad — the host manually constructed an HTTP request instead of calling the wrapper:
99
100> 我直接手动拼了请求参数调用接口:curl -X POST "https://..." -H "x-api-key: ..." -d '{"message": "..."}'
101
102Why forbidden: Bypassing the wrapper leaks headers, credentials, and internal URLs. The wrapper handles credential redaction, error recovery, and session management.
103
104### Do not expose environment concepts
105
106Bad — the host told the user about internal environments:
107
108> 先后尝试了测试环境和正式环境的接口都访问失败(测试环境域名解析失败,正式环境接口返回404)
109
110Why forbidden: Internal infrastructure topology is not a user concept. If the wrapper fails, return its error response directly.
111
112### Do not leak credentials or request details
113
114Bad — the host showed unredacted API key and internal headers:
115
116> -H "x-api-key: 3089e65f8d577071a7c9f7a1ae041716b351ac2a"
117> -H "x-tt-env: ppe_datarangers"
118
119Why forbidden: API keys must never appear unredacted. Internal request headers are implementation details. Only the wrapper's built-in redaction mechanism may expose request details.
120
121### Do not invent alternative calling methods
122
123Bad — the host fabricated a non-existent calling method:
124
125> 工具:sessions_spawn / 参数:agentId: "byted-airesearch-survey" / 返回错误:{"status": "forbidden"}
126
127Why forbidden: `sessions_spawn` and `agentId` do not exist. The only interface is `scripts/send_survey_message.py`.
128
129### Do not improvise on failure
130
131Bad — the host tried alternative paths after the standard call failed:
132
133> 由于子agent方式被禁止,我就换了手动构造curl的方式直接调用接口
134
135Why forbidden: When the wrapper fails, return its error response. Do not diagnose, retry via alternative paths, or construct manual HTTP requests.
136
137### Do not invent next steps beyond next_actions
138
139Bad — the host suggested capabilities that do not exist:
140
141> 你还可以导出结果为PDF、分享给团队成员、或者设置每周自动调研
142
143Why forbidden: The backend returns `next_actions` with pre-built parameters for each valid next step. Do not invent capabilities not listed in `next_actions`.
144
145### Do not summarize or compress long reply_markdown
146
147Bad — the host compressed a full plan card into a summary:
148
149> **方案概览** 主题:喜茶芝芝莓莓 / 方式:定性 / 题目数:21 / 预计耗时:1小时
150
151Why forbidden: `reply_markdown` must be presented verbatim regardless of length. The backend deliberately generates detailed plan cards — compressing them loses critical information like individual questions, audience strategy, and evaluation notes. If the content is long, show it in full.
152
153## When the wrapper fails
154
1551. Return the wrapper's `reply_markdown` directly — it already contains a user-safe error message.
1562. Do not attempt to diagnose the failure, retry via alternative paths, or construct manual HTTP calls.
1573. Do not expose HTTP status codes, error payloads, or transport details unless the user has explicitly requested debugging (in which case, let the wrapper handle redaction).
1584. It is acceptable to say "the request did not succeed" and suggest the user retry later. It is not acceptable to explain internal infrastructure details.
159
160## Command examples
161
162```bash
163# Start a new research conversation
164python3 scripts/send_survey_message.py \
165 --message "Help me run a concept test for a new ready-to-drink tea product" \
166 --force-new-session
167
168# Start with a normalized industry hint
169python3 scripts/send_survey_message.py \
170 --message "Help me research a new Chagee product launch" \
171 --industry-hint "现制茶饮" \
172 --normalized-message "Help me run a concept test for a new freshly made tea product"
173
174# Revise the current plan
175python3 scripts/send_survey_message.py \
176 --message "Change this to a quantitative survey with 400 samples"
177
178# Query current session status directly
179python3 scripts/send_survey_message.py \
180 --message "Check progress" \
181 --status-only
182```
183
184## Final answer rules
185
186- Present user-facing results in natural language, not as a raw JSON dump.
187- When backend `reply_markdown` is available, prefer it over a rewritten summary.
188- When status is `WAITING_CONFIRM`, preserve the plan-card structure and invite the user to revise or confirm execution.
189- When status is `FINISHED`, prefer a report-style answer and include the result link when available.
190- When status is `UNSUPPORTED_INDUSTRY`, explain the limit clearly and invite the user to revise.
191- When status is `FAILED`, explain that execution failed and offer retry, revise, or restart options.
192- Keep transport sync-only. Prefer `sync_deferred`, and use `sync_blocking` only when the host explicitly needs a blocking response.