llm.rb 11.3.0 → 12.0.0

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +270 -1
  3. data/LICENSE +92 -17
  4. data/README.md +209 -647
  5. data/data/anthropic.json +433 -249
  6. data/data/bedrock.json +2097 -1055
  7. data/data/deepinfra.json +993 -0
  8. data/data/deepseek.json +53 -28
  9. data/data/google.json +389 -771
  10. data/data/openai.json +1053 -771
  11. data/data/xai.json +133 -292
  12. data/data/zai.json +249 -141
  13. data/lib/llm/a2a.rb +2 -2
  14. data/lib/llm/active_record/acts_as_agent.rb +10 -41
  15. data/lib/llm/active_record/acts_as_llm.rb +25 -0
  16. data/lib/llm/active_record.rb +3 -3
  17. data/lib/llm/agent.rb +1 -1
  18. data/lib/llm/context.rb +9 -5
  19. data/lib/llm/contract/completion.rb +2 -2
  20. data/lib/llm/cost.rb +1 -1
  21. data/lib/llm/function/fiber_group.rb +2 -2
  22. data/lib/llm/function/task_group.rb +2 -2
  23. data/lib/llm/function/thread_group.rb +3 -3
  24. data/lib/llm/pipe.rb +1 -1
  25. data/lib/llm/provider.rb +2 -2
  26. data/lib/llm/providers/anthropic/request_adapter.rb +1 -1
  27. data/lib/llm/providers/bedrock/request_adapter/completion.rb +5 -5
  28. data/lib/llm/providers/bedrock/request_adapter.rb +3 -3
  29. data/lib/llm/providers/bedrock/response_adapter/completion.rb +2 -2
  30. data/lib/llm/providers/bedrock/response_adapter.rb +2 -2
  31. data/lib/llm/providers/deepinfra/audio.rb +66 -0
  32. data/lib/llm/providers/deepinfra/images.rb +90 -0
  33. data/lib/llm/providers/deepinfra/response_adapter.rb +36 -0
  34. data/lib/llm/providers/deepinfra.rb +100 -0
  35. data/lib/llm/providers/deepseek/images.rb +109 -0
  36. data/lib/llm/providers/deepseek/request_adapter.rb +32 -0
  37. data/lib/llm/providers/deepseek/response_adapter/image.rb +9 -0
  38. data/lib/llm/providers/deepseek/response_adapter.rb +29 -0
  39. data/lib/llm/providers/deepseek.rb +4 -2
  40. data/lib/llm/providers/google/request_adapter.rb +23 -6
  41. data/lib/llm/providers/google.rb +4 -4
  42. data/lib/llm/providers/ollama/request_adapter.rb +1 -1
  43. data/lib/llm/providers/openai/audio.rb +6 -2
  44. data/lib/llm/providers/openai/images.rb +9 -50
  45. data/lib/llm/providers/openai/request_adapter/respond.rb +38 -4
  46. data/lib/llm/providers/openai/request_adapter.rb +1 -1
  47. data/lib/llm/providers/openai/response_adapter/audio.rb +5 -1
  48. data/lib/llm/providers/openai/response_adapter/completion.rb +1 -1
  49. data/lib/llm/providers/openai/response_adapter/image.rb +0 -4
  50. data/lib/llm/providers/openai/responses.rb +1 -0
  51. data/lib/llm/providers/openai/stream_parser.rb +5 -6
  52. data/lib/llm/providers/openai.rb +2 -2
  53. data/lib/llm/providers/xai/images.rb +49 -26
  54. data/lib/llm/providers/xai.rb +2 -2
  55. data/lib/llm/registry.rb +2 -2
  56. data/lib/llm/response.rb +11 -1
  57. data/lib/llm/schema/leaf.rb +7 -1
  58. data/lib/llm/schema/object.rb +1 -1
  59. data/lib/llm/schema/renderer.rb +121 -0
  60. data/lib/llm/schema.rb +30 -0
  61. data/lib/llm/sequel/agent.rb +2 -43
  62. data/lib/llm/sequel/plugin.rb +25 -7
  63. data/lib/llm/stream.rb +1 -1
  64. data/lib/llm/tool.rb +2 -2
  65. data/lib/llm/tracer/telemetry.rb +4 -6
  66. data/lib/llm/tracer.rb +9 -21
  67. data/lib/llm/transport/execution.rb +16 -1
  68. data/lib/llm/transport/http.rb +2 -2
  69. data/lib/llm/transport/net_http_adapter.rb +1 -1
  70. data/lib/llm/transport/persistent_http.rb +1 -1
  71. data/lib/llm/transport/response/http.rb +1 -1
  72. data/lib/llm/uridata.rb +16 -0
  73. data/lib/llm/utils.rb +1 -1
  74. data/lib/llm/version.rb +1 -1
  75. data/lib/llm.rb +20 -8
  76. data/llm.gemspec +14 -26
  77. data/resources/deepdive.md +966 -0
  78. metadata +26 -29
  79. data/lib/llm/tracer/langsmith.rb +0 -144
