English | FranΓ§ais | EspaΓ±ol | δΈζ | Ψ§ΩΨΉΨ±Ψ¨ΩΨ©
Self-hosted. Open source. No vendor lock-in.
Cloud Β· Try the demos Β· Quickstart Β· Docs Β· Discord Β· Book a demo
β If you find this useful, please star the repo. It helps others discover the project.
Idun Agent Platform is an open-source, self-hosted production wrapper for LangGraph and Google ADK agents. pip install idun-agent-engine and your agent runs as a FastAPI process with built-in chat UI, admin panel, traces, observability, guardrails, memory persistence, MCP tool governance, and prompt management.
Why Idun? Teams building agents face a tradeoff: build the production wrapper yourself (FastAPI + traces + guardrails + admin UI β slow), or adopt a SaaS like LangGraph Cloud or LangSmith (sovereignty trade-off). Idun is the third path: pip install a self-sufficient FastAPI process that bundles your agent with chat UI, admin, traces, and guardrails β all open source, all on your infrastructure.
Prerequisites: Python 3.12 or 3.13.
Create a new directory and install the engine:
mkdir my-agent && cd my-agent
pip install idun-agent-engine langgraph langchain-google-genaiSave the three files below inside my-agent/.
my-agent/agent.py
from typing import Annotated, TypedDict
from idun_agent_engine.mcp import get_langchain_tools_sync
from langchain_google_genai import ChatGoogleGenerativeAI
from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
class State(TypedDict):
messages: Annotated[list, add_messages]
tools = get_langchain_tools_sync()
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash").bind_tools(tools)
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
graph = StateGraph(State)
graph.add_node("chatbot", chatbot)
graph.add_node("tools", ToolNode(tools))
graph.add_edge(START, "chatbot")
graph.add_conditional_edges("chatbot", tools_condition)
graph.add_edge("tools", "chatbot")my-agent/config.yaml
server:
api:
port: 8000
agent:
type: LANGGRAPH
config:
name: "my-agent"
graph_definition: "./agent.py:graph"
checkpointer:
type: sqlite
db_url: "sqlite:///conversations.db"
mcp_servers:
- name: idun-docs
transport: streamable_http
url: https://docs.idun-group.com/mcpmy-agent/.env β get a Gemini key at aistudio.google.com/apikey:
GEMINI_API_KEY=your-key-here
From inside my-agent/, run:
idun init
graph_definition: "./agent.py:graph"is resolved against the directory where you runidun init. Stay insidemy-agent/when you launch it, or use an absolute path.
A browser opens at http://localhost:8000 for the chat UI. The agent already has tools from the Idun docs MCP wired in. Visit /admin to configure more MCP servers, managed prompts, guardrails, observability, messaging integrations, and SSO. Visit /admin/traces for the trace store.
What
pip install idun-agent-enginedeliversA single wheel that bundles three Python packages:
idun_agent_engineβ the engine SDK (FastAPI app factory, MCP registry, observability, guardrails).idun_agent_standaloneβ theidunCLI, the admin REST API, and the chat / admin / traces UIs.idun_agent_schemaβ the Pydantic config schemas.The
iduncommand on your$PATH(setup,serve,init,hash-password,agent serve) is provided by the bundled standalone β it is not a separately published package. You won't seeidun-agent-standalonein the engine's declared PyPI dependencies because it ships co-installed inside the wheel, not as a transitive dep.See docs.idun-group.com/architecture for the full layering.
Note
AG-UI streaming β Every agent gets a standards-based streaming API, compatible with CopilotKit clients. Built-in chat playground for testing.
Idun ships as one process: idun-agent-standalone. It bundles the engine SDK, a Next.js chat UI, an admin panel, and a traces viewer β your agent runs inside this process, configured from a YAML file and re-loaded live from the admin REST.
flowchart LR
subgraph Idun["idun-agent-standalone (one process)"]
direction TB
UI["Chat UI / Admin / Traces"] --> ENG["Engine SDK"]
ENG --> DB[(Postgres / SQLite)]
end
Users --> UI
Admin --> UI
ENG --> Agent["Your LangGraph / ADK agent"]
Agent --> LLM["LLMs / MCP / tools"]
Note
Framework support β LangGraph and Google ADK are first-class today, with full adapters in the engine. LangChain is supported via the LangGraph adapter; broader native LangChain compatibility is on the roadmap.
| Idun Engine | LangGraph Cloud | LangSmith | DIY (FastAPI + glue) | |
|---|---|---|---|---|
| Self-hosted / on-prem | β | β | β | β |
| Multi-framework (LangGraph + ADK) | β | LangGraph only | β obs only | Manual |
| Guardrails (15+ built-in) | β | β | β | Build yourself |
| MCP tool governance | β per-agent | β | β | Build yourself |
| Observability (multi-provider) | β Langfuse, Phoenix, LangSmith, GCP | β LangSmith only | β LangSmith only | Manual |
| Memory / checkpointing | β Postgres, SQLite, in-memory | β | β | Build yourself |
| AG-UI / CopilotKit streaming | β | β | β | Manual |
| Open source (GPLv3) | β | β | β | β |
Note
Idun is not a replacement for LangSmith (observability) or LangGraph Cloud (hosting). It is the layer between your agent code and production that handles governance, security, and operations, regardless of which observability or hosting you choose.
After pip install idun-agent-engine, your $PATH and site-packages contain:
| Module | Distributed via | Purpose |
|---|---|---|
idun_agent_engine |
declared in requires_dist |
FastAPI app factory, MCP registry, observability, guardrails wiring |
idun_agent_schema |
declared in requires_dist |
Pydantic config models for config.yaml |
idun_agent_standalone |
co-bundled in the engine wheel | idun CLI, admin REST under /admin/api/v1/, chat / admin / traces UIs at /, /admin/, /admin/traces/ |
idun (console script) |
[project.scripts] idun = "idun_agent_standalone.cli:main" |
Subcommands: setup, serve, init, hash-password, agent serve |
The bundled-install model means you do not need to pip install idun-agent-standalone separately β it isn't published. To verify your install carries everything:
python -c "import idun_agent_engine, idun_agent_standalone, idun_agent_schema; print('all 3 modules importable')"
idun --helpBoth checks are smoke-tested in the release pipeline before any wheel is published.
Heads up: both pypi.org and test.pypi.org JSON APIs report entry_points: null and omit idun-agent-standalone from requires_dist. This is a Warehouse rendering quirk β the wheel itself still wires the idun console script and bundles standalone. The smoke-test commands above are the canonical way to verify a healthy install.
Every agent is configured through a single YAML file. Here is a complete example with all features enabled:
server:
api:
port: 8001
agent:
type: "LANGGRAPH"
config:
name: "Support Agent"
graph_definition: "./agent.py:graph"
checkpointer:
type: "sqlite"
db_url: "sqlite:///checkpoints.db"
observability:
- provider: "LANGFUSE"
enabled: true
config:
host: "https://cloud.langfuse.com"
public_key: "${LANGFUSE_PUBLIC_KEY}"
secret_key: "${LANGFUSE_SECRET_KEY}"
guardrails:
input:
- config_id: "DETECT_PII"
on_fail: "reject"
reject_message: "Request contains personal information."
output:
- config_id: "TOXIC_LANGUAGE"
on_fail: "reject"
mcp_servers:
- name: "time"
transport: "stdio"
command: "docker"
args: ["run", "-i", "--rm", "mcp/time"]
prompts:
- prompt_id: "system-prompt"
version: 1
content: "You are a support agent for {{ company_name }}."
tags: ["latest"]Tip
Environment variables like ${LANGFUSE_SECRET_KEY} are resolved at startup. You can use .env files or inject them through Docker/Kubernetes.
Serve the engine directly from a YAML file (no admin UI, just the agent endpoints):
idun agent serve --source file --path config.yamlImportant
Full config reference: docs.idun-group.com/configuration
9 runnable agent examples: idun-agent-template
| Questions and help | Discord |
| Feature requests | GitHub Discussions |
| Bug reports | GitHub Issues |
| Contributing | CONTRIBUTING.md |
| Roadmap | ROADMAP.md |
Maintained by Idun Group. We help with platform architecture, deployment, and IdP/compliance integration. Book a call Β· contact@idun-group.com
Minimal, anonymous usage metrics + masked session replay via PostHog. No message content, no PII beyond email after sign-in (set IDUN_TELEMETRY_IDENTIFY_USERS=false to disable). View source. Off: IDUN_TELEMETRY_ENABLED=false. Replay-only off: IDUN_TELEMETRY_SESSION_REPLAY=false.



















