Ship agents into the field in days, not quarters.
ConnectOnion is the agent framework for engineers who deploy on the customer's turf. Plug into their messy systems, see exactly what the agent did, and hand off code you actually own. Three lines to a working agent.
pip install connectonion · works with any LLM · Apache-2.0
1from connectonion import Agent23def lookup_order(order_id: str) -> str:4 """Pull an order from the customer's database."""5 return db.query(order_id)67agent = Agent("support", tools=[lookup_order])8agent.input("Where is order #4471?")The framework that survives contact with production.
Forward Deployed Engineers don't need another demo framework. They need something that holds up inside a customer's mess.
Ship in days, not months
A prototype on Monday is in production by Friday. No orchestration graph to learn, no boilerplate to scaffold — a function becomes a tool, a tool becomes an agent.
Built for the field
You don't get a clean lab. You get the customer's database, their auth, their half-documented API. Any Python function is a tool, so the agent talks to whatever is already there.
See exactly what it did
When an agent misbehaves at a client site, you can't shrug. @xray opens up every decision — the task, the iteration, the tools it called — so you debug in minutes, not guesswork.
You own the code
No black box, no platform you can't hand off. It's plain Python you read, fork, and leave behind with the customer. When the engagement ends, they own a real system.
From function to deployed agent, in one file.
The whole loop a Forward Deployed Engineer lives in — build, debug, swap models — without leaving Python.
Write a normal Python function, hand it to an Agent, and call it. No graph, no chains, no config files.
1from connectonion import Agent23def search_tickets(query: str) -> str:4 """Search the customer's helpdesk."""5 return helpdesk.search(query)67def refund(order_id: str, amount: float) -> str:8 """Issue a refund through their billing API."""9 return billing.refund(order_id, amount)1011agent = Agent(12 "support",13 tools=[search_tickets, refund],14)1516agent.input("Refund the duplicate charge on order #4471")Seven things you only need on someone else's site.
Any framework can call a model. These are the parts you reach for in week two, when the demo has to survive their network, their auth, their security review — and their laptop, not yours.
The CLI is the deliverable on day one
A working project before lunch, not a weekend of scaffolding. co ai is a coding agent that knows the framework because it is built with it — and doctor and status tell you what is broken on a machine that is not yours.
co create my-agentco aico doctorIt picks up the skills already on their machines
Their engineers have been writing SKILL.md files for months. Discovery scans ~/.claude, ~/.codex, ~/.cursor and ~/.kiro, loads Claude Code skills with no conversion, and bundles the ones you want into the deployment.
co skills discoverco deploy --skills ./opsDeploy onto their box, not only ours
Plenty of customers will not let anything leave the building. Register the machine and sync the project onto it. The server entry stores a name and an ssh target and no credential — the key is derived from the same recovery phrase as the agent's identity.
co deploy --to prodco server add prod user@hostco keys --sshThe system with no API is the normal case
One persistent browser you can drive by calling a function or by handing it an instruction. And any Python function is a tool, so the half-documented internal endpoint is something you already know how to write.
co browser do "export last month's bookings"Operate a deployed agent with no model in the loop
Run one command on a remote agent and print the result. No LLM, no tokens, no non-determinism — gated by that agent's own host.yaml whitelist. The remote twin of co browser, and the thing you want at 6pm on a Friday.
co call 0x3d40… co statusDebug it on a machine you cannot attach to
@xray opens the task, the message history, the iteration and the previous tool calls from inside any tool. Every run writes a plain-text log and a replayable session, so you can rerun what actually happened instead of describing it.
@xrayxray.trace()co evalA security policy their reviewer can read
Three levels, and the policy is markdown — the customer's security team reads the same file the agent enforces. The rules are evaluated before the model is called, so a denial is a decision you can point at rather than a sentence a model produced.
host(agent, trust="careful")All of it is plain Python you can read, and co copy lifts any built-in tool or plugin into your project when the customer needs it to behave differently.
Same engagement. One week instead of six.
The cost of a deployment isn't the model — it's everything around it. ConnectOnion deletes the everything.
The usual way
- Week 1–2: scaffold an orchestration framework, fight its abstractions
- Week 3–4: wire each customer system in as a custom integration
- Week 5: agent breaks on-site, no visibility into why
- Hand-off: customer is locked to a platform they can't maintain
With ConnectOnion
- Day 1: wrap their existing functions as tools — agent runs
- Day 2: @xray every decision, fix the edge cases live
- Day 3: swap in the customer's own model, ship to prod
- Hand-off: plain Python they own and can extend themselves
The community
Not a project someone abandoned.
Shipped for a year, in the open, at a pace you can check yourself. Every number below is one you can verify without asking us.
- downloads from PyPI
- 82,361downloads from PyPI10,548 of them in the last 30 days
- stars on GitHub
- 1,189stars on GitHub166 forks
- releases in the first year
- 118releases in the first yearroughly one every three days
- Read the sourceopenonion/connectonion
- Ask in DiscordWhere questions actually get answered
- Install itpip install connectonion
Download and repository figures as of July 2026.
Questions from the field
Your next deployment ships this week.
Install it, point it at the customer's systems, and watch the agent work. Three lines is all it takes to start.