Skip to main content

A meta-framework for building agentic workflows with Pydantic AI

Project description

pygentic-ai

A meta-framework for building agentic workflows with Pydantic AI.

โš ๏ธ Early Alpha: This library is in active development. The API is subject to change as we refine the framework based on feedback and real-world usage.

Installation

pip install pygentic-ai

Or with uv:

uv add pygentic-ai

Quick Start

Build your first agentic workflow in 4 steps:

Step 1: Create Configuration

from dataclasses import dataclass

@dataclass
class AppConfig:
    api_key: str
    model: str = "gpt-4o-mini"
    language: str = "english"

Step 2: Build Agent Factory

Create a factory to configure your agents:

from pydantic_ai import UsageLimits
from pygentic_ai import AgentManager
from pygentic_ai.engines import ReasoningAgent, GuardrailsAgent, SimpleTranslatorWorker

class AgentFactory:
    @staticmethod
    async def create_manager(config: AppConfig) -> AgentManager:
        manager = AgentManager()

        # Configure usage limits
        usage_limits = UsageLimits(output_tokens_limit=2000)

        # Register agents
        manager.register(
            "agent",
            ReasoningAgent,
            api_key=config.api_key,
            llm_model=config.model,
            language=config.language,
            usage_limits=usage_limits,
        )

        manager.register(
            "guardrails",
            GuardrailsAgent,
            api_key=config.api_key,
            llm_model=config.model,
        )

        manager.register(
            "translator",
            SimpleTranslatorWorker,
            api_key=config.api_key,
            target_language=config.language,
        )

        # Initialize all agents
        await manager.initialize()
        return manager

Step 3: Set Up Workflow

Use the pre-built workflow:

from pygentic_ai import user_assistant_graph

# Run workflow - manager.to_deps() automatically includes all registered agents
result = await user_assistant_graph.run(
    {"message": "Hello!"},
    manager.to_deps(chat_history=[])
)
print(result)

Step 4: Put It All Together

Complete application:

import asyncio
from dataclasses import dataclass
from pydantic_ai import UsageLimits
from pygentic_ai import AgentManager, user_assistant_graph
from pygentic_ai.engines import ReasoningAgent, GuardrailsAgent, SimpleTranslatorWorker

@dataclass
class AppConfig:
    api_key: str
    model: str = "gpt-4o-mini"
    language: str = "english"

class AgentFactory:
    @staticmethod
    async def create_manager(config: AppConfig) -> AgentManager:
        manager = AgentManager()
        usage_limits = UsageLimits(output_tokens_limit=2000)

        manager.register("agent", ReasoningAgent, api_key=config.api_key,
                        llm_model=config.model, usage_limits=usage_limits)
        manager.register("guardrails", GuardrailsAgent, api_key=config.api_key)
        manager.register("translator", SimpleTranslatorWorker, api_key=config.api_key)

        await manager.initialize()
        return manager

async def main():
    config = AppConfig(api_key="sk-...")
    manager = await AgentFactory.create_manager(config)

    # Use workflow
    result = await user_assistant_graph.run(
        {"message": "Hello!"},
        manager.to_deps(chat_history=[])
    )
    print(result)

    # Or use agent directly
    agent = manager.get("agent")
    result = await agent.generate_response("What's the weather?", [])
    print(result.output)

if __name__ == "__main__":
    asyncio.run(main())

Complete working example: examples/simple-chat

Advanced Usage

Custom Agents

from pygentic_ai import BaseAgent

class MyCustomAgent(BaseAgent):
    def __init__(self, **kwargs):
        super().__init__(
            llm_vendor="openai",
            llm_model="gpt-4o",
            instructions="You are a helpful assistant.",
            **kwargs
        )

Custom Workflow with Pydantic Graph

Build your own workflow by composing nodes:

from pydantic_graph import Graph
from pygentic_ai.workflows.nodes import StartNode, GenerateNode, GuardrailsNode

# Define custom workflow
my_workflow = Graph(
    nodes=(StartNode, GenerateNode, GuardrailsNode),
    name="MyWorkflow"
)

# Execute with manager.to_deps()
result = await my_workflow.run(
    {"message": "Hello"},
    manager.to_deps(chat_history=[])
)

Adding Custom Tools

from pygentic_ai.tools import tool_manager, Toolpacks

# Get tools for your agent
tools = tool_manager.get_toolpack(AgentMode.GENERAL)

# Register agent with tools
manager.register(
    "agent",
    ReasoningAgent,
    api_key=config.api_key,
    tool_list=tools,
)

API Reference

Engines

  • BaseAgent: Foundation for custom agents
  • ReasoningAgent: General-purpose agent with reasoning capabilities
  • GuardrailsAgent: Agent with content safety checks
  • GenericRouter: Routes messages to appropriate handlers
  • SimpleTranslatorWorker: Translates responses to different languages

Manager

  • AgentManager: Registry for managing multiple agents

