AGIWO - AI Agent Framework
Project description
Agiwo
Open-source streaming-first Python AI agent framework and control plane
Build, orchestrate, trace, and operate tool-using LLM agents with streaming execution, scheduler-based orchestration, persistence, and observability.
Public Docs
- Website:
https://docs.agiwo.o-ai.tech - Getting started:
https://docs.agiwo.o-ai.tech/docs/getting-started/ - Comparison:
https://docs.agiwo.o-ai.tech/docs/compare/agiwo-vs-langgraph-openai-agents-autogen/ - Repository overview:
https://docs.agiwo.o-ai.tech/docs/repo-overview/
Repository Structure
Agiwo has three main areas:
agiwo/— the SDK runtime, including agent execution, tools, scheduler orchestration, model abstraction, memory, workspace, and observabilityconsole/— the FastAPI control plane and internal web UIdocs/— design notes, concepts, and repository-native documentation
What Is Agiwo?
Agiwo has two parts:
- SDK: an async, streaming-first Python framework for building LLM agents with tools, hooks, storage, observability, skills, and scheduler-based orchestration.
- Console: an optional self-hosted FastAPI + Next.js control plane for managing agent configs, chatting over SSE, inspecting scheduler state, and integrating channels. It is currently best suited for internal deployments, supports Feishu as its only built-in channel integration, and is not yet production-ready.
The project favors explicit runtime wiring over hidden global state. Agent execution, tool execution, scheduler orchestration, and persistence are all separate layers.
Current Capabilities
- Streaming-first agent execution through one runtime pipeline surfaced as
start(),run(), andrun_stream() - Tool calling with builtin tools, custom
BaseToolimplementations, and agent-as-tool composition viaAgent.as_tool() - Scheduler orchestration for roots and child agents, including
submit,route_root_input,stream,wait_for,steer, and cancellation flows - Run and step persistence plus trace collection with memory, SQLite, and MongoDB-backed storage options
- Global skill discovery with per-agent allowlisting through explicit
allowed_skills - Optional Console package for control-plane operations, trace inspection, session chat, and Feishu channel integration
Quick Start
Install
# SDK
pip install agiwo
For development from source:
git clone https://github.com/xhwSkhizein/agiwo.git
cd agiwo
uv sync
For SDK usage, export provider credentials in your shell or place them in a local .env. Set only the credentials for the providers you actually use.
Example:
export OPENAI_API_KEY=...
Minimal SDK Example
import asyncio
from agiwo.agent import Agent, AgentConfig
from agiwo.llm import OpenAIModel
async def main() -> None:
agent = Agent(
AgentConfig(
name="assistant",
description="A helpful assistant",
system_prompt="You are a concise assistant.",
),
model=OpenAIModel(name="gpt-5.4"),
)
result = await agent.run("What is 2 + 2?")
print(result.response)
async for event in agent.run_stream("Give me a one-line summary of recursion."):
if event.type == "step_delta" and event.delta.content:
print(event.delta.content, end="", flush=True)
await agent.close()
asyncio.run(main())
Custom Tool Example
from agiwo.tool import BaseTool, ToolResult, ToolContext
class WeatherTool(BaseTool):
name = "get_weather"
description = "Get the current weather for a city"
def get_parameters(self) -> dict:
return {
"type": "object",
"properties": {
"city": {"type": "string"},
},
"required": ["city"],
}
async def execute(
self,
parameters: dict,
context: ToolContext,
abort_signal=None,
) -> ToolResult:
city = parameters["city"]
return ToolResult.success(
tool_name=self.name,
content=f"Weather in {city}: sunny, 25C",
content_for_user=f"{city}: sunny, 25C",
output={"city": city, "condition": "sunny", "temp_c": 25},
)
Agent As Tool
from agiwo.agent import Agent, AgentConfig
from agiwo.llm import DeepseekModel
researcher = Agent(
AgentConfig(
name="researcher",
description="Research specialist",
system_prompt="You are strong at collecting and summarizing evidence.",
),
model=DeepseekModel(id="deepseek-chat"),
)
orchestrator = Agent(
AgentConfig(
name="orchestrator",
description="Delegates focused research tasks",
system_prompt="Delegate independent research tasks when useful.",
),
model=DeepseekModel(id="deepseek-chat"),
tools=[researcher.as_tool()],
)
Scheduler Example
import asyncio
from agiwo.agent import Agent, AgentConfig
from agiwo.scheduler import Scheduler
from agiwo.llm import DeepseekModel
async def main() -> None:
agent = Agent(
AgentConfig(
name="orchestrator",
description="Can delegate and wait",
system_prompt="Use spawned agents only for truly independent sub-tasks.",
),
model=DeepseekModel(id="deepseek-chat"),
)
async with Scheduler() as scheduler:
result = await scheduler.run(agent, "Research two competing approaches and summarize them.")
print(result.response)
asyncio.run(main())
For long-running roots, the scheduler API also supports submit, enqueue_input, route_root_input, stream, wait_for, steer, cancel, and shutdown.
Console
The Console is a separately published control-plane package and is intentionally positioned below the SDK in scope and readiness.
- Package:
pip install agiwo-console - Recommended deployment model: internal/self-hosted use
- Built-in channel integrations today: Feishu only
- Readiness: useful for operators, not yet production-ready
Start The API Server
The Console environment template lives at console/.env.example.full.
pip install agiwo-console
cat > .env <<'EOF'
OPENAI_API_KEY=...
EOF
agiwo-console serve --env-file .env
If you are running from source instead of the published package, the full template lives at console/.env.example.full.
The API server defaults to http://localhost:8422.
Useful routes:
GET /api/healthGET /api/agentsPOST /api/chat/{agent_id}GET /api/scheduler/statesGET /api/traces
Start The Web UI
cd console/web
npm install
npm run dev
The frontend reads NEXT_PUBLIC_API_URL from console/web/.env.local.
Example:
echo 'NEXT_PUBLIC_API_URL=http://localhost:8422' > console/web/.env.local
Configuration Model
There are two configuration layers:
- SDK config in
agiwo/config/settings.py - Console config in
console/server/config.py
Environment variable namespaces:
- SDK-owned keys:
AGIWO_* - Console-owned keys:
AGIWO_CONSOLE_* - Provider credentials: canonical external names such as
OPENAI_API_KEY,ANTHROPIC_API_KEY,DEEPSEEK_API_KEY,AWS_REGION
Important current rules:
- Compatible providers (
openai-compatible,anthropic-compatible) must be configured with explicitbase_urlandapi_key_env_name - Builtin tools that create their own models read shared defaults from
AGIWO_TOOL_DEFAULT_MODEL_*
Repository Discoverability Notes
Recommended GitHub repository description:
Open-source Python AI agent framework and control plane for streaming, tool use, orchestration, tracing, and persistence.
Recommended GitHub topics:
ai-agents, python, llm, agent-framework, multi-agent, tool-calling, observability, agent-orchestration, fastapi
- Agent config includes
allowed_skills: list[str] | Noneto filter available skills (global skill discovery is configured viaAGIWO_SKILL_DIRS) - Console agent config writes are full replace, not patch merge
- Scheduler state storage is owned by the
Scheduler; ConsoleStorageManagermanages run-step, trace, and citation storage only
Architecture At A Glance
SDK
agiwo/agent/: canonical agent runtimemodels/: data models (config, run, stream, input, step)runtime/: session runtime, run context, state helpersnested/: child-agent adapter (AgentTool,as_tool())retrospect/: tool result retrospect optimizationstorage/: run/step persistence (memory, SQLite, MongoDB)
agiwo/llm/: model abstractions, providers, config policy, factory (create_model), token usage estimationagiwo/tool/: tool abstractions,ToolContext, builtin tools, authz domain types, process registry, citation storageagiwo/scheduler/: orchestration facade, engine, runner, commands, runtime state, tool control, store, runtime toolsagiwo/workspace/: workspace layout, bootstrap, and workspace document loadingagiwo/memory/: shared MEMORY indexing/search plusWorkspaceMemoryServiceagiwo/observability/: trace/span models and storage backends;agiwo.agent.trace_writer.AgentTraceCollectorbridges agent runs into tracesagiwo/skill/: skill discovery, loading, registry,SkillTool, allowlist handlingagiwo/embedding/: embedding abstractions and factory (local/OpenAI-style)agiwo/config/: SDK global settings, provider enums, termination configagiwo/utils/: cross-module runtime tools, abort signals, logging, storage support
Console
console/server/routers/: HTTP and SSE API boundaryconsole/server/services/: agent lifecycle (agent_lifecycle.py), registry (agent_registry/), storage wiring (storage_wiring.py), tool catalog, metrics, SSE servicesconsole/server/models/: shared Console data models (views, session, config)console/server/channels/: channel runtime, session binding, Feishu integrationconsole/server/config.py: ConsoleConfig (pydantic-settings, env prefix: AGIWO_CONSOLE_)console/web/: Next.js frontend
Development Workflow
Install dependencies once:
uv sync
Low-noise lint is the default workflow after code changes:
uv run python scripts/lint.py changed
If the worktree is already dirty, lint only the files you touched:
uv run python scripts/lint.py files path/to/file.py path/to/other.py
Run tests:
uv run pytest tests/ -v
(cd console && uv run pytest tests/ -v)
Current Status
The project is usable for experimentation and development. Core SDK APIs (Agent, Tool, Scheduler) are stabilizing. The Console remains an internal-use control plane that is still evolving and should not yet be treated as production-ready.
Areas that still change:
- Console channel/session wiring and Feishu integration details
- Scheduler orchestration edge cases and operator-facing controls
- Trace query APIs and visualization
If you are changing the architecture, update both AGENTS.md and this README so the repo-level guidance stays aligned with the code.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agiwo-0.1.0.tar.gz.
File metadata
- Download URL: agiwo-0.1.0.tar.gz
- Upload date:
- Size: 1.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d27741fa6c049c15e5d96a0bc690a7a365a7c8bbaceeef282d87dbbec608b812
|
|
| MD5 |
d2ebc8d58bda8c780221709b26485186
|
|
| BLAKE2b-256 |
75ab2ab592116b6facf637faf7ae441dc4e04cfda34fc53a09c20092ee085957
|
Provenance
The following attestation bundles were made for agiwo-0.1.0.tar.gz:
Publisher:
release.yml on xhwSkhizein/agiwo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agiwo-0.1.0.tar.gz -
Subject digest:
d27741fa6c049c15e5d96a0bc690a7a365a7c8bbaceeef282d87dbbec608b812 - Sigstore transparency entry: 1316437330
- Sigstore integration time:
-
Permalink:
xhwSkhizein/agiwo@e2fe828edd2819aa809e545e0ba94c7a887843b4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/xhwSkhizein
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e2fe828edd2819aa809e545e0ba94c7a887843b4 -
Trigger Event:
release
-
Statement type:
File details
Details for the file agiwo-0.1.0-py3-none-any.whl.
File metadata
- Download URL: agiwo-0.1.0-py3-none-any.whl
- Upload date:
- Size: 246.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2ad471e78f27c1e95ff2c55e0abede31a52afb16b83fd877d573bac259f1ca32
|
|
| MD5 |
221d3833f22133a0cc2d239cf67a0975
|
|
| BLAKE2b-256 |
873dbf8d97b2f5b7a928f98a84de9688751b2bac8a1ea8febf44ca6818de85b9
|
Provenance
The following attestation bundles were made for agiwo-0.1.0-py3-none-any.whl:
Publisher:
release.yml on xhwSkhizein/agiwo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agiwo-0.1.0-py3-none-any.whl -
Subject digest:
2ad471e78f27c1e95ff2c55e0abede31a52afb16b83fd877d573bac259f1ca32 - Sigstore transparency entry: 1316437392
- Sigstore integration time:
-
Permalink:
xhwSkhizein/agiwo@e2fe828edd2819aa809e545e0ba94c7a887843b4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/xhwSkhizein
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e2fe828edd2819aa809e545e0ba94c7a887843b4 -
Trigger Event:
release
-
Statement type: