activeagent 1.0.0.rc1 → 1.0.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.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +102 -1
  3. data/lib/active_agent/providers/_base_provider.rb +94 -82
  4. data/lib/active_agent/providers/anthropic/_types.rb +2 -2
  5. data/lib/active_agent/providers/anthropic/options.rb +4 -6
  6. data/lib/active_agent/providers/anthropic/request.rb +157 -78
  7. data/lib/active_agent/providers/anthropic/transforms.rb +482 -0
  8. data/lib/active_agent/providers/anthropic_provider.rb +159 -59
  9. data/lib/active_agent/providers/common/messages/_types.rb +46 -3
  10. data/lib/active_agent/providers/common/messages/assistant.rb +20 -4
  11. data/lib/active_agent/providers/common/responses/base.rb +118 -70
  12. data/lib/active_agent/providers/common/usage.rb +385 -0
  13. data/lib/active_agent/providers/concerns/instrumentation.rb +263 -0
  14. data/lib/active_agent/providers/concerns/previewable.rb +39 -5
  15. data/lib/active_agent/providers/concerns/tool_choice_clearing.rb +62 -0
  16. data/lib/active_agent/providers/log_subscriber.rb +64 -246
  17. data/lib/active_agent/providers/mock_provider.rb +23 -23
  18. data/lib/active_agent/providers/ollama/chat/request.rb +214 -35
  19. data/lib/active_agent/providers/ollama/chat/transforms.rb +135 -0
  20. data/lib/active_agent/providers/ollama/embedding/request.rb +160 -47
  21. data/lib/active_agent/providers/ollama/embedding/transforms.rb +160 -0
  22. data/lib/active_agent/providers/ollama_provider.rb +0 -1
  23. data/lib/active_agent/providers/open_ai/_base.rb +3 -2
  24. data/lib/active_agent/providers/open_ai/chat/_types.rb +13 -1
  25. data/lib/active_agent/providers/open_ai/chat/request.rb +132 -186
  26. data/lib/active_agent/providers/open_ai/chat/transforms.rb +444 -0
  27. data/lib/active_agent/providers/open_ai/chat_provider.rb +95 -36
  28. data/lib/active_agent/providers/open_ai/embedding/_types.rb +13 -2
  29. data/lib/active_agent/providers/open_ai/embedding/request.rb +38 -70
  30. data/lib/active_agent/providers/open_ai/embedding/transforms.rb +88 -0
  31. data/lib/active_agent/providers/open_ai/responses/_types.rb +1 -7
  32. data/lib/active_agent/providers/open_ai/responses/request.rb +116 -135
  33. data/lib/active_agent/providers/open_ai/responses/transforms.rb +363 -0
  34. data/lib/active_agent/providers/open_ai/responses_provider.rb +115 -30
  35. data/lib/active_agent/providers/open_ai_provider.rb +0 -3
  36. data/lib/active_agent/providers/open_router/_types.rb +27 -1
  37. data/lib/active_agent/providers/open_router/options.rb +49 -1
  38. data/lib/active_agent/providers/open_router/request.rb +252 -66
  39. data/lib/active_agent/providers/open_router/requests/_types.rb +0 -1
  40. data/lib/active_agent/providers/open_router/requests/messages/_types.rb +37 -40
  41. data/lib/active_agent/providers/open_router/requests/messages/content/file.rb +19 -3
  42. data/lib/active_agent/providers/open_router/requests/messages/content/files/details.rb +15 -4
  43. data/lib/active_agent/providers/open_router/requests/plugin.rb +19 -3
  44. data/lib/active_agent/providers/open_router/requests/plugins/pdf_config.rb +30 -8
  45. data/lib/active_agent/providers/open_router/requests/prediction.rb +17 -0
  46. data/lib/active_agent/providers/open_router/requests/provider_preferences/max_price.rb +41 -7
  47. data/lib/active_agent/providers/open_router/requests/provider_preferences.rb +60 -19
  48. data/lib/active_agent/providers/open_router/requests/response_format.rb +30 -2
  49. data/lib/active_agent/providers/open_router/transforms.rb +164 -0
  50. data/lib/active_agent/providers/open_router_provider.rb +23 -0
  51. data/lib/active_agent/version.rb +1 -1
  52. metadata +17 -160
  53. data/lib/active_agent/generation_provider/open_router/types.rb +0 -505
  54. data/lib/active_agent/generation_provider/xai_provider.rb +0 -144
  55. data/lib/active_agent/providers/anthropic/requests/_types.rb +0 -190
  56. data/lib/active_agent/providers/anthropic/requests/container_params.rb +0 -19
  57. data/lib/active_agent/providers/anthropic/requests/content/base.rb +0 -21
  58. data/lib/active_agent/providers/anthropic/requests/content/sources/base.rb +0 -22
  59. data/lib/active_agent/providers/anthropic/requests/context_management_config.rb +0 -18
  60. data/lib/active_agent/providers/anthropic/requests/messages/_types.rb +0 -189
  61. data/lib/active_agent/providers/anthropic/requests/messages/assistant.rb +0 -23
  62. data/lib/active_agent/providers/anthropic/requests/messages/base.rb +0 -63
  63. data/lib/active_agent/providers/anthropic/requests/messages/content/_types.rb +0 -143
  64. data/lib/active_agent/providers/anthropic/requests/messages/content/base.rb +0 -21
  65. data/lib/active_agent/providers/anthropic/requests/messages/content/document.rb +0 -26
  66. data/lib/active_agent/providers/anthropic/requests/messages/content/image.rb +0 -23
  67. data/lib/active_agent/providers/anthropic/requests/messages/content/redacted_thinking.rb +0 -21
  68. data/lib/active_agent/providers/anthropic/requests/messages/content/search_result.rb +0 -27
  69. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/_types.rb +0 -171
  70. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/base.rb +0 -22
  71. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_base64.rb +0 -25
  72. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_file.rb +0 -23
  73. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_text.rb +0 -25
  74. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_url.rb +0 -23
  75. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_base64.rb +0 -27
  76. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_file.rb +0 -23
  77. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_url.rb +0 -23
  78. data/lib/active_agent/providers/anthropic/requests/messages/content/text.rb +0 -22
  79. data/lib/active_agent/providers/anthropic/requests/messages/content/thinking.rb +0 -23
  80. data/lib/active_agent/providers/anthropic/requests/messages/content/tool_result.rb +0 -24
  81. data/lib/active_agent/providers/anthropic/requests/messages/content/tool_use.rb +0 -28
  82. data/lib/active_agent/providers/anthropic/requests/messages/user.rb +0 -21
  83. data/lib/active_agent/providers/anthropic/requests/metadata.rb +0 -18
  84. data/lib/active_agent/providers/anthropic/requests/response_format.rb +0 -22
  85. data/lib/active_agent/providers/anthropic/requests/thinking_config/_types.rb +0 -60
  86. data/lib/active_agent/providers/anthropic/requests/thinking_config/base.rb +0 -20
  87. data/lib/active_agent/providers/anthropic/requests/thinking_config/disabled.rb +0 -16
  88. data/lib/active_agent/providers/anthropic/requests/thinking_config/enabled.rb +0 -20
  89. data/lib/active_agent/providers/anthropic/requests/tool_choice/_types.rb +0 -78
  90. data/lib/active_agent/providers/anthropic/requests/tool_choice/any.rb +0 -17
  91. data/lib/active_agent/providers/anthropic/requests/tool_choice/auto.rb +0 -17
  92. data/lib/active_agent/providers/anthropic/requests/tool_choice/base.rb +0 -20
  93. data/lib/active_agent/providers/anthropic/requests/tool_choice/none.rb +0 -16
  94. data/lib/active_agent/providers/anthropic/requests/tool_choice/tool.rb +0 -20
  95. data/lib/active_agent/providers/ollama/chat/requests/_types.rb +0 -3
  96. data/lib/active_agent/providers/ollama/chat/requests/messages/_types.rb +0 -116
  97. data/lib/active_agent/providers/ollama/chat/requests/messages/assistant.rb +0 -19
  98. data/lib/active_agent/providers/ollama/chat/requests/messages/user.rb +0 -19
  99. data/lib/active_agent/providers/ollama/embedding/requests/_types.rb +0 -83
  100. data/lib/active_agent/providers/ollama/embedding/requests/options.rb +0 -104
  101. data/lib/active_agent/providers/open_ai/chat/requests/_types.rb +0 -229
  102. data/lib/active_agent/providers/open_ai/chat/requests/audio.rb +0 -24
  103. data/lib/active_agent/providers/open_ai/chat/requests/messages/_types.rb +0 -123
  104. data/lib/active_agent/providers/open_ai/chat/requests/messages/assistant.rb +0 -42
  105. data/lib/active_agent/providers/open_ai/chat/requests/messages/base.rb +0 -78
  106. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/_types.rb +0 -133
  107. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/audio.rb +0 -35
  108. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/base.rb +0 -24
  109. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/file.rb +0 -26
  110. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/files/_types.rb +0 -60
  111. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/files/details.rb +0 -41
  112. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/image.rb +0 -37
  113. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/refusal.rb +0 -25
  114. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/text.rb +0 -25
  115. data/lib/active_agent/providers/open_ai/chat/requests/messages/developer.rb +0 -25
  116. data/lib/active_agent/providers/open_ai/chat/requests/messages/function.rb +0 -25
  117. data/lib/active_agent/providers/open_ai/chat/requests/messages/system.rb +0 -25
  118. data/lib/active_agent/providers/open_ai/chat/requests/messages/tool.rb +0 -26
  119. data/lib/active_agent/providers/open_ai/chat/requests/messages/user.rb +0 -32
  120. data/lib/active_agent/providers/open_ai/chat/requests/prediction.rb +0 -46
  121. data/lib/active_agent/providers/open_ai/chat/requests/response_format.rb +0 -53
  122. data/lib/active_agent/providers/open_ai/chat/requests/stream_options.rb +0 -24
  123. data/lib/active_agent/providers/open_ai/chat/requests/tool_choice.rb +0 -26
  124. data/lib/active_agent/providers/open_ai/chat/requests/tools/_types.rb +0 -5
  125. data/lib/active_agent/providers/open_ai/chat/requests/tools/base.rb +0 -22
  126. data/lib/active_agent/providers/open_ai/chat/requests/tools/custom_tool.rb +0 -41
  127. data/lib/active_agent/providers/open_ai/chat/requests/tools/function_tool.rb +0 -51
  128. data/lib/active_agent/providers/open_ai/chat/requests/web_search_options.rb +0 -45
  129. data/lib/active_agent/providers/open_ai/embedding/requests/_types.rb +0 -49
  130. data/lib/active_agent/providers/open_ai/responses/requests/_types.rb +0 -231
  131. data/lib/active_agent/providers/open_ai/responses/requests/conversation.rb +0 -23
  132. data/lib/active_agent/providers/open_ai/responses/requests/inputs/_types.rb +0 -264
  133. data/lib/active_agent/providers/open_ai/responses/requests/inputs/assistant_message.rb +0 -22
  134. data/lib/active_agent/providers/open_ai/responses/requests/inputs/base.rb +0 -89
  135. data/lib/active_agent/providers/open_ai/responses/requests/inputs/code_interpreter_tool_call.rb +0 -30
  136. data/lib/active_agent/providers/open_ai/responses/requests/inputs/computer_tool_call.rb +0 -28
  137. data/lib/active_agent/providers/open_ai/responses/requests/inputs/computer_tool_call_output.rb +0 -33
  138. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/_types.rb +0 -207
  139. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/base.rb +0 -22
  140. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_audio.rb +0 -26
  141. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_file.rb +0 -28
  142. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_image.rb +0 -28
  143. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_text.rb +0 -25
  144. data/lib/active_agent/providers/open_ai/responses/requests/inputs/custom_tool_call.rb +0 -28
  145. data/lib/active_agent/providers/open_ai/responses/requests/inputs/custom_tool_call_output.rb +0 -27
  146. data/lib/active_agent/providers/open_ai/responses/requests/inputs/developer_message.rb +0 -20
  147. data/lib/active_agent/providers/open_ai/responses/requests/inputs/file_search_tool_call.rb +0 -25
  148. data/lib/active_agent/providers/open_ai/responses/requests/inputs/function_call_output.rb +0 -32
  149. data/lib/active_agent/providers/open_ai/responses/requests/inputs/function_tool_call.rb +0 -28
  150. data/lib/active_agent/providers/open_ai/responses/requests/inputs/image_gen_tool_call.rb +0 -27
  151. data/lib/active_agent/providers/open_ai/responses/requests/inputs/input_message.rb +0 -31
  152. data/lib/active_agent/providers/open_ai/responses/requests/inputs/item_reference.rb +0 -23
  153. data/lib/active_agent/providers/open_ai/responses/requests/inputs/local_shell_tool_call.rb +0 -26
  154. data/lib/active_agent/providers/open_ai/responses/requests/inputs/local_shell_tool_call_output.rb +0 -33
  155. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_approval_request.rb +0 -30
  156. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_approval_response.rb +0 -28
  157. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_list_tools.rb +0 -29
  158. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_tool_call.rb +0 -35
  159. data/lib/active_agent/providers/open_ai/responses/requests/inputs/output_message.rb +0 -35
  160. data/lib/active_agent/providers/open_ai/responses/requests/inputs/reasoning.rb +0 -33
  161. data/lib/active_agent/providers/open_ai/responses/requests/inputs/system_message.rb +0 -20
  162. data/lib/active_agent/providers/open_ai/responses/requests/inputs/tool_call_base.rb +0 -27
  163. data/lib/active_agent/providers/open_ai/responses/requests/inputs/tool_message.rb +0 -23
  164. data/lib/active_agent/providers/open_ai/responses/requests/inputs/user_message.rb +0 -20
  165. data/lib/active_agent/providers/open_ai/responses/requests/inputs/web_search_tool_call.rb +0 -24
  166. data/lib/active_agent/providers/open_ai/responses/requests/prompt_reference.rb +0 -23
  167. data/lib/active_agent/providers/open_ai/responses/requests/reasoning.rb +0 -23
  168. data/lib/active_agent/providers/open_ai/responses/requests/stream_options.rb +0 -20
  169. data/lib/active_agent/providers/open_ai/responses/requests/text/_types.rb +0 -89
  170. data/lib/active_agent/providers/open_ai/responses/requests/text/base.rb +0 -22
  171. data/lib/active_agent/providers/open_ai/responses/requests/text/json_object.rb +0 -20
  172. data/lib/active_agent/providers/open_ai/responses/requests/text/json_schema.rb +0 -48
  173. data/lib/active_agent/providers/open_ai/responses/requests/text/plain.rb +0 -20
  174. data/lib/active_agent/providers/open_ai/responses/requests/text.rb +0 -41
  175. data/lib/active_agent/providers/open_ai/responses/requests/tool_choice.rb +0 -26
  176. data/lib/active_agent/providers/open_ai/responses/requests/tools/_types.rb +0 -112
  177. data/lib/active_agent/providers/open_ai/responses/requests/tools/base.rb +0 -25
  178. data/lib/active_agent/providers/open_ai/responses/requests/tools/code_interpreter_tool.rb +0 -23
  179. data/lib/active_agent/providers/open_ai/responses/requests/tools/computer_tool.rb +0 -27
  180. data/lib/active_agent/providers/open_ai/responses/requests/tools/custom_tool.rb +0 -28
  181. data/lib/active_agent/providers/open_ai/responses/requests/tools/file_search_tool.rb +0 -27
  182. data/lib/active_agent/providers/open_ai/responses/requests/tools/function_tool.rb +0 -29
  183. data/lib/active_agent/providers/open_ai/responses/requests/tools/image_generation_tool.rb +0 -37
  184. data/lib/active_agent/providers/open_ai/responses/requests/tools/local_shell_tool.rb +0 -21
  185. data/lib/active_agent/providers/open_ai/responses/requests/tools/mcp_tool.rb +0 -41
  186. data/lib/active_agent/providers/open_ai/responses/requests/tools/web_search_preview_tool.rb +0 -24
  187. data/lib/active_agent/providers/open_ai/responses/requests/tools/web_search_tool.rb +0 -25
  188. data/lib/active_agent/providers/open_ai/schema.yml +0 -65937
  189. data/lib/active_agent/providers/open_router/requests/message.rb +0 -1
  190. data/lib/active_agent/providers/open_router/requests/messages/assistant.rb +0 -20
  191. data/lib/active_agent/providers/open_router/requests/messages/user.rb +0 -30
