Observed since 21 Oct, 09:13 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
AGIWO - AI Agent Framework
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.
https://docs.agiwo.o-ai.techhttps://docs.agiwo.o-ai.tech/docs/getting-started/https://docs.agiwo.o-ai.tech/docs/compare/agiwo-vs-langgraph-openai-agents-autogen/https://docs.agiwo.o-ai.tech/docs/repo-overview/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 documentationAgiwo has two parts:
The project favors explicit runtime wiring over hidden global state. Agent execution, tool execution, scheduler orchestration, and persistence are all separate layers.
start(), run(), and run_stream()BaseTool implementations, and agent-as-tool composition via Agent.as_tool()submit, route_root_input, stream, wait_for, steer, and cancellation flowsallowed_skills# 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=...
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())
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},
)
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()],
)
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.
The Console is a separately published control-plane package and is intentionally positioned below the SDK in scope and readiness.
pip install agiwo-consoleThe 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/tracescd 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
There are two configuration layers:
agiwo/config/settings.pyconsole/server/config.pyEnvironment variable namespaces:
AGIWO_*AGIWO_CONSOLE_*OPENAI_API_KEY, ANTHROPIC_API_KEY, DEEPSEEK_API_KEY, AWS_REGIONImportant current rules:
openai-compatible, anthropic-compatible) must be configured with explicit base_url and api_key_env_nameAGIWO_TOOL_DEFAULT_MODEL_*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
allowed_skills: list[str] | None to filter available skills (global skill discovery is configured via AGIWO_SKILL_DIRS)Scheduler; Console StorageManager manages run-step, trace, and citation storage onlyagiwo/agent/: canonical agent runtime
models/: 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 plus WorkspaceMemoryServiceagiwo/observability/: trace/span models and storage backends; agiwo.agent.trace_writer.AgentTraceCollector bridges 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 supportconsole/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 frontendInstall 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)
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:
If you are changing the architecture, update both AGENTS.md and this README so the repo-level guidance stays aligned with the code.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 16 Apr 2026 | 28 |
This describes our collected data; it is not a security assessment.
Observed since 21 Oct, 09:13 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:f9314df4199490356f8f0b242b19ab916f876a62e7337d48644a778cf2caacdb