{"record":{"id":"25622a1dc60bf8b4","repo":"zeroclaw-labs/zeroclaw","slug":"temperature-unsupported-by-kilocli-temperature","errorCode":null,"errorMessage":"temperature unsupported by KiloCLI: {temperature}. Supported values: 0.7 or 1.0","messagePattern":"temperature unsupported by KiloCLI: (.+?)\\. Supported values: 0\\.7 or 1\\.0","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-providers/src/kilocli.rs","lineNumber":92,"sourceCode":"\n    /// Returns true if the model argument should be forwarded to the CLI.\n    fn should_forward_model(model: &str) -> bool {\n        let trimmed = model.trim();\n        !trimmed.is_empty() && trimmed != DEFAULT_MODEL_MARKER\n    }\n\n    fn supports_temperature(temperature: f64) -> bool {\n        KILO_CLI_SUPPORTED_TEMPERATURES\n            .iter()\n            .any(|v| (temperature - v).abs() < TEMP_EPSILON)\n    }\n\n    fn validate_temperature(temperature: f64) -> anyhow::Result<()> {\n        if !temperature.is_finite() {\n            anyhow::bail!(\"KiloCLI model_provider received non-finite temperature value\");\n        }\n        if !Self::supports_temperature(temperature) {\n            anyhow::bail!(\n                \"temperature unsupported by KiloCLI: {temperature}. \\\n                 Supported values: 0.7 or 1.0\"\n            );\n        }\n        Ok(())\n    }\n\n    fn redact_stderr(stderr: &[u8]) -> String {\n        let text = String::from_utf8_lossy(stderr);\n        let trimmed = text.trim();\n        if trimmed.is_empty() {\n            return String::new();\n        }\n        if trimmed.chars().count() <= MAX_KILO_CLI_STDERR_CHARS {\n            return trimmed.to_string();\n        }\n        let clipped: String = trimmed.chars().take(MAX_KILO_CLI_STDERR_CHARS).collect();\n        format!(\"{clipped}...\")","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-providers/src/kilocli.rs#L74-L110","documentation":"KiloCLI accepts only temperature 0.7 and 1.0 (within TEMP_EPSILON); the CLI has no sampling flag, so these are validated no-ops and every other finite value fails per request. The message includes the rejected value so the offending profile is easy to find.","triggerScenarios":"chat_with_system/chat on a kilocli provider with temperature = 0.0, 0.5, 1.2, etc.; copying an agent block written for an HTTP provider that accepts arbitrary floats.","commonSituations":"Reusing tuned agent profiles after switching model_provider to kilocli; global temperature settings applied to all providers; experimentation scripts that sweep values.","solutions":["Set temperature to 0.7 or 1.0, or omit the field","Drop temperature overrides on agents bound to kilocli","Use an API-based provider if you need arbitrary sampling values"],"exampleFix":"# before\n[agents.helper]\nmodel_provider = \"kilocli\"\ntemperature = 0.4\n\n# after\n[agents.helper]\nmodel_provider = \"kilocli\"\ntemperature = 1.0","handlingStrategy":"validation","validationCode":"fn kilo_temperature_ok(t: Option<f64>) -> bool {\n    t.map(|v| (v - 0.7).abs() < 1e-9 || (v - 1.0).abs() < 1e-9).unwrap_or(true)\n}","typeGuard":"fn is_supported_kilo_temperature(t: f64) -> bool {\n    (t - 0.7).abs() < 1e-9 || (t - 1.0).abs() < 1e-9\n}","tryCatchPattern":"match kilo.chat(req, model, temp).await {\n    Err(e) if e.to_string().contains(\"temperature unsupported by KiloCLI\") =>\n        kilo.chat(req, model, Some(0.7)).await,\n    other => other,\n}","preventionTips":["Omit temperature for kilocli agents or pin it to 0.7/1.0","Validate per-agent settings whenever the model_provider changes"],"tags":["kilocli","temperature","sampling","validation"],"backgroundTag":"unsupported-parameter-value","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}