@@ -1,107 +1,186 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_agent/providers/common/model"
4
- require_relative "_types"
3
+ require "delegate"
4
+ require "json"
5
+ require_relative "transforms"
5
6
 
6
7
  module ActiveAgent
7
8
  module Providers
8
9
  module Anthropic
9
- class Request < Common::BaseModel
10
- # Required parameters
11
- attribute :model, :string
12
- attribute :messages, Requests::Messages::MessagesType.new
13
- attribute :max_tokens, :integer, fallback: 4096
14
-
15
- # Optional parameters - Prompting
16
- attribute :system, Requests::Messages::SystemType.new
17
- attribute :temperature, :float
18
- attribute :top_k, :integer
19
- attribute :top_p, :float
20
- attribute :stop_sequences, default: -> { [] } # Array of strings
21
-
22
- # Optional parameters - Tools
23
- attribute :tools # Array of tool definitions
24
- attribute :tool_choice, Requests::ToolChoice::ToolChoiceType.new
25
-
26
- # Optional parameters - Thinking
27
- attribute :thinking, Requests::ThinkingConfig::ThinkingConfigType.new
28
-
29
- # Optional parameters - Streaming
30
- attribute :stream, :boolean, default: false
31
-
32
- # Optional parameters - Metadata
33
- attribute :metadata, Requests::MetadataType.new
34
-
35
- # Optional parameters - Context Management
36
- attribute :context_management, Requests::ContextManagementConfigType.new
37
-
38
- # Optional parameters - Container
39
- attribute :container, Requests::ContainerParamsType.new
40
-
41
- # Optional parameters - Service tier
42
- attribute :service_tier, :string
10
+ # Request wrapper that delegates to Anthropic gem model.
11
+ #
12
+ # Uses SimpleDelegator to wrap ::Anthropic::Models::MessageCreateParams,
13
+ # eliminating the need to maintain duplicate attribute definitions while
14
+ # providing convenience transformations and custom fields.
15
+ #
16
+ # All standard Anthropic API fields are automatically available via delegation:
17
+ # - model, messages, max_tokens
18
+ # - system, temperature, top_k, top_p, stop_sequences
19
+ # - tools, tool_choice, thinking
20
+ # - stream, metadata, context_management, container, service_tier, mcp_servers
21
+ #
22
+ # Custom fields managed separately:
23
+ # - response_format (simulated JSON mode feature)
24
+ #
25
+ # @example Basic usage
26
+ # request = Request.new(
27
+ # model: "claude-3-5-haiku-latest",
28
+ # messages: [{role: "user", content: "Hello"}]
29
+ # )
30
+ # request.model #=> "claude-3-5-haiku-latest"
31
+ # request.max_tokens #=> 4096 (default)
32
+ #
33
+ # @example With transformations
34
+ # # String content is automatically normalized
35
+ # request = Request.new(
36
+ # model: "...",
37
+ # messages: [{role: "user", content: "Hi"}]
38
+ # )
39
+ # # Internally becomes: [{type: "text", text: "Hi"}]
40
+ #
41
+ # @example Custom field
42
+ # request = Request.new(
43
+ # model: "...",
44
+ # messages: [...],
45
+ # response_format: {type: "json_object"}
46
+ # )
47
+ # request.response_format #=> {type: "json_object"}
48
+ class Request < SimpleDelegator
49
+ # Default max_tokens value when not specified
50
+ DEFAULT_MAX_TOKENS = 4096
51
+
52
+ # Default values for optional parameters
53
+ DEFAULTS = {
54
+ max_tokens: DEFAULT_MAX_TOKENS,
55
+ stop_sequences: [],
56
+ mcp_servers: []
57
+ }.freeze
58
+
59
+ # @return [Hash, nil] simulated JSON response format configuration
60
+ attr_reader :response_format
61
+
62
+ # @return [Boolean, nil] whether to stream the response
63
+ attr_reader :stream
64
+
65
+ # @param params [Hash]
66
+ # @option params [String] :model required
67
+ # @option params [Array<Hash>] :messages required
68
+ # @option params [Integer] :max_tokens (4096)
69
+ # @option params [Hash] :response_format custom field for JSON mode simulation
70
+ # @option params [String] :anthropic_beta beta version for features like MCP
71
+ # @raise [ArgumentError] when gem model validation fails
72
+ def initialize(**params)
73
+ # Step 1: Extract custom fields that gem doesn't support
74
+ @response_format = params.delete(:response_format)
75
+ @stream = params.delete(:stream)
76
+ anthropic_beta = params.delete(:anthropic_beta)
77
+
78
+ # Step 2: Map common format 'instructions' to Anthropic's 'system'
79
+ if params.key?(:instructions)
80
+ params[:system] = params.delete(:instructions)
81
+ end
43
82
 
