Grand Diomande Research · Full HTML Reader

cc-agent-ipc

This crate provides an async Rust interface to communicate with the `cc-agent-service` Python daemon over Unix sockets. It enables Rust applications (Tauri, CLI tools, backend services) to leverage multiple LLM providers:

Agents That Account for Themselves technical note experiment writeup candidate score 28 .md

Full Public Reader

cc-agent-ipc

Rust IPC client for cc-agent-service (multi-model agent orchestration).

Overview

This crate provides an async Rust interface to communicate with the `cc-agent-service` Python daemon over Unix sockets. It enables Rust applications (Tauri, CLI tools, backend services) to leverage multiple LLM providers:

  • Claude (claude-agent-sdk) - Extended thinking, subagents
  • OpenAI (openai-agents) - Handoffs, guardrails
  • Auto - Dynamic provider selection based on capabilities

Architecture

┌─────────────────────────────────────────────────────────────────────┐
│                     Your Rust Application                           │
│  (Tauri, CLI tool, backend service, etc.)                           │
└──────────────────────────────┬──────────────────────────────────────┘
                               │
                               ↓
┌─────────────────────────────────────────────────────────────────────┐
│                   cc-agent-ipc (this crate)                         │
│  • Async IPC client                                                 │
│  • Streaming interface                                              │
│  • Type-safe protocol                                               │
│  • Multi-provider support                                           │
└──────────────────────────────┬──────────────────────────────────────┘
                               │ Unix Socket IPC (JSON-RPC)
                               ↓
┌─────────────────────────────────────────────────────────────────────┐
│                   cc-agent-service (Python daemon)                  │
│  • Claude (claude-agent-sdk)                                        │
│  • OpenAI (openai-agents)                                           │
│  • Multi-provider routing                                           │
│  • Tool execution & hooks                                           │
└──────────────────────────────┬──────────────────────────────────────┘
                               │
                   ┌───────────┴───────────┐
                   ↓                       ↓
┌─────────────────────────┐   ┌─────────────────────────┐
│    Anthropic API        │   │      OpenAI API         │
└─────────────────────────┘   └─────────────────────────┘

Quick Start

rust
use cc_agent_ipc::{AgentClient, CreateSessionParams, Provider, MessageStream, StreamEvent};

#[tokio::main]
async fn main() -> cc_agent_ipc::Result<()> {
    let client = AgentClient::new();

    // Verify service is running
    if !client.is_available().await {
        eprintln!("cc-agent-service is not running");
        return Ok(());
    }

    // Create a Claude session (default)
    let session = client.create_session(CreateSessionParams {
        working_directory: "/path/to/project".into(),
        provider: Provider::Claude,
        ..Default::default()
    }).await?;

    // Stream responses
    let stream = client.send_prompt(&session.session_id, "List files").await?;
    let mut msg_stream = MessageStream::new(stream);

    while let Some(event) = msg_stream.next().await {
        match event? {
            StreamEvent::Text(text) => print!("{}", text),
            StreamEvent::ToolUse { name, .. } => println!("\n[Tool: {}]", name),
            StreamEvent::Done { metrics, .. } => {
                println!("\n[Tokens: {} in, {} out]",
                    metrics.input_tokens, metrics.output_tokens);
                break;
            }
            _ => {}
        }
    }

    client.close_session(&session.session_id).await?;
    Ok(())
}

Multi-Provider Usage

Claude (Extended Thinking)

rust
let session = client.create_session(CreateSessionParams {
    working_directory: "/project".into(),
    provider: Provider::Claude,
    enable_thinking: Some(true),
    model: Some("claude-sonnet-4-20250514".into()),
    ..Default::default()
}).await?;

OpenAI (Handoffs)

rust
let session = client.create_session(CreateSessionParams {
    working_directory: "/project".into(),
    provider: Provider::OpenAI,
    model: Some("gpt-4o".into()),
    handoffs: Some(vec![
        HandoffTarget {
            name: "researcher".into(),
            description: "Hands off to research agent for deep analysis".into(),
        }
    ]),
    ..Default::default()
}).await?;

Auto Selection

rust
// Automatically selects best available provider
let session = client.create_session(CreateSessionParams {
    working_directory: "/project".into(),
    provider: Provider::Auto,
    routing_strategy: Some(RoutingStrategy::Capability),
    ..Default::default()
}).await?;

One-Shot Query

rust
use cc_agent_ipc::quick_dispatch;

let response = quick_dispatch("/project", "Explain main.rs").await?;
println!("{}", response);

Session Management

rust
// Create session with options
let session = client.create_session(CreateSessionParams {
    working_directory: "/project".into(),
    provider: Provider::Claude,
    model: Some("claude-sonnet-4-20250514".into()),
    max_turns: Some(50),
    allowed_tools: Some(vec!["Read".into(), "Glob".into()]),
    project_id: Some("my-project".into()),
    ..Default::default()
}).await?;

// Resume existing session
let session = client.create_session(CreateSessionParams {
    working_directory: "/project".into(),
    resume: Some("sdk-session-id".into()),
    ..Default::default()
}).await?;

// List sessions
let sessions = client.list_sessions().await?;
for s in sessions.sessions {
    println!("{}: {} ({}) - {}", s.session_id, s.state, s.working_directory, s.provider);
}

Subagents

rust
use std::collections::HashMap;
use cc_agent_ipc::{CreateSessionParams, SubagentConfig, Provider};

let mut agents = HashMap::new();
agents.insert("explorer".into(), SubagentConfig {
    description: "Code exploration agent".into(),
    prompt: "Find and analyze code patterns".into(),
    tools: vec!["Read".into(), "Glob".into(), "Grep".into()],
});

let session = client.create_session(CreateSessionParams {
    working_directory: "/project".into(),
    provider: Provider::Claude,
    agents: Some(agents),
    ..Default::default()
}).await?;

Routing Strategies

When using multiple providers, you can configure routing:

rust
let session = client.create_session(CreateSessionParams {
    provider: Provider::Auto,
    routing_strategy: Some(RoutingStrategy::Capability),  // Route by task type
    fallback_provider: Some(Provider::Claude),            // Fallback if primary fails
    ..Default::default()
}).await?;

Available strategies:
- `Fixed` - Always use specified provider
- `RoundRobin` - Alternate between providers
- `Capability` - Route based on task requirements
- `Cost` - Minimize cost
- `Latency` - Minimize latency

Error Handling

rust
use cc_agent_ipc::AgentError;

match client.ping().await {
    Ok(response) => println!("Active sessions: {}", response.active_sessions),
    Err(AgentError::ServiceUnavailable(path)) => {
        eprintln!("Service not running at {}", path);
    }
    Err(e) if e.is_retryable() => {
        // Retry logic
    }
    Err(e) => return Err(e.into()),
}

Related

  • cc-agent-sdk - TypeScript SDK for Node.js/browser applications
  • cc-agent-service - Python daemon that orchestrates Claude/OpenAI agents

License

MIT

Promotion Decision

Attach run IDs, datasets, metrics, and reproduction commands.

Source Anchor

Comp-Core/core/_recovered/cc-agent-ipc/README.md

Detected Structure

Method · Evaluation · Figures · Code Anchors · Architecture