algolia 3.43.0 → 3.46.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 (180) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/issue.yml +6 -4
  3. data/.github/workflows/release.yml +3 -3
  4. data/AGENTS.md +0 -24
  5. data/CHANGELOG.md +50 -0
  6. data/Gemfile.lock +1 -1
  7. data/lib/algolia/api/abtesting_client.rb +20 -13
  8. data/lib/algolia/api/abtesting_v3_client.rb +198 -8
  9. data/lib/algolia/api/agent_studio_client.rb +246 -7
  10. data/lib/algolia/api/analytics_client.rb +12 -11
  11. data/lib/algolia/api/composition_client.rb +2 -1
  12. data/lib/algolia/api/ingestion_client.rb +2 -1
  13. data/lib/algolia/api/insights_client.rb +2 -1
  14. data/lib/algolia/api/monitoring_client.rb +2 -1
  15. data/lib/algolia/api/personalization_client.rb +2 -1
  16. data/lib/algolia/api/query_suggestions_client.rb +2 -1
  17. data/lib/algolia/api/recommend_client.rb +4 -3
  18. data/lib/algolia/api/search_client.rb +141 -23
  19. data/lib/algolia/api_client.rb +10 -2
  20. data/lib/algolia/chunked_helper_options.rb +1 -0
  21. data/lib/algolia/configuration.rb +18 -2
  22. data/lib/algolia/defaults.rb +8 -0
  23. data/lib/algolia/error.rb +20 -3
  24. data/lib/algolia/models/abtesting-v3/ab_test.rb +13 -11
  25. data/lib/algolia/models/abtesting-v3/ab_test_configuration.rb +22 -4
  26. data/lib/algolia/models/abtesting-v3/ab_test_settings_response.rb +224 -0
  27. data/lib/algolia/models/abtesting-v3/add_ab_tests_request.rb +11 -1
  28. data/lib/algolia/models/abtesting-v3/analysis_method.rb +34 -0
  29. data/lib/algolia/models/abtesting-v3/bayesian_metric_result.rb +237 -0
  30. data/lib/algolia/models/abtesting-v3/evidence_status.rb +37 -0
  31. data/lib/algolia/models/abtesting-v3/feature_settings.rb +224 -0
  32. data/lib/algolia/models/abtesting-v3/metric_evidence.rb +209 -0
  33. data/lib/algolia/models/abtesting-v3/metric_metadata.rb +1 -1
  34. data/lib/algolia/models/abtesting-v3/metric_name.rb +7 -1
  35. data/lib/algolia/models/abtesting-v3/metric_result.rb +18 -8
  36. data/lib/algolia/models/abtesting-v3/minimum_detectable_effect.rb +1 -1
  37. data/lib/algolia/models/abtesting-v3/primary_metric.rb +37 -0
  38. data/lib/algolia/models/abtesting-v3/save_settings_request.rb +208 -0
  39. data/lib/algolia/models/abtesting-v3/variant_settings.rb +293 -0
  40. data/lib/algolia/models/agent-studio/agent_completion_algolia_params.rb +16 -4
  41. data/lib/algolia/models/agent-studio/agent_completion_request.rb +1 -3
  42. data/lib/algolia/models/agent-studio/agent_completion_request_union.rb +108 -0
  43. data/lib/algolia/models/agent-studio/agent_test_configuration.rb +1 -1
  44. data/lib/algolia/models/agent-studio/agent_with_version_response.rb +1 -1
  45. data/lib/algolia/models/agent-studio/agui_completion_request.rb +265 -0
  46. data/lib/algolia/models/agent-studio/agui_resume.rb +231 -0
  47. data/lib/algolia/models/agent-studio/algolia_grouped_results_compat_tool_config.rb +268 -0
  48. data/lib/algolia/models/agent-studio/{algolia_display_results_tool_config.rb → algolia_grouped_results_tool_config.rb} +30 -16
  49. data/lib/algolia/models/agent-studio/{algolia_recommend_tool_config_input.rb → algolia_recommend_tool_config.rb} +3 -3
  50. data/lib/algolia/models/agent-studio/algolia_search_tool_config.rb +22 -4
  51. data/lib/algolia/models/agent-studio/assistant_message_agui.rb +280 -0
  52. data/lib/algolia/models/agent-studio/assistant_message_v4.rb +1 -0
  53. data/lib/algolia/models/agent-studio/assistant_message_v5.rb +3 -1
  54. data/lib/algolia/models/agent-studio/assistant_part_v5.rb +2 -0
  55. data/lib/algolia/models/agent-studio/azure_open_ai_provider_input.rb +1 -1
  56. data/lib/algolia/models/agent-studio/boolean_param.rb +220 -0
  57. data/lib/algolia/models/agent-studio/client_side_tool_config.rb +14 -4
  58. data/lib/algolia/models/agent-studio/compaction_stats.rb +271 -0
  59. data/lib/algolia/models/agent-studio/compatibility_mode.rb +2 -1
  60. data/lib/algolia/models/agent-studio/context_compact_request.rb +263 -0
  61. data/lib/algolia/models/agent-studio/context_response.rb +231 -0
  62. data/lib/algolia/models/agent-studio/context_stats.rb +258 -0
  63. data/lib/algolia/models/agent-studio/context_trim_request.rb +239 -0
  64. data/lib/algolia/models/agent-studio/conversation_base_response.rb +16 -5
  65. data/lib/algolia/models/agent-studio/conversation_full_response.rb +26 -5
  66. data/lib/algolia/models/agent-studio/data_guardrail_violation_part_v5.rb +218 -0
  67. data/lib/algolia/models/agent-studio/data_part_v5.rb +220 -0
  68. data/lib/algolia/models/agent-studio/facet_filters_union_search_parameters_overrides.rb +108 -0
  69. data/lib/algolia/models/agent-studio/feedback_update_request.rb +253 -0
  70. data/lib/algolia/models/agent-studio/forwarded_props.rb +226 -0
  71. data/lib/algolia/models/agent-studio/function_call_agui.rb +219 -0
  72. data/lib/algolia/models/agent-studio/guardrail_outcome.rb +231 -0
  73. data/lib/algolia/models/agent-studio/guardrail_violation_data_v5.rb +230 -0
  74. data/lib/algolia/models/agent-studio/impact_analytics.rb +242 -0
  75. data/lib/algolia/models/agent-studio/index_search_parameters.rb +11 -1
  76. data/lib/algolia/models/agent-studio/input_union.rb +113 -0
  77. data/lib/algolia/models/agent-studio/items_union.rb +132 -0
  78. data/lib/algolia/models/agent-studio/items_union_agui_completion_request.rb +123 -0
  79. data/lib/algolia/models/agent-studio/managed_provider_response_input.rb +209 -0
  80. data/lib/algolia/models/agent-studio/mcp_server_tool_config.rb +1 -1
  81. data/lib/algolia/models/agent-studio/memory_record.rb +4 -4
  82. data/lib/algolia/models/agent-studio/message_event.rb +231 -0
  83. data/lib/algolia/models/agent-studio/message_part_assistant_message_agui.rb +123 -0
  84. data/lib/algolia/models/agent-studio/message_response.rb +87 -5
  85. data/lib/algolia/models/agent-studio/mode_enum.rb +34 -0
  86. data/lib/algolia/models/agent-studio/one_of_enum.rb +34 -0
  87. data/lib/algolia/models/agent-studio/open_ai_compatible_provider_input.rb +1 -1
  88. data/lib/algolia/models/agent-studio/paginated_conversations_response.rb +13 -4
  89. data/lib/algolia/models/agent-studio/provider_authentication_response.rb +14 -5
  90. data/lib/algolia/models/agent-studio/provider_input.rb +2 -1
  91. data/lib/algolia/models/agent-studio/provider_input_nullable.rb +2 -1
  92. data/lib/algolia/models/agent-studio/provider_name.rb +2 -1
  93. data/lib/algolia/models/agent-studio/reasoning_message_agui.rb +239 -0
  94. data/lib/algolia/models/agent-studio/reasoning_part_agui.rb +228 -0
  95. data/lib/algolia/models/agent-studio/search_parameters.rb +1 -1
  96. data/lib/algolia/models/agent-studio/search_parameters_overrides.rb +80 -5
  97. data/lib/algolia/models/agent-studio/status_enum.rb +34 -0
  98. data/lib/algolia/models/agent-studio/task_kind.rb +33 -0
  99. data/lib/algolia/models/agent-studio/task_request.rb +240 -0
  100. data/lib/algolia/models/agent-studio/task_response.rb +211 -0
  101. data/lib/algolia/models/agent-studio/text_part_agui.rb +219 -0
  102. data/lib/algolia/models/agent-studio/tool_approval_agui.rb +228 -0
  103. data/lib/algolia/models/agent-studio/tool_approval_request_part.rb +15 -5
  104. data/lib/algolia/models/agent-studio/tool_call_agui.rb +237 -0
  105. data/lib/algolia/models/agent-studio/tool_call_part.rb +13 -1
  106. data/lib/algolia/models/agent-studio/tool_call_part_agui.rb +272 -0
  107. data/lib/algolia/models/agent-studio/tool_call_result_part_agui.rb +250 -0
  108. data/lib/algolia/models/agent-studio/tool_config_input.rb +2 -5
  109. data/lib/algolia/models/agent-studio/{tool_config.rb → tool_config_or_boolean_union.rb} +1 -1
  110. data/lib/algolia/models/agent-studio/tool_config_output.rb +126 -0
  111. data/lib/algolia/models/agent-studio/tool_invocation_v4.rb +10 -2
  112. data/lib/algolia/models/agent-studio/tool_message_agui.rb +259 -0
  113. data/lib/algolia/models/agent-studio/tool_part_v5.rb +47 -2
  114. data/lib/algolia/models/agent-studio/tool_result_part.rb +57 -5
  115. data/lib/algolia/models/agent-studio/unknown_tool_config.rb +1 -1
  116. data/lib/algolia/models/agent-studio/user_message_agui.rb +261 -0
  117. data/lib/algolia/models/agent-studio/user_message_metadata_agui.rb +208 -0
  118. data/lib/algolia/models/agent-studio/user_message_metadata_v5.rb +4 -2
  119. data/lib/algolia/models/agent-studio/user_message_v4.rb +4 -1
  120. data/lib/algolia/models/agent-studio/user_message_v5.rb +4 -1
  121. data/lib/algolia/models/agent-studio/validation_error.rb +5 -25
  122. data/lib/algolia/models/agent-studio/xai_provider_input.rb +220 -0
  123. data/lib/algolia/models/analytics/catalog_entry.rb +1 -1
  124. data/lib/algolia/models/composition/base_injection_query_parameters.rb +18 -18
  125. data/lib/algolia/models/composition/distinct.rb +1 -1
  126. data/lib/algolia/models/composition/external_provider.rb +209 -0
  127. data/lib/algolia/models/composition/external_provider_ordering.rb +34 -0
  128. data/lib/algolia/models/composition/hit_metadata.rb +2 -2
  129. data/lib/algolia/models/composition/injected_item_external.rb +21 -14
  130. data/lib/algolia/models/composition/injected_item_external_provider.rb +258 -0
  131. data/lib/algolia/models/composition/injected_item_external_provider_source.rb +216 -0
  132. data/lib/algolia/models/composition/injected_item_hits_metadata.rb +1 -1
  133. data/lib/algolia/models/composition/{recommend.rb → injected_item_recommend.rb} +10 -3
  134. data/lib/algolia/models/composition/injected_item_recommend_source.rb +1 -1
  135. data/lib/algolia/models/composition/injected_item_search.rb +8 -1
  136. data/lib/algolia/models/composition/injected_item_source.rb +1 -0
  137. data/lib/algolia/models/composition/injection_main_external_provider.rb +258 -0
  138. data/lib/algolia/models/composition/injection_main_external_provider_source.rb +216 -0
  139. data/lib/algolia/models/composition/{main_recommend.rb → injection_main_recommend.rb} +10 -3
  140. data/lib/algolia/models/composition/injection_main_recommend_source.rb +1 -1
  141. data/lib/algolia/models/composition/{main_search.rb → injection_main_search.rb} +11 -4
  142. data/lib/algolia/models/composition/injection_main_search_source.rb +1 -1
  143. data/lib/algolia/models/composition/injection_main_source.rb +1 -0
  144. data/lib/algolia/models/composition/main_injection_query_parameters.rb +22 -22
  145. data/lib/algolia/models/composition/optional_words.rb +1 -1
  146. data/lib/algolia/models/composition/params.rb +6 -6
  147. data/lib/algolia/models/composition/processing_error.rb +209 -0
  148. data/lib/algolia/models/composition/request_body.rb +13 -4
  149. data/lib/algolia/models/composition/result_card.rb +208 -0
  150. data/lib/algolia/models/composition/search_response.rb +16 -4
  151. data/lib/algolia/models/composition/widgets.rb +13 -4
  152. data/lib/algolia/models/ingestion/source_update_commercetools.rb +11 -0
  153. data/lib/algolia/models/recommend/distinct.rb +1 -1
  154. data/lib/algolia/models/recommend/fallback_params.rb +26 -26
  155. data/lib/algolia/models/recommend/optional_words.rb +1 -1
  156. data/lib/algolia/models/recommend/recommend_search_params.rb +26 -26
  157. data/lib/algolia/models/recommend/result_card.rb +208 -0
  158. data/lib/algolia/models/recommend/widgets.rb +13 -4
  159. data/lib/algolia/models/search/api_key.rb +2 -2
  160. data/lib/algolia/models/search/attribute_criteria_computed_by.rb +35 -0
  161. data/lib/algolia/models/search/browse_params_object.rb +35 -25
  162. data/lib/algolia/models/search/consequence_params.rb +35 -25
  163. data/lib/algolia/models/search/distinct.rb +1 -1
  164. data/lib/algolia/models/search/get_api_key_response.rb +2 -2
  165. data/lib/algolia/models/search/index_settings.rb +28 -18
  166. data/lib/algolia/models/search/log.rb +11 -0
  167. data/lib/algolia/models/search/optional_words.rb +1 -1
  168. data/lib/algolia/models/search/result_card.rb +208 -0
  169. data/lib/algolia/models/search/search_for_facets.rb +35 -25
  170. data/lib/algolia/models/search/search_for_hits.rb +35 -25
  171. data/lib/algolia/models/search/search_params_object.rb +35 -25
  172. data/lib/algolia/models/search/secured_api_key_restrictions.rb +1 -1
  173. data/lib/algolia/models/search/settings_response.rb +28 -18
  174. data/lib/algolia/models/search/widgets.rb +13 -4
  175. data/lib/algolia/transport/http/http_requester.rb +2 -2
  176. data/lib/algolia/transport/request_id.rb +49 -0
  177. data/lib/algolia/transport/transport.rb +161 -18
  178. data/lib/algolia/version.rb +1 -1
  179. data/lib/algolia.rb +1 -0
  180. metadata +73 -8
