π«π· Version franΓ§aise
Orkeon
AI agent teams that stay inside the lines β every file, endpoint and budget an agent may touch is declared, then enforced. Described in YAML, TypeScript (.ork.ts) or C#; one .NET runtime executes all three.
The problem
You let a coding agent loose on a repository. It reads what it needs, then writes β a file two directories up, a ~/.config it had no business in, a /tmp script it runs next. Nothing stopped it because nothing was there to stop it: the agent's tools called File.WriteAllText on whatever path the model produced.
Orkeon puts the boundary in front of the model, not behind it:
- A virtual file system. Agents only ever see virtual paths (
/workspace,/output); each one is a mount you declared, with the rights you gave it (ro/rw). A path outside a mount is refused before any byte lands on disk. - A sandbox for code, an execution budget for autonomy β tool calls, depth, wall time, tokens, spawned agents β and circuit breakers for loops. The agent runs out of permission before it runs out of ideas.
- A Roslyn analyzer for your own code.
Orkeon.Compliance.Vfsis a standalone NuGet package with no Orkeon dependency: add it to any C# project and every directSystem.IOcall is a compile error β the line an agent (or a colleague) would have slipped in does not build.
Around that boundary sits a complete agent-team framework: crews of agents with roles, goals and tools, six orchestration strategies (sequential, hierarchical, parallel, consensual, graph, autonomous), 16 LLM providers, memory, RAG, semantic code analysis β typed end to end, Clean Architecture, .NET 10.
Try it in two minutes β no API key
A local model, one agent, one writable mount. From a clone of this repository (git clone --depth 1 https://github.com/Orkeon/orkeon && cd orkeon), with Ollama installed and the .NET 10 SDK:
ollama pull qwen2.5:1.5b
dotnet tool install -g Orkeon.Scripting.Cli --prerelease
mkdir -p out && orkeon run examples/quickstart/crew.yaml --mount ./out:/output:rw
The agent writes ./out/hello.md β and only there: /output is the single mount, rw. Change the crew's task to write anywhere else and watch the file-system service refuse it. The block above is executed literally by CI on every change (Quickstart workflow): if it stops working, the build goes red before you find out. Everything about local models β Docker Model Runner, Ollama, a model baked into the container image β is in the local models guide.
Forge a team from a need
You do not have to write the crew. Describe the need; orkeon forge interviews you, drafts the team, renders it (YAML or .ork.ts), validates it, runs it in a sandbox, diagnoses the run and asks for your verdict β then promotes the result into your project when you say so:
orkeon init # once: pick a provider and a model (Ollama included)
orkeon forge "a team that triages the issues of a GitHub repository every morning"
orkeon forge list # every session on disk, resumable
orkeon forge promote <slug> --to ./crews # adopt the crew that passed
The cycle is brief β blueprint β render β validate β test β diagnose β verdict, with sessions you can resume, edit and re-test. It needs a configured model: without one it stops at the door with FORGE-LLM-UNAVAILABLE and points you to orkeon init. Walkthrough: Forge a team from a need.
Quick Start β one crew, three ways
The same crew, written at three levels of abstraction. Pick the one that fits β or mix them: they all run on the same .NET execution engine.
1. Declarative YAML β no code, no build: edit the file, run it again (crew.yaml):
name: "research-crew"
goal: "Research AI trends for 2026"
process: "sequential"
agents:
researcher:
role: "Researcher"
goal: "Find and summarize information about AI trends"
verbose: true
tasks:
research:
description: "Search for the latest AI developments and trends"
expectedOutput: "A comprehensive summary report"
agent: "researcher"
orkeon run crew.yaml
2. Programmatic TypeScript β scripting ergonomics (agent bodies, hooks, dynamic spawning, FSM/graph literals), .NET runtime underneath β and still no rebuild: scripts are transpiled on the fly (crew.ork.ts):
/// <reference orkeon-script="1.0" />
const researcher = agentBuilder()
.name("Researcher").role("Researcher")
.goal("Find and summarize information about AI trends")
.build();
const crew = crewBuilder()
.name("research-crew")
.goal("Research AI trends for 2026")
.withAgent(researcher)
.withTask({
description: "Search for the latest AI developments and trends",
expectedOutput: "A comprehensive summary report",
})
.build();
await crew.run();
orkeon run crew.ork.ts
3. Pure C# β the builder API embedded in your own application, strongly typed end-to-end:
using Orkeon.Domain.Agent;
using Orkeon.Domain.Crew;
var agent = new AgentBuilder()
.Role("Researcher")
.Goal("Find and summarize information about AI trends")
.Verbose()
.Build();
var crew = new CrewBuilder()
.Goal("Research AI trends for 2026")
.Sequential()
.WithAgent(agent)
.WithTask(t => t
.Description("Search for the latest AI developments and trends")
.ExpectedOutput("A comprehensive summary report"))
.Build();
// wire the host and kick it off β see docs/getting-started/bootstrap.md
No API key? Run everything on a model on your own machine (Docker Model Runner, Ollama, or a model embedded in the container image) β see the Local models guide. Full walkthroughs: Three ways to run Orkeon Β· Run your first example.
Installation
| You want to⦠| Do this | Details |
|---|---|---|
| Run crews with zero install | docker run -it --rm -e ORKEON_RUNNER=shell ghcr.io/orkeon/orkeon-runners β interactive shell, 105 bundled examples (orkeon-example run 1), local-model ready |
Container guide |
Install the orkeon CLI |
Windows and Debian/Ubuntu: the quickstarts below. macOS: the CLI tarball below (osx-arm64, osx-x64). linux-arm64 β and anyone who also wants the REPL or the service host β takes the multi-app orkeon-<version>-<rid>.tar.gz from the releases, then ./install.sh |
Release binaries |
| Embed Orkeon in your app | dotnet add package Orkeon --prerelease β the complete framework in one package. Optionally add Orkeon.Tools (the built-in tool families) and the opt-ins (Orkeon.Rag.Onnx, Orkeon.Tools.Embeddings.Local β the latter pins a pre-release upstream, SmartComponents.LocalEmbeddings, and will keep doing so past 1.0: see limitations) β see the publication matrix. The orkeon CLI tool and the container image above are unchanged |
Bootstrap and execution |
| Verify what you download | Every package and installer carries a GitHub-signed build provenance attestation and a SHA256SUMS line: gh attestation verify <file> --repo Orkeon/orkeon β no trust in this page required |
Verify what you install |
| Hack on the framework | git clone (without --recursive) + dotnet build Orkeon.sln |
From source Β· Contributing |
Clone without
--recursive. This repository declares private maintainer submodules: they are not available in a public clone. Nothing in the build, the tests or the contribution workflow needs them, and a failinggit submodule updateon those paths is expected and harmless β see CONTRIBUTING.md.
Windows β download orkeon-cli-<version>-win-x64.zip (or the .msi) from the releases; it is self-contained, no .NET needed:
# Verify the download first: every release ships a SHA256SUMS asset (SHA256SUMS.msi for the .msi)
(Get-FileHash orkeon-cli-<version>-win-x64.zip -Algorithm SHA256).Hash.ToLower()
Select-String -Path SHA256SUMS -Pattern 'win-x64\.zip' # the two hashes must match
Expand-Archive orkeon-cli-<version>-win-x64.zip -DestinationPath .; cd orkeon-cli-<version>-win-x64
.\install.ps1 # or: msiexec /i orkeon-<version>-win-x64.msi -- pick one channel, not both
orkeon init # in a NEW terminal: pick your LLM provider and model
orkeon run crew.yaml
Debian / Ubuntu β download orkeon_<version>_amd64.deb; self-contained too, no dotnet-runtime package pulled in:
# SHA256SUMS is a release asset too β download it alongside the .deb and check
grep " orkeon_<version>_amd64.deb$" SHA256SUMS | sha256sum --check # expect: OK
sudo apt install ./orkeon_<version>_amd64.deb
orkeon init # writes ~/.config/Orkeon/appsettings.json
orkeon run crew.yaml
macOS β Homebrew becomes the recommended route once the Orkeon/homebrew-tap repository ships with the first tagged release:
brew tap orkeon/tap && brew install orkeon # once the tap is published
orkeon init
orkeon run crew.yaml
Until then (and on any machine), the self-contained tarball β osx-arm64 for Apple Silicon, osx-x64 for Intel. install.sh clears the Gatekeeper quarantine attribute for you:
# The asset name carries the version, and GitHub's `latest/download/` shortcut skips
# prereleases β so resolve the newest tag first (or copy the asset link off the
# releases page, which is the same thing done by hand).
TAG=$(curl -fsSL https://api.github.com/repos/Orkeon/orkeon/releases | grep -m1 '"tag_name"' | cut -d'"' -f4)
VER=${TAG#v}; BASE=https://github.com/Orkeon/orkeon/releases/download/$TAG
curl -fsSL -O "$BASE/orkeon-cli-$VER-osx-arm64.tar.gz" # osx-x64 on Intel
curl -fsSL -O "$BASE/SHA256SUMS"
grep " orkeon-cli-$VER-osx-arm64.tar.gz$" SHA256SUMS | shasum -a 256 --check - # expect: OK
tar -xzf "orkeon-cli-$VER-osx-arm64.tar.gz" && cd "orkeon-cli-$VER-osx-arm64" && ./install.sh
orkeon init
orkeon doctor checks the install (runtime, config, LLM reachability, esbuild, grammars) whenever something looks off.
Features
Every number below is recomputed from the tree on each CI run β bash scripts/count-surface.sh prints them next to the rule that counts them, and a README that disagrees fails the build.
| Capability | Details |
|---|---|
| 79 built-in tools | File system, web scraping (AngleSharp), HTTP APIs, JSON/CSV/XML/PDF/Office (DOCX & XLSX read/write), databases, secure code execution, RAG and semantic search, EventHub messaging, RaggableTree code analysis, delegation/collaboration β see the tool inventory |
| 16 LLM providers | OpenAI, Ollama, Anthropic, Azure OpenAI, Mistral AI, DeepSeek, Kimi (Moonshot), Qwen, Together AI, HuggingFace, Z.AI (GLM), Google Gemini, Grok (x.AI) and MiniMax, plus two aggregators β OpenRouter (one key, a 445-model marketplace) and Mammouth AI (a subscription's included credits) β all HTTP-based, extending HttpLlmProviderBase; local models via Docker Model Runner, Ollama, or embedded llama.cpp β see the local models guide |
| Vision / multimodal | Image content flows end-to-end (MultiModalContent β Anthropic image blocks / OpenAI image_url) with a VFS-backed loader; opt-in via AddOrkeonMultiModal(...) β see the multimodal guide |
| 6 memory providers | Redis (vector search), SQLite, InMemory, ChromaDB (REST API v2), Pinecone, LanceDB (remote REST server) β one IMemoryProvider port, composable decorators |
| 6 orchestration strategies | Sequential, Hierarchical, Parallel, Consensual (Majority / SuperMajority / Unanimity / WeightedConsensus / BordaCount voting strategies), Graph (LangGraph-style), Autonomous (multi-dimensional execution budget) β see the process-type guide |
| Microsoft Agent Framework interop | Orkeon.Interop.AgentFramework: an Orkeon crew runs as a MAF AIAgent; a MAF AIAgent becomes the brain (WithAgentFrameworkAgent) or a tool (WithAgentFrameworkTool) of an Orkeon agent β see ADR-010 and examples/interop/agent-framework/ |
| .NET Aspire | Orkeon.Hosting.Aspire: AddOrkeonHost / AddOrkeonCrewRun put the daemon or a crew run in an AppHost; the runners honour OTEL_EXPORTER_OTLP_ENDPOINT, so the Aspire dashboard shows every invoke_agent / chat / execute_tool span, the token metrics and the logs β see ADR-011 and examples/aspire/AppHost/ |
| Plugin system | Drop-in assemblies implementing IOrkeonPlugin, discovered in a plugin directory, loaded in isolated collectible AssemblyLoadContexts, activated explicitly via AddOrkeonPlugins(...) β see plugins |
| Host bootstrap & scripting | Orkeon.Hosting (RunnerHost) wires the full stack for runners/CLIs (appsettings, VFS mounts, providers, tools); the orkeon dotnet tool runs TypeScript-syntax .ork.ts crew scripts |
| Source generators | Orkeon.Generators emits the [TypedDictionary] wrapper/builder plumbing, keeping the hand-written strongly typed APIs boilerplate-free |
| Typed pipeline architecture | ComponentBase<TRequest, TResponse> eliminates Dictionary<string, object> throughout the stack |
| YAML configuration | Full round-trip export/import for agents, tasks, crews, and tool schemas |
| Fluent Builder API | AgentBuilder, CrewBuilder, CrewTaskBuilder for ergonomic, discoverable construction |
| Clean Architecture | Strict Domain / Application / Infrastructure separation with no cross-layer leakage |
| CQRS pipeline | Commands and queries for all aggregates; ValidatingCommandHandler decorator; UnitOfWork integration |
| Semantic agent selection | Embedding-based similarity matching to route tasks to the most suitable agent |
| Checkpointing & resume | Execution state persisted to pluggable state stores (InMemory, JSON file, SQLite, PostgreSQL); CheckpointManager time-travel (fork, replay, diff) and ResumeEngine to resume interrupted runs |
| A2A communication | Agent-to-Agent protocol with discovery, A2AClient/A2AServer, a scoped agent repository over a shared registration store, and optional mTLS / auth-scheme enforcement (client certificate + server-side RequireMutualTls / AllowedAuthSchemes) |
| Opt-in subsystems | A2A, monitoring, tool rate-limiting, benchmarking, multimodal, kickoff hooks and more β none registered by default, each enabled via its dedicated AddOrkeonXxx() extension β see the opt-in reference |
Architecture
Orkeon follows Clean Architecture with three concentric layers:
+----------------------------------------------------------+
| Infrastructure (outer) |
| LLM providers, memory stores, tools, HTTP clients |
| |
| +------------------------------------------------+ |
| | Application (middle) | |
| | Use cases, orchestrators, service interfaces | |
| | | |
| | +----------------------------------------+ | |
| | | Domain (inner) | | |
| | | Agents, Crews, Tasks, Tools, LLMs | | |
| | | Pure business logic, one satellite of constants | | |
| | +----------------------------------------+ | |
| +------------------------------------------------+ |
+----------------------------------------------------------+
- Domain: Core entities and value objects (
Agent,Crew,CrewTask,IBaseTool,ILlmProvider). No external dependencies. - Application: Use cases and orchestration logic. Defines interfaces (ports) implemented by Infrastructure.
- Infrastructure: LLM providers, memory stores, tool implementations, and all external integrations.
Around the core, dedicated projects cover hosting (Orkeon.Hosting, plus the orkeon-host service daemon of Orkeon.Host and the orkeon run --events jsonl run event bus), plugins (Orkeon.Plugins), Roslyn source generators (Orkeon.Generators), the VFS-compliance analyzer (Orkeon.Compliance.Vfs β a standalone NuGet package with no Orkeon dependency: <PackageReference Include="Orkeon.Compliance.Vfs" PrivateAssets="all" /> makes direct System.IO a compile error in any C# project), the TypeScript-syntax scripting DSL (Orkeon.Scripting plus the orkeon CLI tool), the tool families (Orkeon.Tools.*, shipped together as the Orkeon.Tools package), and the RaggableTree semantic code-analysis engine (Orkeon.Analysis, shipped inside the Orkeon package).
Documentation
| You are looking for⦠| Go to |
|---|---|
| First run, step by step | Getting-started overview Β· Run your first example |
| The three ways to run Orkeon (source / binary / container) | Three ways to run Orkeon |
| Local models (Docker Model Runner, Ollama, embedded, 128K contexts) | Local models guide |
The 105 runnable examples (9 themed categories + orkeon-example) |
Examples Β· Catalog |
| Writing crews: YAML, builders, TypeScript, host wiring, execution | YAML & builders Β· Write a crew in TypeScript Β· Bootstrap and execution |
| Orchestration modes (incl. FSM and graph deep dives) | Process types Β· FSM Β· Graph |
| Writing your own tools | New tool pattern Β· Tool inventory |
| Architecture deep dives (plugins, scripting, VFS, security, RaggableTree) | Architecture docs Β· ADRs |
| Everything else | Documentation index (also available in French) |
These pages, together with the generated API reference, are published as a browsable site
at https://orkeon.github.io/orkeon/. docs.yml deploys it on every v* tag, so the site goes
live with the first tagged release and always documents a tagged version.
Why Orkeon?
- Three authoring surfaces, one engine β the same crew can be a YAML file an analyst edits, a TypeScript script a developer iterates on (both run with zero rebuild), or C# embedded in your product. No rewrite when you graduate from one to the next.
- Orchestration beyond pipelines β six strategies, including LangGraph-style state graphs with conditional edges and a fully autonomous mode where agents delegate, spawn, and communicate under a multi-dimensional execution budget (tool calls, depth, wall time, tokens, spawns).
- Batteries included β 79 tools, 16 LLM providers, 6 memory stores, vision, RAG, code analysis: usable out of the box, replaceable through Clean Architecture ports.
- Local-first β every example runs against a model on your own machine (Docker Model Runner, Ollama, or llama.cpp embedded in the container image). No API key required to evaluate it.
- The boundary is the product β a rights-audited virtual filesystem in front of every file access, a Roslyn analyzer that refuses raw
System.IOin your own code, execution budgets and circuit breakers for autonomy, checkpoint and resume for long runs. Rate limiting, monitoring and the rest are oneAddOrkeonXxx()away. - Typed all the way down β no
Dictionary<string, object>plumbing; source generators keep the typed surface boilerplate-free.
Project Status
The current version is 1.0.0-rc.4 on .NET 10 β the V1 release candidate (src/Directory.Build.props is the single source of truth; the Release badge above and git tag say what is tagged). Recent milestones: the NuGet distribution consolidated into a single Orkeon package (plus Orkeon.Tools and a few opt-ins β see the publication matrix); the orkeon CLI and the orkeon-runners container image with 105 bundled examples and local-model workflows; FSM and Graph orchestration; the Autonomous process with execution budgets; the TypeScript scripting DSL; RaggableTree semantic code analysis (15 agent tools); the plugin system; checkpoint/resume; dual-era MCP client and server; A2A task persistence; a mechanically frozen public API surface; and the LLM provider fleet grown to 16 β fourteen vendors, each under real-execution campaign proof (latest arrivals: Google Gemini, Grok/x.AI, MiniMax), plus the two aggregators OpenRouter and Mammouth AI, integrated documentation-first and awaiting their first campaign.
Every pull request is gated in CI:
- the build compiles with
-warnaserrorand the full .NET analyzer set β any new compiler, analyzer, or NuGet-audit warning fails the build - the public API surface is frozen (Microsoft.CodeAnalysis.PublicApiAnalyzers; undeclared API changes are build errors)
- the unit and fast test suites (Integration/Slow suites run nightly in a dedicated workflow) and the EN/FR documentation parity gate; path-filtered gates add the examples linters on PRs touching
examples/, and a strict docfx build (--warningsAsErrors) on PRs touching sources or docs
Line coverage is measured in public. The Coverage workflow runs the unit and fast suites under dotnet-coverage on every push to main (and weekly): the figure is on each run's summary page, the Cobertura file and an HTML report are its coverage artefact. No number is quoted here β a number typed into a README is a claim, a run is a measurement. Static analysis runs on a local SonarQube via scripts/sonar-analyze.sh under the quality-gate policy; its reports are not tracked by the repository, so its figures are not quoted here either.
Known constraints are tracked in docs/reference/limitations.md. What happens if the project stops β MIT, a reproducible build, no private infrastructure, forkable by anyone β is written down in SUPPORT.md.
Contributing
Contributions are welcome. Please open an issue to discuss significant changes before submitting a pull request. Make sure the tests CI runs pass (dotnet test Orkeon.sln --filter "Category!=Integration&Category!=Slow" β CONTRIBUTING.md explains why the filter is not optional) and that new code follows the Clean Architecture conventions described in CONTRIBUTING.md.
Building from source
The scripting layer (.ork.ts support) ships a small esbuild toolchain that is bootstrapped on the first dotnet build. On a fresh clone the Orkeon.Scripting project runs npm ci (strictly from the committed tools/scripting-esbuild/package-lock.json, so the lockfile is never mutated) under tools/scripting-esbuild/ to provision node_modules/. This is a one-time, network-touching step per clone.
To skip it entirely (e.g. in CI or when packaging NuGet consumers that do not need esbuild), pass the opt-out flag:
dotnet build Orkeon.sln -p:SkipScriptingNpmInstall=true
If npm is unavailable the build still succeeds; esbuild is then resolved from PATH at runtime.
Community and support
- Getting help β SUPPORT.md names the venues: GitHub Discussions for questions and show-and-tell, the issue forms for bugs and feature requests. There is no Discord or Slack channel.
- Reporting a vulnerability β SECURITY.md. Never a public issue: use GitHub Private Vulnerability Reporting (repository β Security β Report a vulnerability).
- Community expectations β the Code of Conduct (Contributor Covenant 2.1) applies to every space of the project.
License
Orkeon is released under the MIT License.