Workflows

  • user_assistant_graph: Pre-built workflow with routing, generation, guardrails, and translation

Workflow Nodes

  • StartNode: Entry point for workflows
  • GenerateNode: Generates responses using an agent
  • GuardrailsNode: Applies safety checks
  • ClassifyNode: Routes based on message classification
  • TranslateNode: Translates output
  • RefuseNode: Handles refused/blocked content

State Management

  • WorkflowState: Maintains conversation state and metadata
  • RefusalInfo: Tracks content refusal details

Tools

  • dateutils: Date utility functions (get_today_date, get_current_week, get_weekday_from_date)
  • tool_registry: ToolManager for organizing tools by agent mode

Features

  • ๐Ÿš€ Built on Pydantic AI for type safety
  • ๐Ÿ”ง Extensible agent system
  • ๐Ÿ”„ Workflow composition with pydantic-graph
  • ๐Ÿ›ก๏ธ Built-in guardrails
  • ๐ŸŒ Multi-language support
  • ๐Ÿ”Œ MCP (Model Context Protocol) support
  • ๐Ÿ“Š Token usage tracking

Examples

  • Simple Chat: Basic chat application showing complete workflow setup

See examples/ for more.

Project Structure

Recommended structure for your application:

your-app/
โ”œโ”€โ”€ config.py                 # Configuration (API keys, models)
โ”œโ”€โ”€ factories/
โ”‚   โ””โ”€โ”€ agent_factory.py      # Agent initialization
โ”œโ”€โ”€ engines/                  # Custom agents (optional)
โ”‚   โ””โ”€โ”€ my_custom_agent.py
โ”œโ”€โ”€ workflows/                # Custom workflows (optional)
โ”‚   โ””โ”€โ”€ my_workflow.py
โ”œโ”€โ”€ nodes/                    # Custom workflow nodes (optional)
โ”‚   โ””โ”€โ”€ my_custom_node.py
โ”œโ”€โ”€ tools/                    # Custom tools (optional)
โ”‚   โ””โ”€โ”€ my_tools.py
โ”œโ”€โ”€ main.py                  # Application entry point
โ””โ”€โ”€ .env                     # Environment variables

Example Custom Engine

# engines/my_custom_agent.py
from pygentic_ai import BaseAgent

class MyCustomAgent(BaseAgent):
    def __init__(self, **kwargs):
        super().__init__(
            llm_vendor="openai",
            llm_model="gpt-4o",
            instructions="You are a specialized assistant.",
            **kwargs
        )

Example Custom Node

# nodes/my_custom_node.py
from dataclasses import dataclass
from pydantic_graph import BaseNode, GraphRunContext
from pygentic_ai.workflows.state import WorkflowState

@dataclass
class MyCustomNode(BaseNode[WorkflowState, dict, str]):
    async def run(self, ctx: GraphRunContext[WorkflowState, dict]):
        # Your custom logic
        return NextNode()

Example Custom Tools

# tools/my_tools.py
def my_custom_tool(query: str) -> str:
    """Custom tool for your agent."""
    return f"Processed: {query}"

MY_TOOLS = [my_custom_tool]

# In factory:
manager.register(
    "agent",
    ReasoningAgent,
    tool_list=MY_TOOLS,
)

Features

  • ๐Ÿš€ Built on Pydantic AI for type safety
  • ๐Ÿ”ง Extensible agent system
  • ๐Ÿ”„ Workflow composition with pydantic-graph
  • ๐Ÿ›ก๏ธ Built-in guardrails
  • ๐ŸŒ Multi-language support
  • ๐Ÿ”Œ MCP (Model Context Protocol) support
  • ๐Ÿ“Š Token usage tracking

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

pygentic_ai-0.1.0.tar.gz (15.5 kB view details)

Uploaded Source

Built Distribution

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

pygentic_ai-0.1.0-py3-none-any.whl (27.0 kB view details)

Uploaded Python 3

File details

Details for the file pygentic_ai-0.1.0.tar.gz.

File metadata

  • Download URL: pygentic_ai-0.1.0.tar.gz
  • Upload date:
  • Size: 15.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pygentic_ai-0.1.0.tar.gz
Algorithm Hash digest
SHA256 e89e9715d9abd55489858af26ccebf4b6cd234e975226ffa713a4319dbf114bf
MD5 a58bbc65311ca89cc9b4c3b0b79d0620
BLAKE2b-256 a5d45933be06f8c33aec76d076961690b12e6e9f0160c889da7f4a1ef4d5465d

See more details on using hashes here.

File details

Details for the file pygentic_ai-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pygentic_ai-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 27.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pygentic_ai-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f8d130258146478a7552646bf2314900a0b2a81a8c4e98810ac7905ae9ed7572
MD5 7215f5b76461dd6e00e8222edf7e2860
BLAKE2b-256 a263e53dce782c6f8cdf8490e8a36c29ef01ffafb9757765c6e49d539a9d986a

See more details on using hashes here.

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