durable-llm 0.1.4 → 0.1.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.
- checksums.yaml +4 -4
- data/.envrc +7 -0
- data/CHANGELOG.md +5 -0
- data/CLI.md +0 -2
- data/Gemfile +7 -9
- data/README.md +564 -30
- data/Rakefile +16 -6
- data/devenv.lock +171 -0
- data/devenv.nix +12 -0
- data/devenv.yaml +8 -0
- data/durable-llm.gemspec +52 -0
- data/examples/openai_quick_complete.rb +4 -2
- data/lib/durable/llm/cli.rb +218 -22
- data/lib/durable/llm/client.rb +228 -8
- data/lib/durable/llm/configuration.rb +163 -10
- data/lib/durable/llm/convenience.rb +102 -0
- data/lib/durable/llm/errors.rb +185 -0
- data/lib/durable/llm/provider_utilities.rb +201 -0
- data/lib/durable/llm/providers/anthropic.rb +232 -24
- data/lib/durable/llm/providers/azure_openai.rb +347 -0
- data/lib/durable/llm/providers/base.rb +220 -11
- data/lib/durable/llm/providers/cohere.rb +157 -11
- data/lib/durable/llm/providers/deepseek.rb +233 -0
- data/lib/durable/llm/providers/fireworks.rb +304 -0
- data/lib/durable/llm/providers/google.rb +327 -0
- data/lib/durable/llm/providers/groq.rb +133 -25
- data/lib/durable/llm/providers/huggingface.rb +120 -17
- data/lib/durable/llm/providers/mistral.rb +431 -0
- data/lib/durable/llm/providers/openai.rb +150 -4
- data/lib/durable/llm/providers/opencode.rb +253 -0
- data/lib/durable/llm/providers/openrouter.rb +256 -0
- data/lib/durable/llm/providers/perplexity.rb +273 -0
- data/lib/durable/llm/providers/together.rb +346 -0
- data/lib/durable/llm/providers/xai.rb +355 -0
- data/lib/durable/llm/providers.rb +113 -13
- data/lib/durable/llm/response_helpers.rb +185 -0
- data/lib/durable/llm/version.rb +5 -1
- data/lib/durable/llm.rb +214 -1
- data/lib/durable.rb +29 -4
- data/sig/durable/llm.rbs +303 -1
- metadata +106 -28
- data/Gemfile.lock +0 -103
data/sig/durable/llm.rbs
CHANGED
|
@@ -1,6 +1,308 @@
|
|
|
1
1
|
module Durable
|
|
2
2
|
module Llm
|
|
3
3
|
VERSION: String
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
def self.configure: () { (Configuration) -> void } -> void
|
|
6
|
+
def self.configuration: () -> Configuration
|
|
7
|
+
def self.config: () -> Configuration
|
|
8
|
+
|
|
9
|
+
class Error < StandardError
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class APIError < Error
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class RateLimitError < Error
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class AuthenticationError < Error
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class InvalidRequestError < Error
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class ResourceNotFoundError < Error
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class TimeoutError < Error
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class ServerError < Error
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class UnsupportedProviderError < Error
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class ConfigurationError < Error
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class ModelNotFoundError < Error
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class InsufficientQuotaError < Error
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class InvalidResponseError < Error
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class NetworkError < Error
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
class StreamingError < Error
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class Configuration
|
|
55
|
+
attr_accessor default_provider: String
|
|
56
|
+
attr_reader providers: Hash[Symbol, untyped]
|
|
57
|
+
|
|
58
|
+
def initialize: () -> void
|
|
59
|
+
def clear: () -> void
|
|
60
|
+
def load_from_datasette: () -> void
|
|
61
|
+
def load_from_env: () -> void
|
|
62
|
+
def method_missing: (Symbol method_name, *untyped args) -> untyped
|
|
63
|
+
def respond_to_missing?: (Symbol method_name, ?bool include_private) -> bool
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
class Client
|
|
67
|
+
attr_reader provider: untyped
|
|
68
|
+
attr_accessor model: String?
|
|
69
|
+
|
|
70
|
+
def initialize: (Symbol | String provider_name, ?Hash[Symbol | String, untyped] options) -> void
|
|
71
|
+
def default_params: () -> Hash[Symbol, String?]
|
|
72
|
+
def complete: (String text, ?Hash[Symbol, untyped] _opts) -> String
|
|
73
|
+
alias quick_complete complete
|
|
74
|
+
def completion: (?Hash[Symbol, untyped] params) -> untyped
|
|
75
|
+
def chat: (?Hash[Symbol, untyped] params) -> untyped
|
|
76
|
+
def embed: (?Hash[Symbol, untyped] params) -> untyped
|
|
77
|
+
def stream: (?Hash[Symbol, untyped] params) { (untyped) -> void } -> untyped
|
|
78
|
+
def stream?: () -> bool
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
def process_params: (?Hash[Symbol, untyped] opts) -> Hash[Symbol, untyped]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
module Providers
|
|
85
|
+
def self.load_all: () -> void
|
|
86
|
+
def self.providers: () -> Array[Symbol]
|
|
87
|
+
def self.model_ids: () -> Array[String]
|
|
88
|
+
def self.model_id_to_provider: (String model_id) -> Class?
|
|
89
|
+
|
|
90
|
+
class Base
|
|
91
|
+
attr_accessor api_key: String?
|
|
92
|
+
|
|
93
|
+
def initialize: (?api_key: String?) -> void
|
|
94
|
+
def default_api_key: () -> String?
|
|
95
|
+
def completion: (Hash[Symbol | String, untyped] options) -> untyped
|
|
96
|
+
def self.models: () -> Array[String]
|
|
97
|
+
def models: () -> Array[String]
|
|
98
|
+
def self.stream?: () -> bool
|
|
99
|
+
def stream?: () -> bool
|
|
100
|
+
def stream: (Hash[Symbol | String, untyped] options) { (untyped) -> void } -> untyped
|
|
101
|
+
def embedding: (model: String, input: String | Array[String], **untyped options) -> untyped
|
|
102
|
+
|
|
103
|
+
private
|
|
104
|
+
def handle_response: (untyped response) -> untyped
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
class OpenAI < Base
|
|
108
|
+
BASE_URL: String
|
|
109
|
+
attr_accessor organization: String?
|
|
110
|
+
|
|
111
|
+
def initialize: (?api_key: String?, ?organization: String?) -> void
|
|
112
|
+
def completion: (Hash[Symbol | String, untyped] options) -> OpenAIResponse
|
|
113
|
+
def embedding: (model: String, input: String | Array[String], **untyped options) -> OpenAIEmbeddingResponse
|
|
114
|
+
def models: () -> Array[String]
|
|
115
|
+
def self.stream?: () -> true
|
|
116
|
+
def stream: (Hash[Symbol | String, untyped] options) { (OpenAIStreamResponse) -> void } -> void
|
|
117
|
+
|
|
118
|
+
class OpenAIResponse
|
|
119
|
+
attr_reader raw_response: Hash[String, untyped]
|
|
120
|
+
def initialize: (Hash[String, untyped] response) -> void
|
|
121
|
+
def choices: () -> Array[OpenAIChoice]
|
|
122
|
+
def data: () -> untyped
|
|
123
|
+
def embedding: () -> untyped
|
|
124
|
+
def to_s: () -> String
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
class OpenAIChoice
|
|
128
|
+
attr_reader message: OpenAIMessage
|
|
129
|
+
attr_reader finish_reason: String?
|
|
130
|
+
def initialize: (Hash[String, untyped] choice) -> void
|
|
131
|
+
def to_s: () -> String
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
class OpenAIMessage
|
|
135
|
+
attr_reader role: String
|
|
136
|
+
attr_reader content: String
|
|
137
|
+
def initialize: (Hash[String, untyped] message) -> void
|
|
138
|
+
def to_s: () -> String
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
class OpenAIStreamResponse
|
|
142
|
+
attr_reader choices: OpenAIStreamChoice
|
|
143
|
+
def initialize: (Hash[String, untyped] parsed) -> void
|
|
144
|
+
def to_s: () -> String
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
class OpenAIStreamChoice
|
|
148
|
+
attr_reader delta: OpenAIStreamDelta
|
|
149
|
+
attr_reader finish_reason: String?
|
|
150
|
+
def initialize: (Array[Hash[String, untyped]] | Hash[String, untyped] choice) -> void
|
|
151
|
+
def to_s: () -> String
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
class OpenAIStreamDelta
|
|
155
|
+
attr_reader role: String?
|
|
156
|
+
attr_reader content: String?
|
|
157
|
+
def initialize: (Hash[String, untyped] delta) -> void
|
|
158
|
+
def to_s: () -> String
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
class OpenAIEmbeddingResponse
|
|
162
|
+
attr_reader embedding: Array[Float]
|
|
163
|
+
def initialize: (Hash[String, untyped] data) -> void
|
|
164
|
+
def to_a: () -> Array[Float]
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
class Anthropic < Base
|
|
169
|
+
BASE_URL: String
|
|
170
|
+
|
|
171
|
+
def initialize: (?api_key: String?) -> void
|
|
172
|
+
def completion: (Hash[Symbol | String, untyped] options) -> AnthropicResponse
|
|
173
|
+
def models: () -> Array[String]
|
|
174
|
+
def self.models: () -> Array[String]
|
|
175
|
+
def self.stream?: () -> true
|
|
176
|
+
def stream: (Hash[Symbol | String, untyped] options) { (AnthropicStreamResponse) -> void } -> void
|
|
177
|
+
|
|
178
|
+
class AnthropicResponse
|
|
179
|
+
attr_reader raw_response: Hash[String, untyped]
|
|
180
|
+
def initialize: (Hash[String, untyped] response) -> void
|
|
181
|
+
def choices: () -> Array[AnthropicChoice]
|
|
182
|
+
def to_s: () -> String
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
class AnthropicChoice
|
|
186
|
+
attr_reader message: AnthropicMessage
|
|
187
|
+
def initialize: (untyped content) -> void
|
|
188
|
+
def to_s: () -> String
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
class AnthropicMessage
|
|
192
|
+
attr_reader role: String
|
|
193
|
+
attr_reader content: String
|
|
194
|
+
def initialize: (untyped content) -> void
|
|
195
|
+
def to_s: () -> String
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
class AnthropicStreamResponse
|
|
199
|
+
attr_reader choices: Array[AnthropicStreamChoice]
|
|
200
|
+
def initialize: (String fragment) -> void
|
|
201
|
+
def to_s: () -> String
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
class AnthropicStreamChoice
|
|
205
|
+
attr_reader delta: AnthropicStreamDelta
|
|
206
|
+
def initialize: (Hash[String, untyped] delta) -> void
|
|
207
|
+
def to_s: () -> String
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
class AnthropicStreamDelta
|
|
211
|
+
attr_reader type: String?
|
|
212
|
+
attr_reader text: String?
|
|
213
|
+
def initialize: (Hash[String, untyped] delta) -> void
|
|
214
|
+
def to_s: () -> String
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
class Groq < Base
|
|
219
|
+
BASE_URL: String
|
|
220
|
+
|
|
221
|
+
def self.conn: () -> untyped
|
|
222
|
+
def conn: () -> untyped
|
|
223
|
+
def initialize: (?api_key: String?) -> void
|
|
224
|
+
def completion: (Hash[Symbol | String, untyped] options) -> GroqResponse
|
|
225
|
+
def embedding: (model: String, input: String | Array[String], **untyped options) -> GroqResponse
|
|
226
|
+
def models: () -> Array[String]
|
|
227
|
+
def self.stream?: () -> false
|
|
228
|
+
|
|
229
|
+
class GroqResponse
|
|
230
|
+
attr_reader raw_response: Hash[String, untyped]
|
|
231
|
+
def initialize: (Hash[String, untyped] response) -> void
|
|
232
|
+
def choices: () -> Array[GroqChoice]
|
|
233
|
+
def to_s: () -> String
|
|
234
|
+
def to_h: () -> Hash[String, untyped]
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
class GroqChoice
|
|
238
|
+
attr_reader message: GroqMessage
|
|
239
|
+
attr_reader finish_reason: String?
|
|
240
|
+
def initialize: (Hash[String, untyped] choice) -> void
|
|
241
|
+
def to_s: () -> String
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
class GroqMessage
|
|
245
|
+
attr_reader role: String
|
|
246
|
+
attr_reader content: String
|
|
247
|
+
def initialize: (Hash[String, untyped] message) -> void
|
|
248
|
+
def to_s: () -> String
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
class Huggingface < Base
|
|
253
|
+
BASE_URL: String
|
|
254
|
+
|
|
255
|
+
def initialize: (?api_key: String?) -> void
|
|
256
|
+
def completion: (Hash[Symbol | String, untyped] options) -> HuggingfaceResponse
|
|
257
|
+
def models: () -> Array[String]
|
|
258
|
+
def self.models: () -> Array[String]
|
|
259
|
+
|
|
260
|
+
class HuggingfaceResponse
|
|
261
|
+
attr_reader raw_response: untyped
|
|
262
|
+
def initialize: (untyped response) -> void
|
|
263
|
+
def choices: () -> Array[HuggingfaceChoice]
|
|
264
|
+
def to_s: () -> String
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
class HuggingfaceChoice
|
|
268
|
+
attr_reader text: String
|
|
269
|
+
def initialize: (Hash[String, untyped] choice) -> void
|
|
270
|
+
def to_s: () -> String
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
class Cohere < Base
|
|
275
|
+
BASE_URL: String
|
|
276
|
+
|
|
277
|
+
def initialize: (?api_key: String?) -> void
|
|
278
|
+
def completion: (Hash[Symbol | String, untyped] options) -> CohereResponse
|
|
279
|
+
def models: () -> Array[String]
|
|
280
|
+
def self.stream?: () -> false
|
|
281
|
+
|
|
282
|
+
class CohereResponse
|
|
283
|
+
attr_reader raw_response: Hash[String, untyped]
|
|
284
|
+
def initialize: (Hash[String, untyped] response) -> void
|
|
285
|
+
def choices: () -> Array[CohereChoice]
|
|
286
|
+
def to_s: () -> String
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
class CohereChoice
|
|
290
|
+
attr_reader text: String
|
|
291
|
+
def initialize: (Hash[String, untyped] generation) -> void
|
|
292
|
+
def to_s: () -> String
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
Openai: singleton(OpenAI)
|
|
297
|
+
Claude: singleton(Anthropic)
|
|
298
|
+
Claude3: singleton(Anthropic)
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
class CLI < Thor
|
|
302
|
+
def self.exit_on_failure?: () -> true
|
|
303
|
+
def prompt: (*String prompt) -> void
|
|
304
|
+
def chat: () -> void
|
|
305
|
+
def models: () -> void
|
|
306
|
+
end
|
|
5
307
|
end
|
|
6
308
|
end
|
metadata
CHANGED
|
@@ -1,29 +1,74 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: durable-llm
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Durable Programming Team
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: event_stream_parser
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '1.0'
|
|
19
|
+
- - ">="
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: 1.0.0
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - "~>"
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '1.0'
|
|
29
|
+
- - ">="
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: 1.0.0
|
|
13
32
|
- !ruby/object:Gem::Dependency
|
|
14
33
|
name: faraday
|
|
15
34
|
requirement: !ruby/object:Gem::Requirement
|
|
16
35
|
requirements:
|
|
17
|
-
- - "
|
|
36
|
+
- - ">="
|
|
18
37
|
- !ruby/object:Gem::Version
|
|
19
38
|
version: '1.0'
|
|
39
|
+
- - "<"
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '3.0'
|
|
20
42
|
type: :runtime
|
|
21
43
|
prerelease: false
|
|
22
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
45
|
requirements:
|
|
24
|
-
- - "
|
|
46
|
+
- - ">="
|
|
25
47
|
- !ruby/object:Gem::Version
|
|
26
48
|
version: '1.0'
|
|
49
|
+
- - "<"
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
version: '3.0'
|
|
52
|
+
- !ruby/object:Gem::Dependency
|
|
53
|
+
name: highline
|
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
|
55
|
+
requirements:
|
|
56
|
+
- - "~>"
|
|
57
|
+
- !ruby/object:Gem::Version
|
|
58
|
+
version: '3.1'
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 3.1.0
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '3.1'
|
|
69
|
+
- - ">="
|
|
70
|
+
- !ruby/object:Gem::Version
|
|
71
|
+
version: 3.1.0
|
|
27
72
|
- !ruby/object:Gem::Dependency
|
|
28
73
|
name: json
|
|
29
74
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -31,6 +76,9 @@ dependencies:
|
|
|
31
76
|
- - "~>"
|
|
32
77
|
- !ruby/object:Gem::Version
|
|
33
78
|
version: '2.6'
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: 2.6.0
|
|
34
82
|
type: :runtime
|
|
35
83
|
prerelease: false
|
|
36
84
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -38,62 +86,77 @@ dependencies:
|
|
|
38
86
|
- - "~>"
|
|
39
87
|
- !ruby/object:Gem::Version
|
|
40
88
|
version: '2.6'
|
|
89
|
+
- - ">="
|
|
90
|
+
- !ruby/object:Gem::Version
|
|
91
|
+
version: 2.6.0
|
|
41
92
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
93
|
+
name: ostruct
|
|
43
94
|
requirement: !ruby/object:Gem::Requirement
|
|
44
95
|
requirements:
|
|
45
96
|
- - "~>"
|
|
46
97
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
98
|
+
version: 0.6.0
|
|
48
99
|
type: :runtime
|
|
49
100
|
prerelease: false
|
|
50
101
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
102
|
requirements:
|
|
52
103
|
- - "~>"
|
|
53
104
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
105
|
+
version: 0.6.0
|
|
55
106
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
107
|
+
name: thor
|
|
57
108
|
requirement: !ruby/object:Gem::Requirement
|
|
58
109
|
requirements:
|
|
59
110
|
- - "~>"
|
|
60
111
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '
|
|
112
|
+
version: '1.3'
|
|
113
|
+
- - ">="
|
|
114
|
+
- !ruby/object:Gem::Version
|
|
115
|
+
version: 1.3.0
|
|
62
116
|
type: :runtime
|
|
63
117
|
prerelease: false
|
|
64
118
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
119
|
requirements:
|
|
66
120
|
- - "~>"
|
|
67
121
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '
|
|
122
|
+
version: '1.3'
|
|
123
|
+
- - ">="
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: 1.3.0
|
|
69
126
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
127
|
+
name: zeitwerk
|
|
71
128
|
requirement: !ruby/object:Gem::Requirement
|
|
72
129
|
requirements:
|
|
73
130
|
- - "~>"
|
|
74
131
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
132
|
+
version: '2.6'
|
|
133
|
+
- - ">="
|
|
134
|
+
- !ruby/object:Gem::Version
|
|
135
|
+
version: 2.6.0
|
|
76
136
|
type: :runtime
|
|
77
137
|
prerelease: false
|
|
78
138
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
139
|
requirements:
|
|
80
140
|
- - "~>"
|
|
81
141
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
142
|
+
version: '2.6'
|
|
143
|
+
- - ">="
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: 2.6.0
|
|
83
146
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
147
|
+
name: dotenv
|
|
85
148
|
requirement: !ruby/object:Gem::Requirement
|
|
86
149
|
requirements:
|
|
87
150
|
- - "~>"
|
|
88
151
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '
|
|
90
|
-
type: :
|
|
152
|
+
version: '2.8'
|
|
153
|
+
type: :development
|
|
91
154
|
prerelease: false
|
|
92
155
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
156
|
requirements:
|
|
94
157
|
- - "~>"
|
|
95
158
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '
|
|
159
|
+
version: '2.8'
|
|
97
160
|
- !ruby/object:Gem::Dependency
|
|
98
161
|
name: minitest
|
|
99
162
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -137,33 +200,33 @@ dependencies:
|
|
|
137
200
|
- !ruby/object:Gem::Version
|
|
138
201
|
version: '1.0'
|
|
139
202
|
- !ruby/object:Gem::Dependency
|
|
140
|
-
name:
|
|
203
|
+
name: vcr
|
|
141
204
|
requirement: !ruby/object:Gem::Requirement
|
|
142
205
|
requirements:
|
|
143
206
|
- - "~>"
|
|
144
207
|
- !ruby/object:Gem::Version
|
|
145
|
-
version: '
|
|
208
|
+
version: '6.0'
|
|
146
209
|
type: :development
|
|
147
210
|
prerelease: false
|
|
148
211
|
version_requirements: !ruby/object:Gem::Requirement
|
|
149
212
|
requirements:
|
|
150
213
|
- - "~>"
|
|
151
214
|
- !ruby/object:Gem::Version
|
|
152
|
-
version: '
|
|
215
|
+
version: '6.0'
|
|
153
216
|
- !ruby/object:Gem::Dependency
|
|
154
|
-
name:
|
|
217
|
+
name: yard
|
|
155
218
|
requirement: !ruby/object:Gem::Requirement
|
|
156
219
|
requirements:
|
|
157
220
|
- - "~>"
|
|
158
221
|
- !ruby/object:Gem::Version
|
|
159
|
-
version: '
|
|
222
|
+
version: '0.9'
|
|
160
223
|
type: :development
|
|
161
224
|
prerelease: false
|
|
162
225
|
version_requirements: !ruby/object:Gem::Requirement
|
|
163
226
|
requirements:
|
|
164
227
|
- - "~>"
|
|
165
228
|
- !ruby/object:Gem::Version
|
|
166
|
-
version: '
|
|
229
|
+
version: '0.9'
|
|
167
230
|
description: Durable-LLM is a unified interface for interacting with multiple Large
|
|
168
231
|
Language Model APIs, simplifying integration of AI capabilities into Ruby applications.
|
|
169
232
|
email:
|
|
@@ -172,14 +235,18 @@ executables: []
|
|
|
172
235
|
extensions: []
|
|
173
236
|
extra_rdoc_files: []
|
|
174
237
|
files:
|
|
238
|
+
- ".envrc"
|
|
175
239
|
- CHANGELOG.md
|
|
176
240
|
- CLI.md
|
|
177
241
|
- CONFIGURE.md
|
|
178
242
|
- Gemfile
|
|
179
|
-
- Gemfile.lock
|
|
180
243
|
- LICENSE.txt
|
|
181
244
|
- README.md
|
|
182
245
|
- Rakefile
|
|
246
|
+
- devenv.lock
|
|
247
|
+
- devenv.nix
|
|
248
|
+
- devenv.yaml
|
|
249
|
+
- durable-llm.gemspec
|
|
183
250
|
- enterprise/GET_ENTERPRISE.md
|
|
184
251
|
- examples/anthropic.md
|
|
185
252
|
- examples/openai.md
|
|
@@ -189,14 +256,27 @@ files:
|
|
|
189
256
|
- lib/durable/llm/cli.rb
|
|
190
257
|
- lib/durable/llm/client.rb
|
|
191
258
|
- lib/durable/llm/configuration.rb
|
|
259
|
+
- lib/durable/llm/convenience.rb
|
|
192
260
|
- lib/durable/llm/errors.rb
|
|
261
|
+
- lib/durable/llm/provider_utilities.rb
|
|
193
262
|
- lib/durable/llm/providers.rb
|
|
194
263
|
- lib/durable/llm/providers/anthropic.rb
|
|
264
|
+
- lib/durable/llm/providers/azure_openai.rb
|
|
195
265
|
- lib/durable/llm/providers/base.rb
|
|
196
266
|
- lib/durable/llm/providers/cohere.rb
|
|
267
|
+
- lib/durable/llm/providers/deepseek.rb
|
|
268
|
+
- lib/durable/llm/providers/fireworks.rb
|
|
269
|
+
- lib/durable/llm/providers/google.rb
|
|
197
270
|
- lib/durable/llm/providers/groq.rb
|
|
198
271
|
- lib/durable/llm/providers/huggingface.rb
|
|
272
|
+
- lib/durable/llm/providers/mistral.rb
|
|
199
273
|
- lib/durable/llm/providers/openai.rb
|
|
274
|
+
- lib/durable/llm/providers/opencode.rb
|
|
275
|
+
- lib/durable/llm/providers/openrouter.rb
|
|
276
|
+
- lib/durable/llm/providers/perplexity.rb
|
|
277
|
+
- lib/durable/llm/providers/together.rb
|
|
278
|
+
- lib/durable/llm/providers/xai.rb
|
|
279
|
+
- lib/durable/llm/response_helpers.rb
|
|
200
280
|
- lib/durable/llm/version.rb
|
|
201
281
|
- sig/durable/llm.rbs
|
|
202
282
|
homepage: https://github.com/durableprogramming/durable-llm
|
|
@@ -207,7 +287,6 @@ metadata:
|
|
|
207
287
|
homepage_uri: https://github.com/durableprogramming/durable-llm
|
|
208
288
|
source_code_uri: https://github.com/durableprogramming/durable-llm
|
|
209
289
|
changelog_uri: https://github.com/durableprogramming/durable-llm/blob/main/CHANGELOG.md
|
|
210
|
-
post_install_message:
|
|
211
290
|
rdoc_options: []
|
|
212
291
|
require_paths:
|
|
213
292
|
- lib
|
|
@@ -222,8 +301,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
222
301
|
- !ruby/object:Gem::Version
|
|
223
302
|
version: '0'
|
|
224
303
|
requirements: []
|
|
225
|
-
rubygems_version: 3.
|
|
226
|
-
signing_key:
|
|
304
|
+
rubygems_version: 3.7.1
|
|
227
305
|
specification_version: 4
|
|
228
306
|
summary: A Ruby gem providing access to LLM APIs from various vendors
|
|
229
307
|
test_files: []
|
data/Gemfile.lock
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
PATH
|
|
2
|
-
remote: .
|
|
3
|
-
specs:
|
|
4
|
-
durable-llm (0.1.3)
|
|
5
|
-
event_stream_parser (~> 1.0)
|
|
6
|
-
faraday (> 1.0)
|
|
7
|
-
highline (~> 3.1)
|
|
8
|
-
json (~> 2.6)
|
|
9
|
-
thor (~> 1.3)
|
|
10
|
-
zeitwerk (~> 2.6)
|
|
11
|
-
|
|
12
|
-
GEM
|
|
13
|
-
remote: https://rubygems.org/
|
|
14
|
-
specs:
|
|
15
|
-
addressable (2.8.7)
|
|
16
|
-
public_suffix (>= 2.0.2, < 7.0)
|
|
17
|
-
ast (2.4.2)
|
|
18
|
-
base64 (0.2.0)
|
|
19
|
-
bigdecimal (3.1.8)
|
|
20
|
-
crack (1.0.0)
|
|
21
|
-
bigdecimal
|
|
22
|
-
rexml
|
|
23
|
-
dotenv (2.8.1)
|
|
24
|
-
event_stream_parser (1.0.0)
|
|
25
|
-
faraday (2.12.0)
|
|
26
|
-
faraday-net_http (>= 2.0, < 3.4)
|
|
27
|
-
json
|
|
28
|
-
logger
|
|
29
|
-
faraday-multipart (1.0.4)
|
|
30
|
-
multipart-post (~> 2)
|
|
31
|
-
faraday-net_http (3.3.0)
|
|
32
|
-
net-http
|
|
33
|
-
hashdiff (1.1.1)
|
|
34
|
-
highline (3.1.1)
|
|
35
|
-
reline
|
|
36
|
-
io-console (0.7.2)
|
|
37
|
-
json (2.7.2)
|
|
38
|
-
language_server-protocol (3.17.0.3)
|
|
39
|
-
logger (1.6.1)
|
|
40
|
-
minitest (5.25.1)
|
|
41
|
-
mocha (2.4.5)
|
|
42
|
-
ruby2_keywords (>= 0.0.5)
|
|
43
|
-
multipart-post (2.4.1)
|
|
44
|
-
net-http (0.4.1)
|
|
45
|
-
uri
|
|
46
|
-
parallel (1.26.3)
|
|
47
|
-
parser (3.3.5.0)
|
|
48
|
-
ast (~> 2.4.1)
|
|
49
|
-
racc
|
|
50
|
-
public_suffix (6.0.1)
|
|
51
|
-
racc (1.8.1)
|
|
52
|
-
rainbow (3.1.1)
|
|
53
|
-
rake (13.2.1)
|
|
54
|
-
regexp_parser (2.9.2)
|
|
55
|
-
reline (0.5.10)
|
|
56
|
-
io-console (~> 0.5)
|
|
57
|
-
rexml (3.3.8)
|
|
58
|
-
rubocop (1.66.1)
|
|
59
|
-
json (~> 2.3)
|
|
60
|
-
language_server-protocol (>= 3.17.0)
|
|
61
|
-
parallel (~> 1.10)
|
|
62
|
-
parser (>= 3.3.0.2)
|
|
63
|
-
rainbow (>= 2.2.2, < 4.0)
|
|
64
|
-
regexp_parser (>= 2.4, < 3.0)
|
|
65
|
-
rubocop-ast (>= 1.32.2, < 2.0)
|
|
66
|
-
ruby-progressbar (~> 1.7)
|
|
67
|
-
unicode-display_width (>= 2.4.0, < 3.0)
|
|
68
|
-
rubocop-ast (1.32.3)
|
|
69
|
-
parser (>= 3.3.1.0)
|
|
70
|
-
ruby-openai (7.1.0)
|
|
71
|
-
event_stream_parser (>= 0.3.0, < 2.0.0)
|
|
72
|
-
faraday (>= 1)
|
|
73
|
-
faraday-multipart (>= 1)
|
|
74
|
-
ruby-progressbar (1.13.0)
|
|
75
|
-
ruby2_keywords (0.0.5)
|
|
76
|
-
thor (1.3.2)
|
|
77
|
-
unicode-display_width (2.6.0)
|
|
78
|
-
uri (0.13.1)
|
|
79
|
-
vcr (6.3.1)
|
|
80
|
-
base64
|
|
81
|
-
webmock (3.24.0)
|
|
82
|
-
addressable (>= 2.8.0)
|
|
83
|
-
crack (>= 0.3.2)
|
|
84
|
-
hashdiff (>= 0.4.0, < 2.0.0)
|
|
85
|
-
zeitwerk (2.6.18)
|
|
86
|
-
|
|
87
|
-
PLATFORMS
|
|
88
|
-
x86_64-linux
|
|
89
|
-
|
|
90
|
-
DEPENDENCIES
|
|
91
|
-
dotenv (~> 2.8)
|
|
92
|
-
durable-llm!
|
|
93
|
-
minitest (~> 5.0)
|
|
94
|
-
mocha (~> 2.1)
|
|
95
|
-
rake (~> 13.0)
|
|
96
|
-
rubocop (~> 1.21)
|
|
97
|
-
ruby-openai (~> 7.1)
|
|
98
|
-
thor (~> 1.3)
|
|
99
|
-
vcr (~> 6.0)
|
|
100
|
-
webmock (~> 3.24)
|
|
101
|
-
|
|
102
|
-
BUNDLED WITH
|
|
103
|
-
2.4.10
|