Loading...
Loading...
Migrate configuration from Bluejay voice AI testing platform to Coval. Use when customer says "migrate from bluejay", "bluejay migration", "import bluejay config", or needs to transfer agents, simulations, metrics, and schedules from Bluejay to Coval.
npx skill4agent add coval-ai/coval-external-skills migrate-bluejay$ARGUMENTS$ARGUMENTS[bluejay-api-key] [coval-api-key]curl -s -o /dev/null -w "%{http_code}" \
-H "X-API-Key: <BLUEJAY_KEY>" \
"https://api.getbluejay.ai/v1/all-agents"200401403curl -s -o /dev/null -w "%{http_code}" \
-H "X-API-Key: <COVAL_KEY>" \
"https://api.coval.dev/v1/agents?page_size=1"200401curl -s -H "X-API-Key: <COVAL_KEY>" \
"https://api.coval.dev/v1/personas/voices"{ "voices": [{ "voice_name": "aria", "supported_languages": ["en-US", ...] }] }| Entity | Endpoint |
|---|---|
| Agents | |
| Simulations | |
| Custom Metrics | |
| Communities | |
| Schedules | Derive from simulations (no list-all endpoint — check each simulation) |
| Customer Personas | Fetch per agent: |
| Folders | |
GET /v1/agents/{agent_id}/prompts/versions?page_size=1GET /v1/agents/{agent_id}/knowledge-bases/versions?page_size=1GET /v1/digital-humans-by-simulation/{simulation_id}Found:
- X agents
- Y digital humans (across Z simulations)
- N custom metrics
- M communities
- P customer personas
- Q schedules
- R folders
Proceed with migration?# Agents
curl -s -H "X-API-Key: <COVAL_KEY>" "https://api.coval.dev/v1/agents?page_size=100"
# Personas
curl -s -H "X-API-Key: <COVAL_KEY>" "https://api.coval.dev/v1/personas?page_size=100"
# Test Sets
curl -s -H "X-API-Key: <COVAL_KEY>" "https://api.coval.dev/v1/test-sets?page_size=100"
# Metrics
curl -s -H "X-API-Key: <COVAL_KEY>" "https://api.coval.dev/v1/metrics?page_size=100"
# Run Templates
curl -s -H "X-API-Key: <COVAL_KEY>" "https://api.coval.dev/v1/run-templates?page_size=100"
# Scheduled Runs
curl -s -H "X-API-Key: <COVAL_KEY>" "https://api.coval.dev/v1/scheduled-runs?page_size=100"next_page_tokendisplay_name → IDbluejay_migration: truemetric_typeresponse_typepromptscoring_guidancedescriptionqualitativequantitativemin_valuemax_valueenumenum_optionscategorieseval_route == "AUDIO"METRIC_AUDIO_LLM_*jsonMETRIC_LLM_BINARYcurl -s -X POST "https://api.coval.dev/v1/metrics" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"metric_name": "<bluejay_metric_name>",
"description": "<bluejay_description>",
"metric_type": "<mapped_type>",
"prompt": "<from_scoring_guidance>",
"metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<bluejay_metric_id>"
}
}'categoriesmin_valuemax_valuebluejay_metric_id → coval_metric_idBluejay Digital Human: "<name>"
Gender: <gender>
Accent: <accent>
Language: <language>
Available Coval voices: aria, asteria, athena, luna, ...
Which Coval voice should map to this configuration?languagelanguage_codeenen-USeses-ESbackground_noisebackground_soundpersona_promptrole_descriptiontraitscurl -s -X POST "https://api.coval.dev/v1/personas" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "<digital_human_name>",
"voice_name": "<mapped_coval_voice>",
"language_code": "<mapped_language_code>",
"persona_prompt": "<built_from_role_description_and_traits>",
"background_sound": "<mapped_background_noise>",
"conversation_initiation": "<from_speaks_first_config>",
"metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<digital_human_id>"
}
}'bluejay_digital_human_id → coval_persona_idcurl -s -X POST "https://api.coval.dev/v1/personas" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "<customer_persona_name>",
"voice_name": "aria",
"language_code": "en-US",
"persona_prompt": "Name: <name>\nDescription: <description>\nGoal: <goal>",
"metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<customer_persona_id>",
"bluejay_entity_type": "customer_persona"
}
}'ariamodel_typemode=VOICEMODEL_TYPE_VOICEmode=TEXTMODEL_TYPE_TEXTpromptprompt_textgoalssystem_promptknowledge_basefolderdisplay_name"[FolderName] AgentName"curl -s -X POST "https://api.coval.dev/v1/agents" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"display_name": "<folder_prefix><agent_name>",
"model_type": "<MODEL_TYPE_VOICE|MODEL_TYPE_TEXT>",
"prompt": "<system_prompt + latest_prompt + goals>",
"metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<bluejay_agent_id>",
"knowledge_base": "<kb_text_content>",
"bluejay_connection_type": "<connection_type>",
"bluejay_phone_number": "<phone_number>"
}
}'bluejay_agent_id → coval_agent_idcurl -s -X POST "https://api.coval.dev/v1/test-sets" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"display_name": "<simulation_name>",
"description": "Migrated from Bluejay simulation <simulation_id>",
"test_set_type": "SCENARIO",
"test_set_metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<simulation_id>",
"bluejay_entity_type": "simulation"
}
}'bluejay_simulation_id → coval_test_set_idcurl -s -X POST "https://api.coval.dev/v1/test-sets" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"display_name": "<community_title>",
"description": "<community_description>",
"test_set_type": "SCENARIO",
"test_set_metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<community_id>",
"bluejay_entity_type": "community"
}
}'bluejay_community_id → coval_test_set_idintentinput_strsuccess_criteriaexpected_behaviorscoval_test_set_idscripted_responsesinput_type: "SCRIPT"simulation_metadata_input.script_turnscurl -s -X POST "https://api.coval.dev/v1/test-cases" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"test_set_id": "<coval_test_set_id>",
"input_str": "<digital_human_intent>",
"expected_behaviors": ["<success_criteria_line_1>", "<success_criteria_line_2>"],
"description": "<digital_human_name>: <digital_human_tag>",
"input_type": "SCENARIO",
"metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<digital_human_id>"
}
}'curl -s -X POST "https://api.coval.dev/v1/test-cases" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"test_set_id": "<coval_test_set_id>",
"input_str": "<digital_human_intent>",
"expected_behaviors": ["<success_criteria>"],
"input_type": "SCRIPT",
"simulation_metadata_input": {
"script_turns": ["<turn_1>", "<turn_2>", "..."]
},
"metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<digital_human_id>"
}
}'bluejay_digital_human_id → coval_test_case_idcoval_agent_idbluejay_agent_idcoval_test_set_idcoval_metric_idscurl -s -X POST "https://api.coval.dev/v1/run-templates" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"display_name": "<simulation_name> Template",
"description": "Migrated from Bluejay simulation <simulation_id>",
"agent_id": "<coval_agent_id>",
"persona_id": "<coval_persona_id>",
"test_set_id": "<coval_test_set_id>",
"metric_ids": ["<coval_metric_id_1>", "<coval_metric_id_2>"],
"iteration_count": 1,
"concurrency": 5,
"metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<simulation_id>"
}
}'bluejay_simulation_id → coval_run_template_idcoval_run_template_idcroncron(...)every_n_minutesrate(<n> minutes)every_n_hoursrate(<n> hours)dailycron(<MM> <HH> ? * * *)weeklycron(<MM> <HH> ? * <DAY> *)monthlycron(<MM> <HH> <DOM> * ? *)curl -s -X POST "https://api.coval.dev/v1/scheduled-runs" \
-H "X-API-Key: <COVAL_KEY>" \
-H "Content-Type: application/json" \
-d '{
"display_name": "<simulation_name> Schedule",
"run_template_id": "<coval_run_template_id>",
"schedule_expression": "<converted_schedule>",
"enabled": false,
"metadata": {
"bluejay_migration": true,
"bluejay_original_id": "<schedule_id>"
}
}'bluejay_schedule_id → coval_scheduled_run_id## Migration Complete
### Created Entities
| Type | Count | Details |
|------|-------|---------|
| Metrics | N | bluejay_id → coval_id for each |
| Personas | N | ... |
| Agents | N | ... |
| Test Sets | N | ... |
| Test Cases | N | ... |
| Run Templates | N | ... |
| Scheduled Runs | N | (all disabled) |
### Skipped (Already Existed)
- List any entities skipped due to idempotency
### Warnings
- List any ambiguous mappings or approximations made
- Note any `json` metrics mapped to METRIC_LLM_BINARY
- Note any voice mappings that may need review
### Next Steps
1. Review migrated entities in the Coval dashboard: https://app.coval.dev
2. Enable scheduled runs after verifying configuration
3. Run a test evaluation from a migrated Run Template to verify
4. Review persona voice assignments and adjust if neededbluejay_migration: true{ "bluejay_migration": true, "bluejay_original_id": "<id>" }