Agent Kernel - Unified AI Agents Runtime
Project description
Agent Kernel
Agent Kernel is a lightweight runtime and adapter layer for building and running AI agents across multiple frameworks and running within a unified execution environment. Migrate your existing agents to Agent Kernel and instantly utilize pre-built execution and testing capabilities.
Features
- Unified API: Common abstractions (Agent, Runner, Session, Module, Runtime) across frameworks
- Multi-Framework Support: OpenAI Agents SDK, CrewAI, LangGraph, Google ADK
- Session Management: Built-in session abstraction for conversational state
- Flexible Deployment: Interactive CLI for local development and testing, AWS Lambda handler for serverless deployment, AWS ECS Fargate deployment
- Pluggable Architecture: Easy to extend with custom framework adapters
- MCP Server: Built-in Model Context Protocol server for exposing agents as MCP tools and exposing any custom tool
- A2A Server: Built-in Agent-to-Agent communication server for exposing agents with a simple configuration change
- REST API: Built-in REST API server for agent interaction
- Test Automation: Built-in test suite for testing agents
Installation
pip install agentkernel
Requirements:
- Python 3.12+
Quick Start
Basic Concepts
- Agent: Framework-specific agent wrapped by an Agent Kernel adapter
- Runner: Framework-specific execution strategy
- Session: Shared state across conversation turns
- Module: Container that registers agents with the Runtime
- Runtime: Global registry and orchestrator for agents
CrewAI Example
from crewai import Agent as CrewAgent
from agentkernel.cli import CLI
from agentkernel.crewai import CrewAIModule
general_agent = CrewAgent(
role="general",
goal="Agent for general questions",
backstory="You provide assistance with general queries. Give direct and short answers",
verbose=False,
)
math_agent = CrewAgent(
role="math",
goal="Specialist agent for math questions",
backstory="You provide help with math problems. Explain your reasoning at each step and include examples. \
If prompted for anything else you refuse to answer.",
verbose=False,
)
# Register agents with Agent Kernel
CrewAIModule([general_agent, math_agent])
if __name__ == "__main__":
CLI.main()
LangGraph Example
from langgraph.graph import StateGraph
from agentkernel.cli import CLI
from agentkernel.langgraph import LangGraphModule
# Build and compile your graph
sg = StateGraph(...)
compiled = sg.compile()
compiled.name = "assistant"
LangGraphModule([compiled])
if __name__ == "__main__":
CLI.main()
OpenAI Agents SDK Example
from agents import Agent as OpenAIAgent
from agentkernel.cli import CLI
from agentkernel.openai import OpenAIModule
general_agent = OpenAIAgent(
name="general",
handoff_description="Agent for general questions",
instructions="You provide assistance with general queries. Give short and direct answers.",
)
OpenAIModule([general_agent])
if __name__ == "__main__":
CLI.main()
Google ADK Example
from google.adk.agents import Agent
from agentkernel.cli import CLI
from agentkernel.adk import GoogleADKModule
from google.adk.models.lite_llm import LiteLlm
# Create Google ADK agents
math_agent = Agent(
name="math",
model=LiteLlm(model="openai/gpt-4o-mini"),
description="Specialist agent for math questions",
instruction="""
You provide help with math problems.
Explain your reasoning at each step and include examples.
If prompted for anything else you refuse to answer.
""",
)
GoogleADKModule([math_agent])
if __name__ == "__main__":
CLI.main()
Interactive CLI
Agent Kernel includes an interactive CLI for local development and testing.
Available Commands:
!h,!help— Show help!ld,!load <module_name>— Load a Python module containing agents!ls,!list— List registered agents!s,!select <agent_name>— Select an agent!n,!new— Start a new session!q,!quit— Exit
Usage:
python demo.py
Then interact with your agents:
(assistant) >> !load my_agents
(assistant) >> !select researcher
(researcher) >> What is the latest news on AI?
AWS Lambda Deployment
Deploy your agents as serverless functions using the built-in Lambda handler.
from openai import OpenAI
from agents import Agent as OpenAIAgent
from agentkernel.aws import Lambda
from agentkernel.openai import OpenAIModule
client = OpenAI()
assistant = OpenAIAgent(name="assistant")
OpenAIModule([assistant])
handler = Lambda.handler
Request Format:
{
"prompt": "Hello agent",
"agent": "assistant"
}
Response Format:
{
"result": "Agent response here"
}
Status Codes:
200— Success400— No agent available500— Unexpected error
Configuration
Agent Kernel can be configured via environment variables, .env files, or YAML/JSON configuration files.
Configuration Precedence
Values are loaded in the following order (highest precedence first):
- Environment variables (including variables from
.envfile) - Configuration file (YAML or JSON)
- Built-in defaults
Configuration File
By default, Agent Kernel looks for ./config.yaml in the current working directory.
Override the config file path:
export AK_CONFIG_PATH_OVERRIDE=config.json
# or
export AK_CONFIG_PATH_OVERRIDE=conf/agent-kernel.yaml
Supported formats: .yaml, .yml, .json
Configuration Options
Debug Mode
- Field:
debug - Type: boolean
- Default:
false - Description: Enable debug mode across the library
- Environment Variable:
AK_DEBUG
Session Store
Configure where agent sessions are stored.
- Field:
session.type - Type: string
- Options:
in_memory,redis - Default:
in_memory - Environment Variable:
AK_SESSION_TYPE
Redis Configuration
Required when session.type=redis:
-
URL
- Field:
session.redis.url - Default:
redis://localhost:6379 - Description: Redis connection URL. Use
rediss://for SSL - Environment Variable:
AK_SESSION_REDIS_URL
- Field:
-
TTL (Time to Live)
- Field:
session.redis.ttl - Default:
604800(7 days) - Description: Session TTL in seconds
- Environment Variable:
AK_SESSION_REDIS_TTL
- Field:
-
Key Prefix
- Field:
session.redis.prefix - Default:
ak:sessions: - Description: Key prefix for session storage
- Environment Variable:
AK_SESSION_REDIS_PREFIX
- Field:
API Configuration
Configure the REST API server (if using the API module).
-
Host
- Field:
api.host - Default:
0.0.0.0 - Environment Variable:
AK_API_HOST
- Field:
-
Port
- Field:
api.port - Default:
8000 - Environment Variable:
AK_API_PORT
- Field:
-
Enabled Routes
- Field:
api.enabled_routes.agents - Default:
true - Description: Enable agent interaction routes
- Environment Variable:
AK_API_ENABLED_ROUTES_AGENTS
- Field:
A2A (Agent-to-Agent) Configuration
-
Enabled
- Field:
a2a.enabled - Default:
false - Environment Variable:
AK_A2A_ENABLED
- Field:
-
Agents
- Field:
a2a.agents - Default:
["*"] - Description: List of agent names to enable A2A (use
["*"]for all) - Environment Variable:
AK_A2A_AGENTS(comma-separated)
- Field:
-
URL
- Field:
a2a.url - Default:
http://localhost:8000/a2a - Environment Variable:
AK_A2A_URL
- Field:
-
Task Store Type
- Field:
a2a.task_store_type - Options:
in_memory,redis - Default:
in_memory - Environment Variable:
AK_A2A_TASK_STORE_TYPE
- Field:
MCP (Model Context Protocol) Configuration
-
Enabled
- Field:
mcp.enabled - Default:
false - Environment Variable:
AK_MCP_ENABLED
- Field:
-
Expose Agents
- Field:
mcp.expose_agents - Default:
false - Description: Expose agents as MCP tools
- Environment Variable:
AK_MCP_EXPOSE_AGENTS
- Field:
-
Agents
- Field:
mcp.agents - Default:
["*"] - Description: List of agent names to expose as MCP tools
- Environment Variable:
AK_MCP_AGENTS(comma-separated)
- Field:
-
URL
- Field:
mcp.url - Default:
http://localhost:8000/mcp - Environment Variable:
AK_MCP_URL
- Field:
Configuration Examples
Environment Variables
Use the AK_ prefix and underscores for nested fields:
export AK_DEBUG=true
export AK_SESSION_TYPE=redis
export AK_SESSION_REDIS_URL=redis://localhost:6379
export AK_SESSION_REDIS_TTL=604800
export AK_SESSION_REDIS_PREFIX=ak:sessions:
export AK_API_HOST=0.0.0.0
export AK_API_PORT=8000
export AK_A2A_ENABLED=true
export AK_MCP_ENABLED=false
.env File
Create a .env file in your working directory:
AK_DEBUG=false
AK_SESSION_TYPE=redis
AK_SESSION_REDIS_URL=rediss://my-redis:6379
AK_SESSION_REDIS_TTL=1209600
AK_SESSION_REDIS_PREFIX=ak:prod:sessions:
AK_API_HOST=0.0.0.0
AK_API_PORT=8080
AK_A2A_ENABLED=true
AK_A2A_URL=http://localhost:8080/a2a
config.yaml
debug: false
session:
type: redis
redis:
url: redis://localhost:6379
ttl: 604800
prefix: "ak:sessions:"
api:
host: 0.0.0.0
port: 8000
enabled_routes:
agents: true
a2a:
enabled: true
agents: ["*"]
url: http://localhost:8000/a2a
task_store_type: in_memory
mcp:
enabled: false
expose_agents: false
agents: ["*"]
url: http://localhost:8000/mcp
config.json
{
"debug": false,
"session": {
"type": "redis",
"redis": {
"url": "redis://localhost:6379",
"ttl": 604800,
"prefix": "ak:sessions:"
}
},
"api": {
"host": "0.0.0.0",
"port": 8000,
"enabled_routes": {
"agents": true
}
},
"a2a": {
"enabled": true,
"agents": ["*"],
"url": "http://localhost:8000/a2a",
"task_store_type": "in_memory"
},
"mcp": {
"enabled": false,
"expose_agents": false,
"agents": ["*"],
"url": "http://localhost:8000/mcp"
}
}
Configuration Notes
- Empty environment variables are ignored
- Unknown fields in files or environment variables are ignored
- Environment variables override configuration file values
- Configuration file values override built-in defaults
- Nested fields use underscore (
_) delimiter in environment variables
Extensibility
Custom Framework Adapters
To add support for a new framework:
- Implement a
Runnerclass for your framework - Create an
Agentwrapper class - Create a
Moduleclass that registers agents with the Runtime
Example structure:
from agentkernel.core import Agent, Runner, Module
class MyFrameworkRunner(Runner):
def run(self, agent, prompt, session):
# Implement framework-specific execution
pass
class MyFrameworkAgent(Agent):
def __init__(self, native_agent):
self.native_agent = native_agent
self.runner = MyFrameworkRunner()
class MyFrameworkModule(Module):
def __init__(self, agents):
super().__init__()
for agent in agents:
wrapped = MyFrameworkAgent(agent)
self.register(wrapped)
Session Management
Sessions maintain state across agent interactions. Framework adapters manage their own session storage within the Session object using namespaced keys:
"crewai"— CrewAI session data"langgraph"— LangGraph session data"openai"— OpenAI Agents SDK session data"adk"— Google ADK session data
Access the session in your runner:
def run(self, agent, prompt, session):
# Get framework-specific data
my_data = session.get("my_framework", {})
# Process and update data
my_data["last_prompt"] = prompt
# Update session
session.set("my_framework", my_data)
Development
Requirements:
- Python 3.12+
- uv 0.8.0+ (recommended) or pip
Setup:
git clone https://github.com/yaalalabs/agent-kernel.git
cd agent-kernel/ak-py
uv sync # or: pip install -e ".[dev]"
Run Tests:
uv run pytest
# or: pytest
Code Quality:
The project uses:
black— Code formattingisort— Import sortingmypy— Type checking
License
MIT License - see LICENSE file for details.
Support
- Issues: GitHub Issues
- Documentation: Full Documentation
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agentkernel-0.2.0b1.tar.gz.
File metadata
- Download URL: agentkernel-0.2.0b1.tar.gz
- Upload date:
- Size: 25.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1444510b90a73ffb62e65ad7adecfb3d02460f57406248103746a3a63a1fa30
|
|
| MD5 |
6efc9158fe7516a77631480884d79d32
|
|
| BLAKE2b-256 |
1951263339154d4621ef0fd5402d0fe045123c6a40bfe19396bbfeeb4b3f1b08
|
Provenance
The following attestation bundles were made for agentkernel-0.2.0b1.tar.gz:
Publisher:
publish.yaml on yaalalabs/agent-kernel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentkernel-0.2.0b1.tar.gz -
Subject digest:
f1444510b90a73ffb62e65ad7adecfb3d02460f57406248103746a3a63a1fa30 - Sigstore transparency entry: 637605928
- Sigstore integration time:
-
Permalink:
yaalalabs/agent-kernel@891a0f3f4ea5b79c0faa67267bb9d83c5f2f54f3 -
Branch / Tag:
refs/heads/develop - Owner: https://github.com/yaalalabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@891a0f3f4ea5b79c0faa67267bb9d83c5f2f54f3 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file agentkernel-0.2.0b1-py3-none-any.whl.
File metadata
- Download URL: agentkernel-0.2.0b1-py3-none-any.whl
- Upload date:
- Size: 40.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eaa5900806715b802828bf25c07b9200cddd3b46d286fc980d8ef6018a762d67
|
|
| MD5 |
f848795bf3d1211b3147ba444fecd8de
|
|
| BLAKE2b-256 |
d19d00f3ae4eae67a7f0da068d35427116ed0c3376fc35549b55d87d6baff7fc
|
Provenance
The following attestation bundles were made for agentkernel-0.2.0b1-py3-none-any.whl:
Publisher:
publish.yaml on yaalalabs/agent-kernel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentkernel-0.2.0b1-py3-none-any.whl -
Subject digest:
eaa5900806715b802828bf25c07b9200cddd3b46d286fc980d8ef6018a762d67 - Sigstore transparency entry: 637605930
- Sigstore integration time:
-
Permalink:
yaalalabs/agent-kernel@891a0f3f4ea5b79c0faa67267bb9d83c5f2f54f3 -
Branch / Tag:
refs/heads/develop - Owner: https://github.com/yaalalabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@891a0f3f4ea5b79c0faa67267bb9d83c5f2f54f3 -
Trigger Event:
workflow_dispatch
-
Statement type: