tinyhumansai/openhuman · error · anyhow::Error

create_skill: invalid params: {e}

Error message

create_skill: invalid params: {e}

What it means

create_skill failed to deserialize its tool arguments into the CreateSkill params struct: a required field (name or description) is missing, or an optional field (scope, tags, allowed_tools, inputs, ...) has the wrong JSON type. This is the params-parse guard, fired before any skill is written.

Source

Thrown at src/openhuman/skills/tools.rs:586

                "scope": { "type": "string", "enum": ["user", "project"], "description": "Install scope (default user)." },
                "license": { "type": "string" },
                "author": { "type": "string" },
                "tags": { "type": "array", "items": { "type": "string" } },
                "allowed_tools": { "type": "array", "items": { "type": "string" } },
                "inputs": { "type": "array", "items": { "type": "object" } }
            },
            "required": ["name", "description"]
        })
    }

    fn permission_level(&self) -> PermissionLevel {
        PermissionLevel::Write
    }

    async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {
        log::debug!("[tool][skills] create invoked");
        let params: CreateWorkflowParams = serde_json::from_value(args)
            .map_err(|e| anyhow::anyhow!("create_skill: invalid params: {e}"))?;
        let skill = create_workflow(&self.workspace_dir, params)
            .map_err(|e| anyhow::anyhow!("create_skill: {e}"))?;
        Ok(ToolResult::success(serde_json::to_string(&skill)?))
    }
}

/// Install a skill from a remote URL. **Fetches + writes** — default-OFF.
pub struct WorkflowInstallFromUrlTool {
    workspace_dir: PathBuf,
}

impl WorkflowInstallFromUrlTool {
    pub fn new(config: Arc<Config>) -> Self {
        Self {
            workspace_dir: config.workspace_dir.clone(),
        }
    }
}

View on GitHub (pinned to 7491200858)

Solutions

  1. Check the serde error {e}: it names the offending field and the expected type
  2. Supply both required fields 'name' and 'description' as strings
  3. Use the documented shapes: scope is 'user'|'project', tags/allowed_tools are string arrays, inputs is an array of objects
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at src/openhuman/skills/tools.rs:586 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/9a43abb37265a7f0. Report an issue: GitHub.