Transports
Transports control where agent steps execute. By default, agents run on the local machine via ClaudeCodeProvider. Ironflow ships additional transports for running agents in isolated environments.
Available transports
| Transport | Provider | Use case |
|---|---|---|
| Local | ClaudeCodeProvider | Development, simple setups |
| Docker | DockerProvider | Isolated containers on the same host |
| SSH | SshProvider | Remote machines |
| Kubernetes | K8sProvider | Ephemeral or persistent pods in a cluster |
Docker transport
Executes agent commands inside a running Docker container via docker exec:
//! Docker transport example.
//!
//! Executes `claude` inside a running Docker container via `docker exec`.
//! The container must already be running and have the `claude` binary installed.
//!
//! # Usage
//!
//! ```sh
//! DOCKER_CONTAINER=claude-worker cargo run --bin docker-transport
//! ```
use std::env;
use ironflow_core::prelude::*;
use ironflow_core::providers::claude::DockerProvider;
#[tokio::main]
async fn main() -> Result<(), OperationError> {
let container = env::var("DOCKER_CONTAINER").expect("DOCKER_CONTAINER env var required");
let provider = DockerProvider::new(&container).working_dir("/workspace");
let result = Agent::new()
.prompt("What is 2 + 2?")
.max_budget_usd(0.10)
.run(&provider)
.await?;
println!("Response: {}", result.text());
println!("Model: {}", result.model().unwrap_or("unknown"));
println!("Duration: {}ms", result.duration_ms());
Ok(())
}
SSH transport
Connects to a remote host via SSH:
//! SSH transport example.
//!
//! Connects to a remote host via SSH and runs `claude` there.
//! Requires the `claude` binary to be installed on the remote host.
//!
//! # Usage
//!
//! ```sh
//! SSH_HOST=build-server SSH_USER=deploy SSH_PASSWORD=secret cargo run --bin ssh-transport
//! ```
use std::env;
use ironflow_core::prelude::*;
use ironflow_core::providers::claude::SshProvider;
use ironflow_core::providers::claude::ssh::HostKeyPolicy;
#[tokio::main]
async fn main() -> Result<(), OperationError> {
let host = env::var("SSH_HOST").expect("SSH_HOST env var required");
let user = env::var("SSH_USER").expect("SSH_USER env var required");
let password = env::var("SSH_PASSWORD").expect("SSH_PASSWORD env var required");
// For production, use HostKeyPolicy::Fingerprint or HostKeyPolicy::KnownHostsFile
let provider = SshProvider::new(&host, &user)
.password(&password)
.host_key_policy(HostKeyPolicy::AcceptAll);
let result = Agent::new()
.prompt("What is 2 + 2?")
.max_budget_usd(0.10)
.run(&provider)
.await?;
println!("Response: {}", result.text());
println!("Model: {}", result.model().unwrap_or("unknown"));
println!("Duration: {}ms", result.duration_ms());
Ok(())
}
Kubernetes transport
Two modes are available:
- Ephemeral – creates a pod for each agent call, deletes it when done
- Persistent – reuses a long-lived pod for multiple calls
See the examples/transports/ directory for complete Kubernetes examples.
Choosing a transport
- Development: use
ClaudeCodeProvider(local). No setup needed. - CI/CD pipelines: Docker or Kubernetes for isolation.
- Remote build servers: SSH for machines you already manage.
- Multi-tenant production: Kubernetes ephemeral pods for strong isolation between tenants.