44
- # Optional parameters - MCP Servers
45
- attribute :mcp_servers, default: -> { [] } # Array of MCP server definitions
83
+ # Step 3: Apply defaults
84
+ params = apply_defaults(params)
46
85
 
47
- # Common Format Compatibility
48
- attribute :response_format, Requests::ResponseFormatType.new
86
+ # Step 4: Transform params for gem compatibility
87
+ transformed = Transforms.normalize_params(params)
49
88
 
50
- # Validations for required fields
51
- validates :model, :messages, :max_tokens, presence: true
89
+ # Step 5: Determine if we need beta params (for MCP or other beta features)
90
+ use_beta = anthropic_beta.present? || transformed[:mcp_servers]&.any?
52
91
 
53
- # Validations for numeric parameters
54
- validates :max_tokens, numericality: { greater_than_or_equal_to: 1 }, allow_nil: true
55
- validates :temperature, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 1 }, allow_nil: true
56
- validates :top_k, numericality: { greater_than_or_equal_to: 0 }, allow_nil: true
57
- validates :top_p, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 1 }, allow_nil: true
92
+ # Step 6: Add betas parameter if using beta API
93
+ if use_beta
94
+ # Default to MCP beta version if not specified
95
+ beta_version = anthropic_beta || "mcp-client-2025-04-04"
96
+ transformed[:betas] = [ beta_version ]
97
+ end
58
98
 
