EchoKit Config Generator
Generate config.toml for EchoKit servers with interactive setup for ASR, TTS, LLM services, MCP servers, API key entry, and server launch
Best use case
EchoKit Config Generator is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Generate config.toml for EchoKit servers with interactive setup for ASR, TTS, LLM services, MCP servers, API key entry, and server launch
Teams using EchoKit Config Generator should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/echokit-config-generator/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How EchoKit Config Generator Compares
| Feature / Agent | EchoKit Config Generator | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Generate config.toml for EchoKit servers with interactive setup for ASR, TTS, LLM services, MCP servers, API key entry, and server launch
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# EchoKit Config Generator
## Overview
This SKILL generates `config.toml` files for EchoKit servers through an interactive five-phase process that includes configuration generation, API key entry, and server launch.
**Announce at start:** "I'm using the EchoKit Config Generator to create your config.toml."
## Handling User Input
Throughout this SKILL, when asking questions with default values:
**Always phrase it as:** *"Question? (default: {VALUE})"*
**Handle responses:**
- **Empty response or Enter** → Use the default value
- **User provides value** → Use user's value
- **User enters "default"** → Use the default value explicitly
**Example:**
```
AI: How many messages should it remember? (default: 5)
User: [Enter]
AI: [Uses 5]
AI: How many messages should it remember? (default: 5)
User: 10
AI: [Uses 10]
```
This applies to ALL questions with defaults throughout the SKILL.
## Phase 1: Assistant Definition
Ask these questions **one at a time**:
1. *"What is your AI assistant's primary purpose? (Describe in 1-2 sentences)"*
2. *"What tone should it have? (professional, casual, friendly, expert, or describe your own)"*
3. *"What specific capabilities should it have?"*
- Prompt with examples if needed: "code generation", "data analysis", "creative writing", "problem-solving", "teaching", etc.
4. *"Any response format requirements?"*
- Examples: "short answers", "detailed explanations", "step-by-step", "conversational", "formal reports"
5. *"Any domain-specific knowledge areas?"* (Optional)
- Examples: "programming", "medicine", "law", "finance", etc.
6. *"Any constraints or guidelines?"* (Optional)
- Examples: "no bullet points", "always cite sources", "avoid jargon", "max 3 sentences"
7. *"Any additional instructions or preferences?"* (Optional)
**Generate sophisticated system prompt** using this structure:
```toml
[[llm.sys_prompts]]
role = "system"
content = """
You are a {TONE} AI assistant specialized in {PURPOSE}.
## Core Purpose
{PURPOSE_EXPANDED - elaborate based on user input}
## Your Capabilities
- List the capabilities provided by user
- Each capability on its own line
- Be specific about what you can do
## Response Style
{FORMAT_REQUIREMENTS}
## Domain Knowledge
{DOMAIN_KNOWLEDGE if provided, otherwise omit this section}
## Behavioral Guidelines
{BEHAVIORS_FROM_USER}
- Add any relevant default behaviors based on tone
## Constraints
{CONSTRAINTS_FROM_USER}
- Always maintain {TONE} tone
- {RESPONSE_FORMAT_RULES}
## Additional Instructions
{ADDITIONAL_NOTES if provided}
---
Remember: Stay in character as a {TONE} {DOMAIN} assistant. Always prioritize helpfulness and accuracy.
"""
```
**Enhanced defaults based on tone:**
If user doesn't provide specific behaviors, use these expanded defaults:
- **professional:**
- Provide accurate, well-researched information
- Maintain formal, business-appropriate language
- Acknowledge limitations and uncertainty
- Structure responses logically
- **casual:**
- Be conversational and engaging
- Use natural, relaxed language
- Show personality when appropriate
- Keep interactions friendly and approachable
- **friendly:**
- Be warm and welcoming
- Use simple, clear language
- Show empathy and understanding
- Make users feel comfortable
- **expert:**
- Provide comprehensive technical details
- Cite sources and references when relevant
- Explain trade-offs and alternatives
- Use appropriate terminology correctly
- Acknowledge edge cases and limitations
## Phase 2: Platform Selection
For each service category (ASR, TTS, LLM):
1. **Read platform data** from `platforms/{category}.yml` using the Read tool
2. **Display available options** with this format:
```
Available {SERVICE} Services:
1. {PLATFORM_1.name}
URL: {PLATFORM_1.url}
Model: {PLATFORM_1.model}
Get API key: {PLATFORM_1.api_key_url}
Notes: {PLATFORM_1.notes}
2. {PLATFORM_2.name}
URL: {PLATFORM_2.url}
Model: {PLATFORM_2.model}
Get API key: {PLATFORM_2.api_key_url}
Notes: {PLATFORM_2.notes}
C. Custom - Specify your own platform/model
Your choice (1-{N} or C):
```
3. **User selection:**
**If user selects a number (1-{N}):**
- Store the selected platform data from the YAML file
- Continue to next service
**If user selects 'C' (Custom):**
**Step 1: Get platform name**
- Ask: *"What's the platform name?"* (e.g., "groq", "deepseek", "mistral", "together")
**Step 2: Auto-fetch API information**
- Use WebSearch to find API documentation
- Search query: `"{PLATFORM_NAME} API endpoint {SERVICE_TYPE} 2025"`
- For ASR: "speech to text API", "transcription API"
- For TTS: "text to speech API"
- For LLM: "chat completions API", "LLM API"
- Extract from search results:
- API endpoint URL
- API documentation URL
- Authentication method
- Default model names
**Step 3: Confirm with user**
Display what was found:
```
I found the following for {PLATFORM_NAME} {SERVICE}:
API Endpoint: {FOUND_URL}
Documentation: {FOUND_DOCS_URL}
Authentication: {FOUND_AUTH_METHOD}
Default Models: {FOUND_MODELS}
Is this correct? (y/edit)
```
**Step 4: Gather additional details**
- Ask: *"What model should I use? (suggested: {FOUND_MODELS} or enter custom)"*
- Ask for additional settings:
- LLM: *"How many messages should it remember? (default: 5)"*
- TTS: *"What voice should it use? (default: default)"*
- ASR: *"What language? (default: en)"*
**Step 5: Store custom platform**
```
name: "{PLATFORM_NAME}"
platform: "{INFERRED_TYPE from API docs or user}"
url: "{CONFIRMED_URL}"
model: "{USER_MODEL_CHOICE}"
history/voice/lang: {USER_SETTINGS}
api_key_url: "{FOUND_DOCS_URL}"
notes: "Custom {PLATFORM_NAME} - auto-configured"
```
4. **Continue to next service**
**Load platforms in order:**
1. ASR from `platforms/asr.yml`
2. TTS from `platforms/tts.yml`
3. LLM from `platforms/llm.yml`
**Note on WebSearch:** Use WebSearch tool with year-specific queries (2025) to get current API information. For common platforms, you can also infer from patterns:
- OpenAI-compatible: `https://api.{platform}.com/v1/chat/completions`
- Anthropic-compatible: `https://api.{platform}.com/v1/messages`
- Together/Groq: OpenAI-compatible format
## Phase 3: MCP Server (Optional)
Ask: *"Do you need an MCP server? (y/n)"*
If yes, ask: *"What's your MCP server URL?"*
Default: `http://localhost:8000/mcp`
**Add MCP configuration to LLM section:**
The MCP server is configured within the LLM configuration as:
```toml
[[llm.mcp_server]]
server = "{USER_PROVIDED_URL or http://localhost:8000/mcp}"
type = "http_streamable"
call_mcp_message = "Please hold on a few seconds while I am searching for an answer!"
```
**Explain to user:**
- The MCP server will be added to the LLM section
- `type` can be: "http_streamable" or "http"
- `call_mcp_message` is shown to users when MCP is being called
## Phase 4: Generate Files
### Step 1: Preview config.toml
**IMPORTANT:** EchoKit server requires a specific TOML structure:
- Section order MUST be: `[tts]` → `[asr]` → `[llm]`
- No comments allowed at the beginning of the file
- Field names vary by platform (check platform-specific requirements)
Display complete configuration with this format:
```toml
addr = "0.0.0.0:8080"
hello_wav = "hello.wav"
[tts]
platform = "{SELECTED_TTS.platform}"
url = "{SELECTED_TTS.url}"
{TTS_API_KEY_FIELD} = "YOUR_API_KEY_HERE"
{TTS_MODEL_FIELD} = "{SELECTED_TTS.model}"
voice = "{SELECTED_TTS.voice}"
[asr]
platform = "{SELECTED_ASR.platform}"
url = "{SELECTED_ASR.url}"
{ASR_API_KEY_FIELD} = "YOUR_API_KEY_HERE"
model = "{SELECTED_ASR.model}"
lang = "{ASR_LANG}"
prompt = "Hello\\n你好\\n(noise)\\n(bgm)\\n(silence)\\n"
vad_url = "http://localhost:9093/v1/audio/vad"
[llm]
platform = "{SELECTED_LLM.platform}"
url = "{SELECTED_LLM.url}"
{LLM_API_KEY_FIELD} = "YOUR_API_KEY_HERE"
model = "{SELECTED_LLM.model}"
history = {SELECTED_LLM.history}
{GENERATED_SYSTEM_PROMPT}
{MCP_CONFIGURATION if enabled}
```
**Platform-specific field mappings:**
**TTS platforms:**
- `openai`: uses `api_key` and `model`
- `elevenlabs`: uses `token` and `model_id`
- `groq`: uses `api_key` and `model`
**ASR platforms:**
- `openai`/`whisper`: uses `api_key` and `model`
**LLM platforms:**
- `openai_chat`: uses `api_key` (optional, can be empty string)
When generating the config, replace `{TTS_API_KEY_FIELD}`, `{ASR_API_KEY_FIELD}`, and `{LLM_API_KEY_FIELD}` with the appropriate field name for the selected platform:
- For ElevenLabs TTS: use `token`
- For OpenAI/Groq TTS: use `api_key`
- For Whisper ASR: use `api_key`
- For OpenAI Chat LLM: use `api_key`
### Step 2: Ask for confirmation
*"Does this configuration look correct? (y/edit/regenerate)"*
- **y** - Proceed to write files
- **e** - Ask which section to edit (asr/tts/llm/system_prompt)
- **r** - Restart from Phase 1
### Step 3: Determine output location
Ask: *"Where should I save the config files? (press Enter for default: echokit_server/)"*
**Handle user input:**
- **Empty/Enter** → Use default: `echokit_server/`
- **Custom path** → Use user-provided path
- **Relative path** → Use as-is (e.g., `my_configs/`)
- **Absolute path** → Use as-is (e.g., `/Users/username/echokit/`)
**After path is determined:**
1. Check if directory exists
2. If not, ask: *"Directory '{OUTPUT_DIR}' doesn't exist. Create it? (y/n)"*
- If **y**: Create with `mkdir -p {OUTPUT_DIR}`
- If **n**: Ask for different path
3. Verify write permissions
- Test by attempting to create a temporary file
- If fails, ask for different location
### Step 4: Write files
Use the Write tool to create:
1. **`{OUTPUT_DIR}/config.toml`** - Main configuration (includes MCP server if enabled)
2. **`{OUTPUT_DIR}/SETUP_GUIDE.md`** - Setup instructions (use template from `templates/SETUP_GUIDE.md`)
### Step 5: Display success message
```
✓ Configuration generated successfully!
Files created:
{OUTPUT_DIR}/config.toml
{OUTPUT_DIR}/SETUP_GUIDE.md
Now proceeding to Phase 5: API Key Entry and Server Launch...
```
## Phase 5: API Key Entry and Server Launch
### Overview
This phase collects API keys from the user, updates the config.toml file, builds the server (if needed), and launches it.
### Step 1: Display API key URLs
Show the user where to get their API keys:
```
## Phase 5: API Key Entry and Server Launch
You'll need API keys for your selected services. Here's where to get them:
ASR ({SELECTED_ASR.name}):
API Key URL: {SELECTED_ASR.api_key_url}
TTS ({SELECTED_TTS.name}):
API Key URL: {SELECTED_TTS.api_key_url}
LLM ({SELECTED_LLM.name}):
API Key URL: {SELECTED_LLM.api_key_url}
I'll prompt you for each key. You can also press Enter to skip and manually edit config.toml later.
```
### Step 2: Collect API keys
For each service (ASR, TTS, LLM), ask:
```
Enter your {SERVICE_NAME} API key:
(or press Enter to skip and add it manually later)
```
**Handle responses:**
- **User provides a key** → Store it for updating config.toml
- **Empty/Enter** → Keep "YOUR_API_KEY_HERE" placeholder
**Store keys temporarily** in memory:
```
ASR_API_KEY = "{user_input or 'YOUR_API_KEY_HERE'}"
TTS_API_KEY = "{user_input or 'YOUR_API_KEY_HERE'}"
LLM_API_KEY = "{user_input or 'YOUR_API_KEY_HERE'}"
```
### Step 3: Update config.toml with API keys
Read the existing config.toml using the Read tool, then replace the API key placeholders:
```
[asr]
api_key = "{ASR_API_KEY}"
[tts]
{CORRECT_TTS_FIELD} = "{TTS_API_KEY}"
[llm]
api_key = "{LLM_API_KEY}"
```
Use the Edit tool to update each API key field line in `{OUTPUT_DIR}/config.toml`.
**IMPORTANT - Platform-specific field names:**
- **ElevenLabs TTS:** uses `token` (not `api_key`) and `model_id` (not `model`)
- **OpenAI/Groq TTS:** uses `api_key` and `model`
- **Whisper ASR:** uses `api_key`
- **OpenAI Chat LLM:** uses `api_key`
Make sure to preserve the correct field names for each platform when editing!
### Step 4: Verify server installation
Check if the EchoKit server is already built:
1. Check if `{OUTPUT_DIR}/target/release/echokit_server` exists
2. If it exists, skip to Step 6
If not built, ask: *"The EchoKit server needs to be built. Do you want me to build it now? (y/n)"*
### Step 5: Build the server (if needed)
If user said **yes** in Step 4:
1. Change to the output directory: `cd {OUTPUT_DIR}`
2. Run: `cargo build --release`
3. Monitor build output for errors
**If build succeeds:**
```
✓ Server built successfully at {OUTPUT_DIR}/target/release/echokit_server
```
**If build fails:**
```
✗ Build failed. Please check the error messages above.
You can manually build the server later with:
cd {OUTPUT_DIR} && cargo build --release
For now, your config.toml has been saved with your API keys.
```
- **End here** - don't proceed to server launch
### Step 6: Launch the server
If the server is available (either pre-built or just built):
Ask: *"Ready to launch the EchoKit server? (y/n)"*
If **no**:
```
Your config.toml has been saved with your API keys.
To run the server manually:
cd {OUTPUT_DIR} && ./target/release/echokit_server
```
- **End here**
If **yes**:
1. Change to output directory: `cd {OUTPUT_DIR}`
2. Enable debug logging and launch server in background:
```bash
export RUST_LOG=debug
./target/release/echokit_server &
```
3. Store the process ID for potential later management
4. **Get the actual local IP address** by running:
```bash
# Try multiple methods to get IP, use first successful result
ipconfig getifaddr en0 2>/dev/null || \
ipconfig getifaddr en1 2>/dev/null || \
hostname -I 2>/dev/null | awk '{print $1}' || \
ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | head -1
```
5. Store the result as `LOCAL_IP`
6. Display success message with WebSocket URLs:
```
✓ EchoKit server is now running!
Server Details:
Location: {OUTPUT_DIR}
Config: {OUTPUT_DIR}/config.toml
Bind Address: 0.0.0.0:8080
WebSocket URL: ws://{ACTUAL_LOCAL_IP}:8080/ws
You can connect to the server using any WebSocket client at this URL.
The server is running in the background.
To stop the server later:
- Find the process: ps aux | grep echokit_server
- Kill it: kill {PID}
Or if you have the PID: kill {SERVER_PID}
```
### Step 7: Verify server is running
After launching, verify the server started successfully:
1. Wait 2-3 seconds for startup
2. Check if the process is still running: `ps aux | grep echokit_server | grep -v grep`
3. Optionally test the endpoint: `curl -s http://localhost:8080/health || echo "Health check not available"`
**If server is running:**
```
✓ Server is running and responding!
```
**If server crashed:**
```
⚠ The server may have crashed. Check the logs above for errors.
You can try running it manually to see error messages:
cd {OUTPUT_DIR} && ./target/release/echokit_server
```
### Error Handling
#### API key entry issues
If user enters an obviously invalid key (too short, contains spaces, etc.):
```
Warning: That doesn't look like a valid API key.
API keys are typically long strings without spaces.
Use this key anyway? (y/retry)
```
- **y** → Accept the key as entered
- **retry** → Ask again for that service's key
#### Build fails
If the build fails:
1. Show the error output
2. Don't proceed to server launch
3. Provide manual build instructions
4. Remind user that config.toml is saved with API keys
#### Server won't start
If the server process exits immediately:
1. Check for error messages in the output
2. Common issues:
- Port 8080 already in use
- Invalid config.toml syntax
- Missing dependencies
- Incorrect API keys
Provide troubleshooting suggestions based on error messages.
## File Locations
All files are relative to SKILL root:
- Platform data: `platforms/asr.yml`, `platforms/tts.yml`, `platforms/llm.yml`
- Templates: `templates/SETUP_GUIDE.md`
- Examples: `examples/voice-companion.toml`, `examples/coding-assistant.toml`
**No external dependencies** - this SKILL is completely self-contained.
## Error Handling
### Platform files not found
If a platform file is missing:
```
Error: Could not find platforms/{category}.yml
Please ensure the SKILL is properly installed with all platform data files.
```
### Invalid user input
If user enters invalid choice:
```
Invalid choice. Please enter a number between 1 and {N}.
```
### Cannot create output directory
If directory creation fails:
```
Error: Cannot create directory {OUTPUT_DIR}
Please choose a different location or create the directory manually.
```
### Cannot write files
If file write fails:
```
Error: Cannot write to {OUTPUT_DIR}/config.toml
Please check permissions and try again.
```
## Template Variables for SETUP_GUIDE.md
When generating SETUP_GUIDE.md, replace these variables:
- `{{TIMESTAMP}}` - Current date and time
- `{{ASSISTANT_TYPE}}` - User's description from Phase 1
- `{{ASR_NAME}}` - Selected ASR platform name
- `{{ASR_MODEL}}` - Selected ASR model
- `{{ASR_API_URL}}` - Selected ASR API key URL
- `{{TTS_NAME}}` - Selected TTS platform name
- `{{TTS_VOICE}}` - Selected TTS voice
- `{{TTS_API_URL}}` - Selected TTS API key URL
- `{{LLM_NAME}}` - Selected LLM platform name
- `{{LLM_MODEL}}` - Selected LLM model
- `{{LLM_API_URL}}` - Selected LLM API key URL
- `{{MCP_ENABLED}}` - "Yes" or "No" based on Phase 3
Read the template from `templates/SETUP_GUIDE.md`, replace variables, then write to output.
## Example Conversation
```
User: Generate an EchoKit config for a friendly voice assistant
AI: I'm using the EchoKit Config Generator to create your config.toml.
Phase 1: Assistant Definition
What is your AI assistant's primary purpose?
User: Daily conversational assistance and smart home control
What tone should it have?
User: Friendly
Any specific behaviors or requirements?
User: Keep responses short, show some personality
Phase 2: Platform Selection
Available ASR Services:
1. OpenAI Whisper
URL: https://api.openai.com/v1/audio/transcriptions
Model: gpt-4o-mini-transcribe
Get API key: https://platform.openai.com/api-keys
Notes: Best accuracy, requires OpenAI account with API access
2. Local Whisper
URL: http://localhost:8080/transcribe
Model: base
Get API key: Not required (local deployment)
Notes: Free and private, requires local whisper server running
Your choice (1-2):
User: 1
[Continue for TTS and LLM...]
Phase 3: MCP Server
Do you need an MCP server? (y/n)
User: n
Phase 4: Generate Files
[Preview config...]
Does this look correct? (y/edit/regenerate)
User: y
Where should I save? (default: echokit_server/)
User: [Enter]
✓ Configuration generated successfully!
[...]
```
## Version History
- 1.3.1 - Added `export RUST_LOG=debug` before server launch for better troubleshooting
- 1.3.0 - Fixed config.toml format with correct section order ([tts] → [asr] → [llm]), platform-specific field names (ElevenLabs uses `token`/`model_id`), removed comments from top, added `prompt` and `vad_url` fields for ASR
- 1.2.0 - Added Phase 5: API Key Entry and Server Launch with interactive key collection, automatic config updates, server build, and launch
- 1.1.0 - Enhanced system prompts, custom platform support with auto-fetch, corrected MCP format
- 1.0.0 - Initial release with four-phase flow
## Testing
To test this SKILL:
1. Install to `~/.claude/skills/`
2. In Claude Code: "Generate an EchoKit config for testing"
3. Verify files are created correctly
4. Check config.toml has valid TOML syntax
5. Test Phase 5: Enter API keys and verify config.toml is updated
6. Test server build (optional, requires Rust/Cargo)
7. Test server launch (optional, requires built server)
---
**This SKILL is 100% standalone with no external dependencies.**Related Skills
generator
Générateur de Skill - Crée de nouveaux fichiers SKILL.md depuis les définitions YAML d'agents
claude-config-management
Claude Code設定(リポジトリルート)の構成管理ガイド。ファイルレベルsymlinkによる設定管理、管理対象の追加・削除、Taskfileタスクの実行方法を提供する。「設定ファイルを追加して」「新しいスキルを追加して」「symlinkの状態を確認して」「Claude設定を変更して」のようにClaude Code設定の構成変更を行うときに使用する。
bigconfig-generator
Use this skill when creating or updating Bigeye monitoring configurations (bigconfig.yml files) for BigQuery tables. Works with metadata-manager skill.
ai-image-generator
使用 ModelScope 等平台生成 AI 图像。当用户需要生成图像、设计图标、创建角色立绘,或需要帮助编写 AI 绘画提示词时使用此技能。支持直接生成图像和仅优化提示词两种模式。
ai-agent-config
Manage AI coding skills across platforms (Claude Code, Antigravity, Cursor, Windsurf) using ai-agent-config CLI. Use when the user wants to sync skills to/from GitHub, install to multiple platforms, add custom skill sources, or configure skill management settings.
agent-config-maintenance
Refactor Codex configuration files and Agent Skills by splitting concerns, deduplicating instructions, and reorganizing guidance across AGENTS.md, project docs, and skills. Use when asked to clean up AGENTS.md, move instructions into skill bundles, or standardize agent setup rules.
thumbnail-generator
Generate prompts for dev.to blog thumbnail/cover images in hand-drawn infographic style. Use when creating cover images, thumbnails, or featured images for blog posts. Recommended size 1000x420 pixels.
seedream-image-generator
Generate images using the Doubao SeeDream API based on text prompts. Use this skill when users request AI-generated images, artwork, illustrations, or visual content creation. The skill handles API calls, downloads generated images to the project's /pic folder, and supports batch generation of up to 4 sequential images.
og-image-generator
Generate and optimize Open Graph meta images for social media sharing. Use this skill when building web applications that need dynamic OG image generation with support for Vercel's @vercel/og library, pre-generated image storage, and social media optimization (Twitter Cards, Facebook, LinkedIn). Handles dynamic routes, performance optimization, and includes best practices for crawler compatibility and testing.
gemini-image-generator
Generate and edit images using Google Gemini. Use when the user asks to generate, create, edit, or modify images.
didactic-content-generator
Gere conteúdo didático de alta qualidade em HTML/CSS com ilustrações SVG, usando um sistema de Temas pré definidos e reutilizáveis. Capaz de criar ou editar apostilas, tutoriais e materiais educacionais que seguem filosofias pedagógicas claras.
article-image-generator
Generates consistent, professional cover images for business/fiscal articles using Ideogram with standardized prompts and naming conventions. Use when creating new articles, updating missing covers, or maintaining visual consistency across the content library.