Skip to main content

Python SDK for Chucky - Claude Agent as a Service

Project description

Chucky SDK - Python

Python client for Chucky - Claude Agent as a Service.

Installation

pip install chucky-sdk
# or
poetry add chucky-sdk
# or
uv add chucky-sdk

Quick Start

import asyncio
from chucky import Chucky

async def main():
    # Create client
    client = Chucky(
        url='wss://your-chucky-server.com/ws',
        token='your-jwt-token',
    )

    # Simple prompt
    result = await client.prompt('What is 2 + 2?')
    print(result.result)

asyncio.run(main())

Streaming

async for event in client.stream('Tell me a story'):
    if event.type == 'message':
        msg = event.data
        if msg.get('type') == 'assistant':
            content = msg.get('message', {}).get('content', [])
            for block in content:
                if block.get('type') == 'text':
                    print(block['text'], end='', flush=True)

Tools

Define tools that execute locally in your Python application:

from typing import Literal
from chucky import Chucky, tool, text_result, ToolResult

@tool("greet", "Greet someone by name")
async def greet(
    name: str,
    style: Literal["formal", "casual"] = "casual",
) -> ToolResult:
    """
    Greet someone.

    Args:
        name: The name of the person to greet
        style: The greeting style
    """
    greeting = f"Good day, {name}." if style == "formal" else f"Hey {name}!"
    return text_result(greeting)

result = await client.prompt('Greet Alice formally', tools=[greet])

MCP Servers

Group tools into MCP servers for better organization:

from chucky import create_mcp_server, tool, text_result
from datetime import datetime

@tool("get_time", "Get current time")
async def get_time() -> ToolResult:
    return text_result(datetime.now().isoformat())

time_server = create_mcp_server("time-tools", [get_time])

client = Chucky(
    url='wss://...',
    token='...',
    mcp_servers={'time-tools': time_server},
)

Tool Schema Options

The @tool decorator supports multiple ways to define input schemas:

1. Auto-infer from function signature (recommended)

@tool("greet", "Greet someone")
async def greet(name: str, count: int = 1) -> ToolResult:
    return text_result(f"Hello, {name}!" * count)

2. Pydantic model

from pydantic import BaseModel

class GreetInput(BaseModel):
    name: str
    style: Literal["formal", "casual"] = "casual"

@tool("greet", "Greet someone", schema=GreetInput)
async def greet(args: dict) -> ToolResult:
    return text_result(f"Hello, {args['name']}!")

3. Raw JSON Schema

@tool("greet", "Greet someone", schema={
    "type": "object",
    "properties": {"name": {"type": "string"}},
    "required": ["name"]
})
async def greet(args: dict) -> ToolResult:
    return text_result(f"Hello, {args['name']}!")

API Reference

Chucky

Main client class.

Constructor Parameters:

  • url (required): WebSocket URL of the Chucky server
  • token (required): JWT billing token
  • model: Claude model to use (default: claude-sonnet-4-5-20250929)
  • system_prompt: Default system prompt
  • max_turns: Maximum conversation turns
  • allowed_tools: List of allowed tool names
  • disallowed_tools: List of disallowed tool names
  • mcp_servers: MCP servers with client-side tools
  • timeout: Connection timeout in seconds (default: 30.0)
  • keepalive_interval: Keep-alive interval in seconds (default: 60.0)

Methods:

  • prompt(message, **options): Send a prompt and wait for result
  • stream(message, options=None): Send a prompt and stream events

@tool(name, description, schema=None)

Decorator to create a tool from a function.

create_mcp_server(name, tools, version="1.0.0")

Create an MCP server with tools.

text_result(text)

Helper to create a simple text result.

error_result(message)

Helper to create an error result.

License

MIT

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

chucky_sdk-0.1.0.tar.gz (11.6 kB view details)

Uploaded Source

Built Distribution

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

chucky_sdk-0.1.0-py3-none-any.whl (13.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: chucky_sdk-0.1.0.tar.gz
  • Upload date:
  • Size: 11.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for chucky_sdk-0.1.0.tar.gz
Algorithm Hash digest
SHA256 06d7a860111228724bb538273d7116bb292fc98fad33aef3d2332d32084cbdfc
MD5 78dc7d00f3442adb04ceb6c35e58599c
BLAKE2b-256 68c7dd4ff3d5e95e07c44c4f8b66e0f299c659c7f5d031477e8f02b801b1478d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: chucky_sdk-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for chucky_sdk-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 77f108c9dca287177f8ba6bbd81bb331474535d05f05f903e6c982a73c976d3d
MD5 b71ccd89c4c3b48c45ef90ff1f7a6e8f
BLAKE2b-256 603b6e8681a2c4c48b98aabd5bd7241a8c677546b0f1d23aea397a88f186b5e9

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