Version 4.4.0#

Released: April 30, 2026

This release introduces the reasoning extension: an LLM-driven plan -> act -> observe state body, plus the primitives it consumes — tools, skills and workspaces. See the new reasoning wiki section and the reasoning_agent example.

New Features#

Reasoning state#

A predefined state whose body runs an LLM tool-calling loop. Register it with new_reasoning_state(). Built-in task planning (add_tasks / complete_task / skip_task) keeps multi-step requests tracked: the loop only finalises when every planned task is resolved, otherwise the orchestrator pushes back.

Tools#

Plain Python callables registered via new_tool() (or load_tools() for bulk-load from a module/folder, or the @agent.tool decorator). Signatures, type hints and docstrings are auto-introspected into the OpenAI / Anthropic function-calling JSON schema — no schema written by hand. LLMOpenAI gains predict_with_tools() for native tool-calling.

Skills#

Named markdown playbooks injected into the system prompt of the reasoning state. Loaded from a file, a string, or a folder of .md files via new_skill() / load_skills(). YAML-style frontmatter (name, description) supported.

Workspaces#

Filesystem paths the LLM can browse and (optionally) modify on demand — a Claude Code-style alternative to RAG. Register with new_workspace(). Auto-registers universal list_directory / read_file tools, plus write_file / create_file / delete_file when at least one workspace is writable=True. Path traversal outside the workspace root is rejected.

Streaming and persistence#

Every observable reasoning event (LLM tool calls, tool results, task list mutations, push-back, max-steps) is streamed to the UI through the new reply_reasoning_step() method, with task-list snapshots flowing on the parallel reply_task_list_update() channel. Events bracketed by reasoning_started / reasoning_finished. A dedicated reasoning_step database table stores them for session replay.

Improvements#