{"record":{"id":"cc3fb242124d5d3a","repo":"windmill-labs/windmill","slug":"tool-module","errorCode":null,"errorMessage":"Tool module '{}': {}","messagePattern":"Tool module '(.+?)': (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/windmill-types/src/flows.rs","lineNumber":745,"sourceCode":"                    Self::traverse_modules(&branch.modules, cb)?;\n                }\n                Self::traverse_modules(default, cb)?;\n            }\n            FlowModuleValue::BranchAll { branches, .. } => {\n                for branch in branches {\n                    Self::traverse_modules(&branch.modules, cb)?;\n                }\n            }\n            FlowModuleValue::AIAgent { tools, .. } => {\n                for tool in tools {\n                    let Some(tool_module) = Option::<FlowModule>::from(tool) else {\n                        continue;\n                    };\n\n                    cb(&tool_module)?;\n                    let tool_value = tool_module\n                        .get_value()\n                        .map_err(|e| anyhow::anyhow!(\"Tool module '{}': {}\", tool_module.id, e))?;\n                    Self::traverse_module_value(&tool_value, cb)?;\n                }\n            }\n            _ => {}\n        }\n        Ok(())\n    }\n}\n\n#[derive(Deserialize)]\npub struct UntaggedInputTransform {\n    #[serde(rename = \"type\")]\n    pub type_: String,\n    pub value: Option<Box<RawValue>>,\n    pub expr: Option<String>,\n}\n\nimpl<'de> Deserialize<'de> for InputTransform {","sourceCodeStart":727,"sourceCodeEnd":763,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/windmill-types/src/flows.rs#L727-L763","documentation":"Same as the plain module traversal error but raised for tool modules nested inside a flow (e.g. inside tool items of a flow step). get_value() on the tool module failed, and the module id is prepended for diagnosis.","triggerScenarios":"Traversing a flow whose value contains tools (e.g. an AI-agent style module) and one tool module's get_value() fails to resolve/parse.","commonSituations":"Corrupt or hand-edited tool definitions; tool payload schema drift across versions; imported flows referencing tools that fail validation.","solutions":["Read the wrapped inner error and the tool module id","Open that tool in the flow editor and fix its value","Re-save/redeploy the flow to normalize the stored value","Verify windmill version consistency between environments"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match result {\n    Err(e) if e.to_string().contains(\"Tool module\") => {\n        let id = e.to_string().split('\\'').nth(1).unwrap_or(\"?\");\n        eprintln!(\"fix tool module {id}: {e:#}\");\n    }\n    other => other?,\n}","preventionTips":["Re-save tools through the editor rather than hand-editing JSON","Validate tool payloads before deployment","Pin matching windmill versions across environments"],"tags":["rust","flows","tools"],"backgroundTag":"flow-module-resolution-failed","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}