activeagent 1.0.0.rc1 → 1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -1
- data/lib/active_agent/providers/_base_provider.rb +92 -82
- data/lib/active_agent/providers/anthropic/_types.rb +2 -2
- data/lib/active_agent/providers/anthropic/request.rb +135 -81
- data/lib/active_agent/providers/anthropic/transforms.rb +353 -0
- data/lib/active_agent/providers/anthropic_provider.rb +96 -53
- data/lib/active_agent/providers/common/messages/_types.rb +37 -1
- data/lib/active_agent/providers/common/responses/base.rb +118 -70
- data/lib/active_agent/providers/common/usage.rb +385 -0
- data/lib/active_agent/providers/concerns/instrumentation.rb +263 -0
- data/lib/active_agent/providers/log_subscriber.rb +64 -246
- data/lib/active_agent/providers/mock_provider.rb +23 -23
- data/lib/active_agent/providers/ollama/chat/request.rb +214 -35
- data/lib/active_agent/providers/ollama/chat/transforms.rb +135 -0
- data/lib/active_agent/providers/ollama/embedding/request.rb +160 -47
- data/lib/active_agent/providers/ollama/embedding/transforms.rb +160 -0
- data/lib/active_agent/providers/ollama_provider.rb +0 -1
- data/lib/active_agent/providers/open_ai/_base.rb +3 -2
- data/lib/active_agent/providers/open_ai/chat/_types.rb +13 -1
- data/lib/active_agent/providers/open_ai/chat/request.rb +132 -186
- data/lib/active_agent/providers/open_ai/chat/transforms.rb +364 -0
- data/lib/active_agent/providers/open_ai/chat_provider.rb +57 -36
- data/lib/active_agent/providers/open_ai/embedding/_types.rb +13 -2
- data/lib/active_agent/providers/open_ai/embedding/request.rb +38 -70
- data/lib/active_agent/providers/open_ai/embedding/transforms.rb +88 -0
- data/lib/active_agent/providers/open_ai/responses/_types.rb +1 -7
- data/lib/active_agent/providers/open_ai/responses/request.rb +100 -134
- data/lib/active_agent/providers/open_ai/responses/transforms.rb +228 -0
- data/lib/active_agent/providers/open_ai/responses_provider.rb +77 -30
- data/lib/active_agent/providers/open_ai_provider.rb +0 -3
- data/lib/active_agent/providers/open_router/_types.rb +27 -1
- data/lib/active_agent/providers/open_router/options.rb +49 -1
- data/lib/active_agent/providers/open_router/request.rb +232 -66
- data/lib/active_agent/providers/open_router/requests/_types.rb +0 -1
- data/lib/active_agent/providers/open_router/requests/messages/_types.rb +37 -40
- data/lib/active_agent/providers/open_router/requests/messages/content/file.rb +19 -3
- data/lib/active_agent/providers/open_router/requests/messages/content/files/details.rb +15 -4
- data/lib/active_agent/providers/open_router/requests/plugin.rb +19 -3
- data/lib/active_agent/providers/open_router/requests/plugins/pdf_config.rb +30 -8
- data/lib/active_agent/providers/open_router/requests/prediction.rb +17 -0
- data/lib/active_agent/providers/open_router/requests/provider_preferences/max_price.rb +41 -7
- data/lib/active_agent/providers/open_router/requests/provider_preferences.rb +60 -19
- data/lib/active_agent/providers/open_router/requests/response_format.rb +30 -2
- data/lib/active_agent/providers/open_router/transforms.rb +134 -0
- data/lib/active_agent/providers/open_router_provider.rb +9 -0
- data/lib/active_agent/version.rb +1 -1
- metadata +15 -159
- data/lib/active_agent/generation_provider/open_router/types.rb +0 -505
- data/lib/active_agent/generation_provider/xai_provider.rb +0 -144
- data/lib/active_agent/providers/anthropic/requests/_types.rb +0 -190
- data/lib/active_agent/providers/anthropic/requests/container_params.rb +0 -19
- data/lib/active_agent/providers/anthropic/requests/content/base.rb +0 -21
- data/lib/active_agent/providers/anthropic/requests/content/sources/base.rb +0 -22
- data/lib/active_agent/providers/anthropic/requests/context_management_config.rb +0 -18
- data/lib/active_agent/providers/anthropic/requests/messages/_types.rb +0 -189
- data/lib/active_agent/providers/anthropic/requests/messages/assistant.rb +0 -23
- data/lib/active_agent/providers/anthropic/requests/messages/base.rb +0 -63
- data/lib/active_agent/providers/anthropic/requests/messages/content/_types.rb +0 -143
- data/lib/active_agent/providers/anthropic/requests/messages/content/base.rb +0 -21
- data/lib/active_agent/providers/anthropic/requests/messages/content/document.rb +0 -26
- data/lib/active_agent/providers/anthropic/requests/messages/content/image.rb +0 -23
- data/lib/active_agent/providers/anthropic/requests/messages/content/redacted_thinking.rb +0 -21
- data/lib/active_agent/providers/anthropic/requests/messages/content/search_result.rb +0 -27
- data/lib/active_agent/providers/anthropic/requests/messages/content/sources/_types.rb +0 -171
- data/lib/active_agent/providers/anthropic/requests/messages/content/sources/base.rb +0 -22
- data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_base64.rb +0 -25
- data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_file.rb +0 -23
- data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_text.rb +0 -25
- data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_url.rb +0 -23
- data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_base64.rb +0 -27
- data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_file.rb +0 -23
- data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_url.rb +0 -23
- data/lib/active_agent/providers/anthropic/requests/messages/content/text.rb +0 -22
- data/lib/active_agent/providers/anthropic/requests/messages/content/thinking.rb +0 -23
- data/lib/active_agent/providers/anthropic/requests/messages/content/tool_result.rb +0 -24
- data/lib/active_agent/providers/anthropic/requests/messages/content/tool_use.rb +0 -28
- data/lib/active_agent/providers/anthropic/requests/messages/user.rb +0 -21
- data/lib/active_agent/providers/anthropic/requests/metadata.rb +0 -18
- data/lib/active_agent/providers/anthropic/requests/response_format.rb +0 -22
- data/lib/active_agent/providers/anthropic/requests/thinking_config/_types.rb +0 -60
- data/lib/active_agent/providers/anthropic/requests/thinking_config/base.rb +0 -20
- data/lib/active_agent/providers/anthropic/requests/thinking_config/disabled.rb +0 -16
- data/lib/active_agent/providers/anthropic/requests/thinking_config/enabled.rb +0 -20
- data/lib/active_agent/providers/anthropic/requests/tool_choice/_types.rb +0 -78
- data/lib/active_agent/providers/anthropic/requests/tool_choice/any.rb +0 -17
- data/lib/active_agent/providers/anthropic/requests/tool_choice/auto.rb +0 -17
- data/lib/active_agent/providers/anthropic/requests/tool_choice/base.rb +0 -20
- data/lib/active_agent/providers/anthropic/requests/tool_choice/none.rb +0 -16
- data/lib/active_agent/providers/anthropic/requests/tool_choice/tool.rb +0 -20
- data/lib/active_agent/providers/ollama/chat/requests/_types.rb +0 -3
- data/lib/active_agent/providers/ollama/chat/requests/messages/_types.rb +0 -116
- data/lib/active_agent/providers/ollama/chat/requests/messages/assistant.rb +0 -19
- data/lib/active_agent/providers/ollama/chat/requests/messages/user.rb +0 -19
- data/lib/active_agent/providers/ollama/embedding/requests/_types.rb +0 -83
- data/lib/active_agent/providers/ollama/embedding/requests/options.rb +0 -104
- data/lib/active_agent/providers/open_ai/chat/requests/_types.rb +0 -229
- data/lib/active_agent/providers/open_ai/chat/requests/audio.rb +0 -24
- data/lib/active_agent/providers/open_ai/chat/requests/messages/_types.rb +0 -123
- data/lib/active_agent/providers/open_ai/chat/requests/messages/assistant.rb +0 -42
- data/lib/active_agent/providers/open_ai/chat/requests/messages/base.rb +0 -78
- data/lib/active_agent/providers/open_ai/chat/requests/messages/content/_types.rb +0 -133
- data/lib/active_agent/providers/open_ai/chat/requests/messages/content/audio.rb +0 -35
- data/lib/active_agent/providers/open_ai/chat/requests/messages/content/base.rb +0 -24
- data/lib/active_agent/providers/open_ai/chat/requests/messages/content/file.rb +0 -26
- data/lib/active_agent/providers/open_ai/chat/requests/messages/content/files/_types.rb +0 -60
- data/lib/active_agent/providers/open_ai/chat/requests/messages/content/files/details.rb +0 -41
- data/lib/active_agent/providers/open_ai/chat/requests/messages/content/image.rb +0 -37
- data/lib/active_agent/providers/open_ai/chat/requests/messages/content/refusal.rb +0 -25
- data/lib/active_agent/providers/open_ai/chat/requests/messages/content/text.rb +0 -25
- data/lib/active_agent/providers/open_ai/chat/requests/messages/developer.rb +0 -25
- data/lib/active_agent/providers/open_ai/chat/requests/messages/function.rb +0 -25
- data/lib/active_agent/providers/open_ai/chat/requests/messages/system.rb +0 -25
- data/lib/active_agent/providers/open_ai/chat/requests/messages/tool.rb +0 -26
- data/lib/active_agent/providers/open_ai/chat/requests/messages/user.rb +0 -32
- data/lib/active_agent/providers/open_ai/chat/requests/prediction.rb +0 -46
- data/lib/active_agent/providers/open_ai/chat/requests/response_format.rb +0 -53
- data/lib/active_agent/providers/open_ai/chat/requests/stream_options.rb +0 -24
- data/lib/active_agent/providers/open_ai/chat/requests/tool_choice.rb +0 -26
- data/lib/active_agent/providers/open_ai/chat/requests/tools/_types.rb +0 -5
- data/lib/active_agent/providers/open_ai/chat/requests/tools/base.rb +0 -22
- data/lib/active_agent/providers/open_ai/chat/requests/tools/custom_tool.rb +0 -41
- data/lib/active_agent/providers/open_ai/chat/requests/tools/function_tool.rb +0 -51
- data/lib/active_agent/providers/open_ai/chat/requests/web_search_options.rb +0 -45
- data/lib/active_agent/providers/open_ai/embedding/requests/_types.rb +0 -49
- data/lib/active_agent/providers/open_ai/responses/requests/_types.rb +0 -231
- data/lib/active_agent/providers/open_ai/responses/requests/conversation.rb +0 -23
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/_types.rb +0 -264
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/assistant_message.rb +0 -22
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/base.rb +0 -89
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/code_interpreter_tool_call.rb +0 -30
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/computer_tool_call.rb +0 -28
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/computer_tool_call_output.rb +0 -33
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/_types.rb +0 -207
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/base.rb +0 -22
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_audio.rb +0 -26
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_file.rb +0 -28
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_image.rb +0 -28
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_text.rb +0 -25
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/custom_tool_call.rb +0 -28
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/custom_tool_call_output.rb +0 -27
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/developer_message.rb +0 -20
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/file_search_tool_call.rb +0 -25
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/function_call_output.rb +0 -32
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/function_tool_call.rb +0 -28
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/image_gen_tool_call.rb +0 -27
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/input_message.rb +0 -31
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/item_reference.rb +0 -23
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/local_shell_tool_call.rb +0 -26
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/local_shell_tool_call_output.rb +0 -33
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_approval_request.rb +0 -30
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_approval_response.rb +0 -28
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_list_tools.rb +0 -29
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_tool_call.rb +0 -35
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/output_message.rb +0 -35
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/reasoning.rb +0 -33
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/system_message.rb +0 -20
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/tool_call_base.rb +0 -27
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/tool_message.rb +0 -23
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/user_message.rb +0 -20
- data/lib/active_agent/providers/open_ai/responses/requests/inputs/web_search_tool_call.rb +0 -24
- data/lib/active_agent/providers/open_ai/responses/requests/prompt_reference.rb +0 -23
- data/lib/active_agent/providers/open_ai/responses/requests/reasoning.rb +0 -23
- data/lib/active_agent/providers/open_ai/responses/requests/stream_options.rb +0 -20
- data/lib/active_agent/providers/open_ai/responses/requests/text/_types.rb +0 -89
- data/lib/active_agent/providers/open_ai/responses/requests/text/base.rb +0 -22
- data/lib/active_agent/providers/open_ai/responses/requests/text/json_object.rb +0 -20
- data/lib/active_agent/providers/open_ai/responses/requests/text/json_schema.rb +0 -48
- data/lib/active_agent/providers/open_ai/responses/requests/text/plain.rb +0 -20
- data/lib/active_agent/providers/open_ai/responses/requests/text.rb +0 -41
- data/lib/active_agent/providers/open_ai/responses/requests/tool_choice.rb +0 -26
- data/lib/active_agent/providers/open_ai/responses/requests/tools/_types.rb +0 -112
- data/lib/active_agent/providers/open_ai/responses/requests/tools/base.rb +0 -25
- data/lib/active_agent/providers/open_ai/responses/requests/tools/code_interpreter_tool.rb +0 -23
- data/lib/active_agent/providers/open_ai/responses/requests/tools/computer_tool.rb +0 -27
- data/lib/active_agent/providers/open_ai/responses/requests/tools/custom_tool.rb +0 -28
- data/lib/active_agent/providers/open_ai/responses/requests/tools/file_search_tool.rb +0 -27
- data/lib/active_agent/providers/open_ai/responses/requests/tools/function_tool.rb +0 -29
- data/lib/active_agent/providers/open_ai/responses/requests/tools/image_generation_tool.rb +0 -37
- data/lib/active_agent/providers/open_ai/responses/requests/tools/local_shell_tool.rb +0 -21
- data/lib/active_agent/providers/open_ai/responses/requests/tools/mcp_tool.rb +0 -41
- data/lib/active_agent/providers/open_ai/responses/requests/tools/web_search_preview_tool.rb +0 -24
- data/lib/active_agent/providers/open_ai/responses/requests/tools/web_search_tool.rb +0 -25
- data/lib/active_agent/providers/open_ai/schema.yml +0 -65937
- data/lib/active_agent/providers/open_router/requests/message.rb +0 -1
- data/lib/active_agent/providers/open_router/requests/messages/assistant.rb +0 -20
- data/lib/active_agent/providers/open_router/requests/messages/user.rb +0 -30
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "messages/_types"
|
|
4
|
-
require_relative "tools/_types"
|
|
5
|
-
|
|
6
|
-
require_relative "audio"
|
|
7
|
-
require_relative "prediction"
|
|
8
|
-
require_relative "response_format"
|
|
9
|
-
require_relative "stream_options"
|
|
10
|
-
require_relative "tool_choice"
|
|
11
|
-
require_relative "web_search_options"
|
|
12
|
-
|
|
13
|
-
module ActiveAgent
|
|
14
|
-
module Providers
|
|
15
|
-
module OpenAI
|
|
16
|
-
module Chat
|
|
17
|
-
module Requests
|
|
18
|
-
# Type for Audio
|
|
19
|
-
class AudioType < ActiveModel::Type::Value
|
|
20
|
-
def cast(value)
|
|
21
|
-
case value
|
|
22
|
-
when Audio
|
|
23
|
-
value
|
|
24
|
-
when Hash
|
|
25
|
-
Audio.new(**value.symbolize_keys)
|
|
26
|
-
when nil
|
|
27
|
-
nil
|
|
28
|
-
else
|
|
29
|
-
raise ArgumentError, "Cannot cast #{value.class} to Audio"
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def serialize(value)
|
|
34
|
-
case value
|
|
35
|
-
when Audio
|
|
36
|
-
value.serialize
|
|
37
|
-
when Hash
|
|
38
|
-
value
|
|
39
|
-
when nil
|
|
40
|
-
nil
|
|
41
|
-
else
|
|
42
|
-
raise ArgumentError, "Cannot serialize #{value.class}"
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def deserialize(value)
|
|
47
|
-
cast(value)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Type for Prediction
|
|
52
|
-
class PredictionType < ActiveModel::Type::Value
|
|
53
|
-
def cast(value)
|
|
54
|
-
case value
|
|
55
|
-
when Prediction
|
|
56
|
-
value
|
|
57
|
-
when Hash
|
|
58
|
-
Prediction.new(**value.symbolize_keys)
|
|
59
|
-
when nil
|
|
60
|
-
nil
|
|
61
|
-
else
|
|
62
|
-
raise ArgumentError, "Cannot cast #{value.class} to Prediction"
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def serialize(value)
|
|
67
|
-
case value
|
|
68
|
-
when Prediction
|
|
69
|
-
value.serialize
|
|
70
|
-
when Hash
|
|
71
|
-
value
|
|
72
|
-
when nil
|
|
73
|
-
nil
|
|
74
|
-
else
|
|
75
|
-
raise ArgumentError, "Cannot serialize #{value.class}"
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def deserialize(value)
|
|
80
|
-
cast(value)
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# Type for ResponseFormat
|
|
85
|
-
class ResponseFormatType < ActiveModel::Type::Value
|
|
86
|
-
def cast(value)
|
|
87
|
-
case value
|
|
88
|
-
when ResponseFormat
|
|
89
|
-
value
|
|
90
|
-
when Hash
|
|
91
|
-
ResponseFormat.new(**value.symbolize_keys)
|
|
92
|
-
when nil
|
|
93
|
-
nil
|
|
94
|
-
else
|
|
95
|
-
raise ArgumentError, "Cannot cast #{value.class} to ResponseFormat"
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def serialize(value)
|
|
100
|
-
case value
|
|
101
|
-
when ResponseFormat
|
|
102
|
-
value.serialize
|
|
103
|
-
when Hash
|
|
104
|
-
value
|
|
105
|
-
when nil
|
|
106
|
-
nil
|
|
107
|
-
else
|
|
108
|
-
raise ArgumentError, "Cannot serialize #{value.class}"
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def deserialize(value)
|
|
113
|
-
cast(value)
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# Type for StreamOptions
|
|
118
|
-
class StreamOptionsType < ActiveModel::Type::Value
|
|
119
|
-
def cast(value)
|
|
120
|
-
case value
|
|
121
|
-
when StreamOptions
|
|
122
|
-
value
|
|
123
|
-
when Hash
|
|
124
|
-
StreamOptions.new(**value.symbolize_keys)
|
|
125
|
-
when nil
|
|
126
|
-
nil
|
|
127
|
-
else
|
|
128
|
-
raise ArgumentError, "Cannot cast #{value.class} to StreamOptions"
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
def serialize(value)
|
|
133
|
-
case value
|
|
134
|
-
when StreamOptions
|
|
135
|
-
value.serialize
|
|
136
|
-
when Hash
|
|
137
|
-
value
|
|
138
|
-
when nil
|
|
139
|
-
nil
|
|
140
|
-
else
|
|
141
|
-
raise ArgumentError, "Cannot serialize #{value.class}"
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def deserialize(value)
|
|
146
|
-
cast(value)
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
# Type for ToolChoice
|
|
151
|
-
class ToolChoiceType < ActiveModel::Type::Value
|
|
152
|
-
def cast(value)
|
|
153
|
-
case value
|
|
154
|
-
when ToolChoice
|
|
155
|
-
value
|
|
156
|
-
when Hash
|
|
157
|
-
ToolChoice.new(**value.symbolize_keys)
|
|
158
|
-
when String
|
|
159
|
-
ToolChoice.new(mode: value)
|
|
160
|
-
when nil
|
|
161
|
-
nil
|
|
162
|
-
else
|
|
163
|
-
raise ArgumentError, "Cannot cast #{value.class} to ToolChoice"
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
def serialize(value)
|
|
168
|
-
case value
|
|
169
|
-
when ToolChoice
|
|
170
|
-
hash = value.serialize
|
|
171
|
-
# If it's just a mode string, return the string
|
|
172
|
-
if hash[:mode].present? && hash[:type].blank? && hash[:function].blank? && hash[:custom].blank? && hash[:allowed_tools].blank?
|
|
173
|
-
hash[:mode]
|
|
174
|
-
else
|
|
175
|
-
hash
|
|
176
|
-
end
|
|
177
|
-
when Hash
|
|
178
|
-
value
|
|
179
|
-
when String
|
|
180
|
-
value
|
|
181
|
-
when nil
|
|
182
|
-
nil
|
|
183
|
-
else
|
|
184
|
-
raise ArgumentError, "Cannot serialize #{value.class}"
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
def deserialize(value)
|
|
189
|
-
cast(value)
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
# Type for WebSearchOptions
|
|
194
|
-
class WebSearchOptionsType < ActiveModel::Type::Value
|
|
195
|
-
def cast(value)
|
|
196
|
-
case value
|
|
197
|
-
when WebSearchOptions
|
|
198
|
-
value
|
|
199
|
-
when Hash
|
|
200
|
-
WebSearchOptions.new(**value.symbolize_keys)
|
|
201
|
-
when nil
|
|
202
|
-
nil
|
|
203
|
-
else
|
|
204
|
-
raise ArgumentError, "Cannot cast #{value.class} to WebSearchOptions"
|
|
205
|
-
end
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
def serialize(value)
|
|
209
|
-
case value
|
|
210
|
-
when WebSearchOptions
|
|
211
|
-
value.serialize
|
|
212
|
-
when Hash
|
|
213
|
-
value
|
|
214
|
-
when nil
|
|
215
|
-
nil
|
|
216
|
-
else
|
|
217
|
-
raise ArgumentError, "Cannot serialize #{value.class}"
|
|
218
|
-
end
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
def deserialize(value)
|
|
222
|
-
cast(value)
|
|
223
|
-
end
|
|
224
|
-
end
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
end
|
|
229
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "active_agent/providers/common/model"
|
|
4
|
-
|
|
5
|
-
module ActiveAgent
|
|
6
|
-
module Providers
|
|
7
|
-
module OpenAI
|
|
8
|
-
module Chat
|
|
9
|
-
module Requests
|
|
10
|
-
class Audio < Common::BaseModel
|
|
11
|
-
# Voice to use for audio output
|
|
12
|
-
attribute :voice, :string
|
|
13
|
-
|
|
14
|
-
# Audio format
|
|
15
|
-
attribute :format, :string
|
|
16
|
-
|
|
17
|
-
validates :voice, inclusion: { in: %w[alloy ash ballad coral echo fable nova onyx sage shimmer] }, allow_nil: true
|
|
18
|
-
validates :format, inclusion: { in: %w[wav mp3 flac opus pcm16] }, allow_nil: true
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "content/_types"
|
|
4
|
-
|
|
5
|
-
# Load all message classes
|
|
6
|
-
require_relative "base"
|
|
7
|
-
require_relative "developer"
|
|
8
|
-
require_relative "system"
|
|
9
|
-
require_relative "user"
|
|
10
|
-
require_relative "assistant"
|
|
11
|
-
require_relative "tool"
|
|
12
|
-
require_relative "function"
|
|
13
|
-
|
|
14
|
-
module ActiveAgent
|
|
15
|
-
module Providers
|
|
16
|
-
module OpenAI
|
|
17
|
-
module Chat
|
|
18
|
-
module Requests
|
|
19
|
-
module Messages
|
|
20
|
-
# Type for Messages array
|
|
21
|
-
class MessagesType < ActiveModel::Type::Value
|
|
22
|
-
def initialize
|
|
23
|
-
super
|
|
24
|
-
@message_type = MessageType.new
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def cast(value)
|
|
28
|
-
case value
|
|
29
|
-
when Array
|
|
30
|
-
value.map { |v| @message_type.cast(v) }
|
|
31
|
-
when nil
|
|
32
|
-
nil
|
|
33
|
-
else
|
|
34
|
-
raise ArgumentError, "Cannot cast #{value.class} to Messages array"
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def serialize(value)
|
|
39
|
-
case value
|
|
40
|
-
when Array
|
|
41
|
-
grouped = []
|
|
42
|
-
|
|
43
|
-
value.each do |message|
|
|
44
|
-
if grouped.empty? || grouped.last.role != message.role
|
|
45
|
-
grouped << message.deep_dup
|
|
46
|
-
else
|
|
47
|
-
grouped.last.content += message.content.deep_dup
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
grouped.map { |v| @message_type.serialize(v) }
|
|
52
|
-
when nil
|
|
53
|
-
nil
|
|
54
|
-
else
|
|
55
|
-
raise ArgumentError, "Cannot serialize #{value.class}"
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def deserialize(value)
|
|
60
|
-
cast(value)
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# Type for individual Message
|
|
65
|
-
class MessageType < ActiveModel::Type::Value
|
|
66
|
-
def cast(value)
|
|
67
|
-
case value
|
|
68
|
-
when ::OpenAI::Models::Chat::ChatCompletionMessage
|
|
69
|
-
cast(value.to_h)
|
|
70
|
-
when Base
|
|
71
|
-
value
|
|
72
|
-
when String
|
|
73
|
-
User.new(content: value)
|
|
74
|
-
when Hash
|
|
75
|
-
hash = value.deep_symbolize_keys
|
|
76
|
-
role = hash[:role]&.to_sym
|
|
77
|
-
|
|
78
|
-
case role
|
|
79
|
-
when :developer
|
|
80
|
-
Developer.new(**hash)
|
|
81
|
-
when :system
|
|
82
|
-
System.new(**hash)
|
|
83
|
-
when :user, nil
|
|
84
|
-
User.new(**hash)
|
|
85
|
-
when :assistant
|
|
86
|
-
Assistant.new(**hash)
|
|
87
|
-
when :tool
|
|
88
|
-
Tool.new(**hash)
|
|
89
|
-
when :function
|
|
90
|
-
Function.new(**hash)
|
|
91
|
-
else
|
|
92
|
-
raise ArgumentError, "Unknown message role: #{role.inspect}"
|
|
93
|
-
end
|
|
94
|
-
when nil
|
|
95
|
-
nil
|
|
96
|
-
else
|
|
97
|
-
raise ArgumentError, "Cannot cast #{value.class} to Message (expected Base, String, Hash, or nil)"
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def serialize(value)
|
|
102
|
-
case value
|
|
103
|
-
when Base
|
|
104
|
-
value.serialize
|
|
105
|
-
when Hash
|
|
106
|
-
value
|
|
107
|
-
when nil
|
|
108
|
-
nil
|
|
109
|
-
else
|
|
110
|
-
raise ArgumentError, "Cannot serialize #{value.class} as Message"
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def deserialize(value)
|
|
115
|
-
cast(value)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "base"
|
|
4
|
-
require_relative "content/_types"
|
|
5
|
-
|
|
6
|
-
module ActiveAgent
|
|
7
|
-
module Providers
|
|
8
|
-
module OpenAI
|
|
9
|
-
module Chat
|
|
10
|
-
module Requests
|
|
11
|
-
module Messages
|
|
12
|
-
# Assistant message - messages sent by the model
|
|
13
|
-
class Assistant < Base
|
|
14
|
-
attribute :role, :string, as: "assistant"
|
|
15
|
-
attribute :content # String, null, or array of content parts
|
|
16
|
-
attribute :name, :string # Optional name for the participant
|
|
17
|
-
attribute :audio # Audio response from the model
|
|
18
|
-
attribute :refusal, :string # Refusal message if the model refused to respond
|
|
19
|
-
attribute :tool_calls # Array of tool calls the model wants to make
|
|
20
|
-
attribute :function_call # Deprecated: function call (use tool_calls instead)
|
|
21
|
-
|
|
22
|
-
# Assistant messages need content, tool_calls, function_call, or refusal
|
|
23
|
-
validate :validate_has_response_content
|
|
24
|
-
|
|
25
|
-
drop_attributes :annotations, :index
|
|
26
|
-
|
|
27
|
-
alias_attribute :text, :content
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def validate_has_response_content
|
|
32
|
-
if content.nil? && tool_calls.nil? && function_call.nil? && refusal.nil?
|
|
33
|
-
errors.add(:base, "must have content, tool_calls, function_call, or refusal")
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "active_agent/providers/common/model"
|
|
4
|
-
|
|
5
|
-
module ActiveAgent
|
|
6
|
-
module Providers
|
|
7
|
-
module OpenAI
|
|
8
|
-
module Chat
|
|
9
|
-
module Requests
|
|
10
|
-
module Messages
|
|
11
|
-
# Base class for all OpenAI message types.
|
|
12
|
-
#
|
|
13
|
-
# Provides common message structure and conversion utilities for
|
|
14
|
-
# OpenAI's message format, including role mapping and content extraction.
|
|
15
|
-
class Base < Common::BaseModel
|
|
16
|
-
attribute :role, :string
|
|
17
|
-
|
|
18
|
-
validates :role, presence: true
|
|
19
|
-
|
|
20
|
-
# Converts to common format.
|
|
21
|
-
#
|
|
22
|
-
# @return [Hash] message in canonical format
|
|
23
|
-
def to_common
|
|
24
|
-
{
|
|
25
|
-
role: map_role_to_common,
|
|
26
|
-
content: extract_text_content,
|
|
27
|
-
name: respond_to?(:name) ? name : nil,
|
|
28
|
-
tool_call_id: respond_to?(:tool_call_id) ? tool_call_id : nil
|
|
29
|
-
}.compact
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
private
|
|
33
|
-
|
|
34
|
-
# Maps OpenAI roles to canonical roles.
|
|
35
|
-
#
|
|
36
|
-
# @return [String] canonical role name
|
|
37
|
-
def map_role_to_common
|
|
38
|
-
case role
|
|
39
|
-
when "developer", "system"
|
|
40
|
-
"system"
|
|
41
|
-
when "user"
|
|
42
|
-
"user"
|
|
43
|
-
when "assistant"
|
|
44
|
-
"assistant"
|
|
45
|
-
when "tool", "function"
|
|
46
|
-
"tool"
|
|
47
|
-
else
|
|
48
|
-
role
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Extracts text content from OpenAI's content structure.
|
|
53
|
-
#
|
|
54
|
-
# @return [String, nil] extracted text content
|
|
55
|
-
def extract_text_content
|
|
56
|
-
return nil unless respond_to?(:content)
|
|
57
|
-
|
|
58
|
-
case content
|
|
59
|
-
when String
|
|
60
|
-
content
|
|
61
|
-
when Array
|
|
62
|
-
# Join all text parts
|
|
63
|
-
content.select { |part| part.is_a?(Hash) && part["type"] == "text" }
|
|
64
|
-
.map { |part| part["text"] }
|
|
65
|
-
.join("\n")
|
|
66
|
-
when nil
|
|
67
|
-
nil
|
|
68
|
-
else
|
|
69
|
-
content.to_s
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "base"
|
|
4
|
-
require_relative "text"
|
|
5
|
-
require_relative "image"
|
|
6
|
-
require_relative "audio"
|
|
7
|
-
require_relative "file"
|
|
8
|
-
require_relative "refusal"
|
|
9
|
-
|
|
10
|
-
module ActiveAgent
|
|
11
|
-
module Providers
|
|
12
|
-
module OpenAI
|
|
13
|
-
module Chat
|
|
14
|
-
module Requests
|
|
15
|
-
module Messages
|
|
16
|
-
module Content
|
|
17
|
-
# Type for handling content (string or array of content parts)
|
|
18
|
-
class ContentsType < ActiveModel::Type::Value
|
|
19
|
-
def initialize
|
|
20
|
-
super
|
|
21
|
-
@content_type = ContentType.new
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def cast(value)
|
|
25
|
-
case value
|
|
26
|
-
when String
|
|
27
|
-
# Plain text string - convert to array with single text content
|
|
28
|
-
[ Text.new(text: value) ]
|
|
29
|
-
when Array
|
|
30
|
-
# Array of content parts - cast each part
|
|
31
|
-
value.map { |part| @content_type.cast(part) }
|
|
32
|
-
when nil
|
|
33
|
-
nil
|
|
34
|
-
else
|
|
35
|
-
raise ArgumentError, "Cannot cast #{value.class} to Contents (expected String, Array, or nil)"
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def serialize(value)
|
|
40
|
-
case value
|
|
41
|
-
when String
|
|
42
|
-
value
|
|
43
|
-
when Array
|
|
44
|
-
array = value.map { |part| @content_type.serialize(part) }
|
|
45
|
-
|
|
46
|
-
if array in [ { type: "text", text: String } ]
|
|
47
|
-
array.first[:text]
|
|
48
|
-
else
|
|
49
|
-
array
|
|
50
|
-
end
|
|
51
|
-
when nil
|
|
52
|
-
nil
|
|
53
|
-
else
|
|
54
|
-
raise ArgumentError, "Cannot serialize #{value.class} as Contents"
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def deserialize(value)
|
|
59
|
-
cast(value)
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Type for individual content items
|
|
64
|
-
class ContentType < ActiveModel::Type::Value
|
|
65
|
-
def cast(value)
|
|
66
|
-
case value
|
|
67
|
-
when Base
|
|
68
|
-
value
|
|
69
|
-
when Hash
|
|
70
|
-
hash = value.deep_symbolize_keys
|
|
71
|
-
type = hash[:type]&.to_sym
|
|
72
|
-
|
|
73
|
-
case type
|
|
74
|
-
when :text
|
|
75
|
-
Text.new(**hash)
|
|
76
|
-
when :image_url
|
|
77
|
-
Image.new(**hash)
|
|
78
|
-
when :input_audio
|
|
79
|
-
Audio.new(**hash)
|
|
80
|
-
when :file
|
|
81
|
-
File.new(**hash)
|
|
82
|
-
when :refusal
|
|
83
|
-
Refusal.new(**hash)
|
|
84
|
-
when nil
|
|
85
|
-
# When type is nil, check for specific content keys to infer type
|
|
86
|
-
if hash.key?(:text)
|
|
87
|
-
Text.new(**hash)
|
|
88
|
-
elsif hash.key?(:image)
|
|
89
|
-
Image.new(**hash.merge(image_url: hash.delete(:image)))
|
|
90
|
-
elsif hash.key?(:document)
|
|
91
|
-
File.new(**hash.merge(file: hash.delete(:document)))
|
|
92
|
-
else
|
|
93
|
-
raise ArgumentError, "Cannot determine content type from hash keys: #{hash.keys.inspect}"
|
|
94
|
-
end
|
|
95
|
-
else
|
|
96
|
-
raise ArgumentError, "Unknown content type: #{type.inspect}"
|
|
97
|
-
end
|
|
98
|
-
when String
|
|
99
|
-
# Plain text string becomes text content
|
|
100
|
-
Text.new(text: value)
|
|
101
|
-
when nil
|
|
102
|
-
nil
|
|
103
|
-
else
|
|
104
|
-
raise ArgumentError, "Cannot cast #{value.class} to Content (expected Base, Hash, String, or nil)"
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
def serialize(value)
|
|
109
|
-
case value
|
|
110
|
-
when Base
|
|
111
|
-
value.serialize
|
|
112
|
-
when Hash
|
|
113
|
-
value
|
|
114
|
-
when String
|
|
115
|
-
{ type: "text", text: value }
|
|
116
|
-
when nil
|
|
117
|
-
nil
|
|
118
|
-
else
|
|
119
|
-
raise ArgumentError, "Cannot serialize #{value.class} as Content"
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def deserialize(value)
|
|
124
|
-
cast(value)
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "base"
|
|
4
|
-
|
|
5
|
-
module ActiveAgent
|
|
6
|
-
module Providers
|
|
7
|
-
module OpenAI
|
|
8
|
-
module Chat
|
|
9
|
-
module Requests
|
|
10
|
-
module Messages
|
|
11
|
-
module Content
|
|
12
|
-
# Audio content part
|
|
13
|
-
class Audio < Base
|
|
14
|
-
attribute :type, :string, as: "input_audio"
|
|
15
|
-
attribute :input_audio, default: -> { {} }
|
|
16
|
-
|
|
17
|
-
validates :input_audio, presence: true
|
|
18
|
-
|
|
19
|
-
# Nested input_audio object
|
|
20
|
-
def input_audio=(value)
|
|
21
|
-
case value
|
|
22
|
-
when Hash
|
|
23
|
-
super(value.symbolize_keys)
|
|
24
|
-
else
|
|
25
|
-
super(value)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "active_agent/providers/common/model"
|
|
4
|
-
|
|
5
|
-
module ActiveAgent
|
|
6
|
-
module Providers
|
|
7
|
-
module OpenAI
|
|
8
|
-
module Chat
|
|
9
|
-
module Requests
|
|
10
|
-
module Messages
|
|
11
|
-
module Content
|
|
12
|
-
# Base class for content parts
|
|
13
|
-
class Base < Common::BaseModel
|
|
14
|
-
attribute :type, :string
|
|
15
|
-
|
|
16
|
-
validates :type, presence: true
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|