59
- # Validations for specific values
60
- validates :service_tier, inclusion: { in: %w[auto standard_only] }, allow_nil: true
99
+ # Step 7: Create gem model - use Beta version if needed
100
+ gem_model = if use_beta
101
+ ::Anthropic::Models::Beta::MessageCreateParams.new(**transformed)
102
+ else
103
+ ::Anthropic::Models::MessageCreateParams.new(**transformed)
104
+ end
61
105
 
62
- # Custom validations
63
- validate :validate_stop_sequences
64
- validate :validate_tools_format
65
- validate :validate_mcp_servers_format
106
+ # Step 8: Delegate all method calls to gem model
107
+ super(gem_model)
108
+ rescue ArgumentError => e
109
+ # Re-raise with more context
110
+ raise ArgumentError, "Invalid Anthropic request parameters: #{e.message}"
111
+ end
66
112
 
67
- # Common Format Compatibility
68
- alias_attribute :instructions, :system
113
+ # Serializes request for API call.
114
+ #
115
+ # Uses gem's JSON serialization and delegates cleanup to Transforms module.
116
+ #
117
+ # @return [Hash]
118
+ def serialize
119
+ # Use gem's JSON serialization (handles all nested objects)
120
+ hash = Anthropic::Transforms.gem_to_hash(__getobj__)
121
+
122
+ # Delegate cleanup to transforms module
123
+ Transforms.cleanup_serialized_request(hash, DEFAULTS, __getobj__)
124
+ end
69
125
 
