Skip to main content

pycelest — AI Agent Framework

Build · Orchestrate · Defend · Connect A production-ready Python framework for safe, capable, and observable AI agents.

PyPI version Python 3.11+ License


What is pycelest?

pycelest is a Python framework for building AI agents that are safe, capable, and observable — designed from day one for production deployment, not just demos.

Unlike frameworks that bolt guardrails on as an afterthought, pycelest puts security, traceability, and reliability at the center of its architecture.


Features

Feature Description
🔁 ReAct Loop Native Reasoning + Acting loop
🌐 Multi-Provider OpenAI · Anthropic · Google · Mistral · DeepSeek · Ollama · LM Studio
🧠 Memory STM · Scratchpad · RAG · automatic compression
🛡️ Guardrails Tool Firewall · Execution Budget · token limits
👥 Multi-Agent Native agent collaboration via AgentBus
📡 Streaming First-class async token streaming
🔌 Plugins Lifecycle hooks: on_session_start, on_turn_end, on_tool_call…
🔗 MCP Client MCPAdapter — consume any MCP server as agent tools
🖥️ MCP Server MCPServer — expose any agent as an MCP server (stdio / SSE)
📬 Native Connectors Gmail · Slack · Notion · Meta (Facebook + Instagram)
📊 Langfuse LangfusePlugin — full LLM observability out of the box
⚙️ YAML Config Code or YAML — your choice

Installation

# Core framework
pip install pycelest

# With providers
pip install pycelest[anthropic]   # Claude
pip install pycelest[openai]      # GPT-4o, Gemini, DeepSeek, Mistral, Grok

# Extras
pip install pycelest[mcp]         # MCP client + server
pip install pycelest[langfuse]    # Observability
pip install pycelest[gmail]       # Gmail connector
pip install pycelest[rag]         # ChromaDB RAG

# Everything
pip install pycelest[all]

Quick Start

import asyncio
from celest import SessionManager, SessionConfig
from celest.providers import AnthropicAdapter

config = SessionConfig(
    system_prompt="You are a helpful, careful AI agent.",
    max_iterations=8,
)

session = SessionManager(
    config=config,
    provider=AnthropicAdapter(model="claude-sonnet-4-6", api_key="sk-ant-..."),
)

result = asyncio.run(session.run("Plan a 3-day trip to Kyoto"))
print(result.response)

Local Models (no API key)

from celest.providers import OllamaAdapter

session = SessionManager(
    config=config,
    provider=OllamaAdapter(model="llama3.2"),
)

Install Ollama from ollama.com, then ollama pull llama3.2.


With Tools

from celest.tools import FunctionTool

@FunctionTool.register(description="Search the web for current information")
async def web_search(query: str) -> str:
    ...

session = SessionManager(config=config, provider=provider, tools=[web_search])
result = await session.run("What are the latest AI news?")

MCP Client — consume any MCP server

from celest.tools.mcp import MCPAdapter

# Stdio (local subprocess)
async with MCPAdapter(command="uvx", args=["mcp-server-time"]) as mcp:
    tools = await mcp.discover_tools()
    session = SessionManager(config=config, provider=provider, tools=tools)

# SSE (remote server) with auth + auto-reconnect
async with MCPAdapter(
    url="https://my-mcp-server.com/sse",
    headers={"Authorization": "Bearer sk-..."},
    auto_reconnect=True,
) as mcp:
    tools = await mcp.discover_tools()

MCP Server — expose your agent as an MCP server

from celest import SessionManager, SessionConfig, MCPServer
from celest.providers import AnthropicAdapter

def make_session():
    return SessionManager(
        config=SessionConfig(system_prompt="You are a helpful assistant."),
        provider=AnthropicAdapter(model="claude-sonnet-4-6", api_key="sk-ant-..."),
    )

server = MCPServer(session_factory=make_session, name="my-agent")
server.run_stdio()   # or server.run_sse(port=8080)

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "my-agent": {
      "command": "python",
      "args": ["my_agent.py"]
    }
  }
}

Native Connectors

from celest.connectors.native.gmail import GmailConnector
from celest.connectors.native.slack import SlackConnector
from celest.connectors.native.notion import NotionConnector

gmail = GmailConnector(access_token="ya29....")
tools = gmail.get_tools()   # gmail_send, gmail_read

slack = SlackConnector(bot_token="xoxb-...")
tools += slack.get_tools()  # slack_send, slack_read

session = SessionManager(config=config, provider=provider, tools=tools)

Observability with Langfuse

pip install pycelest[langfuse]
from celest.plugins.langfuse import LangfusePlugin

plugin = LangfusePlugin(
    public_key="pk-lf-...",
    secret_key="sk-lf-...",
    host="https://cloud.langfuse.com",
    agent_name="my-agent",
)

session = SessionManager(config=config, provider=provider, plugins=[plugin])
# Every run is now traced in Langfuse: turns, tool calls, tokens, latency

YAML Config

# celest.yaml
system_prompt: "You are a helpful AI agent"
max_iterations: 8
provider: anthropic
model: claude-sonnet-4-6
guardrails:
  tool_firewall: ask   # accept | deny | ask
session = SessionManager.from_yaml("celest.yaml")
result = await session.run("Your task here")

CLI

celest init                           # Generate starter celest.yaml
celest run celest.yaml "Your prompt"  # Run agent from config

Changelog

Version Highlights
v0.5.0 MCPServer (stdio + SSE) · MCPAdapter auto-reconnect + auth headers
v0.4.0 LangfusePlugin — full LLM observability
v0.3.0 Native connectors: Gmail · Slack · Notion · Meta
v0.2.0 Plugin system · AgentBus · Streaming · OpenTelemetry
v0.1.2 MCP client · RAG · Compression · YAML config

License

Proprietary © 2026 Lovanirainy Theogene Eddy Celestin RAFANOMEZANA — flycelest.com

Metadata

Release files for pycelest 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pycelest 1.0.0
File Size Uploaded Provenance Actions
pycelest-1.0.0.tar.gz 700.2 kB Without provenance Details for pycelest-1.0.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pycelest 1.0.0
File Interpreter ABI Platform Actions
pycelest-1.0.0-py3-none-any.whl Python 3 none any Details for pycelest-1.0.0-py3-none-any.whl

Total release size: 847.1 kB

Release files / pycelest-1.0.0.tar.gz

Download URL pycelest-1.0.0.tar.gz
Size 700.2 kB
Tags Source
SHA-256 checksum
How to use checksums
5057a96268439d54925179b1cdbaa3ffbee64d31bba99f602b1c62f60db94f24
BLAKE2b-256 checksum
How to use checksums
3c7baa961df0d1983cbc19b8cb05d5a78ce1fb69bc966c42875db09b1b73d8db
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.2

Release files / pycelest-1.0.0-py3-none-any.whl

Download URL pycelest-1.0.0-py3-none-any.whl
Size 146.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
61644d702352668b387adfac3262c25111c203ff2120d7ffac0b14c39d4ba413
BLAKE2b-256 checksum
How to use checksums
01b78c74c12a330007d541056aa95b001b946d824ae355ee37cec86b33674556
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.2

Security for pycelest 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page