liter_llm 1.0.0.pre.rc.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +239 -0
  3. data/ext/liter_llm_rb/extconf.rb +65 -0
  4. data/ext/liter_llm_rb/native/.cargo/config.toml +23 -0
  5. data/ext/liter_llm_rb/native/Cargo.lock +3713 -0
  6. data/ext/liter_llm_rb/native/Cargo.toml +32 -0
  7. data/ext/liter_llm_rb/native/build.rs +15 -0
  8. data/ext/liter_llm_rb/native/src/lib.rs +1079 -0
  9. data/lib/liter_llm.rb +8 -0
  10. data/sig/liter_llm.rbs +416 -0
  11. data/vendor/Cargo.toml +54 -0
  12. data/vendor/liter-llm/Cargo.toml +92 -0
  13. data/vendor/liter-llm/README.md +252 -0
  14. data/vendor/liter-llm/schemas/pricing.json +40 -0
  15. data/vendor/liter-llm/schemas/providers.json +1662 -0
  16. data/vendor/liter-llm/src/auth/azure_ad.rs +264 -0
  17. data/vendor/liter-llm/src/auth/bedrock_sts.rs +353 -0
  18. data/vendor/liter-llm/src/auth/mod.rs +68 -0
  19. data/vendor/liter-llm/src/auth/vertex_oauth.rs +353 -0
  20. data/vendor/liter-llm/src/client/config.rs +351 -0
  21. data/vendor/liter-llm/src/client/managed.rs +622 -0
  22. data/vendor/liter-llm/src/client/mod.rs +864 -0
  23. data/vendor/liter-llm/src/cost.rs +212 -0
  24. data/vendor/liter-llm/src/error.rs +190 -0
  25. data/vendor/liter-llm/src/http/eventstream.rs +860 -0
  26. data/vendor/liter-llm/src/http/mod.rs +12 -0
  27. data/vendor/liter-llm/src/http/request.rs +438 -0
  28. data/vendor/liter-llm/src/http/retry.rs +72 -0
  29. data/vendor/liter-llm/src/http/streaming.rs +289 -0
  30. data/vendor/liter-llm/src/lib.rs +37 -0
  31. data/vendor/liter-llm/src/provider/anthropic.rs +2250 -0
  32. data/vendor/liter-llm/src/provider/azure.rs +579 -0
  33. data/vendor/liter-llm/src/provider/bedrock.rs +1543 -0
  34. data/vendor/liter-llm/src/provider/cohere.rs +654 -0
  35. data/vendor/liter-llm/src/provider/custom.rs +404 -0
  36. data/vendor/liter-llm/src/provider/google_ai.rs +281 -0
  37. data/vendor/liter-llm/src/provider/mistral.rs +188 -0
  38. data/vendor/liter-llm/src/provider/mod.rs +616 -0
  39. data/vendor/liter-llm/src/provider/vertex.rs +1504 -0
  40. data/vendor/liter-llm/src/tests.rs +1425 -0
  41. data/vendor/liter-llm/src/tokenizer.rs +281 -0
  42. data/vendor/liter-llm/src/tower/budget.rs +599 -0
  43. data/vendor/liter-llm/src/tower/cache.rs +502 -0
  44. data/vendor/liter-llm/src/tower/cache_opendal.rs +270 -0
  45. data/vendor/liter-llm/src/tower/cooldown.rs +231 -0
  46. data/vendor/liter-llm/src/tower/cost.rs +404 -0
  47. data/vendor/liter-llm/src/tower/fallback.rs +121 -0
  48. data/vendor/liter-llm/src/tower/health.rs +219 -0
  49. data/vendor/liter-llm/src/tower/hooks.rs +369 -0
  50. data/vendor/liter-llm/src/tower/mod.rs +77 -0
  51. data/vendor/liter-llm/src/tower/rate_limit.rs +300 -0
  52. data/vendor/liter-llm/src/tower/router.rs +436 -0
  53. data/vendor/liter-llm/src/tower/service.rs +181 -0
  54. data/vendor/liter-llm/src/tower/tests.rs +539 -0
  55. data/vendor/liter-llm/src/tower/tests_common.rs +252 -0
  56. data/vendor/liter-llm/src/tower/tracing.rs +209 -0
  57. data/vendor/liter-llm/src/tower/types.rs +170 -0
  58. data/vendor/liter-llm/src/types/audio.rs +52 -0
  59. data/vendor/liter-llm/src/types/batch.rs +77 -0
  60. data/vendor/liter-llm/src/types/chat.rs +214 -0
  61. data/vendor/liter-llm/src/types/common.rs +244 -0
  62. data/vendor/liter-llm/src/types/embedding.rs +84 -0
  63. data/vendor/liter-llm/src/types/files.rs +58 -0
  64. data/vendor/liter-llm/src/types/image.rs +40 -0
  65. data/vendor/liter-llm/src/types/mod.rs +27 -0
  66. data/vendor/liter-llm/src/types/models.rs +21 -0
  67. data/vendor/liter-llm/src/types/moderation.rs +80 -0
  68. data/vendor/liter-llm/src/types/ocr.rs +87 -0
  69. data/vendor/liter-llm/src/types/rerank.rs +46 -0
  70. data/vendor/liter-llm/src/types/responses.rs +55 -0
  71. data/vendor/liter-llm/src/types/search.rs +45 -0
  72. data/vendor/liter-llm/tests/contract.rs +332 -0
  73. data/vendor/liter-llm-ffi/Cargo.toml +30 -0
  74. data/vendor/liter-llm-ffi/build.rs +66 -0
  75. data/vendor/liter-llm-ffi/cbindgen.toml +60 -0
  76. data/vendor/liter-llm-ffi/liter_llm.h +850 -0
  77. data/vendor/liter-llm-ffi/src/lib.rs +2488 -0
  78. metadata +286 -0
