Skip to main content

Python SDK for Ripperdoc AI Agent

Project description

Ripperdoc Python SDK

Python SDK for Ripperdoc AI Agent.

Overview

This SDK is a fork of Anthropic's Claude Agent SDK Python and maintains full API compatibility with it. The Ripperdoc SDK extends the original SDK with support for multiple LLM providers (not just Claude) while keeping the same interface and usage patterns.

Compatibility: If you have code using claude_agent_sdk, you can easily migrate by simply changing the imports from claude_agent_sdk to ripperdoc_agent_sdk and using RipperdocAgentOptions instead of ClaudeAgentOptions. All other API calls remain the same.

Features

  • Subprocess Architecture: Clean separation between SDK and CLI via JSON Control Protocol
  • Async-First: Built with asyncio and anyio for efficient async operations
  • Type Safety: Full type hints for better IDE support and type checking
  • Comprehensive: Support for hooks, permissions, MCP servers, and custom tools

Installation

Install from PyPI:

pip install ripperdoc-agent-sdk

Install from GitHub:

pip install git+https://github.com/quantmew/ripperdoc-agent-sdk-python

For development:

pip install git+https://github.com/quantmew/ripperdoc-agent-sdk-python#egg=ripperdoc-agent-sdk[dev]

Quick Start

Simple Query

import asyncio
from ripperdoc_agent_sdk import query, RipperdocAgentOptions

async def main():
    async for message in query(
        prompt="What is the capital of France?",
        options=RipperdocAgentOptions()
    ):
        print(message)

asyncio.run(main())

Persistent Client

import asyncio
from ripperdoc_agent_sdk import RipperdocSDKClient, RipperdocAgentOptions

async def main():
    async with RipperdocSDKClient(options=RipperdocAgentOptions()) as client:
        await client.query("Help me understand this code")

        async for message in client.receive_messages():
            if isinstance(message, AssistantMessage):
                for block in message.content:
                    if isinstance(block, TextBlock):
                        print(block.text)

asyncio.run(main())

Configuration

RipperdocAgentOptions

from ripperdoc_agent_sdk import RipperdocAgentOptions

options = RipperdocAgentOptions(
    model="model-name",
    permission_mode="default",  # or "acceptEdits", "bypassPermissions", "plan"
    allowed_tools=["Bash", "Read", "Write"],
    max_turns=10,
    system_prompt="You are a helpful coding assistant",
    cli_path="/path/to/ripperdoc",  # Optional: path to Ripperdoc CLI
)

Permission Modes

  • "default": Prompts for dangerous operations
  • "acceptEdits": Auto-accept file edits
  • "bypassPermissions": Allow all operations (use with caution)
  • "plan": Planning mode with no execution

Advanced Usage

Custom Permission Checker

from ripperdoc_agent_sdk import (
    RipperdocSDKClient,
    RipperdocAgentOptions,
    PermissionResultAllow,
    PermissionResultDeny,
)

async def my_permission_checker(tool_name, tool_input, context):
    # Custom permission logic
    if tool_name == "Bash" and "rm -rf" in tool_input.get("command", ""):
        return PermissionResultDeny(message="Dangerous command!")
    return PermissionResultAllow()

options = RipperdocAgentOptions(
    permission_checker=my_permission_checker,
)

Programmatic Hooks

from ripperdoc_agent_sdk import RipperdocAgentOptions, HookMatcher

async def my_hook(event_type, data):
    print(f"Hook event: {event_type}")
    return {"continue_": True}

options = RipperdocAgentOptions(
    hooks={
        "PreToolUse": [
            HookMatcher(
                callback=my_hook,
                tool_pattern="Bash*",
            )
        ]
    },
)

MCP Servers

from ripperdoc_agent_sdk import RipperdocAgentOptions, McpServerConfig

options = RipperdocAgentOptions(
    mcp_servers={
        "my-server": McpServerConfig(
            type="stdio",
            command="node",
            args=["/path/to/server.js"],
        )
    },
)