@@ -23,11 +23,30 @@ module Algolia
23
23
 
24
24
  # @param config [Configuration]
25
25
  # @param requester [Object] requester used for sending requests. Uses Algolia::Http::HttpRequester by default
26
+ # @param request_id_support [true, false] the generated per-client Request-ID capability
26
27
  #
27
- def initialize(config, requester)
28
+ def initialize(config, requester, request_id_support: false)
28
29
  @config = config
29
30
  @requester = requester
31
+ @request_id_support = request_id_support
30
32
  @retry_strategy = RetryStrategy.new(config.hosts)
33
+ @sleeper = Kernel.method(:sleep)
34
+ end
35
+
36
+ # Callable waiting the given number of whole seconds before a 429 is retried,
37
+ # Kernel#sleep by default. Private on purpose: it is a test seam, not gem
38
+ # surface, and the tests reach it with send(:sleeper=, ...).
39
+ attr_writer :sleeper
40
+ private :sleeper=
41
+
42
+ # Whether the transport mints Request-ID headers. Resolved per request so a
43
+ # caller can flip config.request_id_enabled at any time, like every other
44
+ # Configuration setting; nil falls back to the per-client capability.
45
+ #
46
+ # @return [true, false]
47
+ #
48
+ def request_id_enabled?
49
+ @config.request_id_enabled.nil? ? @request_id_support : @config.request_id_enabled
31
50
  end