@@ -0,0 +1,252 @@
1
+ # Rust
2
+
3
+ <div align="center" style="display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin: 20px 0;">
4
+ <!-- Language Bindings -->
5
+ <a href="https://crates.io/crates/liter-llm">
6
+ <img src="https://img.shields.io/crates/v/liter-llm?label=Rust&color=007ec6" alt="Rust">
7
+ </a>
8
+ <a href="https://pypi.org/project/liter-llm/">
9
+ <img src="https://img.shields.io/pypi/v/liter-llm?label=Python&color=007ec6" alt="Python">
10
+ </a>
11
+ <a href="https://www.npmjs.com/package/@kreuzberg/liter-llm">
12
+ <img src="https://img.shields.io/npm/v/@kreuzberg/liter-llm?label=Node.js&color=007ec6" alt="Node.js">
13
+ </a>
14
+ <a href="https://www.npmjs.com/package/@kreuzberg/liter-llm-wasm">
15
+ <img src="https://img.shields.io/npm/v/@kreuzberg/liter-llm-wasm?label=WASM&color=007ec6" alt="WASM">
16
+ </a>
17
+ <a href="https://central.sonatype.com/artifact/dev.kreuzberg/liter-llm">
18
+ <img src="https://img.shields.io/maven-central/v/dev.kreuzberg/liter-llm?label=Java&color=007ec6" alt="Java">
19
+ </a>
20
+ <a href="https://github.com/kreuzberg-dev/liter-llm/tree/main/packages/go">
21
+ <img src="https://img.shields.io/github/v/tag/kreuzberg-dev/liter-llm?label=Go&color=007ec6" alt="Go">
22
+ </a>
23
+ <a href="https://www.nuget.org/packages/LiterLlm">
24
+ <img src="https://img.shields.io/nuget/v/LiterLlm?label=C%23&color=007ec6" alt="C#">
25
+ </a>
26
+ <a href="https://packagist.org/packages/kreuzberg/liter-llm">
27
+ <img src="https://img.shields.io/packagist/v/kreuzberg/liter-llm?label=PHP&color=007ec6" alt="PHP">
28
+ </a>
29
+ <a href="https://rubygems.org/gems/liter_llm">
30
+ <img src="https://img.shields.io/gem/v/liter_llm?label=Ruby&color=007ec6" alt="Ruby">
31
+ </a>
32
+ <a href="https://hex.pm/packages/liter_llm">
33
+ <img src="https://img.shields.io/hexpm/v/liter_llm?label=Elixir&color=007ec6" alt="Elixir">
34
+ </a>
35
+ <a href="https://github.com/kreuzberg-dev/liter-llm/pkgs/container/liter-llm">
36
+ <img src="https://img.shields.io/badge/Docker-007ec6?logo=docker&logoColor=white" alt="Docker">
37
+ </a>
38
+ <a href="https://github.com/kreuzberg-dev/liter-llm/tree/main/crates/liter-llm-ffi">
39
+ <img src="https://img.shields.io/badge/C-FFI-007ec6" alt="C FFI">
40
+ </a>
41
+
42
+ <!-- Project Info -->
43
+ <a href="https://github.com/kreuzberg-dev/liter-llm/blob/main/LICENSE">
44
+ <img src="https://img.shields.io/badge/License-MIT-007ec6" alt="License">
45
+ </a>
46
+ <a href="https://docs.liter-llm.kreuzberg.dev">
47
+ <img src="https://img.shields.io/badge/docs-kreuzberg.dev-007ec6" alt="Docs">
48
+ </a>
49
+ </div>
50
+
51
+
52
+ <div align="center" style="margin: 20px 0;">
53
+ <picture>
54
+ <img width="100%" alt="kreuzberg.dev" src="https://github.com/user-attachments/assets/1b6c6ad7-3b6d-4171-b1c9-f2026cc9deb8" />
55
+ </picture>
56
+ </div>
57
+
58
+
59
+ <div align="center" style="margin-bottom: 20px;">
60
+ <a href="https://discord.gg/xt9WY3GnKR">
61
+ <img height="22" src="https://img.shields.io/badge/Discord-Join%20our%20community-7289da?logo=discord&logoColor=white" alt="Discord">
62
+ </a>
63
+ </div>
64
+
65
+
66
+ Universal LLM API client for Rust. Access 142+ LLM providers — OpenAI, Anthropic, Groq, Mistral, and more — through a single unified interface. Async/await with Tokio, streaming via BoxStream, composable Tower middleware stack, and compile-time type safety.
67
+
68
+
69
+ ## Installation
70
+
71
+ ### Package Installation
72
+
73
+
74
+
75
+
76
+
77
+
78
+ ### System Requirements
79
+
80
+
81
+ - See [Installation Guide](https://github.com/kreuzberg-dev/liter-llm#installation) for requirements
82
+
83
+
84
+
85
+ ## Quick Start
86
+
87
+ ### Basic Chat
88
+
89
+ Send a message to any provider using the `provider/model` prefix:
90
+
91
+ ```rust
92
+ use liter_llm::{
93
+ ChatCompletionRequest, ClientConfigBuilder, DefaultClient, LlmClient,
94
+ Message, UserContent, UserMessage,
95
+ };
96
+
97
+ #[tokio::main]
98
+ async fn main() -> Result<(), Box<dyn std::error::Error>> {
99
+ let config = ClientConfigBuilder::new(std::env::var("OPENAI_API_KEY")?)
100
+ .build();
101
+ let client = DefaultClient::new(config, Some("openai/gpt-4o"))?;
102
+
103
+ let request = ChatCompletionRequest {
104
+ model: "openai/gpt-4o".into(),
105
+ messages: vec![Message::User(UserMessage {
106
+ content: UserContent::Text("Hello!".into()),
107
+ name: None,
108
+ })],
109
+ ..Default::default()
110
+ };
111
+
112
+ let response = client.chat(request).await?;
113
+ if let Some(choice) = response.choices.first() {
114
+ println!("{}", choice.message.content.as_deref().unwrap_or(""));
115
+ }
116
+ Ok(())
117
+ }
118
+ ```
119
+
120
+
121
+ ### Common Use Cases
122
+
123
+
124
+ #### Streaming Responses
125
+
126
+ Stream tokens in real time:
127
+
128
+ ```rust
129
+ use futures::StreamExt;
130
+ use liter_llm::{
131
+ ChatCompletionRequest, ClientConfigBuilder, DefaultClient, LlmClient,
132
+ Message, UserContent, UserMessage,
133
+ };
134
+
135
+ #[tokio::main]
136
+ async fn main() -> Result<(), Box<dyn std::error::Error>> {
137
+ let config = ClientConfigBuilder::new(std::env::var("OPENAI_API_KEY")?)
138
+ .build();
139
+ let client = DefaultClient::new(config, Some("openai/gpt-4o"))?;
140
+
141
+ let request = ChatCompletionRequest {
142
+ model: "openai/gpt-4o".into(),
143
+ messages: vec![Message::User(UserMessage {
144
+ content: UserContent::Text("Tell me a story".into()),
145
+ name: None,
146
+ })],
147
+ ..Default::default()
148
+ };
149
+
150
+ let mut stream = client.chat_stream(request).await?;
151
+ while let Some(chunk) = stream.next().await {
152
+ let chunk = chunk?;
153
+ if let Some(choice) = chunk.choices.first() {
154
+ if let Some(content) = &choice.delta.content {
155
+ print!("{content}");
156
+ }
157
+ }
158
+ }
159
+ println!();
160
+ Ok(())
161
+ }
162
+ ```
163
+
164
+
165
+
166
+
167
+
168
+ ### Next Steps
169
+
170
+ - **[Provider Registry](https://github.com/kreuzberg-dev/liter-llm/blob/main/schemas/providers.json)** - Full list of supported providers
171
+ - **[GitHub Repository](https://github.com/kreuzberg-dev/liter-llm)** - Source, issues, and discussions
172
+
173
+
174
+
175
+ ## Features
176
+
177
+ ### Supported Providers (142+)
178
+
179
+ Route to any provider using the `provider/model` prefix convention:
180
+
181
+ | Provider | Example Model |
182
+ |----------|--------------|
183
+ | **OpenAI** | `openai/gpt-4o`, `openai/gpt-4o-mini` |
184
+ | **Anthropic** | `anthropic/claude-3-5-sonnet-20241022` |
185
+ | **Groq** | `groq/llama-3.1-70b-versatile` |
186
+ | **Mistral** | `mistral/mistral-large-latest` |
187
+ | **Cohere** | `cohere/command-r-plus` |
188
+ | **Together AI** | `together/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo` |
189
+ | **Fireworks** | `fireworks/accounts/fireworks/models/llama-v3p1-70b-instruct` |
190
+ | **Google Vertex** | `vertexai/gemini-1.5-pro` |
191
+ | **Amazon Bedrock** | `bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0` |
192
+
193
+ **[Complete Provider List](https://github.com/kreuzberg-dev/liter-llm/blob/main/schemas/providers.json)**
194
+
195
+ ### Key Capabilities
196
+
197
+ - **Provider Routing** -- Single client for 142+ LLM providers via `provider/model` prefix
198
+ - **Unified API** -- Consistent `chat`, `chat_stream`, `embeddings`, `list_models` interface
199
+
200
+ - **Streaming** -- Real-time token streaming via `chat_stream`
201
+
202
+
203
+ - **Tool Calling** -- Function calling and tool use across all supporting providers
204
+
205
+ - **Type Safe** -- Schema-driven types compiled from JSON schemas
206
+ - **Secure** -- API keys never logged or serialized, managed via environment variables
207
+ - **Observability** -- Built-in [OpenTelemetry](https://opentelemetry.io/docs/specs/semconv/gen-ai/) with GenAI semantic conventions
208
+ - **Error Handling** -- Structured errors with provider context and retry hints
209
+
210
+ ### Performance
211
+
212
+ Built on a compiled Rust core for speed and safety:
213
+
214
+ - **Provider resolution** at client construction -- zero per-request overhead
215
+ - **Configurable timeouts** and connection pooling
216
+ - **Zero-copy streaming** with SSE and AWS EventStream support
217
+ - **API keys** wrapped in secure memory, zeroed on drop
218
+
219
+
220
+
221
+ ## Provider Routing
222
+
223
+ Route to 142+ providers using the `provider/model` prefix convention:
224
+
225
+ ```text
226
+ openai/gpt-4o
227
+ anthropic/claude-3-5-sonnet-20241022
228
+ groq/llama-3.1-70b-versatile
229
+ mistral/mistral-large-latest
230
+ ```
231
+
232
+ See the [provider registry](https://github.com/kreuzberg-dev/liter-llm/blob/main/schemas/providers.json) for the full list.
233
+
234
+
235
+
236
+ ## Documentation
237
+
238
+ - **[Documentation](https://docs.liter-llm.kreuzberg.dev)** -- Full docs and API reference
239
+ - **[GitHub Repository](https://github.com/kreuzberg-dev/liter-llm)** -- Source, issues, and discussions
240
+ - **[Provider Registry](https://github.com/kreuzberg-dev/liter-llm/blob/main/schemas/providers.json)** -- 142 supported providers
241
+
242
+ Part of [kreuzberg.dev](https://kreuzberg.dev).
243
+
244
+ ## Contributing
245
+
246
+ Contributions are welcome! See [CONTRIBUTING.md](https://github.com/kreuzberg-dev/liter-llm/blob/main/CONTRIBUTING.md) for guidelines.
247
+
248
+ Join our [Discord community](https://discord.gg/xt9WY3GnKR) for questions and discussion.
249
+
250
+ ## License
251
+
252
+ MIT -- see [LICENSE](https://github.com/kreuzberg-dev/liter-llm/blob/main/LICENSE) for details.
@@ -0,0 +1,40 @@
1
+ {
2
+ "$comment": "Model pricing data derived from litellm (MIT License, Copyright 2023 Berri AI). Prices in USD per token. Source: https://github.com/BerriAI/litellm",
3
+ "models": {
4
+ "gpt-4": { "input_cost_per_token": 0.00003, "output_cost_per_token": 0.00006 },
5
+ "gpt-4-turbo": { "input_cost_per_token": 0.00001, "output_cost_per_token": 0.00003 },
6
+ "gpt-4o": { "input_cost_per_token": 0.0000025, "output_cost_per_token": 0.00001 },
7
+ "gpt-4o-mini": { "input_cost_per_token": 0.00000015, "output_cost_per_token": 0.0000006 },
8
+ "gpt-3.5-turbo": { "input_cost_per_token": 0.0000005, "output_cost_per_token": 0.0000015 },
9
+ "o1": { "input_cost_per_token": 0.000015, "output_cost_per_token": 0.00006 },
10
+ "o3": { "input_cost_per_token": 0.000002, "output_cost_per_token": 0.000008 },
11
+ "o3-mini": { "input_cost_per_token": 0.0000011, "output_cost_per_token": 0.0000044 },
12
+ "claude-3-haiku-20240307": { "input_cost_per_token": 0.00000025, "output_cost_per_token": 0.00000125 },
13
+ "claude-3-opus-20240229": { "input_cost_per_token": 0.000015, "output_cost_per_token": 0.000075 },
14
+ "claude-3-7-sonnet-20250219": { "input_cost_per_token": 0.000003, "output_cost_per_token": 0.000015 },
15
+ "claude-haiku-4-5": { "input_cost_per_token": 0.000001, "output_cost_per_token": 0.000005 },
16
+ "claude-haiku-4-5-20251001": { "input_cost_per_token": 0.000001, "output_cost_per_token": 0.000005 },
17
+ "claude-sonnet-4-5": { "input_cost_per_token": 0.000003, "output_cost_per_token": 0.000015 },
18
+ "claude-sonnet-4-5-20250929": { "input_cost_per_token": 0.000003, "output_cost_per_token": 0.000015 },
19
+ "claude-sonnet-4-6": { "input_cost_per_token": 0.000003, "output_cost_per_token": 0.000015 },
20
+ "claude-4-sonnet-20250514": { "input_cost_per_token": 0.000003, "output_cost_per_token": 0.000015 },
21
+ "claude-sonnet-4-20250514": { "input_cost_per_token": 0.000003, "output_cost_per_token": 0.000015 },
22
+ "claude-opus-4-1": { "input_cost_per_token": 0.000015, "output_cost_per_token": 0.000075 },
23
+ "claude-opus-4-5": { "input_cost_per_token": 0.000005, "output_cost_per_token": 0.000025 },
24
+ "claude-opus-4-6": { "input_cost_per_token": 0.000005, "output_cost_per_token": 0.000025 },
25
+ "claude-4-opus-20250514": { "input_cost_per_token": 0.000015, "output_cost_per_token": 0.000075 },
26
+ "gemini-2.0-flash": { "input_cost_per_token": 0.0000001, "output_cost_per_token": 0.0000004 },
27
+ "gemini-2.0-flash-lite": { "input_cost_per_token": 0.000000075, "output_cost_per_token": 0.0000003 },
28
+ "gemini-2.5-flash": { "input_cost_per_token": 0.0000003, "output_cost_per_token": 0.0000025 },
29
+ "gemini-2.5-pro": { "input_cost_per_token": 0.00000125, "output_cost_per_token": 0.00001 },
30
+ "text-embedding-3-small": { "input_cost_per_token": 0.00000002, "output_cost_per_token": 0.0 },
31
+ "text-embedding-3-large": { "input_cost_per_token": 0.00000013, "output_cost_per_token": 0.0 },
32
+ "text-embedding-ada-002": { "input_cost_per_token": 0.0000001, "output_cost_per_token": 0.0 },
33
+ "deepseek/deepseek-chat": { "input_cost_per_token": 0.00000028, "output_cost_per_token": 0.00000042 },
34
+ "deepseek/deepseek-r1": { "input_cost_per_token": 0.00000055, "output_cost_per_token": 0.00000219 },
35
+ "mistral/mistral-large-latest": { "input_cost_per_token": 0.0000005, "output_cost_per_token": 0.0000015 },
36
+ "mistral/mistral-small-latest": { "input_cost_per_token": 0.00000006, "output_cost_per_token": 0.00000018 },
37
+ "groq/llama-3.1-8b-instant": { "input_cost_per_token": 0.00000005, "output_cost_per_token": 0.00000008 },
38
+ "groq/llama-3.3-70b-versatile": { "input_cost_per_token": 0.00000059, "output_cost_per_token": 0.00000079 }
39
+ }
40
+ }