Expand description
§Embacle — LLM Runners
Standalone library providing pluggable LlmProvider
implementations that delegate to CLI tools (Claude Code, Copilot, Cursor Agent,
OpenCode, Gemini, Codex, Goose, Cline, Continue, Warp) and ACP (Copilot Headless) for LLM completions.
CLI runners wrap a binary, build prompts from ChatMessage
sequences, parse JSON output, and manage session continuity. The Copilot Headless
runner communicates via NDJSON-framed JSON-RPC with copilot --acp.
§Quick Start
use std::path::PathBuf;
use embacle::{ClaudeCodeRunner, RunnerConfig};
use embacle::types::{ChatMessage, ChatRequest, LlmProvider};
let config = RunnerConfig::new(PathBuf::from("claude"));
let runner = ClaudeCodeRunner::new(config);
let request = ChatRequest::new(vec![ChatMessage::user("Hello!")]);
let response = runner.complete(&request).await?;
println!("{}", response.content);§Fallback Chains
Try multiple providers in order — first success wins:
use std::path::PathBuf;
use embacle::{ClaudeCodeRunner, CopilotRunner, RunnerConfig};
use embacle::fallback::FallbackProvider;
use embacle::types::{ChatMessage, ChatRequest, LlmProvider};
let claude = ClaudeCodeRunner::new(RunnerConfig::new(PathBuf::from("claude")));
let copilot = CopilotRunner::new(RunnerConfig::new(PathBuf::from("copilot"))).await;
let provider = FallbackProvider::new(vec![
Box::new(claude),
Box::new(copilot),
])?;
// If claude fails, copilot handles it — same interface
let request = ChatRequest::new(vec![ChatMessage::user("Hello!")]);
let response = provider.complete(&request).await?;§Structured Output
Schema-validated JSON from any provider, with retry on validation failure:
use embacle::structured_output::{request_structured_output, StructuredOutputRequest};
use embacle::types::{ChatMessage, ChatRequest, LlmProvider};
use serde_json::json;
let schema = json!({
"type": "object",
"properties": {
"city": {"type": "string"},
"temperature": {"type": "number"}
},
"required": ["city", "temperature"]
});
let request = ChatRequest::new(vec![
ChatMessage::user("What's the weather in Paris?"),
]);
let data = request_structured_output(
runner,
&StructuredOutputRequest { request, schema, max_retries: 2 },
).await?;
assert!(data["city"].is_string());
assert!(data["temperature"].is_number());§Modules
types— Core types:LlmProvidertrait, messages, requests, errorsconfig— Runner types and configurationagent— Configurable agent loop with multi-turn tool callingfallback— Provider fallback chains (try providers in order)mcp_tool_bridge— MCP tool definition to text-tool-simulation bridgemetrics— Cost/latency normalization decoratorquality_gate— Response quality validation with retrystructured_output— Schema-enforced JSON output from any providercompat— Version compatibility and capability detectioncontainer— Container-based execution backenddiscovery— Automatic binary detection on the hostcapability_guard— Request/provider capability validationauth— Readiness and authentication checkingprocess— Subprocess spawning with timeout and output limitssandbox— Environment variable whitelisting and working directory controlprompt— Prompt building fromChatMessageslicesclaude_code— Claude Code CLI runnercopilot— GitHub Copilot CLI runnercursor_agent— Cursor Agent CLI runneropencode—OpenCodeCLI runnergemini_cli— Gemini CLI runnercodex_cli— Codex CLI runnergoose_cli— Goose CLI runnercline_cli— Cline CLI runnercontinue_cli— Continue CLI runnerwarp_cli— Warp terminalozCLI runnercopilot_headless— GitHub Copilot Headless (ACP) runner (requirescopilot-headlessfeature)
Re-exports§
pub use agent::AgentExecutor;pub use agent::AgentResult;pub use agent::OnTurnCallback;pub use agent::TurnInfo;pub use auth::ProviderReadiness;pub use capability_guard::validate_capabilities;pub use claude_code::ClaudeCodeRunner;pub use cli_common::CliRunnerBase;pub use cline_cli::ClineCliRunner;pub use codex_cli::CodexCliRunner;pub use compat::CliCapabilities;pub use config::CliRunnerType;pub use config::RunnerConfig;pub use container::ContainerConfig;pub use container::ContainerExecutor;pub use container::NetworkMode;pub use continue_cli::ContinueCliRunner;pub use copilot::copilot_fallback_models;pub use copilot::discover_copilot_models;pub use copilot::CopilotRunner;pub use cursor_agent::CursorAgentRunner;pub use discovery::discover_runner;pub use discovery::resolve_binary;pub use factory::create_runner;pub use factory::parse_runner_type;pub use factory::valid_provider_names;pub use factory::ALL_PROVIDERS;pub use fallback::FallbackProvider;pub use gemini_cli::GeminiCliRunner;pub use goose_cli::GooseCliRunner;pub use mcp_tool_bridge::McpToolDefinition;pub use mcp_tool_bridge::McpToolExecutor;pub use metrics::MetricsProvider;pub use metrics::MetricsReport;pub use opencode::OpenCodeRunner;pub use quality_gate::QualityGateProvider;pub use quality_gate::QualityPolicy;pub use structured_output::request_structured_output;pub use structured_output::StructuredOutputRequest;pub use warp_cli::WarpCliRunner;pub use types::ResponseFormat;pub use types::ToolCallRequest;pub use types::ToolChoice;pub use types::ToolDefinition;pub use tool_simulation::execute_with_text_tools;pub use tool_simulation::format_tool_results_as_text;pub use tool_simulation::generate_tool_catalog;pub use tool_simulation::inject_tool_catalog;pub use tool_simulation::parse_tool_call_blocks;pub use tool_simulation::strip_tool_call_blocks;pub use tool_simulation::FunctionCall;pub use tool_simulation::FunctionDeclaration;pub use tool_simulation::FunctionResponse;pub use tool_simulation::TextToolHandler;pub use tool_simulation::TextToolResponse;
Modules§
- agent
- Configurable agent loop with multi-turn tool calling
- auth
- Auth readiness checking for CLI runners
- capability_
guard - Request/provider capability validation
- claude_
code - Claude Code CLI runner
- cli_
common - Shared base struct and macro for CLI runner boilerplate
- cline_
cli - Cline CLI runner
- codex_
cli - Codex CLI runner
- compat
- Version compatibility and capability detection
- config
- Shared configuration types for CLI runners
- container
- Container-based execution backend
- continue_
cli - Continue CLI runner
- copilot
- GitHub Copilot CLI runner
- cursor_
agent - Cursor Agent CLI runner
- discovery
- Binary auto-detection and discovery
- factory
- Runner factory, provider parsing, and provider enumeration
- fallback
- Provider fallback chains
- gemini_
cli - Gemini CLI runner
- goose_
cli - Goose CLI runner
- mcp_
tool_ bridge - MCP tool definition to text-tool-simulation bridge
- metrics
- Cost/latency normalization decorator
- opencode
OpenCodeCLI runner- process
- Subprocess spawning with safety limits
- prompt
- Prompt construction from
ChatMessagesequences - quality_
gate - Response quality validation with retry
- sandbox
- Environment sandboxing and tool policy
- stream
- Stream wrapper for child process lifecycle management
- structured_
output - Schema-enforced JSON output from any provider
- tool_
simulation - Text-based tool simulation for CLI runners without native function calling
- types
- Core types: traits, messages, requests, responses, and errors
- warp_
cli - Warp terminal
ozCLI runner
Macros§
- delegate_
provider_ base - Generate the boilerplate
LlmProvidertrait methods.