Quickstart
Configuration
downcity.json, PROFILE.md, and runtime configuration essentials
Configuration
Downcity is configured with three core files:
PROFILE.md: agent role and boundaries (required)SOUL.md: stable operating principles (optional)downcity.json: runtime configuration (required)
Key downcity.json fields
start (advanced only)
For city agent start, ports are auto-allocated by console.
So in normal usage you do not need start.port in project downcity.json.
Only configure start when manually running foreground runtime or debugging special host binding:
{
"start": {
"host": "0.0.0.0"
}
}execution
Agent model binding (maps to the city global model pool):
{
"execution": {
"type": "api",
"modelId": "quality"
}
}Notes:
- project runtime now binds through
execution.modelId - for the current project runtime path,
execution.typeshould beapi - the old
model.primarystructure is no longer the recommended project-side format
services.chat
Chat channels and queue behavior:
{
"services": {
"chat": {
"queue": {
"maxConcurrency": 2,
"mergeDebounceMs": 600,
"mergeMaxWaitMs": 2000
},
"channels": {
"telegram": {
"enabled": true,
"channelAccountId": "telegram-main"
}
}
}
}
}channelAccountId binds to the global channel account registry in ~/.downcity/downcity.db (channel_accounts).
services.chat.queue notes:
maxConcurrency: max lane concurrency across different chat keys.mergeDebounceMs: short debounce window for batching consecutive inbound messages in one run.mergeMaxWaitMs: hard cap for the batching wait to avoid unbounded delay.
plugins.skill
Skills discovery roots:
{
"plugins": {
"skill": {
"enabled": true,
"paths": [".agents/skills"],
"allowExternalPaths": false
}
}
}plugins.*
Plugin config is maintained in project downcity.json.
Example for asr:
city asr on SenseVoiceSmall
city config get plugins.asrUseful commands
city config get
city config get execution.modelId
city model list
city config unset services.chat.channels.telegram