tinyhumansai/openhuman · error
thread_read: {e}
Error message
thread_read: {e} What it means
Generic wrapper from thread_read: the underlying threads_list ops call failed, so the thread metadata could not even be looked up. The {e} carries the RPC/ops-layer error, not a per-thread fact.
Source
Thrown at src/openhuman/threads/tools.rs:130
fn description(&self) -> &str {
"Read one conversation thread's metadata by `thread_id` (title, labels, \
timestamps). For the messages themselves, use `thread_message_list`."
}
fn parameters_schema(&self) -> serde_json::Value {
json!({
"type": "object",
"properties": { "thread_id": { "type": "string", "description": "Thread id." } },
"required": ["thread_id"]
})
}
async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {
log::debug!("[tool][threads] read invoked");
let thread_id = read_required_str(&args, "thread_id")?;
let outcome = ops::threads_list(EmptyRequest {})
.await
.map_err(|e| anyhow::anyhow!("thread_read: {e}"))?;
let value = serde_json::to_value(&outcome.value)?;
match find_thread_obj(&value, &thread_id) {
Some(found) => Ok(ToolResult::success(serde_json::to_string(&found)?)),
None => Err(anyhow::anyhow!(
"thread_read: thread `{thread_id}` not found"
)),
}
}
fn is_concurrency_safe(&self, _args: &serde_json::Value) -> bool {
true
}
}
/// Create a new thread.
pub struct ThreadCreateTool;
#[async_trait]View on GitHub (pinned to 7491200858)
Solutions
- Read {e} for the ops-layer failure
- Retry transient errors
- If persistent, check core logs for the threads domain
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at src/openhuman/threads/tools.rs:130 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/e6ef8d83f583886c.
Report an issue: GitHub.