32
51
 
33
52
  # @param call_type [Binary] READ or WRITE operation
@@ -41,7 +60,26 @@ module Algolia
41
60
  def request(call_type, method, path, body, opts = {})
42
61
  retry_errors = []
43
62
 
63
+ # The Request-ID is minted once per execution, before the host loop, so that
64
+ # every retry attempt shares the same value and each subsequent call gets a
65
+ # fresh one.
66
+ request_id = mint_request_id(opts)
67
+
68
+ # create consumes these two channels from opts on every attempt: snapshot them
69
+ # so retries keep them. Timeout keys stay consumable, recomputed per host below.
70
+ header_params = opts[:header_params]
71
+ query_params = opts[:query_params]
72
+
73
+ # The Correlation-ID of the last retried attempt whose response carried a
74
+ # non-empty one, surfaced on the exhaustion error for support tickets.
75
+ last_correlation_id = nil
76
+
77
+ # Budget of 429 waits for this request, shared across hosts.
78
+ rate_limit_retries_left = max_rate_limit_retries
79
+
44
80
  @retry_strategy.get_tryable_hosts(call_type).each do |host|
81
+ opts[:header_params] ||= header_params
82
+ opts[:query_params] ||= query_params
45
83
  opts[:timeout] ||= get_timeout(call_type)
46
84
  opts[:connect_timeout] ||= (@config.connect_timeout || Defaults::CONNECT_TIMEOUT) * (host.retry_count + 1)
47
85
 
@@ -50,17 +88,23 @@ module Algolia
50
88
  # TODO: what is this merge for ?
51
89
  # request_options.query_params.merge!(request_options.data) if method == :GET
52
90
 