@@ -21,7 +21,7 @@ class LLM::Transport
21
21
  when :put then ::Net::HTTP::Put.new(path, headers)
22
22
  when :patch then ::Net::HTTP::Patch.new(path, headers)
23
23
  when :delete then ::Net::HTTP::Delete.new(path, headers)
24
- else ::Net::HTTP::GenericRequest.new(method, path, nil, headers)
24
+ else ::Net::HTTPGenericRequest.new(method, path, nil, headers)
25
25
  end
26
26
  if req.body
27
27
  http_req.body = req.body
@@ -81,7 +81,7 @@ class LLM::Transport
81
81
 
82
82
  ##
83
83
  # Performs a request on the current HTTP transport.
84
- # Accepts both {Net::HTTPRequest} and {LLM::Transport::Request}.
84
+ # Accepts both `Net::HTTPRequest` and {LLM::Transport::Request}.
85
85
  #
86
86
  # @param [Net::HTTPRequest, LLM::Transport::Request] request
87
87
  # @param [Fiber] owner
@@ -3,7 +3,7 @@
3
3
  class LLM::Transport::Response
4
4
  ##
5
5
  # {LLM::Transport::Response::HTTP LLM::Transport::Response::HTTP}
6
- # adapts a {Net::HTTPResponse Net::HTTPResponse} to the
6
+ # adapts a `Net::HTTPResponse` to the
7
7
  # {LLM::Transport::Response LLM::Transport::Response} interface.
8
8
  #
9
9
  # This is the default wrapper for responses produced by the built-in
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LLM
4
+ class URIData < Struct.new(:content_type, :encoding_type, :encoded, :decoded)
5
+ ##
6
+ # @param [String] str
7
+ # A string
8
+ # @return [URIData]
9
+ def self.parse(str)
10
+ _, data = str.split(":")
11
+ content_type, data = data.split(";")
12
+ encoding_type, data = data.split(",")
13
+ URIData.new(content_type, encoding_type, data, StringIO.new(data.unpack1("m0")))
14
+ end
15
+ end
16
+ end
data/lib/llm/utils.rb CHANGED
@@ -45,7 +45,7 @@ module LLM
45
45
  # Returns the Ruby module or class name for an object.
46
46
  #
47
47
  # This bypasses overridden `#name` implementations by binding
48
- # {Module#name} directly.
48
+ # `Module#name` directly.
49
49
  #
50
50
  # @param [Module] obj
51
51
  # @return [String, nil]
data/lib/llm/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LLM
4
- VERSION = "11.3.0"
4
+ VERSION = "12.0.0"
5
5
  end
data/lib/llm.rb CHANGED
@@ -37,6 +37,7 @@ module LLM
37
37
  require_relative "llm/server_tool"
38
38
  require_relative "llm/mcp"
39
39
  require_relative "llm/a2a"
40
+ require_relative "llm/uridata"
40
41
 
41
42
  ##
42
43
  # Thread-safe monitors for different contexts
@@ -154,6 +155,14 @@ module LLM
154
155
  LLM::OpenAI.new(**)
155
156
  end
156
157
 
158
+ ##
159
+ # @param key (see LLM::Provider#initialize)
160
+ # @return (see LLM::DeepInfra#initialize)
161
+ def deepinfra(**)
162
+ lock(:require) { require_relative "llm/providers/deepinfra" unless defined?(LLM::DeepInfra) }
163
+ LLM::DeepInfra.new(**)
164
+ end
165
+
157
166
  ##
158
167
  # @param (see LLM::Bedrock#initialize)
159
168
  # @return (see LLM::Bedrock#initialize)
@@ -181,16 +190,19 @@ module LLM
181
190
  end
182
191
 
183
192
  ##
184
- # @param [Hash, nil] stdio
185
- # @option stdio [Array<String>] :argv
193
+ # @param [Hash] opts
194
+ # MCP client options
195
+ # @option opts [Hash, nil] :stdio
196
+ # Standard I/O transport options
197
+ # @option opts [Array<String>] :stdio/:argv
186
198
  # The command to run for the MCP process
187
- # @option stdio [Hash] :env
199
+ # @option opts [Hash] :stdio/:env
188
200
  # The environment variables to set for the MCP process
