Contracts, not coupling
Every package talks through protocols in oridecon-contracts. Agents code to interfaces, not implementations. Swap Redis for in-memory, Postgres for SQLite — same contract, one config line.
v0.1 alpha Python 3.11+ · MIT licensed
Contracts and protocols coding agents can reason about. 17 AI packages they can build with. A full backend — web, SQL, auth, queues — wired through one container.
uv add oridecon-cli pip install oridecon-cli · coding agents # composition root — oridecon run boots this
from oridecon import Application, OrideconConfig
from oridecon.web import WebModule
from oridecon.sql import DatabaseModule
from oridecon.cache import CacheModule
from oridecon.ai import AIModule
def create_app(
config: OrideconConfig | None = None
) -> Application:
app = Application(
name="my-app",
config=config,
)
app.add_modules([
DatabaseModule.configure(),
CacheModule.configure(),
AIModule.configure(),
WebModule.configure(
discover=["my_app.controllers"],
),
])
return app
app = create_app() How it feels
A @tool, AgentBuilder, a provider that binds LLMClientProtocol, then create_app().
The executor returns Result. The model is a YAML (or test fake) swap — not a rewrite.
# @tool wraps a plain async function for the ReAct loop
from oridecon.ai.agents import tool
@tool(description="Look up an order by ID and return status.")
async def lookup_order(order_id: str) -> dict:
return {"found": True, "order_id": order_id, "status": "shipped"} # AgentBuilder freezes config; the facade returns Result
from oridecon.ai.agents import AgentBuilder
from oridecon.contracts.ai.agents import (
AgentError, AgentExecutorProtocol, AgentProtocol, AgentResponse,
)
from oridecon.result import Result
def build_support_agent() -> AgentProtocol:
return (
AgentBuilder("support-agent")
.with_system_prompt("Use tools. Never invent order state.")
.with_tools(lookup_order)
.with_strategy("react")
.build()
)
class SupportAgent:
def __init__(self, executor: AgentExecutorProtocol, agent: AgentProtocol) -> None:
self._executor = executor
self._agent = agent
async def ask(self, question: str) -> Result[AgentResponse, AgentError]:
return await self._executor.run(agent=self._agent, message=question) # bind LLMClientProtocol in register() — AgentsModule resolves it at boot
from oridecon.di.provider import Provider
from oridecon.contracts.ai.llm import LLMClientProtocol
from oridecon.contracts.ai.agents import AgentExecutorProtocol
from oridecon.contracts.core.di import ContainerRegistrarProtocol, ContainerResolverProtocol
class AgentSupportProvider(Provider):
name = "agent-support"
async def register(self, container: ContainerRegistrarProtocol) -> None:
container.singleton(LLMClientProtocol, factory=self._llm)
async def boot(self, container: ContainerResolverProtocol) -> None:
executor = await container.resolve(AgentExecutorProtocol)
self._support = SupportAgent(
executor=executor,
agent=build_support_agent(),
) # composition root — list the modules this app actually uses
from oridecon import Application, OrideconConfig
from oridecon.ai.agents import AgentConfig, AgentsModule
from oridecon.web import WebModule
def create_app(config: OrideconConfig | None = None) -> Application:
app = Application(name="support-agent", config=config)
app.add_modules([
AgentsModule.configure(AgentConfig(max_iterations=5)),
WebModule.configure(discover=["support_agent.controllers"]),
])
app.add_providers([AgentSupportProvider()])
return app The stack
The same seams that keep a human codebase composable are the ones a coding agent can inspect, type-check, and test against.
Every package talks through protocols in oridecon-contracts. Agents code to interfaces, not implementations. Swap Redis for in-memory, Postgres for SQLite — same contract, one config line.
Lifecycle and wiring live in one place. Register, boot, shut down. Priority is explicit — web mounts last, after SQL, cache, and auth are actually ready.
Domain failures are Ok / Err. Agents can follow the error path without guessing which exception flies out of a handler.
Architectural boundaries are enforced. Cross-package leaks fail CI before they ship — agents can verify their own imports.
ASGI controllers, routing, middleware, CORS, rate limiting. Docs generate themselves at /docs.
Python 3.11+, 100% async, full type hints. Your IDE and your agent see the same signatures.
AI native
Oridecon is a Python backend an LLM can actually operate: stable contracts, an explicit boot graph, and docs that ship in the format agents already fetch.
Read order, repo map, one project layout (domains/, di/), fail vs fix, and /SKILL.md. Machine indexes: /llms.txt, /agents.md, /llms/oridecon-sql.txt.
Protocols100+ protocols, 533 error codes, typed providers. Agents reason about contracts instead of scraping READMEs for hidden kwargs.
SkillsPublic pack at github.com/dbtinoy-/oridecon-skills — Claude Code, Cursor, OpenCode. One-file fetch: /SKILL.md.
Ecosystem
Every extension depends on oridecon and oridecon-contracts — never on each other. The boundary is what keeps the graph composable.
Application, container, providers, modules, config, Result.
ASGI, GraphQL, outbound HTTP, webhooks.
SQL, NoSQL, cache, object storage, search.
Auth, secrets, JWT, OAuth2, guards.
Domain events, queues, notifications.
Tasks, workflows, tenancy, resilience, vectors.
LLMs, RAG, agents, memory, MCP, skills, eval.
Image, video, audio, TTS, upscale, interpolate.
CLI, testing, admin, UI — experimental except testing.
Examples
Each one boots the real Application — providers, DI, the web stack. In-memory backends, so the run is deterministic.
A ReAct agent with tools on the container.
OpenCookie sessions, JWT, lockout after five failures.
OpenCQRS orders, domain events, a transactional outbox.
OpenSQL in the repository. The controller stays thin.
OpenComing from FastAPI
Starlette routing, Pydantic request shapes, OpenAPI — you already know this layer. Oridecon wraps it in a container, providers, and a contract-first ecosystem so SQL, cache, auth, queues, and AI feel as designed as the routes. Feature types live in domains/, not a models/ directory.
FAQ
Oridecon is an async-first, contract-driven Python application framework. The core gives you a DI container, providers, modules, YAML config, and the Result type. Extensions add web, SQL, auth, queues, and a 17-package AI platform — each talking through protocols, never through each other.
No. Starlette routing, Pydantic request shapes, and OpenAPI are still the HTTP layer. Oridecon puts a composition root around them: constructor injection instead of Depends() on the handler, providers instead of ad-hoc startup hooks, and oridecon-contracts so you can swap SQL, cache, or LLM backends in config. Adopt it one service at a time. See the FastAPI map.
Coding agents need stable interfaces, typed errors, and docs they can load. Oridecon ships 100+ protocols, 533 error codes, /llms.txt, /agents.md, /SKILL.md, a public oridecon-skills pack, runnable examples, and fail vs fix. Import boundaries are linted so generated code cannot quietly couple packages.
Python 3.11 or newer. The stack is 100% async/await. Install with uv add oridecon-cli (recommended) or pip install oridecon-cli, then oridecon new project my-app --template web-api.
Oridecon is alpha (0.1.x). Public APIs may change before 1.0. Pin versions in production, follow the changelog, and treat it as early on purpose — the architecture is stable; the surface is still moving.
No. Scaffold with uv add oridecon-cli, then oridecon new project my-app --template web-api. The foundation is oridecon plus oridecon-contracts. Add oridecon-web, oridecon-sql, oridecon-ai-llm, or anything else only when you need it. Extensions never depend on other extensions.
Updates
The 0.1.1 line, plus writing from the last few weeks. Not a git log.
The architecture is the pin. Package names and experimental surfaces will still move. Here is what we will not casually rewrite.
Sep 6, 2026
BlogThe shortest path from a fresh clone to a change that will pass the import linter — llms.txt, agents.md, contracts, then an example.
Sep 1, 2026
BlogFastAPI is a great HTTP layer. Oridecon keeps that instinct and puts a composition root around it — you are not starting over.
Aug 26, 2026
Start building
Install the CLI, scaffold with oridecon new project, and add packages as you need them. The contracts stay put.
uv add oridecon-cli