53
- request = build_request(method, path, body, request_options)
54
- response = @requester.send_request(
55
- host,
56
- request[:method],
57
- request[:path],
58
- request[:body],
59
- request[:query_params],
60
- request[:header_params],
61
- request[:timeout],
62
- request[:connect_timeout]
63
- )
91
+ request = build_request(method, path, body, request_options, request_id)
92
+ response = send_request(host, request)
93
+
94
+ # HTTP 429 is not a host failover: wait Retry-After (whole seconds, 1s when
95
+ # missing or invalid) and resend the same request to the same host. The retry
96
+ # strategy only sees the final response, so a waited-out 429 never marks the
97
+ # host down nor bumps its retry_count. The attempt is still recorded, with its
98
+ # Correlation-ID, so the exhaustion error keeps it visible.
99
+ while response.status == 429 && rate_limit_retries_left > 0
100
+ rate_limit_retries_left -= 1
101
+ correlation_id = correlation_id_from(response.headers)
102
+ last_correlation_id = correlation_id unless correlation_id.nil? || correlation_id.empty?
103
+ retry_errors << {host: host.url, error: response.error}
104
+
105
+ @sleeper.call(rate_limit_wait_seconds(response.headers))
106
+ response = send_request(host, request)
107
+ end
64
108
 
65
109
  outcome = @retry_strategy.decide(
66
110
  host,
@@ -69,16 +113,20 @@ module Algolia
69
113
  network_failure: response.network_failure
70
114
  )
71
115
  if outcome == FAILURE
116
+ correlation_id = correlation_id_from(response.headers)
117
+
72
118
  # handle HTML error
73
119
  if response.headers["content-type"]&.include?("text/html")
74
- raise Algolia::AlgoliaHttpError.new(response.status, response.reason_phrase)
120
+ raise Algolia::AlgoliaHttpError.new(response.status, response.reason_phrase, correlation_id)
75
121
  end
76
122
 
77
123
  decoded_error = JSON.parse(response.error, :symbolize_names => true)
78
- raise Algolia::AlgoliaHttpError.new(response.status, decoded_error[:message])
124
+ raise Algolia::AlgoliaHttpError.new(response.status, decoded_error[:message], correlation_id)
79
125
  end
80
126
 
81
127
  if outcome == RETRY
128
+ correlation_id = correlation_id_from(response.headers)
129
+ last_correlation_id = correlation_id unless correlation_id.nil? || correlation_id.empty?
82
130
  retry_errors << {host: host.url, error: response.error}
83
131
  else
84
132
  return response
@@ -88,29 +136,121 @@ module Algolia
88
136
  raise(
89
137
  Algolia::AlgoliaUnreachableHostError.new(
90
138
  "Unreachable hosts. If the error persists, please visit our help center https://alg.li/support-unreachable-hosts or reach out to the Algolia Support team: https://alg.li/support",
91
- retry_errors
139
+ retry_errors,
140
+ last_correlation_id
92
141
  )
93
142
  )
94
143
  end
95
144
 
96
145
  private
97
146
 
147
+ # Sends an already built request to the given host.
148
+ #
149
+ # @param host [StatefulHost]
150
+ # @param request [Hash] the request built by build_request
151
+ #
152
+ # @return [Response]
153
+ #
154
+ def send_request(host, request)
155
+ @requester.send_request(
156
+ host,
157
+ request[:method],
158
+ request[:path],
159
+ request[:body],
160
+ request[:query_params],
161
+ request[:header_params],
162
+ request[:timeout],
163
+ request[:connect_timeout]
164
+ )
165
+ end
166
+
167
+ # How many 429s are waited out per request: nil falls back to the default, a
168
+ # negative value behaves like 0, and so does false, which a caller may pass to
169
+ # mean "no retries" (only nil means unset, as for request_id_enabled).
170
+ #
171
+ # @return [Integer]
172
+ #
173
+ def max_rate_limit_retries
174
+ retries = @config.max_rate_limit_retries
175
+ return Defaults::MAX_RATE_LIMIT_RETRIES if retries.nil?
176
+
177
+ [retries || 0, 0].max
178
+ end
179
+
180
+ # Retry-After as a wait in whole seconds. Only a positive whole number of ASCII
181
+ # digits is honoured (header key matched case-insensitively, value trimmed); a
182
+ # missing, empty, zero, negative, fractional, HTTP-date or junk value waits
183
+ # Defaults::RATE_LIMIT_WAIT. A value above what Kernel#sleep accepts saturates at
184
+ # Defaults::MAX_RATE_LIMIT_WAIT rather than being capped or falling back.
185
+ #
186
+ # @param headers [Hash, String]
187
+ #
188
+ # @return [Integer]
189
+ #
190
+ def rate_limit_wait_seconds(headers)
191
+ return Defaults::RATE_LIMIT_WAIT unless headers.respond_to?(:each_pair)
192
+
193
+ value = headers.find { |k, _| k.to_s.casecmp?("Retry-After") }&.last
194
+ raw = value.to_s.strip
195
+ return Defaults::RATE_LIMIT_WAIT unless raw.match?(/\A[0-9]+\z/)
196
+
197
+ seconds = Integer(raw, 10)
198
+ return Defaults::RATE_LIMIT_WAIT if seconds <= 0
199
+
200
+ [seconds, Defaults::MAX_RATE_LIMIT_WAIT].min
201
+ end
202
+
203
+ # Returns a fresh Request-ID, or nil when the feature is off for this client
204
+ # or the caller already supplied one through the request options, the config
205
+ # default headers, or the x-algolia-request-id query parameter. Caller-supplied
206
+ # values ride their own channel on every attempt.
207
+ #
208
+ # @param opts [Hash]
209
+ #
210
+ # @return [String, nil]
211
+ #
212
+ def mint_request_id(opts)
213
+ return nil unless request_id_enabled?
214
+ return nil if RequestId.request_id?(opts[:header_params])
215
+ return nil if RequestId.request_id?(@config.header_params)
216
+ return nil if RequestId.request_id_query_param?(opts[:query_params])
217
+
218
+ RequestId.generate
219
+ end
220
+
221
+ # Reads the Correlation-ID header of a failed response case-insensitively: the
222
+ # headers hash keeps the server's casing and defaults to an empty string on
223
+ # timeout and network failures. The unrelated X-Algolia-RequestID edge header
224
+ # must never be read instead.
225
+ #
226
+ # @param headers [Hash, String]
227
+ #
228
+ # @return [String, nil]
229
+ #
230
+ def correlation_id_from(headers)
231
+ return nil unless headers.respond_to?(:each_pair)
232
+
233
+ headers.find { |k, _| k.to_s.casecmp?(RequestId::CORRELATION_HEADER) }&.last
234
+ end
235
+
98
236
  # Parse the different information and build the request
