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.
Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -1
  3. data/lib/active_agent/providers/_base_provider.rb +92 -82
  4. data/lib/active_agent/providers/anthropic/_types.rb +2 -2
  5. data/lib/active_agent/providers/anthropic/request.rb +135 -81
  6. data/lib/active_agent/providers/anthropic/transforms.rb +353 -0
  7. data/lib/active_agent/providers/anthropic_provider.rb +96 -53
  8. data/lib/active_agent/providers/common/messages/_types.rb +37 -1
  9. data/lib/active_agent/providers/common/responses/base.rb +118 -70
  10. data/lib/active_agent/providers/common/usage.rb +385 -0
  11. data/lib/active_agent/providers/concerns/instrumentation.rb +263 -0
  12. data/lib/active_agent/providers/log_subscriber.rb +64 -246
  13. data/lib/active_agent/providers/mock_provider.rb +23 -23
  14. data/lib/active_agent/providers/ollama/chat/request.rb +214 -35
  15. data/lib/active_agent/providers/ollama/chat/transforms.rb +135 -0
  16. data/lib/active_agent/providers/ollama/embedding/request.rb +160 -47
  17. data/lib/active_agent/providers/ollama/embedding/transforms.rb +160 -0
  18. data/lib/active_agent/providers/ollama_provider.rb +0 -1
  19. data/lib/active_agent/providers/open_ai/_base.rb +3 -2
  20. data/lib/active_agent/providers/open_ai/chat/_types.rb +13 -1
  21. data/lib/active_agent/providers/open_ai/chat/request.rb +132 -186
  22. data/lib/active_agent/providers/open_ai/chat/transforms.rb +364 -0
  23. data/lib/active_agent/providers/open_ai/chat_provider.rb +57 -36
  24. data/lib/active_agent/providers/open_ai/embedding/_types.rb +13 -2
  25. data/lib/active_agent/providers/open_ai/embedding/request.rb +38 -70
  26. data/lib/active_agent/providers/open_ai/embedding/transforms.rb +88 -0
  27. data/lib/active_agent/providers/open_ai/responses/_types.rb +1 -7
  28. data/lib/active_agent/providers/open_ai/responses/request.rb +100 -134
  29. data/lib/active_agent/providers/open_ai/responses/transforms.rb +228 -0
  30. data/lib/active_agent/providers/open_ai/responses_provider.rb +77 -30
  31. data/lib/active_agent/providers/open_ai_provider.rb +0 -3
  32. data/lib/active_agent/providers/open_router/_types.rb +27 -1
  33. data/lib/active_agent/providers/open_router/options.rb +49 -1
  34. data/lib/active_agent/providers/open_router/request.rb +232 -66
  35. data/lib/active_agent/providers/open_router/requests/_types.rb +0 -1
  36. data/lib/active_agent/providers/open_router/requests/messages/_types.rb +37 -40
  37. data/lib/active_agent/providers/open_router/requests/messages/content/file.rb +19 -3
  38. data/lib/active_agent/providers/open_router/requests/messages/content/files/details.rb +15 -4
  39. data/lib/active_agent/providers/open_router/requests/plugin.rb +19 -3
  40. data/lib/active_agent/providers/open_router/requests/plugins/pdf_config.rb +30 -8
  41. data/lib/active_agent/providers/open_router/requests/prediction.rb +17 -0
  42. data/lib/active_agent/providers/open_router/requests/provider_preferences/max_price.rb +41 -7
  43. data/lib/active_agent/providers/open_router/requests/provider_preferences.rb +60 -19
  44. data/lib/active_agent/providers/open_router/requests/response_format.rb +30 -2
  45. data/lib/active_agent/providers/open_router/transforms.rb +134 -0
  46. data/lib/active_agent/providers/open_router_provider.rb +9 -0
  47. data/lib/active_agent/version.rb +1 -1
  48. metadata +15 -159
  49. data/lib/active_agent/generation_provider/open_router/types.rb +0 -505
  50. data/lib/active_agent/generation_provider/xai_provider.rb +0 -144
  51. data/lib/active_agent/providers/anthropic/requests/_types.rb +0 -190
  52. data/lib/active_agent/providers/anthropic/requests/container_params.rb +0 -19
  53. data/lib/active_agent/providers/anthropic/requests/content/base.rb +0 -21
  54. data/lib/active_agent/providers/anthropic/requests/content/sources/base.rb +0 -22
  55. data/lib/active_agent/providers/anthropic/requests/context_management_config.rb +0 -18
  56. data/lib/active_agent/providers/anthropic/requests/messages/_types.rb +0 -189
  57. data/lib/active_agent/providers/anthropic/requests/messages/assistant.rb +0 -23
  58. data/lib/active_agent/providers/anthropic/requests/messages/base.rb +0 -63
  59. data/lib/active_agent/providers/anthropic/requests/messages/content/_types.rb +0 -143
  60. data/lib/active_agent/providers/anthropic/requests/messages/content/base.rb +0 -21
  61. data/lib/active_agent/providers/anthropic/requests/messages/content/document.rb +0 -26
  62. data/lib/active_agent/providers/anthropic/requests/messages/content/image.rb +0 -23
  63. data/lib/active_agent/providers/anthropic/requests/messages/content/redacted_thinking.rb +0 -21
  64. data/lib/active_agent/providers/anthropic/requests/messages/content/search_result.rb +0 -27
  65. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/_types.rb +0 -171
  66. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/base.rb +0 -22
  67. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_base64.rb +0 -25
  68. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_file.rb +0 -23
  69. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_text.rb +0 -25
  70. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_url.rb +0 -23
  71. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_base64.rb +0 -27
  72. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_file.rb +0 -23
  73. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_url.rb +0 -23
  74. data/lib/active_agent/providers/anthropic/requests/messages/content/text.rb +0 -22
  75. data/lib/active_agent/providers/anthropic/requests/messages/content/thinking.rb +0 -23
  76. data/lib/active_agent/providers/anthropic/requests/messages/content/tool_result.rb +0 -24
  77. data/lib/active_agent/providers/anthropic/requests/messages/content/tool_use.rb +0 -28
  78. data/lib/active_agent/providers/anthropic/requests/messages/user.rb +0 -21
  79. data/lib/active_agent/providers/anthropic/requests/metadata.rb +0 -18
  80. data/lib/active_agent/providers/anthropic/requests/response_format.rb +0 -22
  81. data/lib/active_agent/providers/anthropic/requests/thinking_config/_types.rb +0 -60
  82. data/lib/active_agent/providers/anthropic/requests/thinking_config/base.rb +0 -20
  83. data/lib/active_agent/providers/anthropic/requests/thinking_config/disabled.rb +0 -16
  84. data/lib/active_agent/providers/anthropic/requests/thinking_config/enabled.rb +0 -20
  85. data/lib/active_agent/providers/anthropic/requests/tool_choice/_types.rb +0 -78
  86. data/lib/active_agent/providers/anthropic/requests/tool_choice/any.rb +0 -17
  87. data/lib/active_agent/providers/anthropic/requests/tool_choice/auto.rb +0 -17
  88. data/lib/active_agent/providers/anthropic/requests/tool_choice/base.rb +0 -20
  89. data/lib/active_agent/providers/anthropic/requests/tool_choice/none.rb +0 -16
  90. data/lib/active_agent/providers/anthropic/requests/tool_choice/tool.rb +0 -20
  91. data/lib/active_agent/providers/ollama/chat/requests/_types.rb +0 -3
  92. data/lib/active_agent/providers/ollama/chat/requests/messages/_types.rb +0 -116
  93. data/lib/active_agent/providers/ollama/chat/requests/messages/assistant.rb +0 -19
  94. data/lib/active_agent/providers/ollama/chat/requests/messages/user.rb +0 -19
  95. data/lib/active_agent/providers/ollama/embedding/requests/_types.rb +0 -83
  96. data/lib/active_agent/providers/ollama/embedding/requests/options.rb +0 -104
  97. data/lib/active_agent/providers/open_ai/chat/requests/_types.rb +0 -229
  98. data/lib/active_agent/providers/open_ai/chat/requests/audio.rb +0 -24
  99. data/lib/active_agent/providers/open_ai/chat/requests/messages/_types.rb +0 -123
  100. data/lib/active_agent/providers/open_ai/chat/requests/messages/assistant.rb +0 -42
  101. data/lib/active_agent/providers/open_ai/chat/requests/messages/base.rb +0 -78
  102. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/_types.rb +0 -133
  103. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/audio.rb +0 -35
  104. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/base.rb +0 -24
  105. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/file.rb +0 -26
  106. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/files/_types.rb +0 -60
  107. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/files/details.rb +0 -41
  108. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/image.rb +0 -37
  109. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/refusal.rb +0 -25
  110. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/text.rb +0 -25
  111. data/lib/active_agent/providers/open_ai/chat/requests/messages/developer.rb +0 -25
  112. data/lib/active_agent/providers/open_ai/chat/requests/messages/function.rb +0 -25
  113. data/lib/active_agent/providers/open_ai/chat/requests/messages/system.rb +0 -25
  114. data/lib/active_agent/providers/open_ai/chat/requests/messages/tool.rb +0 -26
  115. data/lib/active_agent/providers/open_ai/chat/requests/messages/user.rb +0 -32
  116. data/lib/active_agent/providers/open_ai/chat/requests/prediction.rb +0 -46
  117. data/lib/active_agent/providers/open_ai/chat/requests/response_format.rb +0 -53
  118. data/lib/active_agent/providers/open_ai/chat/requests/stream_options.rb +0 -24
  119. data/lib/active_agent/providers/open_ai/chat/requests/tool_choice.rb +0 -26
  120. data/lib/active_agent/providers/open_ai/chat/requests/tools/_types.rb +0 -5
  121. data/lib/active_agent/providers/open_ai/chat/requests/tools/base.rb +0 -22
  122. data/lib/active_agent/providers/open_ai/chat/requests/tools/custom_tool.rb +0 -41
  123. data/lib/active_agent/providers/open_ai/chat/requests/tools/function_tool.rb +0 -51
  124. data/lib/active_agent/providers/open_ai/chat/requests/web_search_options.rb +0 -45
  125. data/lib/active_agent/providers/open_ai/embedding/requests/_types.rb +0 -49
  126. data/lib/active_agent/providers/open_ai/responses/requests/_types.rb +0 -231
  127. data/lib/active_agent/providers/open_ai/responses/requests/conversation.rb +0 -23
  128. data/lib/active_agent/providers/open_ai/responses/requests/inputs/_types.rb +0 -264
  129. data/lib/active_agent/providers/open_ai/responses/requests/inputs/assistant_message.rb +0 -22
  130. data/lib/active_agent/providers/open_ai/responses/requests/inputs/base.rb +0 -89
  131. data/lib/active_agent/providers/open_ai/responses/requests/inputs/code_interpreter_tool_call.rb +0 -30
  132. data/lib/active_agent/providers/open_ai/responses/requests/inputs/computer_tool_call.rb +0 -28
  133. data/lib/active_agent/providers/open_ai/responses/requests/inputs/computer_tool_call_output.rb +0 -33
  134. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/_types.rb +0 -207
  135. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/base.rb +0 -22
  136. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_audio.rb +0 -26
  137. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_file.rb +0 -28
  138. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_image.rb +0 -28
  139. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_text.rb +0 -25
  140. data/lib/active_agent/providers/open_ai/responses/requests/inputs/custom_tool_call.rb +0 -28
  141. data/lib/active_agent/providers/open_ai/responses/requests/inputs/custom_tool_call_output.rb +0 -27
  142. data/lib/active_agent/providers/open_ai/responses/requests/inputs/developer_message.rb +0 -20
  143. data/lib/active_agent/providers/open_ai/responses/requests/inputs/file_search_tool_call.rb +0 -25
  144. data/lib/active_agent/providers/open_ai/responses/requests/inputs/function_call_output.rb +0 -32
  145. data/lib/active_agent/providers/open_ai/responses/requests/inputs/function_tool_call.rb +0 -28
  146. data/lib/active_agent/providers/open_ai/responses/requests/inputs/image_gen_tool_call.rb +0 -27
  147. data/lib/active_agent/providers/open_ai/responses/requests/inputs/input_message.rb +0 -31
  148. data/lib/active_agent/providers/open_ai/responses/requests/inputs/item_reference.rb +0 -23
  149. data/lib/active_agent/providers/open_ai/responses/requests/inputs/local_shell_tool_call.rb +0 -26
  150. data/lib/active_agent/providers/open_ai/responses/requests/inputs/local_shell_tool_call_output.rb +0 -33
  151. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_approval_request.rb +0 -30
  152. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_approval_response.rb +0 -28
  153. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_list_tools.rb +0 -29
  154. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_tool_call.rb +0 -35
  155. data/lib/active_agent/providers/open_ai/responses/requests/inputs/output_message.rb +0 -35
  156. data/lib/active_agent/providers/open_ai/responses/requests/inputs/reasoning.rb +0 -33
  157. data/lib/active_agent/providers/open_ai/responses/requests/inputs/system_message.rb +0 -20
  158. data/lib/active_agent/providers/open_ai/responses/requests/inputs/tool_call_base.rb +0 -27
  159. data/lib/active_agent/providers/open_ai/responses/requests/inputs/tool_message.rb +0 -23
  160. data/lib/active_agent/providers/open_ai/responses/requests/inputs/user_message.rb +0 -20
  161. data/lib/active_agent/providers/open_ai/responses/requests/inputs/web_search_tool_call.rb +0 -24
  162. data/lib/active_agent/providers/open_ai/responses/requests/prompt_reference.rb +0 -23
  163. data/lib/active_agent/providers/open_ai/responses/requests/reasoning.rb +0 -23
  164. data/lib/active_agent/providers/open_ai/responses/requests/stream_options.rb +0 -20
  165. data/lib/active_agent/providers/open_ai/responses/requests/text/_types.rb +0 -89
  166. data/lib/active_agent/providers/open_ai/responses/requests/text/base.rb +0 -22
  167. data/lib/active_agent/providers/open_ai/responses/requests/text/json_object.rb +0 -20
  168. data/lib/active_agent/providers/open_ai/responses/requests/text/json_schema.rb +0 -48
  169. data/lib/active_agent/providers/open_ai/responses/requests/text/plain.rb +0 -20
  170. data/lib/active_agent/providers/open_ai/responses/requests/text.rb +0 -41
  171. data/lib/active_agent/providers/open_ai/responses/requests/tool_choice.rb +0 -26
  172. data/lib/active_agent/providers/open_ai/responses/requests/tools/_types.rb +0 -112
  173. data/lib/active_agent/providers/open_ai/responses/requests/tools/base.rb +0 -25
  174. data/lib/active_agent/providers/open_ai/responses/requests/tools/code_interpreter_tool.rb +0 -23
  175. data/lib/active_agent/providers/open_ai/responses/requests/tools/computer_tool.rb +0 -27
  176. data/lib/active_agent/providers/open_ai/responses/requests/tools/custom_tool.rb +0 -28
  177. data/lib/active_agent/providers/open_ai/responses/requests/tools/file_search_tool.rb +0 -27
  178. data/lib/active_agent/providers/open_ai/responses/requests/tools/function_tool.rb +0 -29
  179. data/lib/active_agent/providers/open_ai/responses/requests/tools/image_generation_tool.rb +0 -37
  180. data/lib/active_agent/providers/open_ai/responses/requests/tools/local_shell_tool.rb +0 -21
  181. data/lib/active_agent/providers/open_ai/responses/requests/tools/mcp_tool.rb +0 -41
  182. data/lib/active_agent/providers/open_ai/responses/requests/tools/web_search_preview_tool.rb +0 -24
  183. data/lib/active_agent/providers/open_ai/responses/requests/tools/web_search_tool.rb +0 -25
  184. data/lib/active_agent/providers/open_ai/schema.yml +0 -65937
  185. data/lib/active_agent/providers/open_router/requests/message.rb +0 -1
  186. data/lib/active_agent/providers/open_router/requests/messages/assistant.rb +0 -20
  187. 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