Custom Agents

from ripperdoc_agent_sdk import RipperdocAgentOptions, AgentConfig

options = RipperdocAgentOptions(
    agents={
        "code-reviewer": AgentConfig(
            description="Reviews code for bugs and style issues",
            prompt="You are a code reviewer. Focus on bug detection and style.",
            tools=["Read", "Grep"],
        )
    },
)

Message Types

The SDK provides the following message types:

  • UserMessage: Messages from the user
  • AssistantMessage: Responses from the AI
  • SystemMessage: System-level events
  • ResultMessage: Query completion with metadata
  • StreamEvent: Raw stream events

Content Blocks

  • TextBlock: Plain text content
  • ThinkingBlock: Extended thinking output
  • ToolUseBlock: Tool invocation
  • ToolResultBlock: Tool execution result

Architecture

The SDK uses a subprocess architecture:

┌─────────────────────┐
│   Python SDK        │
│                     │
│  ┌───────────────┐  │
│  │ Ripperdoc     │  │
│  │ SDK Client    │  │
│  └───────┬───────┘  │
│          │          │
│  ┌───────▼───────┐  │
│  │ JSON Control  │  │
│  │   Protocol    │  │
│  └───────┬───────┘  │
└──────────┼──────────┘
           │ stdio
    ┌──────▼─────────┐
    │  Ripperdoc     │
    │  CLI Process   │
    └────────────────┘

Development

Running Tests

pytest tests/

Type Checking

mypy ripperdoc_agent_sdk

Code Formatting

black ripperdoc_agent_sdk
ruff check ripperdoc_agent_sdk

Requirements

  • Python 3.10+
  • anyio >= 4.0.0
  • pydantic >= 2.0.0

License

Apache License 2.0

Contributing

Contributions are welcome! Please read our contributing guidelines before submitting PRs.

Related Projects

Migration from Claude Agent SDK

If you're already using the Claude Agent SDK, migrating is straightforward:

# Before (Claude Agent SDK)
from claude_agent_sdk import query, ClaudeAgentOptions

options = ClaudeAgentOptions(
    system_prompt="You are a helpful assistant",
    permission_mode='acceptEdits',
)

# After (Ripperdoc SDK)
from ripperdoc_agent_sdk import query, RipperdocAgentOptions

options = RipperdocAgentOptions(
    system_prompt="You are a helpful assistant",
    permission_mode='acceptEdits',
)

The rest of your code remains exactly the same. The Ripperdoc SDK provides the same API with the added benefit of supporting multiple LLM providers beyond just Claude.

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

ripperdoc_agent_sdk-0.0.3.tar.gz (40.6 kB view details)

Uploaded Source

Built Distribution

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

ripperdoc_agent_sdk-0.0.3-py3-none-any.whl (40.4 kB view details)

Uploaded Python 3

File details

Details for the file ripperdoc_agent_sdk-0.0.3.tar.gz.

File metadata

  • Download URL: ripperdoc_agent_sdk-0.0.3.tar.gz
  • Upload date:
  • Size: 40.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ripperdoc_agent_sdk-0.0.3.tar.gz
Algorithm Hash digest
SHA256 a91e37a26f205cf3bcbe13073b7e583fc9540cf1a40b1b6a35514b7378f5e2c7
MD5 0d443eb010007c6323305655c4cf7b86
BLAKE2b-256 1ab59f3aec9a33b8438535a19e25e8270960a3ae28f2e35c4d381dc32ae1d260

See more details on using hashes here.

File details

Details for the file ripperdoc_agent_sdk-0.0.3-py3-none-any.whl.

File metadata

File hashes

Hashes for ripperdoc_agent_sdk-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 f7a76524cd5db1e2cc7432176198e292c6807afbe6e17ee0fdb78f432fbe6cda
MD5 f185b2db4938c18d76cbad108672a1eb
BLAKE2b-256 da13505f94afb665016d50a6d4f102c4544b61ba2f9357e3bb9b654c76833930

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