99
237
  #
100
238
  # @param [Symbol] method
101
239
  # @param [String] path
102
240
  # @param [Hash] body
103
241
  # @param [RequestOptions] request_options
242
+ # @param [String, nil] request_id
104
243
  #
105
244
  # @return [Hash]
106
245
  #
107
- def build_request(method, path, body, request_options)
246
+ def build_request(method, path, body, request_options, request_id = nil)
108
247
  request = {}
109
248
  request[:method] = method.downcase
110
249
  request[:path] = path
111
250
  request[:body] = build_body(body, request_options)
112
251
  request[:query_params] = Algolia::Transport.stringify_query_params(request_options.query_params)
113
- request[:header_params] = generate_header_params(body, request_options)
252
+
253
+ request[:header_params] = generate_header_params(body, request_options, request_id)
114
254
  request[:timeout] = request_options.timeout
115
255
  request[:connect_timeout] = request_options.connect_timeout
116
256
  request
@@ -129,13 +269,16 @@ module Algolia
129
269
 
130
270
  # Generates headers from config headers and optional parameters
131
271
  #
272
+ # @param body [String, nil]
132
273
  # @param request_options [RequestOptions]
274
+ # @param request_id [String, nil]
133
275
  #
134
276
  # @return [Hash] merged headers
135
277
  #
136
- def generate_header_params(body, request_options)
278
+ def generate_header_params(body, request_options, request_id = nil)
137
279
  header_params = request_options.header_params.transform_keys(&:downcase)
138
280
  header_params = @config.header_params.merge(header_params)
281
+ header_params[RequestId::HEADER] = request_id if request_id
139
282
  if request_options.compression_type == "gzip" && body.is_a?(String) && !body.to_s.strip.empty?
140
283
  header_params["content-encoding"] = "gzip"
141
284
  end
@@ -3,5 +3,5 @@
3
3
  # Code generated by OpenAPI Generator (https://openapi-generator.tech), manual changes will be lost - read more on https://github.com/algolia/api-clients-automation. DO NOT EDIT.
4
4
 
5
5
  module Algolia
6
- VERSION = "3.43.0"
6
+ VERSION = "3.46.1"
7
7
  end
data/lib/algolia.rb CHANGED
@@ -17,6 +17,7 @@ require "algolia/transport/call_type"
17
17
  require "algolia/transport/retry_outcome_type"
18
18
  require "algolia/transport/stateful_host"
19
19
  require "algolia/transport/retry_strategy"
20
+ require "algolia/transport/request_id"
20
21
  require "algolia/transport/request_options"
21
22
  require "algolia/transport/transport"
22
23
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: algolia
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.43.0
4
+ version: 3.46.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - https://alg.li/support
@@ -152,10 +152,13 @@ files:
152
152
  - lib/algolia/models/abtesting-v3/ab_test.rb
153
153
  - lib/algolia/models/abtesting-v3/ab_test_configuration.rb
154
154
  - lib/algolia/models/abtesting-v3/ab_test_response.rb
155
+ - lib/algolia/models/abtesting-v3/ab_test_settings_response.rb
155
156
  - lib/algolia/models/abtesting-v3/ab_tests_variant.rb
156
157
  - lib/algolia/models/abtesting-v3/ab_tests_variant_search_params.rb
157
158
  - lib/algolia/models/abtesting-v3/add_ab_tests_request.rb
158
159
  - lib/algolia/models/abtesting-v3/add_ab_tests_variant.rb
160
+ - lib/algolia/models/abtesting-v3/analysis_method.rb
161
+ - lib/algolia/models/abtesting-v3/bayesian_metric_result.rb
159
162
  - lib/algolia/models/abtesting-v3/create_metric.rb
160
163
  - lib/algolia/models/abtesting-v3/decision.rb
161
164
  - lib/algolia/models/abtesting-v3/direction.rb
@@ -166,20 +169,26 @@ files:
166
169
  - lib/algolia/models/abtesting-v3/estimate_ab_test_request.rb
167
170
  - lib/algolia/models/abtesting-v3/estimate_ab_test_response.rb
168
171
  - lib/algolia/models/abtesting-v3/estimate_configuration.rb
172
+ - lib/algolia/models/abtesting-v3/evidence_status.rb
173
+ - lib/algolia/models/abtesting-v3/feature_settings.rb
169
174
  - lib/algolia/models/abtesting-v3/filter_effects.rb
170
175
  - lib/algolia/models/abtesting-v3/list_ab_tests_response.rb
171
176
  - lib/algolia/models/abtesting-v3/metric_date.rb
177
+ - lib/algolia/models/abtesting-v3/metric_evidence.rb
172
178
  - lib/algolia/models/abtesting-v3/metric_metadata.rb
173
179
  - lib/algolia/models/abtesting-v3/metric_name.rb
174
180
  - lib/algolia/models/abtesting-v3/metric_result.rb
175
181
  - lib/algolia/models/abtesting-v3/metrics_filter.rb
176
182
  - lib/algolia/models/abtesting-v3/minimum_detectable_effect.rb
177
183
  - lib/algolia/models/abtesting-v3/outliers_filter.rb
184
+ - lib/algolia/models/abtesting-v3/primary_metric.rb
185
+ - lib/algolia/models/abtesting-v3/save_settings_request.rb
178
186
  - lib/algolia/models/abtesting-v3/status.rb
179
187
  - lib/algolia/models/abtesting-v3/timeseries.rb
180
188
  - lib/algolia/models/abtesting-v3/timeseries_variant.rb
181
189
  - lib/algolia/models/abtesting-v3/variant.rb
182
190
  - lib/algolia/models/abtesting-v3/variant_metadata.rb
191
+ - lib/algolia/models/abtesting-v3/variant_settings.rb
183
192
  - lib/algolia/models/abtesting/ab_test.rb
184
193
  - lib/algolia/models/abtesting/ab_test_configuration.rb
