recursive-agent 0.6.0

A minimal, orthogonal, self-improving coding agent kernel in Rust
Documentation
# Custom LLM Providers

Implement the `LlmProvider` trait to add support for any model backend.

## The LlmProvider trait

```rust
#[async_trait]
pub trait LlmProvider: Send + Sync {
    async fn complete(
        &self,
        messages: &[Message],
        tools: Option<&[ToolDef]>,
    ) -> Result<Message, RecursiveError>;
}
```

## Built-in providers

| Provider | Description |
|---|---|
| `OpenAiProvider` | OpenAI-compatible HTTP (OpenAI, DeepSeek, Ollama, etc.) |
| `AnthropicProvider` | Native Anthropic API (requires `anthropic` feature) |
| `MockProvider` | Scripted responses for testing |

## OpenAiProvider

```rust
use recursive::llm::OpenAiProvider;

let llm = Arc::new(OpenAiProvider::new(
    "https://api.openai.com/v1",
    api_key,
    model_name,
));
```

Works with any OpenAI-compatible endpoint.

## AnthropicProvider

```rust
use recursive::llm::AnthropicProvider;

let llm = Arc::new(AnthropicProvider::new(
    api_key,
    model_name,   // e.g. "claude-sonnet-4-5"
));
```

Requires `features = ["anthropic"]` in Cargo.toml.

## MockProvider

Useful for testing without an API key:

```rust
use recursive::llm::MockProvider;

let llm = Arc::new(
    MockProvider::new()
        .reply("I'll list the files.")
        .tool_call("list_dir", json!({"path": "."}))
        .reply("The directory contains: src/, tests/, Cargo.toml")
);
```

## Implementing a custom provider

```rust
use recursive::llm::LlmProvider;
use recursive::message::Message;
use recursive::tools::ToolDef;
use recursive::error::RecursiveError;
use async_trait::async_trait;

pub struct MyCustomProvider {
    client: MyApiClient,
}

#[async_trait]
impl LlmProvider for MyCustomProvider {
    async fn complete(
        &self,
        messages: &[Message],
        tools: Option<&[ToolDef]>,
    ) -> Result<Message, RecursiveError> {
        // Convert messages to your API's format
        // Call your API
        // Convert the response back to Message
        todo!()
    }
}
```