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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 75eebeb1fb346c1b47a939190522550015d928a771d73d532d6cdf3af93cbd0b
4
+ data.tar.gz: 929b7559a37ee03dbc467673f4a6f4bd05e1885a98af7cf82da5199ca308d0ba
5
+ SHA512:
6
+ metadata.gz: 8c39e44c430dea7e970a50b50c9ec7e71e37de2df58031614ac388f48f74d21d7f9f7b17b9de82af1395b85d7dc7816b6332a872a7fc2faf19915924fc3225e2
7
+ data.tar.gz: 5d9a2acc0229c7d3f9f5b1d9c78f4d8470749a42582cb428b8b12b5716fc63fdaebb4a53f4038d5b96a60dc4c7cc453f8b27bd82b383dbeab5180cb4b0585e8b
data/README.md ADDED
@@ -0,0 +1,239 @@
1
+ # Ruby
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 Ruby. Access 142+ LLM providers through a single interface with idiomatic Ruby API and native performance.
67
+
68
+
69
+ ## Installation
70
+
71
+ ### Package Installation
72
+
73
+
74
+ Install via one of the supported package managers:
75
+
76
+
77
+
78
+ **gem:**
79
+
80
+ ```bash
81
+ gem install liter_llm
82
+ ```
83
+
84
+
85
+
86
+
87
+ **Bundler:**
88
+
89
+ ```ruby
90
+ gem 'liter_llm'
91
+ ```
92
+
93
+
94
+
95
+
96
+
97
+ ### System Requirements
98
+
99
+
100
+ - **Ruby 3.2+** required
101
+ - API keys via environment variables (e.g. `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`)
102
+
103
+
104
+
105
+ ## Quick Start
106
+
107
+ ### Basic Chat
108
+
109
+ Send a message to any provider using the `provider/model` prefix:
110
+
111
+ ```ruby
112
+ # frozen_string_literal: true
113
+
114
+ require "liter_llm"
115
+ require "json"
116
+
117
+ client = LiterLlm::LlmClient.new(ENV.fetch("OPENAI_API_KEY"), {})
118
+
119
+ response = JSON.parse(client.chat(JSON.generate(
120
+ model: "openai/gpt-4o",
121
+ messages: [{ role: "user", content: "Hello!" }]
122
+ )))
123
+
124
+ puts response.dig("choices", 0, "message", "content")
125
+ ```
126
+
127
+
128
+ ### Common Use Cases
129
+
130
+
131
+ #### Streaming Responses
132
+
133
+ Stream tokens in real time:
134
+
135
+ ```ruby
136
+ # frozen_string_literal: true
137
+
138
+ require "liter_llm"
139
+ require "json"
140
+
141
+ client = LiterLlm::LlmClient.new(ENV.fetch("OPENAI_API_KEY"), {})
142
+
143
+ chunks = JSON.parse(client.chat_stream(JSON.generate(
144
+ model: "openai/gpt-4o-mini",
145
+ messages: [{ role: "user", content: "Hello" }]
146
+ )))
147
+
148
+ chunks.each { |chunk| puts chunk }
149
+ ```
150
+
151
+
152
+
153
+
154
+
155
+ ### Next Steps
156
+
157
+ - **[Provider Registry](https://github.com/kreuzberg-dev/liter-llm/blob/main/schemas/providers.json)** - Full list of supported providers
158
+ - **[GitHub Repository](https://github.com/kreuzberg-dev/liter-llm)** - Source, issues, and discussions
159
+
160
+
161
+
162
+ ## Features
163
+
164
+ ### Supported Providers (142+)
165
+
166
+ Route to any provider using the `provider/model` prefix convention:
167
+
168
+ | Provider | Example Model |
169
+ |----------|--------------|
170
+ | **OpenAI** | `openai/gpt-4o`, `openai/gpt-4o-mini` |
171
+ | **Anthropic** | `anthropic/claude-3-5-sonnet-20241022` |
172
+ | **Groq** | `groq/llama-3.1-70b-versatile` |
173
+ | **Mistral** | `mistral/mistral-large-latest` |
174
+ | **Cohere** | `cohere/command-r-plus` |
175
+ | **Together AI** | `together/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo` |
176
+ | **Fireworks** | `fireworks/accounts/fireworks/models/llama-v3p1-70b-instruct` |
177
+ | **Google Vertex** | `vertexai/gemini-1.5-pro` |
178
+ | **Amazon Bedrock** | `bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0` |
179
+
180
+ **[Complete Provider List](https://github.com/kreuzberg-dev/liter-llm/blob/main/schemas/providers.json)**
181
+
182
+ ### Key Capabilities
183
+
184
+ - **Provider Routing** -- Single client for 142+ LLM providers via `provider/model` prefix
185
+ - **Unified API** -- Consistent `chat`, `chat_stream`, `embeddings`, `list_models` interface
186
+
187
+ - **Streaming** -- Real-time token streaming via `chat_stream`
188
+
189
+
190
+ - **Tool Calling** -- Function calling and tool use across all supporting providers
191
+
192
+ - **Type Safe** -- Schema-driven types compiled from JSON schemas
193
+ - **Secure** -- API keys never logged or serialized, managed via environment variables
194
+ - **Observability** -- Built-in [OpenTelemetry](https://opentelemetry.io/docs/specs/semconv/gen-ai/) with GenAI semantic conventions
195
+ - **Error Handling** -- Structured errors with provider context and retry hints
196
+
197
+ ### Performance
198
+
199
+ Built on a compiled Rust core for speed and safety:
200
+
201
+ - **Provider resolution** at client construction -- zero per-request overhead
202
+ - **Configurable timeouts** and connection pooling
203
+ - **Zero-copy streaming** with SSE and AWS EventStream support
204
+ - **API keys** wrapped in secure memory, zeroed on drop
205
+
206
+
207
+
208
+ ## Provider Routing
209
+
210
+ Route to 142+ providers using the `provider/model` prefix convention:
211
+
212
+ ```text
213
+ openai/gpt-4o
214
+ anthropic/claude-3-5-sonnet-20241022
215
+ groq/llama-3.1-70b-versatile
216
+ mistral/mistral-large-latest
217
+ ```
218
+
219
+ See the [provider registry](https://github.com/kreuzberg-dev/liter-llm/blob/main/schemas/providers.json) for the full list.
220
+
221
+
222
+
223
+ ## Documentation
224
+
225
+ - **[Documentation](https://docs.liter-llm.kreuzberg.dev)** -- Full docs and API reference
226
+ - **[GitHub Repository](https://github.com/kreuzberg-dev/liter-llm)** -- Source, issues, and discussions
227
+ - **[Provider Registry](https://github.com/kreuzberg-dev/liter-llm/blob/main/schemas/providers.json)** -- 142 supported providers
228
+
229
+ Part of [kreuzberg.dev](https://kreuzberg.dev).
230
+
231
+ ## Contributing
232
+
233
+ Contributions are welcome! See [CONTRIBUTING.md](https://github.com/kreuzberg-dev/liter-llm/blob/main/CONTRIBUTING.md) for guidelines.
234
+
235
+ Join our [Discord community](https://discord.gg/xt9WY3GnKR) for questions and discussion.
236
+
237
+ ## License
238
+
239
+ MIT -- see [LICENSE](https://github.com/kreuzberg-dev/liter-llm/blob/main/LICENSE) for details.
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mkmf'
4
+ require 'rb_sys/mkmf'
5
+ require 'rbconfig'
6
+ require 'fileutils'
7
+
8
+ if Gem.win_platform?
9
+ # Use CI-provided CARGO_TARGET_DIR if available, otherwise use a short path
10
+ # GitHub Actions sets CARGO_TARGET_DIR=C:\t for MAX_PATH mitigation
11
+ if ENV['CARGO_TARGET_DIR']
12
+ puts "Windows detected: Using existing CARGO_TARGET_DIR=#{ENV['CARGO_TARGET_DIR']}"
13
+ else
14
+ # Try C:\t first (CI convention), fall back to D:/ll-build
15
+ short_target_dir = Dir.exist?('C:/t') ? 'C:/t' : 'C:/ll-build'
16
+ begin
17
+ FileUtils.mkdir_p(short_target_dir)
18
+ ENV['CARGO_TARGET_DIR'] = short_target_dir
19
+ ENV['OUT_DIR'] = short_target_dir
20
+ puts "Windows detected: Using short build path #{short_target_dir}"
21
+ rescue StandardError => e
22
+ puts "Warning: Could not create short path #{short_target_dir}: #{e.message}"
23
+ # Fall back to relative path which rb_sys will handle
24
+ end
25
+ end
26
+ end
27
+
28
+ if /mswin|mingw/.match?(RbConfig::CONFIG['host_os'])
29
+ devkit = ENV.fetch('RI_DEVKIT', nil)
30
+ prefix = ENV['MSYSTEM_PREFIX'] || '/ucrt64'
31
+
32
+ # Set up include paths for MSVC compatibility headers
33
+ native_include = File.expand_path('native/include', __dir__).tr('\\', '/')
34
+ compat_include = File.expand_path('native/include/msvc_compat', __dir__).tr('\\', '/')
35
+
36
+ extra_args = []
37
+ extra_args << "-I#{native_include}"
38
+ extra_args << "-I#{compat_include}"
39
+
40
+ # Add Windows-specific flags for better compatibility
41
+ extra_args << '-fms-extensions'
42
+ extra_args << '-fno-omit-frame-pointer'
43
+
44
+ if devkit
45
+ sysroot = "#{devkit}#{prefix}".tr('\\', '/')
46
+ extra_args.push('--target=x86_64-pc-windows-gnu', "--sysroot=#{sysroot}")
47
+ end
48
+
49
+ unless extra_args.empty?
50
+ existing = ENV['BINDGEN_EXTRA_CLANG_ARGS'].to_s.split(/\s+/).reject(&:empty?)
51
+ ENV['BINDGEN_EXTRA_CLANG_ARGS'] = (existing + extra_args).uniq.join(' ')
52
+ puts "BINDGEN_EXTRA_CLANG_ARGS set to: #{ENV.fetch('BINDGEN_EXTRA_CLANG_ARGS', nil)}"
53
+ end
54
+
55
+ # Set target for Windows GNU toolchain if not already set
56
+ ENV['CARGO_BUILD_TARGET'] ||= 'x86_64-pc-windows-gnu' if devkit || ENV['MSYSTEM']
57
+ end
58
+
59
+ default_profile = ENV.fetch('CARGO_PROFILE', 'release')
60
+ native_dir = 'native'
61
+
62
+ create_rust_makefile('liter_llm_rb') do |config|
63
+ config.profile = default_profile.to_sym
64
+ config.ext_dir = native_dir
65
+ end
@@ -0,0 +1,23 @@
1
+ [build]
2
+ rustflags = ["-A", "unpredictable-function-pointer-comparisons", "-A", "fn_ptr_eq"]
3
+
4
+ # Windows GNU target configuration
5
+ [target.x86_64-pc-windows-gnu]
6
+ rustflags = [
7
+ "-A",
8
+ "unpredictable-function-pointer-comparisons",
9
+ "-A",
10
+ "fn_ptr_eq",
11
+ "-C",
12
+ "link-arg=-lbcrypt",
13
+ "-C",
14
+ "link-arg=-lcrypt32",
15
+ "-C",
16
+ "link-arg=-lws2_32",
17
+ "-C",
18
+ "link-arg=-luserenv",
19
+ ]
20
+
21
+ # Windows MSVC target configuration (fallback)
22
+ [target.x86_64-pc-windows-msvc]
23
+ rustflags = ["-A", "unpredictable-function-pointer-comparisons", "-A", "fn_ptr_eq"]