185
194
  - lib/algolia/models/abtesting/ab_test_response.rb
@@ -206,13 +215,17 @@ files:
206
215
  - lib/algolia/models/agent-studio/advanced_syntax_features.rb
207
216
  - lib/algolia/models/agent-studio/agent_completion_algolia_params.rb
208
217
  - lib/algolia/models/agent-studio/agent_completion_request.rb
218
+ - lib/algolia/models/agent-studio/agent_completion_request_union.rb
209
219
  - lib/algolia/models/agent-studio/agent_config_create.rb
210
220
  - lib/algolia/models/agent-studio/agent_config_update.rb
211
221
  - lib/algolia/models/agent-studio/agent_status.rb
212
222
  - lib/algolia/models/agent-studio/agent_test_configuration.rb
213
223
  - lib/algolia/models/agent-studio/agent_with_version_response.rb
214
- - lib/algolia/models/agent-studio/algolia_display_results_tool_config.rb
215
- - lib/algolia/models/agent-studio/algolia_recommend_tool_config_input.rb
224
+ - lib/algolia/models/agent-studio/agui_completion_request.rb
225
+ - lib/algolia/models/agent-studio/agui_resume.rb
226
+ - lib/algolia/models/agent-studio/algolia_grouped_results_compat_tool_config.rb
227
+ - lib/algolia/models/agent-studio/algolia_grouped_results_tool_config.rb
228
+ - lib/algolia/models/agent-studio/algolia_recommend_tool_config.rb
216
229
  - lib/algolia/models/agent-studio/algolia_recommend_tool_index_config.rb
217
230
  - lib/algolia/models/agent-studio/algolia_search_tool_config.rb
218
231
  - lib/algolia/models/agent-studio/algolia_search_tool_index_config.rb
@@ -227,46 +240,70 @@ files:
227
240
  - lib/algolia/models/agent-studio/application_config_response.rb
228
241
  - lib/algolia/models/agent-studio/around_precision_union.rb
229
242
  - lib/algolia/models/agent-studio/around_radius_union.rb
243
+ - lib/algolia/models/agent-studio/assistant_message_agui.rb
230
244
  - lib/algolia/models/agent-studio/assistant_message_v4.rb
231
245
  - lib/algolia/models/agent-studio/assistant_message_v5.rb
232
246
  - lib/algolia/models/agent-studio/assistant_part_v4.rb
233
247
  - lib/algolia/models/agent-studio/assistant_part_v5.rb
234
248
  - lib/algolia/models/agent-studio/azure_open_ai_provider_input.rb
235
249
  - lib/algolia/models/agent-studio/base_provider_input.rb
250
+ - lib/algolia/models/agent-studio/boolean_param.rb
236
251
  - lib/algolia/models/agent-studio/client_side_tool_config.rb
237
252
  - lib/algolia/models/agent-studio/client_tools_args_schema.rb
253
+ - lib/algolia/models/agent-studio/compaction_stats.rb
238
254
  - lib/algolia/models/agent-studio/compatibility_mode.rb
255
+ - lib/algolia/models/agent-studio/context_compact_request.rb
256
+ - lib/algolia/models/agent-studio/context_response.rb
257
+ - lib/algolia/models/agent-studio/context_stats.rb
258
+ - lib/algolia/models/agent-studio/context_trim_request.rb
239
259
  - lib/algolia/models/agent-studio/conversation_base_response.rb
240
260
  - lib/algolia/models/agent-studio/conversation_full_response.rb
241
261
  - lib/algolia/models/agent-studio/conversation_metadata.rb
262
+ - lib/algolia/models/agent-studio/data_guardrail_violation_part_v5.rb
263
+ - lib/algolia/models/agent-studio/data_part_v5.rb
242
264
  - lib/algolia/models/agent-studio/distinct_union.rb
243
265
  - lib/algolia/models/agent-studio/episode.rb
244
266
  - lib/algolia/models/agent-studio/error_base.rb
245
267
  - lib/algolia/models/agent-studio/exact_on_single_word_query.rb
246
268
  - lib/algolia/models/agent-studio/facet_filters_union.rb
269
+ - lib/algolia/models/agent-studio/facet_filters_union_search_parameters_overrides.rb
247
270
  - lib/algolia/models/agent-studio/facets.rb
248
271
  - lib/algolia/models/agent-studio/facets_param.rb
249
272
  - lib/algolia/models/agent-studio/facets_union.rb
250
273
  - lib/algolia/models/agent-studio/feedback_creation_request.rb
251
274
  - lib/algolia/models/agent-studio/feedback_response.rb
275
+ - lib/algolia/models/agent-studio/feedback_update_request.rb
276
+ - lib/algolia/models/agent-studio/forwarded_props.rb
277
+ - lib/algolia/models/agent-studio/function_call_agui.rb
278
+ - lib/algolia/models/agent-studio/guardrail_outcome.rb
279
+ - lib/algolia/models/agent-studio/guardrail_violation_data_v5.rb
252
280
  - lib/algolia/models/agent-studio/ignore_plurals_union.rb
281
+ - lib/algolia/models/agent-studio/impact_analytics.rb
253
282
  - lib/algolia/models/agent-studio/index_search_parameters.rb
283
+ - lib/algolia/models/agent-studio/input_union.rb
254
284
  - lib/algolia/models/agent-studio/inside_bounding_box_union.rb
255
285
  - lib/algolia/models/agent-studio/inside_polygon_union.rb
286
+ - lib/algolia/models/agent-studio/items_union.rb
287
+ - lib/algolia/models/agent-studio/items_union_agui_completion_request.rb
256
288
  - lib/algolia/models/agent-studio/location_item_union.rb
289
+ - lib/algolia/models/agent-studio/managed_provider_response_input.rb
257
290
  - lib/algolia/models/agent-studio/mcp_server_tool_config.rb
258
291
  - lib/algolia/models/agent-studio/mcp_tool_config.rb
259
292
  - lib/algolia/models/agent-studio/memory_record.rb
260
293
  - lib/algolia/models/agent-studio/memory_type.rb
294
+ - lib/algolia/models/agent-studio/message_event.rb
261
295
  - lib/algolia/models/agent-studio/message_part.rb
