Skip to main content

Python SDK and runtime to serve AI agents with FastAPI, LangGraph, and observability.

Project description

Idun Agent Engine

Turn any LangGraph-based agent into a production-grade API in minutes.

Idun Agent Engine is a lightweight runtime and SDK that wraps your agent with a FastAPI server, adds streaming, structured responses, config validation, and optional observability — with zero boilerplate. Use a YAML file or a fluent builder to configure and run.

Installation

pip install idun-agent-engine
  • Requires Python 3.12+
  • Ships with FastAPI, Uvicorn, LangGraph, SQLite checkpointing, and optional observability hooks

Quickstart

1) Minimal one-liner (from a YAML config)

from idun_agent_engine.core.server_runner import run_server_from_config

run_server_from_config("config.yaml")

Example config.yaml:

server:
  api:
    port: 8000

agent:
  type: "langgraph"
  config:
    name: "My Example LangGraph Agent"
    graph_definition: "./examples/01_basic_config_file/example_agent.py:app"
    # Optional: conversation persistence
    checkpointer:
      type: "sqlite"
      db_url: "sqlite:///example_checkpoint.db"
    # Optional: provider-agnostic observability
    observability:
      provider: langfuse   # or phoenix
      enabled: true
      options:
        host: ${LANGFUSE_HOST}
        public_key: ${LANGFUSE_PUBLIC_KEY}
        secret_key: ${LANGFUSE_SECRET_KEY}
        run_name: "idun-langgraph-run"

Run and open docs at http://localhost:8000/docs.

2) Programmatic setup with the fluent builder

from pathlib import Path
from idun_agent_engine import ConfigBuilder, create_app, run_server

config = (
    ConfigBuilder()
    .with_api_port(8000)
    .with_langgraph_agent(
        name="Programmatic Example Agent",
        graph_definition=str(Path("./examples/02_programmatic_config/smart_agent.py:app")),
        sqlite_checkpointer="programmatic_example.db",
    )
    .build()
)

app = create_app(engine_config=config)
run_server(app, reload=True)

Endpoints

All servers expose these by default:

  • POST /agent/invoke: single request/response
  • POST /agent/stream: server-sent events stream of ag-ui protocol events
  • GET /health: service health with engine version
  • GET /: root landing with links

Invoke example:

curl -X POST "http://localhost:8000/agent/invoke" \
  -H "Content-Type: application/json" \
  -d '{"query": "Hello!", "session_id": "user-123"}'

Stream example:

curl -N -X POST "http://localhost:8000/agent/stream" \
  -H "Content-Type: application/json" \
  -d '{"query": "Tell me a story", "session_id": "user-123"}'

LangGraph integration

Point the engine to a StateGraph variable in your file using graph_definition:

# examples/01_basic_config_file/example_agent.py
import operator
from typing import Annotated, TypedDict
from langgraph.graph import END, StateGraph

class AgentState(TypedDict):
    messages: Annotated[list, operator.add]

def greeting_node(state):
    user_message = state["messages"][-1] if state["messages"] else ""
    return {"messages": [("ai", f"Hello! You said: '{user_message}'")]}

graph = StateGraph(AgentState)
graph.add_node("greet", greeting_node)
graph.set_entry_point("greet")
graph.add_edge("greet", END)

# This variable name is referenced by graph_definition
app = graph

Then reference it in config:

agent:
  type: "langgraph"
  config:
    graph_definition: "./examples/01_basic_config_file/example_agent.py:app"

Behind the scenes, the engine:

  • Validates config with Pydantic models
  • Loads your StateGraph from disk
  • Optionally wires a SQLite checkpointer via langgraph.checkpoint.sqlite
  • Exposes invoke and stream endpoints
  • Bridges LangGraph events to ag-ui stream events

Observability (optional)

Enable provider-agnostic observability via the observability block in your agent config. Today supports Langfuse and Arize Phoenix (OpenInference) patterns; more coming soon.

agent:
  type: "langgraph"
  config:
    observability:
      provider: langfuse   # or phoenix
      enabled: true
      options:
        host: ${LANGFUSE_HOST}
        public_key: ${LANGFUSE_PUBLIC_KEY}
        secret_key: ${LANGFUSE_SECRET_KEY}
        run_name: "idun-langgraph-run"

