raix 0.4.0 → 0.4.1
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/CHANGELOG.md +1 -0
- data/Gemfile.lock +1 -1
- data/lib/raix/chat_completion.rb +2 -1
- data/lib/raix/message_adapters/base.rb +50 -0
- data/lib/raix/response_format.rb +76 -0
- data/lib/raix/version.rb +1 -1
- data/lib/raix.rb +1 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 00be6de8258fbe226ea622d4d0e591fa6035ddd8d5ad627dd316291561317355
|
4
|
+
data.tar.gz: 2749f23745e8385a770d1214c131c3babd2b48e2c983c10eaa1775ae85151879
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 561520feed1ab27d400e1482ecc3a3740fdb3d21b0ac09603f59b1b798facf9d6bb83f910c4f77b66ce7b5a60d6278bbe174429853e74aa5e5ccda771603566e
|
7
|
+
data.tar.gz: 537a7d27ad0d9a717f52bdb7a0aaa0d6f8479f0261f9730f18d0e93255c734e027d577d9284425a213d151fb08dd95c2f988a21015cd7746706e989dedb91cd0
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/lib/raix/chat_completion.rb
CHANGED
@@ -2,10 +2,11 @@
|
|
2
2
|
|
3
3
|
require "active_support/concern"
|
4
4
|
require "active_support/core_ext/object/blank"
|
5
|
-
require "raix/message_adapters/base"
|
6
5
|
require "open_router"
|
7
6
|
require "openai"
|
8
7
|
|
8
|
+
require_relative "message_adapters/base"
|
9
|
+
|
9
10
|
module Raix
|
10
11
|
# The `ChatCompletion`` module is a Rails concern that provides a way to interact
|
11
12
|
# with the OpenRouter Chat Completion API via its client. The module includes a few
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/module/delegation"
|
4
|
+
|
5
|
+
module Raix
|
6
|
+
module MessageAdapters
|
7
|
+
# Transforms messages into the format expected by the OpenAI API
|
8
|
+
class Base
|
9
|
+
attr_accessor :context
|
10
|
+
|
11
|
+
delegate :cache_at, :model, to: :context
|
12
|
+
|
13
|
+
def initialize(context)
|
14
|
+
@context = context
|
15
|
+
end
|
16
|
+
|
17
|
+
def transform(message)
|
18
|
+
return message if message[:role].present?
|
19
|
+
|
20
|
+
if message[:function].present?
|
21
|
+
{ role: "assistant", name: message.dig(:function, :name), content: message.dig(:function, :arguments).to_json }
|
22
|
+
elsif message[:result].present?
|
23
|
+
{ role: "function", name: message[:name], content: message[:result] }
|
24
|
+
else
|
25
|
+
content(message)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def content(message)
|
32
|
+
case message
|
33
|
+
in { system: content }
|
34
|
+
{ role: "system", content: }
|
35
|
+
in { user: content }
|
36
|
+
{ role: "user", content: }
|
37
|
+
in { assistant: content }
|
38
|
+
{ role: "assistant", content: }
|
39
|
+
else
|
40
|
+
raise ArgumentError, "Invalid message format: #{message.inspect}"
|
41
|
+
end.tap do |msg|
|
42
|
+
# convert to anthropic multipart format if model is claude-3 and cache_at is set
|
43
|
+
if model.to_s.include?("anthropic/claude-3") && cache_at && msg[:content].to_s.length > cache_at.to_i
|
44
|
+
msg[:content] = [{ type: "text", text: msg[:content], cache_control: { type: "ephemeral" } }]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/object/deep_dup"
|
4
|
+
|
5
|
+
module Raix
|
6
|
+
# Handles the formatting of responses for AI interactions.
|
7
|
+
#
|
8
|
+
# This class is responsible for converting input data into a JSON schema
|
9
|
+
# that can be used to structure and validate AI responses. It supports
|
10
|
+
# nested structures and arrays, ensuring that the output conforms to
|
11
|
+
# the expected format for AI model interactions.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# input = { name: { type: "string" }, age: { type: "integer" } }
|
15
|
+
# format = ResponseFormat.new("PersonInfo", input)
|
16
|
+
# schema = format.to_schema
|
17
|
+
#
|
18
|
+
# @attr_reader [String] name The name of the response format
|
19
|
+
# @attr_reader [Hash] input The input data to be formatted
|
20
|
+
class ResponseFormat
|
21
|
+
def initialize(name, input)
|
22
|
+
@name = name
|
23
|
+
@input = input
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_json(*)
|
27
|
+
JSON.pretty_generate(to_schema)
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_schema
|
31
|
+
{
|
32
|
+
type: "json_schema",
|
33
|
+
json_schema: {
|
34
|
+
name: @name,
|
35
|
+
schema: {
|
36
|
+
type: "object",
|
37
|
+
properties: decode(@input.deep_dup),
|
38
|
+
required: @input.keys,
|
39
|
+
additionalProperties: false
|
40
|
+
},
|
41
|
+
strict: true
|
42
|
+
}
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def decode(input)
|
49
|
+
{}.tap do |response|
|
50
|
+
case input
|
51
|
+
when Array
|
52
|
+
properties = {}
|
53
|
+
input.each { |item| properties.merge!(decode(item)) }
|
54
|
+
|
55
|
+
response[:type] = "array"
|
56
|
+
response[:items] = {
|
57
|
+
type: "object",
|
58
|
+
properties:,
|
59
|
+
required: properties.keys.select { |key| properties[key].delete(:required) },
|
60
|
+
additionalProperties: false
|
61
|
+
}
|
62
|
+
when Hash
|
63
|
+
input.each do |key, value|
|
64
|
+
response[key] = if value.is_a?(Hash) && value.key?(:type)
|
65
|
+
value
|
66
|
+
else
|
67
|
+
decode(value)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
else
|
71
|
+
raise "Invalid input"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/raix/version.rb
CHANGED
data/lib/raix.rb
CHANGED
@@ -4,6 +4,7 @@ require_relative "raix/version"
|
|
4
4
|
require_relative "raix/chat_completion"
|
5
5
|
require_relative "raix/function_dispatch"
|
6
6
|
require_relative "raix/prompt_declarations"
|
7
|
+
require_relative "raix/response_format"
|
7
8
|
|
8
9
|
# The Raix module provides configuration options for the Raix gem.
|
9
10
|
module Raix
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Obie Fernandez
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-10-
|
11
|
+
date: 2024-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -58,7 +58,9 @@ files:
|
|
58
58
|
- lib/raix.rb
|
59
59
|
- lib/raix/chat_completion.rb
|
60
60
|
- lib/raix/function_dispatch.rb
|
61
|
+
- lib/raix/message_adapters/base.rb
|
61
62
|
- lib/raix/prompt_declarations.rb
|
63
|
+
- lib/raix/response_format.rb
|
62
64
|
- lib/raix/version.rb
|
63
65
|
- raix.gemspec
|
64
66
|
- sig/raix.rbs
|