70
- # Handle merging in the common format
71
- def message=(value)
72
- self.messages ||= []
73
- self.messages << Requests::Messages::MessageType.new.cast(value)
126
+ # Accessor for system instructions.
127
+ #
128
+ # Must override SimpleDelegator's method_missing because Ruby's Kernel.system
129
+ # conflicts with delegation. The gem stores data in @data instance variable.
130
+ #
131
+ # @return [String, Array, nil]
132
+ def system
133
+ __getobj__.instance_variable_get(:@data)[:system]
74
134
  end
75
135
 
76
- private
136
+ # @param value [String, Array]
137
+ def system=(value)
138
+ __getobj__.instance_variable_get(:@data)[:system] = value
139
+ end
77
140
 
78
- def validate_stop_sequences
79
- return if stop_sequences.nil? || stop_sequences.empty?
141
+ # Alias for system (common format compatibility).
142
+ #
143
+ # @return [String, Array, nil]
144
+ def instructions
145
+ system
146
+ end
80
147
 
81
- unless stop_sequences.is_a?(Array)
82
- errors.add(:stop_sequences, "must be an array")
83
- end
148
+ # @param value [String, Array]
149
+ def instructions=(value)
150
+ self.system = value
84
151
  end
85
152
 
86
- def validate_tools_format
87
- return if tools.nil?
153
+ # Accessor for MCP servers.
154
+ #
155
+ # Safely returns MCP servers array, defaulting to empty array if not set.
156
+ #
157
+ # @return [Array]
158
+ def mcp_servers
159
+ __getobj__.instance_variable_get(:@data)[:mcp_servers] || []
160
+ end
88
161
 
89
- unless tools.is_a?(Array)
90
- errors.add(:tools, "must be an array")
91
- end
162
+ # Removes the last message from the messages array.
163
+ #
164
+ # Used for JSON format simulation to remove the lead-in assistant message.
165
+ #
166
+ # @return [void]
167
+ def pop_message!
168
+ new_messages = messages.dup
169
+ new_messages.pop
170
+ self.messages = new_messages
92
171
  end
93
172
 
94
- def validate_mcp_servers_format
95
- return if mcp_servers.nil? || mcp_servers.empty?
173
+ private
96
174
 
97
- unless mcp_servers.is_a?(Array)
98
- errors.add(:mcp_servers, "must be an array")
99
- return
175
+ # @param params [Hash]
176
+ # @return [Hash]
177
+ def apply_defaults(params)
178
+ # Only apply defaults for keys that aren't present
179
+ DEFAULTS.each do |key, value|
180
+ params[key] = value unless params.key?(key)
100
181
  end
101
182
 
102
- if mcp_servers.length > 20
103
- errors.add(:mcp_servers, "can have at most 20 servers")
104
- end
183
+ params
105
184
  end
106
185
  end
107
186
  end