Configuration reference

  • server.api.port (int): HTTP port (default 8000)
  • agent.type (enum): currently langgraph (CrewAI placeholder exists but not implemented)
  • agent.config.name (str): human-readable name
  • agent.config.graph_definition (str): absolute or relative path/to/file.py:variable
  • agent.config.checkpointer (sqlite): { type: "sqlite", db_url: "sqlite:///file.db" }
  • agent.config.observability (optional): provider options as shown above
  • mcp_servers (list, optional): collection of MCP servers that should be available to your agent runtime. Each entry matches the fields supported by langchain-mcp-adapters (name, transport, url/command, headers, etc.).

Config can be sourced by:

  • engine_config (preferred): pass a validated EngineConfig to create_app
  • config_dict: dict validated at runtime
  • config_path: path to YAML; defaults to config.yaml

MCP Servers

You can mount MCP servers directly in your engine config. The engine will automatically create a MultiServerMCPClient and expose it on app.state.mcp_registry.

mcp_servers:
  - name: "math"
    transport: "stdio"
    command: "python"
    args:
      - "/path/to/math_server.py"
  - name: "weather"
    transport: "streamable_http"
    url: "http://localhost:8000/mcp"

Inside your FastAPI dependencies or handlers:

from idun_agent_engine.server.dependencies import get_mcp_registry

@router.get("/mcp/{server}/tools")
async def list_tools(server: str, registry = Depends(get_mcp_registry)):
    return await registry.get_tools(server)

Or outside of FastAPI:

from langchain_mcp_adapters.tools import load_mcp_tools

registry = app.state.mcp_registry
async with registry.get_session("math") as session:
    tools = await load_mcp_tools(session)

Examples

The examples/ folder contains complete projects:

  • 01_basic_config_file: YAML config + simple agent
  • 02_programmatic_config: ConfigBuilder usage and advanced flows
  • 03_minimal_setup: one-line server from config

Run any example with Python 3.13 installed.

CLI and runtime helpers

Top-level imports for convenience:

from idun_agent_engine import (
  create_app,
  run_server,
  run_server_from_config,
  run_server_from_builder,
  ConfigBuilder,
)
  • create_app(...) builds the FastAPI app and registers routes
  • run_server(app, ...) runs with Uvicorn
  • run_server_from_config(path, ...) loads config, builds app, and runs
  • run_server_from_builder(builder, ...) builds from a builder and runs

Production notes

  • Use a process manager (e.g., multiple Uvicorn workers behind a gateway). Note: reload=True is for development and incompatible with multi-worker mode.
  • Mount behind a reverse proxy and enable TLS where appropriate.
  • Persist conversations using the SQLite checkpointer in production or replace with a custom checkpointer when available.

Roadmap

  • CrewAI adapter (placeholder exists, not yet implemented)
  • Additional stores and checkpointers
  • First-class CLI for idun commands

Contributing

Issues and PRs are welcome. See the repository:

  • Repo: https://github.com/Idun-Group/idun-agent-platform
  • Package path: libs/idun_agent_engine
  • Open an issue: https://github.com/Idun-Group/idun-agent-platform/issues

Run locally:

cd libs/idun_agent_engine
poetry install
poetry run pytest -q

License

MIT — see LICENSE in the repo root.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

idun_agent_engine-0.4.1.tar.gz (65.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

idun_agent_engine-0.4.1-py3-none-any.whl (96.1 kB view details)

Uploaded Python 3

File details

Details for the file idun_agent_engine-0.4.1.tar.gz.

File metadata

  • Download URL: idun_agent_engine-0.4.1.tar.gz
  • Upload date:
  • Size: 65.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for idun_agent_engine-0.4.1.tar.gz
Algorithm Hash digest
SHA256 7f35e544fc62c063baab2b1968277efa4292802f548783720a63d0e2e45fa984
MD5 c27c08e89db18513216dfe649a59857c
BLAKE2b-256 e247995a054adf4e8451c442ea0b1e2bd601fddde0e920fd50bbe15d668286d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for idun_agent_engine-0.4.1.tar.gz:

Publisher: release.yml on Idun-Group/idun-agent-platform

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file idun_agent_engine-0.4.1-py3-none-any.whl.

File metadata

File hashes

Hashes for idun_agent_engine-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 73b6b96e55d007a36425c1f0d04b60a876a53a0212f81680f897b4a3008c84e7
MD5 06482b9e4d3d55ecd1e7aaff05d067c0
BLAKE2b-256 ea44121dcc3c4e6fce4f5eff7795882d5b3e3895c4664e44d9faaceffb703ae7

See more details on using hashes here.

Provenance

The following attestation bundles were made for idun_agent_engine-0.4.1-py3-none-any.whl:

Publisher: release.yml on Idun-Group/idun-agent-platform

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page