Config Defaults
This page is the source-of-truth documentation for current default config values and normalization behavior.
Default Config JSON
json
{
"projectName": "OpenPocket",
"workspaceDir": "<absolute OPENPOCKET_HOME>/workspace",
"stateDir": "<absolute OPENPOCKET_HOME>/state",
"defaultModel": "gpt-5.2-codex",
"emulator": {
"avdName": "OpenPocket_AVD",
"androidSdkRoot": "<ANDROID_SDK_ROOT env or empty string>",
"headless": false,
"bootTimeoutSec": 180
},
"telegram": {
"botToken": "",
"botTokenEnv": "TELEGRAM_BOT_TOKEN",
"allowedChatIds": [],
"pollTimeoutSec": 25
},
"agent": {
"maxSteps": 50,
"loopDelayMs": 1200,
"progressReportInterval": 1,
"returnHomeOnTaskEnd": true,
"lang": "en",
"verbose": true,
"deviceId": null
},
"screenshots": {
"saveStepScreenshots": true,
"directory": "<absolute OPENPOCKET_HOME>/state/screenshots",
"maxCount": 400
},
"scriptExecutor": {
"enabled": true,
"timeoutSec": 60,
"maxOutputChars": 6000,
"allowedCommands": [
"adb",
"am",
"pm",
"input",
"echo",
"pwd",
"ls",
"cat",
"grep",
"rg",
"sed",
"awk",
"bash",
"sh",
"node",
"npm"
]
},
"heartbeat": {
"enabled": true,
"everySec": 30,
"stuckTaskWarnSec": 600,
"writeLogFile": true
},
"cron": {
"enabled": true,
"tickSec": 10,
"jobsFile": "<absolute OPENPOCKET_HOME>/workspace/cron/jobs.json"
},
"humanAuth": {
"enabled": false,
"relayBaseUrl": "",
"publicBaseUrl": "",
"apiKey": "",
"apiKeyEnv": "OPENPOCKET_HUMAN_AUTH_KEY",
"requestTimeoutSec": 300,
"pollIntervalMs": 2000
},
"models": {
"gpt-5.2-codex": {
"baseUrl": "https://api.openai.com/v1",
"model": "gpt-5.2-codex",
"apiKey": "",
"apiKeyEnv": "OPENAI_API_KEY",
"maxTokens": 4096,
"reasoningEffort": "medium",
"temperature": null
},
"gpt-5.3-codex": {
"baseUrl": "https://api.openai.com/v1",
"model": "gpt-5.3-codex",
"apiKey": "",
"apiKeyEnv": "OPENAI_API_KEY",
"maxTokens": 4096,
"reasoningEffort": "medium",
"temperature": null
},
"claude-sonnet-4.6": {
"baseUrl": "https://openrouter.ai/api/v1",
"model": "claude-sonnet-4.6",
"apiKey": "",
"apiKeyEnv": "OPENROUTER_API_KEY",
"maxTokens": 4096,
"reasoningEffort": "medium",
"temperature": null
},
"claude-opus-4.6": {
"baseUrl": "https://openrouter.ai/api/v1",
"model": "claude-opus-4.6",
"apiKey": "",
"apiKeyEnv": "OPENROUTER_API_KEY",
"maxTokens": 4096,
"reasoningEffort": "medium",
"temperature": null
},
"autoglm-phone": {
"baseUrl": "https://api.z.ai/api/paas/v4",
"model": "autoglm-phone-multilingual",
"apiKey": "",
"apiKeyEnv": "AUTOGLM_API_KEY",
"maxTokens": 3000,
"reasoningEffort": null,
"temperature": null
}
}
}Notes:
- Runtime-generated
config.jsonuses absolute paths. openpocket.config.example.jsonkeeps~for readability, but loader resolves to absolute paths.
Normalization
defaultModelmust exist inmodels.agent.langis normalized toen(English-only runtime prompts).agent.progressReportIntervalis clamped to at least1.screenshots.maxCountis clamped to at least20.scriptExecutor.timeoutSecis clamped to at least1.scriptExecutor.maxOutputCharsis clamped to at least1000.heartbeat.everySecis clamped to at least5.heartbeat.stuckTaskWarnSecis clamped to at least30.cron.tickSecis clamped to at least2.humanAuth.requestTimeoutSecis clamped to at least30.humanAuth.pollIntervalMsis clamped to at least500.allowedChatIdsis coerced to numeric array with non-finite values removed.- model
reasoningEffortaccepts onlylow|medium|high|xhigh, elsenull. - model
temperatureisnullif absent/invalid.
Paths
- values starting with
~are expanded to user home - other paths are resolved to absolute paths
API Keys
Per model profile:
- use
apiKeywhen non-empty - else use env var from
apiKeyEnv - else key is missing
Missing key causes task start failure with a persisted failed session/memory entry.
Legacy Keys
The loader maps legacy snake_case keys (top-level and nested) to camelCase keys before merge.
Examples:
default_model->defaultModelmax_steps->maxStepsheartbeat_config->heartbeatcron_config->cronhuman_auth->humanAuthallowed_commands->allowedCommandsbase_url->baseUrlreasoning_effort->reasoningEffort