llm-connector
Minimal Rust library for LLM protocol abstraction.
Supports 4 protocols: OpenAI, Anthropic, Aliyun, Ollama. No complex configuration - just pick a protocol and start chatting.
✨ Key Features
- 4 Protocol Support: OpenAI, Anthropic, Aliyun, Ollama
- No Hardcoded Models: Use any model name without restrictions
- Online Model Discovery: Fetch available models dynamically from API
- Streaming Support: Real-time streaming responses (optional feature)
- Unified Interface: Same API for all protocols
- Type-Safe: Full Rust type safety with async/await
Quick Start
Installation
Add to your Cargo.toml:
[]
= "0.2.2"
= { = "1", = ["full"] }
Optional features:
= { = "0.2.2", = ["streaming"] }
Basic Usage
use ;
async
Supported Protocols
1. OpenAI Protocol
Standard OpenAI API format.
// OpenAI
let client = openai;
// OpenAI-compatible endpoints (if needed)
let client = openai_compatible;
Features:
- ✅ No hardcoded models - use any model name
- ✅ Online model discovery via
fetch_models() - ✅ Works with OpenAI-compatible providers (DeepSeek, Zhipu, Moonshot, etc.)
Example Models: gpt-4, gpt-4-turbo, gpt-3.5-turbo, o1-preview, o1-mini
2. Anthropic Protocol
Claude Messages API with separate system messages.
let client = anthropic;
Models: claude-3-5-sonnet-20241022, claude-3-opus, claude-3-haiku
3. Aliyun Protocol (DashScope)
Custom protocol for Qwen models.
let client = aliyun;
Models: qwen-turbo, qwen-plus, qwen-max
4. Ollama Protocol (Local)
Local LLM server with no API key required.
// Default: localhost:11434
let client = ollama;
// Custom URL
let client = ollama_at;
Models: llama3.2, llama3.1, mistral, mixtral, qwen2.5, etc.
Model Discovery
Fetch the latest available models from the API:
let client = openai;
// Fetch models online from the API
let models = client.fetch_models.await?;
println!;
Supported by:
- ✅ OpenAI Protocol (including OpenAI-compatible providers like DeepSeek, Zhipu, Moonshot)
- ❌ Anthropic Protocol (not supported)
- ❌ Aliyun Protocol (not supported)
- ❌ Ollama Protocol (not supported)
Example Results:
- DeepSeek:
["deepseek-chat", "deepseek-reasoner"] - Zhipu:
["glm-4.5", "glm-4.5-air", "glm-4.6"] - Moonshot:
["moonshot-v1-32k", "kimi-latest", ...]
Recommendation:
- Cache
fetch_models()results to avoid repeated API calls - For protocols that don't support model listing, you can use any model name directly in your requests
Request Examples
OpenAI / OpenAI-compatible
let request = ChatRequest ;
Anthropic (requires max_tokens)
let request = ChatRequest ;
Aliyun (DashScope)
let request = ChatRequest ;
Ollama (Local)
let request = ChatRequest ;
Streaming (Optional Feature)
Enable streaming in your Cargo.toml:
= { = "0.2.2", = ["streaming"] }
use StreamExt;
let mut stream = client.chat_stream.await?;
while let Some = stream.next.await
Error Handling
use LlmConnectorError;
match client.chat.await
Configuration
Simple API Key (Recommended)
let client = openai;
Environment Variables
use env;
let api_key = var?;
let client = openai;
Protocol Information
let client = openai;
// Get protocol name
println!;
// Get static models (fast, no API call)
println!;
// Fetch models online (requires API call)
let models = client.fetch_models.await?;
println!;
Recent Changes
v0.2.1 (Latest)
✨ New Features:
- Added
fetch_models()for online model discovery - OpenAI protocol now supports dynamic model fetching from
/v1/modelsendpoint - Works with OpenAI-compatible providers (DeepSeek, Zhipu, Moonshot, etc.)
🔧 Improvements:
- Removed hardcoded model lists from OpenAI protocol
supported_models()now returns empty[]for OpenAI (usefetch_models()instead)- Added
UnsupportedOperationerror for protocols without model listing - Added HTTP GET support to transport layer
📝 Documentation:
- Updated README with model discovery examples
- Added comprehensive examples:
test_fetch_models.rs,fetch_models_simple.rs - Created
FETCH_MODELS_FEATURE.mdwith detailed documentation
Design Philosophy
Minimal by Design:
- Only 4 protocols to cover all major LLM providers
- No hardcoded model restrictions - use any model name
- No complex configuration files or registries
- Direct API usage with clear abstractions
Protocol-first:
- Group providers by API protocol, not by company
- OpenAI-compatible providers share one implementation
- Extensible through protocol adapters
Examples
Check out the examples/ directory:
# Test online model fetching with all providers
# Compare supported_models() vs fetch_models()
# Test with your API keys from keys.yaml
Example Descriptions
test_fetch_models.rs
- Tests
fetch_models()with all providers fromkeys.yaml - Shows which providers support online model listing
- Displays available models for each provider
fetch_models_simple.rs
- Simple comparison between
supported_models()andfetch_models() - Demonstrates the difference between static and online model discovery
- Includes usage recommendations
test_with_keys.rs
- Comprehensive test with real API keys
- Tests chat completion for all providers
- Verifies API connectivity and responses
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
MIT