189
- # @option stdio [String, nil] :cwd
201
+ # @option opts [String, nil] :stdio/:cwd
190
202
  # The working directory for the MCP process
191
203
  # @return [LLM::MCP]
192
- def mcp(**)
193
- LLM::MCP.new(**)
204
+ def mcp(**opts)
205
+ LLM::MCP.new(**opts)
194
206
  end
195
207
 
196
208
  ##
@@ -234,7 +246,7 @@ module LLM
234
246
  ##
235
247
  # Provides a thread-safe lock
236
248
  # @param [Symbol] name The name of the lock
237
- # @param [Proc] & The block to execute within the lock
249
+ # @param [Proc] block The block to execute within the lock
238
250
  # @return [void]
239
- def lock(name, &) = @monitors[name].synchronize(&)
251
+ def lock(name, &block) = @monitors[name].synchronize(&block)
240
252
  end
data/llm.gemspec CHANGED
@@ -5,46 +5,34 @@ require_relative "lib/llm/version"
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "llm.rb"
7
7
  spec.version = LLM::VERSION
8
- spec.authors = ["0x1eef (Robert)", "Antar Azri", "Rodrigo Serrano", "Christos Maris"]
9
- spec.email = ["robert@4.4bsd.dev"]
10
-
11
- spec.summary = "Ruby's most capable AI runtime"
12
- spec.description = <<~DESC
13
- llm.rb is Ruby's most capable AI runtime.
14
-
15
- It runs on Ruby's standard library by default. loads optional pieces
16
- only when needed, and offers a single runtime for providers, agents,
17
- tools, skills, MCP, A2A (Agent2Agent), RAG (vector stores & embeddings),
18
- streaming, files, and persisted state. As a bonus, llm.rb is also available
19
- for mruby.
20
-
21
- It supports OpenAI, OpenAI-compatible endpoints, Anthropic, Google
22
- Gemini, DeepSeek, xAI, Z.ai, AWS Bedrock, Ollama, and llama.cpp. It
23
- also includes built-in ActiveRecord and Sequel support, plus concurrent
24
- tool execution through threads, tasks (via async gem), fibers, ractors,
25
- and fork (via xchan.rb gem).
26
- DESC
27
-
28
- spec.license = "0BSD"
8
+ spec.authors = ["bsdrobert", "Antar Azri", "Rodrigo Serrano"]
9
+ spec.email = ["robert@r.uby.dev"]
10
+
11
+ spec.summary = "Ruby's capable AI runtime"
12
+ spec.description = "llm.rb is not a library, framework or toolkit but " \
13
+ "an advanced runtime for building highly capable AI " \
14
+ "applications on CRuby."
15
+ spec.license = "BUSL-1.1"
29
16
  spec.required_ruby_version = ">= 3.3.0"
30
17
 
31
- spec.homepage = "https://llmrb.github.io"
18
+ spec.homepage = "https://r.uby.dev/llm/"
32
19
  spec.metadata["homepage_uri"] = spec.homepage
33
- spec.metadata["source_code_uri"] = "https://github.com/llmrb/llm.rb"
34
- spec.metadata["documentation_uri"] = "https://llmrb.github.io/llm.rb"
35
- spec.metadata["changelog_uri"] = "https://0x1eef.github.io/x/llm.rb/file.CHANGELOG.html"
20
+ spec.metadata["source_code_uri"] = "https://github.com/r-uby-dev/llm.rb"
21
+ spec.metadata["documentation_uri"] = spec.homepage
22
+ spec.metadata["changelog_uri"] = "https://r.uby.dev/api-docs/llm.rb/file.CHANGELOG.html"
36
23
 
37
24
  spec.files = Dir[
38
25
  "README.md", "LICENSE",
39
26
  "lib/*.rb", "lib/**/*.rb",
40
27
  "data/*.json", "CHANGELOG.md",
28
+ "resources/deepdive.md",
41
29
  "llm.gemspec"
42
30
  ]
43
31
  spec.require_paths = ["lib"]
44
32
 
45
33
  spec.add_development_dependency "webmock", "~> 3.24.0"
46
34
  spec.add_development_dependency "yard", "~> 0.9.37"
47
- spec.add_development_dependency "kramdown", "~> 2.4"
35
+ spec.add_development_dependency "redcarpet", "~> 3.6"
48
36
  spec.add_development_dependency "webrick", "~> 1.8"
49
37
  spec.add_development_dependency "test-cmd.rb", "~> 0.12.0"
50
38
  spec.add_development_dependency "rake", "~> 13.0"