Skip to content

Commit fb8be0c

Browse files
committed
feat(dependencies): replace genai crate with liter-llm dependency
1 parent c9f2651 commit fb8be0c

11 files changed

Lines changed: 472 additions & 388 deletions

File tree

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ eyre = "0.6.12"
3333
flume = "0.12.0"
3434
futures-core = "0.3.32"
3535
futures-util = "0.3.32"
36-
genai = "=0.6.0-beta.10"
3736
jsonschema = "0.45.0"
37+
liter-llm = { version = "1.1.1", default-features = false, features = [
38+
"native-http",
39+
] }
3840
opentelemetry = "0.31.0"
3941
opentelemetry-otlp = { version = "0.31.1", features = ["grpc-tonic"] }
4042
opentelemetry_sdk = "0.31.0"

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE.md)
88
[![Rust](https://img.shields.io/badge/rust-2024%20edition-orange.svg)](https://www.rust-lang.org/)
99

10-
**Bob** is a minimal AI agent framework built in Rust with a hexagonal (ports & adapters) architecture. It connects to language models via [`genai`](https://crates.io/crates/genai) and to external tools via MCP servers using [`rmcp`](https://crates.io/crates/rmcp).
10+
**Bob** is a minimal AI agent framework built in Rust with a hexagonal (ports & adapters) architecture. It connects to language models via [`liter-llm`](https://crates.io/crates/liter-llm) and to external tools via MCP servers using [`rmcp`](https://crates.io/crates/rmcp).
1111

1212
## Design Philosophy
1313

@@ -43,7 +43,7 @@ Compile-Time Safety
4343
|-------|-------------|
4444
| **[bob-core](https://crates.io/crates/bob-core)** | Domain types, port traits (`LlmPort`, `ToolPort`, `SessionStore`, `EventSink`) |
4545
| **[bob-runtime](https://crates.io/crates/bob-runtime)** | Runtime orchestration: 6-state turn FSM, prompt builder, action parser |
46-
| **[bob-adapters](https://crates.io/crates/bob-adapters)** | Concrete implementations: genai LLM, MCP tools, file/memory stores, OpenTelemetry |
46+
| **[bob-adapters](https://crates.io/crates/bob-adapters)** | Concrete implementations: liter-llm, MCP tools, file/memory stores, OpenTelemetry |
4747
| **[bob-chat](https://crates.io/crates/bob-chat)** | Chat channel types and streaming abstractions for multi-platform integration |
4848
| **[bob-skills](https://crates.io/crates/bob-skills)** | Skill loading, parsing, selection, and registry with frontmatter metadata |
4949
| **bob-cli** | CLI application with interactive REPL and skill management |
@@ -117,7 +117,7 @@ Skill management system with deterministic selection and frontmatter metadata:
117117
┌─────────────────────────────────────────────────────────────┐
118118
│ Adapters (bob-adapters) │
119119
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
120-
│ │GenAI LLM │ │MCP Tools │ │In-Memory │ │ Tracing │ │
120+
│ │LiterLLM │ │MCP Tools │ │In-Memory │ │ Tracing │ │
121121
│ │ │ │ │ │ Store │ │ Events │ │
122122
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
123123
└─────────────────────────────────────────────────────────────┘

agent.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#
33
# Copy this file to your project root and adjust as needed.
44
# API keys (e.g. OPENAI_API_KEY) are read from environment variables
5-
# by the genai crate — they are NOT stored in this file.
5+
# by the liter-llm crate — they are NOT stored in this file.
66

77
[runtime]
88
# Model identifier in "provider:model" format.

bin/bob-cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ bob-skills = { workspace = true }
2323
clap = { workspace = true, features = ["derive"] }
2424
config = { workspace = true }
2525
eyre = { workspace = true }
26-
genai = { workspace = true }
26+
liter-llm = { workspace = true }
2727
serde = { workspace = true, features = ["derive"] }
2828
serde_json.workspace = true
2929
serde_yml = { workspace = true }

bin/bob-cli/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ Here is the translated explanation...
152152

153153
### Multi-Model Support
154154

155-
Works with any LLM provider supported by `genai`:
155+
Works with any LLM provider supported by `liter-llm`:
156156

157157
- OpenAI: `openai:gpt-4o`, `openai:gpt-4o-mini`
158158
- Anthropic: `anthropic:claude-3-5-sonnet-20241022`

bin/bob-cli/src/bootstrap.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,17 @@ pub(crate) struct CliRuntimeHandles {
4646

4747
/// Build the runtime from a loaded config.
4848
pub(crate) async fn build_runtime(cfg: &AgentConfig) -> eyre::Result<CliRuntimeHandles> {
49-
let client = genai::Client::default();
49+
let api_key = std::env::var("OPENAI_API_KEY")
50+
.or_else(|_| std::env::var("ANTHROPIC_API_KEY"))
51+
.or_else(|_| std::env::var("GEMINI_API_KEY"))
52+
.unwrap_or_default();
53+
let config = liter_llm::ClientConfig::new(api_key);
54+
let client = std::sync::Arc::new(
55+
liter_llm::DefaultClient::new(config, Some(&cfg.runtime.default_model))
56+
.wrap_err("failed to create LLM client")?,
57+
);
5058
let llm: Arc<dyn bob_adapters::core::ports::LlmPort> =
51-
Arc::new(bob_adapters::llm_genai::GenAiLlmAdapter::new(client));
59+
Arc::new(bob_adapters::llm_liter::LiterLlmAdapter::new(client));
5260

5361
let tools = build_tool_port(cfg).await?;
5462
let store_root = resolve_store_root(cfg)?;

crates/bob-adapters/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ repository.workspace = true
77
homepage.workspace = true
88
authors.workspace = true
99
description = "Adapter implementations for Bob Agent Framework ports"
10-
keywords = ["agent", "ai", "adapter", "genai", "mcp"]
10+
keywords = ["agent", "ai", "adapter", "llm", "mcp"]
1111
categories = ["development-tools", "asynchronous", "api-bindings"]
1212
readme = "README.md"
1313
documentation = "https://docs.rs/bob-adapters"
1414

1515
[features]
16-
default = ["llm-genai", "mcp-rmcp", "skills-agent", "observe-tracing"]
17-
llm-genai = ["dep:genai"]
16+
default = ["llm-liter", "mcp-rmcp", "skills-agent", "observe-tracing"]
17+
llm-liter = ["dep:liter-llm"]
1818
mcp-rmcp = [
1919
"dep:rmcp",
2020
"rmcp/client",
@@ -45,7 +45,7 @@ tokio = { workspace = true, features = ["process", "io-util"] }
4545

4646
# Feature-gated
4747
bob-skills = { workspace = true, optional = true }
48-
genai = { workspace = true, optional = true }
48+
liter-llm = { workspace = true, optional = true }
4949
opentelemetry = { workspace = true, optional = true }
5050
opentelemetry-otlp = { workspace = true, optional = true }
5151
opentelemetry_sdk = { workspace = true, optional = true }

crates/bob-adapters/README.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Adapter implementations for the [Bob Agent Framework](https://github.com/longcip
2121

2222
All adapters are feature-gated to minimize dependencies:
2323

24-
- **`llm-genai`** (default): LLM adapter using the [`genai`](https://crates.io/crates/genai) crate
24+
- **`llm-liter`** (default): LLM adapter using the [`liter-llm`](https://crates.io/crates/liter-llm) crate
2525
- **`mcp-rmcp`** (default): Tool adapter for MCP servers via [`rmcp`](https://crates.io/crates/rmcp)
2626
- **`skills-agent`** (default): Skill loading and composition via [`agent-skills`](https://crates.io/crates/agent-skills)
2727
- **`store-memory`** (default): In-memory session storage
@@ -42,23 +42,25 @@ To disable default features and select specific adapters:
4242
[dependencies.bob-adapters]
4343
version = "0.2.1"
4444
default-features = false
45-
features = ["llm-genai", "mcp-rmcp"]
45+
features = ["llm-liter", "mcp-rmcp"]
4646
```
4747

4848
### Example: Creating Adapters
4949

5050
```rust
5151
use bob_adapters::{
52-
llm_genai::GenAiLlmAdapter,
52+
llm_liter::LiterLlmAdapter,
5353
mcp_rmcp::McpToolAdapter,
5454
store_memory::InMemorySessionStore,
5555
observe::TracingEventSink,
5656
};
57-
use genai::Client;
57+
use liter_llm::{ClientConfig, DefaultClient, LlmClient};
58+
use std::sync::Arc;
5859

5960
// LLM adapter
60-
let client = Client::default();
61-
let llm = GenAiLlmAdapter::new(client);
61+
let config = ClientConfig::new(std::env::var("OPENAI_API_KEY").unwrap_or_default());
62+
let client = Arc::new(DefaultClient::new(config, None).unwrap());
63+
let llm = LiterLlmAdapter::new(client);
6264

6365
// Tool adapter (MCP server)
6466
let tools = McpToolAdapter::connect_stdio(
@@ -91,9 +93,9 @@ let rendered = composer.render_bundle_for_input("summarize this incident report"
9193

9294
## Adapters
9395

94-
### LLM Adapters (`llm-genai`)
96+
### LLM Adapters (`llm-liter`)
9597

96-
Connects to LLM providers through the `genai` crate, supporting:
98+
Connects to LLM providers through the `liter-llm` crate, supporting:
9799

98100
- OpenAI (GPT-4, GPT-4o-mini, etc.)
99101
- Anthropic (Claude)

crates/bob-adapters/src/lib.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
//!
1616
//! All adapters are feature-gated to minimize dependencies:
1717
//!
18-
//! - **`llm-genai`** (default): LLM adapter using the [`genai`](https://crates.io/crates/genai)
18+
//! - **`llm-liter`** (default): LLM adapter using the [`liter-llm`](https://crates.io/crates/liter-llm)
1919
//! crate
2020
//! - **`mcp-rmcp`** (default): Tool adapter for MCP servers via [`rmcp`](https://crates.io/crates/rmcp)
2121
//! - **`skills-agent`** (default): Skill loading and composition via [`bob-skills`](https://crates.io/crates/bob-skills)
@@ -26,16 +26,18 @@
2626
//!
2727
//! ```rust,ignore
2828
//! use bob_adapters::{
29-
//! llm_genai::GenAiLlmAdapter,
29+
//! llm_liter::LiterLlmAdapter,
3030
//! mcp_rmcp::McpToolAdapter,
3131
//! store_memory::InMemorySessionStore,
3232
//! observe::TracingEventSink,
3333
//! };
34-
//! use genai::Client;
34+
//! use liter_llm::{ClientConfig, DefaultClient, LlmClient};
35+
//! use std::sync::Arc;
3536
//!
3637
//! // LLM adapter
37-
//! let client = Client::default();
38-
//! let llm = GenAiLlmAdapter::new(client);
38+
//! let config = ClientConfig::new(std::env::var("OPENAI_API_KEY").unwrap_or_default());
39+
//! let client = Arc::new(DefaultClient::new(config, None).unwrap());
40+
//! let llm = LiterLlmAdapter::new(client);
3941
//!
4042
//! // Tool adapter (MCP server)
4143
//! let tools = McpToolAdapter::connect_stdio(
@@ -54,9 +56,9 @@
5456
//!
5557
//! ## Adapters
5658
//!
57-
//! ### LLM Adapters (`llm-genai`)
59+
//! ### LLM Adapters (`llm-liter`)
5860
//!
59-
//! Connects to LLM providers through the `genai` crate, supporting:
61+
//! Connects to LLM providers through the `liter-llm` crate, supporting:
6062
//! - OpenAI (GPT-4, GPT-4o-mini, etc.)
6163
//! - Anthropic (Claude)
6264
//! - Google (Gemini)
@@ -101,8 +103,8 @@ pub mod journal_memory;
101103
pub mod openai_schema;
102104
pub mod tape_memory;
103105

104-
#[cfg(feature = "llm-genai")]
105-
pub mod llm_genai;
106+
#[cfg(feature = "llm-liter")]
107+
pub mod llm_liter;
106108

107109
#[cfg(feature = "mcp-rmcp")]
108110
pub mod mcp_rmcp;

0 commit comments

Comments
 (0)