296
+ - lib/algolia/models/agent-studio/message_part_assistant_message_agui.rb
262
297
  - lib/algolia/models/agent-studio/message_response.rb
263
298
  - lib/algolia/models/agent-studio/message_role.rb
264
299
  - lib/algolia/models/agent-studio/message_v4.rb
265
300
  - lib/algolia/models/agent-studio/message_v5.rb
266
301
  - lib/algolia/models/agent-studio/messages_union.rb
302
+ - lib/algolia/models/agent-studio/mode_enum.rb
267
303
  - lib/algolia/models/agent-studio/number_param.rb
268
304
  - lib/algolia/models/agent-studio/number_param_constraint.rb
269
305
  - lib/algolia/models/agent-studio/numeric_filters_union.rb
306
+ - lib/algolia/models/agent-studio/one_of_enum.rb
270
307
  - lib/algolia/models/agent-studio/open_ai_compatible_provider_input.rb
271
308
  - lib/algolia/models/agent-studio/open_ai_provider_input.rb
272
309
  - lib/algolia/models/agent-studio/optional_filters_union.rb
@@ -284,7 +321,9 @@ files:
284
321
  - lib/algolia/models/agent-studio/provider_name.rb
285
322
  - lib/algolia/models/agent-studio/query_type.rb
286
323
  - lib/algolia/models/agent-studio/re_ranking_apply_filter_union.rb
324
+ - lib/algolia/models/agent-studio/reasoning_message_agui.rb
287
325
  - lib/algolia/models/agent-studio/reasoning_part.rb
326
+ - lib/algolia/models/agent-studio/reasoning_part_agui.rb
288
327
  - lib/algolia/models/agent-studio/reasoning_part_v4.rb
289
328
  - lib/algolia/models/agent-studio/reasoning_part_v5.rb
290
329
  - lib/algolia/models/agent-studio/remove_stop_words_union.rb
@@ -296,22 +335,33 @@ files:
296
335
  - lib/algolia/models/agent-studio/secret_key_response.rb
297
336
  - lib/algolia/models/agent-studio/start_part.rb
298
337
  - lib/algolia/models/agent-studio/start_step_part.rb
338
+ - lib/algolia/models/agent-studio/status_enum.rb
299
339
  - lib/algolia/models/agent-studio/step_start_part_v4.rb
300
340
  - lib/algolia/models/agent-studio/step_start_part_v5.rb
301
341
  - lib/algolia/models/agent-studio/string_array_param.rb
302
342
  - lib/algolia/models/agent-studio/string_array_param_constraint.rb
303
343
  - lib/algolia/models/agent-studio/supported_language.rb
304
344
  - lib/algolia/models/agent-studio/tag_filters_union.rb
345
+ - lib/algolia/models/agent-studio/task_kind.rb
346
+ - lib/algolia/models/agent-studio/task_request.rb
347
+ - lib/algolia/models/agent-studio/task_response.rb
305
348
  - lib/algolia/models/agent-studio/text_param.rb
306
349
  - lib/algolia/models/agent-studio/text_part.rb
350
+ - lib/algolia/models/agent-studio/text_part_agui.rb
307
351
  - lib/algolia/models/agent-studio/text_part_v4.rb
308
352
  - lib/algolia/models/agent-studio/text_part_v5.rb
353
+ - lib/algolia/models/agent-studio/tool_approval_agui.rb
309
354
  - lib/algolia/models/agent-studio/tool_approval_request_part.rb
355
+ - lib/algolia/models/agent-studio/tool_call_agui.rb
310
356
  - lib/algolia/models/agent-studio/tool_call_part.rb
311
- - lib/algolia/models/agent-studio/tool_config.rb
357
+ - lib/algolia/models/agent-studio/tool_call_part_agui.rb
358
+ - lib/algolia/models/agent-studio/tool_call_result_part_agui.rb
312
359
  - lib/algolia/models/agent-studio/tool_config_input.rb
360
+ - lib/algolia/models/agent-studio/tool_config_or_boolean_union.rb
361
+ - lib/algolia/models/agent-studio/tool_config_output.rb
313
362
  - lib/algolia/models/agent-studio/tool_invocation_part_v4.rb
314
363
  - lib/algolia/models/agent-studio/tool_invocation_v4.rb
364
+ - lib/algolia/models/agent-studio/tool_message_agui.rb
315
365
  - lib/algolia/models/agent-studio/tool_part_v5.rb
316
366
  - lib/algolia/models/agent-studio/tool_result_output.rb
317
367
  - lib/algolia/models/agent-studio/tool_result_output_type.rb
@@ -321,11 +371,14 @@ files:
321
371
  - lib/algolia/models/agent-studio/typo_tolerance_union.rb
322
372
  - lib/algolia/models/agent-studio/unknown_tool_config.rb
323
373
  - lib/algolia/models/agent-studio/user_data_response.rb
374
+ - lib/algolia/models/agent-studio/user_message_agui.rb
375
+ - lib/algolia/models/agent-studio/user_message_metadata_agui.rb
324
376
  - lib/algolia/models/agent-studio/user_message_metadata_v5.rb
325
377
  - lib/algolia/models/agent-studio/user_message_v4.rb
326
378
  - lib/algolia/models/agent-studio/user_message_v5.rb
327
379
  - lib/algolia/models/agent-studio/validation_error.rb
328
380
  - lib/algolia/models/agent-studio/vote_enum.rb
381
+ - lib/algolia/models/agent-studio/xai_provider_input.rb
329
382
  - lib/algolia/models/analytics/bin_edge.rb
330
383
  - lib/algolia/models/analytics/catalog.rb
331
384
  - lib/algolia/models/analytics/catalog_entry.rb
@@ -439,6 +492,8 @@ files:
439
492
  - lib/algolia/models/composition/external_injected_item.rb
440
493
  - lib/algolia/models/composition/external_injection.rb
441
494
  - lib/algolia/models/composition/external_ordering.rb
495
+ - lib/algolia/models/composition/external_provider.rb
496
+ - lib/algolia/models/composition/external_provider_ordering.rb
442
497
  - lib/algolia/models/composition/facet_filters.rb
443
498
  - lib/algolia/models/composition/facet_hits.rb
444
499
  - lib/algolia/models/composition/facet_ordering.rb
@@ -453,9 +508,12 @@ files:
453
508
  - lib/algolia/models/composition/ignore_plurals.rb
454
509
  - lib/algolia/models/composition/index_settings_facets.rb
455
510
  - lib/algolia/models/composition/injected_item_external.rb
511
+ - lib/algolia/models/composition/injected_item_external_provider.rb
512
+ - lib/algolia/models/composition/injected_item_external_provider_source.rb
456
513
  - lib/algolia/models/composition/injected_item_external_source.rb
457
514
  - lib/algolia/models/composition/injected_item_hits_metadata.rb
458
515
  - lib/algolia/models/composition/injected_item_metadata.rb
516
+ - lib/algolia/models/composition/injected_item_recommend.rb
459
517
  - lib/algolia/models/composition/injected_item_recommend_source.rb
460
518
  - lib/algolia/models/composition/injected_item_search.rb
461
519
  - lib/algolia/models/composition/injected_item_search_source.rb
@@ -463,14 +521,16 @@ files:
463
521
  - lib/algolia/models/composition/injection.rb
464
522
  - lib/algolia/models/composition/injection_injected_item.rb
465
523
  - lib/algolia/models/composition/injection_main.rb
524
+ - lib/algolia/models/composition/injection_main_external_provider.rb
525
+ - lib/algolia/models/composition/injection_main_external_provider_source.rb
526
+ - lib/algolia/models/composition/injection_main_recommend.rb
466
527
  - lib/algolia/models/composition/injection_main_recommend_source.rb
528
+ - lib/algolia/models/composition/injection_main_search.rb
467
529
  - lib/algolia/models/composition/injection_main_search_source.rb
468
530
  - lib/algolia/models/composition/injection_main_source.rb
469
531
  - lib/algolia/models/composition/inside_bounding_box.rb
470
532
  - lib/algolia/models/composition/list_compositions_response.rb
471
533
  - lib/algolia/models/composition/main_injection_query_parameters.rb
472
- - lib/algolia/models/composition/main_recommend.rb
473
- - lib/algolia/models/composition/main_search.rb
474
534
  - lib/algolia/models/composition/match_level.rb
475
535
  - lib/algolia/models/composition/matched_geo_location.rb
476
536
  - lib/algolia/models/composition/model.rb
@@ -482,9 +542,9 @@ files:
482
542
  - lib/algolia/models/composition/optional_words.rb
483
543
  - lib/algolia/models/composition/params.rb
484
544
  - lib/algolia/models/composition/personalization.rb
545
+ - lib/algolia/models/composition/processing_error.rb
485
546
  - lib/algolia/models/composition/query_type.rb
486
547
  - lib/algolia/models/composition/range.rb
487
- - lib/algolia/models/composition/recommend.rb
488
548
  - lib/algolia/models/composition/redirect.rb
489
549
  - lib/algolia/models/composition/redirect_rule_index_data.rb
490
550
  - lib/algolia/models/composition/redirect_rule_index_metadata.rb
@@ -493,6 +553,7 @@ files:
493
553
  - lib/algolia/models/composition/remove_words_if_no_results.rb
494
554
  - lib/algolia/models/composition/rendering_content.rb
495
555
  - lib/algolia/models/composition/request_body.rb
556
+ - lib/algolia/models/composition/result_card.rb
496
557
  - lib/algolia/models/composition/results_composition_info_response.rb
497
558
  - lib/algolia/models/composition/results_injected_item_applied_rules_info_response.rb
498
559
  - lib/algolia/models/composition/results_injected_item_info_response.rb
@@ -802,6 +863,7 @@ files:
802
863
  - lib/algolia/models/recommend/remove_stop_words.rb
803
864
  - lib/algolia/models/recommend/remove_words_if_no_results.rb
804
865
  - lib/algolia/models/recommend/rendering_content.rb
866
+ - lib/algolia/models/recommend/result_card.rb
805
867
  - lib/algolia/models/recommend/rule_metadata.rb
806
868
  - lib/algolia/models/recommend/search_recommend_rules_params.rb
807
869
  - lib/algolia/models/recommend/search_recommend_rules_response.rb
@@ -833,6 +895,7 @@ files:
833
895
  - lib/algolia/models/search/around_radius.rb
834
896
  - lib/algolia/models/search/around_radius_all.rb
835
897
  - lib/algolia/models/search/assign_user_id_params.rb
898
+ - lib/algolia/models/search/attribute_criteria_computed_by.rb
836
899
  - lib/algolia/models/search/attribute_to_update.rb
837
900
  - lib/algolia/models/search/auto_filtering_filter_entry.rb
838
901
  - lib/algolia/models/search/auto_filtering_result.rb
@@ -951,6 +1014,7 @@ files:
951
1014
  - lib/algolia/models/search/replace_all_objects_with_transformation_response.rb
952
1015
  - lib/algolia/models/search/replace_source_response.rb
953
1016
  - lib/algolia/models/search/response_extensions.rb
1017
+ - lib/algolia/models/search/result_card.rb
954
1018
  - lib/algolia/models/search/rule.rb
955
1019
  - lib/algolia/models/search/save_object_response.rb
956
1020
  - lib/algolia/models/search/save_synonym_response.rb
@@ -1010,6 +1074,7 @@ files:
1010
1074
  - lib/algolia/transport/echo_requester.rb
1011
1075
  - lib/algolia/transport/http/http_requester.rb
1012
1076
  - lib/algolia/transport/http/response.rb
1077
+ - lib/algolia/transport/request_id.rb
1013
1078
  - lib/algolia/transport/request_options.rb
1014
1079
  - lib/algolia/transport/retry_outcome_type.rb
1015
1080
  - lib/algolia/transport/retry_strategy.rb
@@ -1038,7 +1103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1038
1103
  - !ruby/object:Gem::Version
1039
1104
  version: '0'
1040
1105
  requirements: []
1041
- rubygems_version: 4.0.16
1106
+ rubygems_version: 4.0.20
1042
1107
  specification_version: 4
1043
1108
  summary: A simple Ruby client for the algolia.com REST API
1044
1109
  test_files: []