cadenya 0.22.0 → 0.23.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +13 -1
  4. data/lib/cadenya/internal/stream.rb +32 -0
  5. data/lib/cadenya/internal/transport/base_client.rb +1 -1
  6. data/lib/cadenya/internal/type/base_stream.rb +83 -0
  7. data/lib/cadenya/models/ai_provider_key_spec.rb +14 -168
  8. data/lib/cadenya/models/{objective_continue_response.rb → objective_event.rb} +2 -2
  9. data/lib/cadenya/models/objective_event_webhook_data.rb +3 -43
  10. data/lib/cadenya/models/objective_stream_events_params.rb +26 -0
  11. data/lib/cadenya/models/unsafe_unwrap_webhook_event.rb +3 -43
  12. data/lib/cadenya/models/unwrap_webhook_event.rb +3 -42
  13. data/lib/cadenya/models.rb +4 -0
  14. data/lib/cadenya/resources/objectives.rb +31 -4
  15. data/lib/cadenya/version.rb +1 -1
  16. data/lib/cadenya.rb +4 -2
  17. data/rbi/cadenya/internal/stream.rbi +18 -0
  18. data/rbi/cadenya/internal/transport/base_client.rbi +18 -2
  19. data/rbi/cadenya/internal/type/base_stream.rbi +75 -0
  20. data/rbi/cadenya/models/ai_provider_key_spec.rbi +24 -363
  21. data/rbi/cadenya/models/{objective_continue_response.rbi → objective_event.rbi} +2 -5
  22. data/rbi/cadenya/models/objective_event_webhook_data.rbi +4 -80
  23. data/rbi/cadenya/models/objective_stream_events_params.rbi +46 -0
  24. data/rbi/cadenya/models/unsafe_unwrap_webhook_event.rbi +4 -78
  25. data/rbi/cadenya/models/unwrap_webhook_event.rbi +4 -77
  26. data/rbi/cadenya/models.rbi +4 -0
  27. data/rbi/cadenya/resources/objectives.rbi +17 -6
  28. data/sig/cadenya/internal/stream.rbs +9 -0
  29. data/sig/cadenya/internal/type/base_stream.rbs +38 -0
  30. data/sig/cadenya/models/ai_provider_key_spec.rbs +11 -161
  31. data/sig/cadenya/models/{objective_continue_response.rbs → objective_event.rbs} +2 -2
  32. data/sig/cadenya/models/objective_event_webhook_data.rbs +4 -42
  33. data/sig/cadenya/models/objective_stream_events_params.rbs +28 -0
  34. data/sig/cadenya/models/unsafe_unwrap_webhook_event.rbs +4 -42
  35. data/sig/cadenya/models/unwrap_webhook_event.rbs +4 -42
  36. data/sig/cadenya/models.rbs +4 -0
  37. data/sig/cadenya/resources/objectives.rbs +8 -2
  38. metadata +13 -7
  39. data/lib/cadenya/models/objective_list_events_response.rb +0 -42
  40. data/rbi/cadenya/models/objective_list_events_response.rbi +0 -72
  41. data/sig/cadenya/models/objective_list_events_response.rbs +0 -39
@@ -222,7 +222,7 @@ module Cadenya
222
222
  #
223
223
  # @param request_options [Cadenya::RequestOptions, Hash{Symbol=>Object}, nil]
224
224
  #
225
- # @return [Cadenya::Models::ObjectiveContinueResponse]
225
+ # @return [Cadenya::Models::ObjectiveEvent]
226
226
  #
227
227
  # @see Cadenya::Models::ObjectiveContinueParams
228
228
  def continue(objective_id, params)
@@ -235,7 +235,7 @@ module Cadenya
235
235
  method: :post,
236
236
  path: ["v1/workspaces/%1$s/objectives/%2$s:continue", workspace_id, objective_id],
237
237
  body: parsed,
238
- model: Cadenya::Models::ObjectiveContinueResponse,
238
+ model: Cadenya::ObjectiveEvent,
239
239
  options: options
240
240
  )
241
241
  end
@@ -299,7 +299,7 @@ module Cadenya
299
299
  #
300
300
  # @param request_options [Cadenya::RequestOptions, Hash{Symbol=>Object}, nil]
301
301
  #
302
- # @return [Cadenya::Internal::CursorPagination<Cadenya::Models::ObjectiveListEventsResponse>]
302
+ # @return [Cadenya::Internal::CursorPagination<Cadenya::Models::ObjectiveEvent>]
303
303
  #
304
304
  # @see Cadenya::Models::ObjectiveListEventsParams
305
305
  def list_events(objective_id, params)
@@ -319,7 +319,34 @@ module Cadenya
319
319
  window_id: "windowId"
320
320
  ),
321
321
  page: Cadenya::Internal::CursorPagination,
322
- model: Cadenya::Models::ObjectiveListEventsResponse,
322
+ model: Cadenya::ObjectiveEvent,
323
+ options: options
324
+ )
325
+ end
326
+
327
+ # Streams events for an objective in real-time using server-sent events (SSE)
328
+ #
329
+ # @overload stream_events_streaming(objective_id, workspace_id:, request_options: {})
330
+ #
331
+ # @param objective_id [String]
332
+ # @param workspace_id [String]
333
+ # @param request_options [Cadenya::RequestOptions, Hash{Symbol=>Object}, nil]
334
+ #
335
+ # @return [Cadenya::Internal::Stream<Cadenya::Models::ObjectiveEvent>]
336
+ #
337
+ # @see Cadenya::Models::ObjectiveStreamEventsParams
338
+ def stream_events_streaming(objective_id, params)
339
+ parsed, options = Cadenya::ObjectiveStreamEventsParams.dump_request(params)
340
+ workspace_id =
341
+ parsed.delete(:workspace_id) do
342
+ raise ArgumentError.new("missing required path argument #{_1}")
343
+ end
344
+ @client.request(
345
+ method: :get,
346
+ path: ["v1/workspaces/%1$s/objectives/%2$s/events:stream", workspace_id, objective_id],
347
+ headers: {"accept" => "text/event-stream", "accept-encoding" => "identity"},
348
+ stream: Cadenya::Internal::Stream,
349
+ model: Cadenya::ObjectiveEvent,
323
350
  options: options
324
351
  )
325
352
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cadenya
4
- VERSION = "0.22.0"
4
+ VERSION = "0.23.0"
5
5
  end
data/lib/cadenya.rb CHANGED
@@ -45,6 +45,7 @@ require_relative "cadenya/internal/type/array_of"
45
45
  require_relative "cadenya/internal/type/hash_of"
46
46
  require_relative "cadenya/internal/type/base_model"
47
47
  require_relative "cadenya/internal/type/base_page"
48
+ require_relative "cadenya/internal/type/base_stream"
48
49
  require_relative "cadenya/internal/type/request_parameters"
49
50
  require_relative "cadenya/internal"
50
51
  require_relative "cadenya/request_options"
@@ -53,6 +54,7 @@ require_relative "cadenya/errors"
53
54
  require_relative "cadenya/internal/transport/base_client"
54
55
  require_relative "cadenya/internal/transport/pooled_net_requester"
55
56
  require_relative "cadenya/client"
57
+ require_relative "cadenya/internal/stream"
56
58
  require_relative "cadenya/internal/cursor_pagination"
57
59
  require_relative "cadenya/models/account"
58
60
  require_relative "cadenya/models/account_info"
@@ -177,16 +179,15 @@ require_relative "cadenya/models/objective_config_snapshot"
177
179
  require_relative "cadenya/models/objective_context_window"
178
180
  require_relative "cadenya/models/objective_context_window_data"
179
181
  require_relative "cadenya/models/objective_continue_params"
180
- require_relative "cadenya/models/objective_continue_response"
181
182
  require_relative "cadenya/models/objective_create_params"
182
183
  require_relative "cadenya/models/objective_error"
184
+ require_relative "cadenya/models/objective_event"
183
185
  require_relative "cadenya/models/objective_event_data"
184
186
  require_relative "cadenya/models/objective_event_info"
185
187
  require_relative "cadenya/models/objective_event_webhook_data"
186
188
  require_relative "cadenya/models/objective_info"
187
189
  require_relative "cadenya/models/objective_list_context_windows_params"
188
190
  require_relative "cadenya/models/objective_list_events_params"
189
- require_relative "cadenya/models/objective_list_events_response"
190
191
  require_relative "cadenya/models/objective_list_params"
191
192
  require_relative "cadenya/models/objective_retrieve_params"
192
193
  require_relative "cadenya/models/objectives/feedback_create_params"
@@ -215,6 +216,7 @@ require_relative "cadenya/models/objectives/tool_call_list_params"
215
216
  require_relative "cadenya/models/objectives/tool_call_retrieve_params"
216
217
  require_relative "cadenya/models/objectives/tool_list_params"
217
218
  require_relative "cadenya/models/objective_secret"
219
+ require_relative "cadenya/models/objective_stream_events_params"
218
220
  require_relative "cadenya/models/operation_metadata"
219
221
  require_relative "cadenya/models/page"
220
222
  require_relative "cadenya/models/profile"
@@ -0,0 +1,18 @@
1
+ # typed: strong
2
+
3
+ module Cadenya
4
+ module Internal
5
+ class Stream
6
+ Message =
7
+ type_member(:in) { { fixed: Cadenya::Internal::Util::ServerSentEvent } }
8
+ Elem = type_member(:out)
9
+
10
+ include Cadenya::Internal::Type::BaseStream
11
+
12
+ # @api private
13
+ sig { override.returns(T::Enumerable[Elem]) }
14
+ private def iterator
15
+ end
16
+ end
17
+ end
18
+ end
@@ -49,7 +49,15 @@ module Cadenya
49
49
  ]
50
50
  ]
51
51
  ),
52
- stream: T.nilable(T::Class[T.anything]),
52
+ stream:
53
+ T.nilable(
54
+ T::Class[
55
+ Cadenya::Internal::Type::BaseStream[
56
+ T.anything,
57
+ Cadenya::Internal::Type::BaseModel
58
+ ]
59
+ ]
60
+ ),
53
61
  model: T.nilable(Cadenya::Internal::Type::Converter::Input),
54
62
  options: T.nilable(Cadenya::RequestOptions::OrHash)
55
63
  }
@@ -268,7 +276,15 @@ module Cadenya
268
276
  ]
269
277
  ]
270
278
  ),
271
- stream: T.nilable(T::Class[T.anything]),
279
+ stream:
280
+ T.nilable(
281
+ T::Class[
282
+ Cadenya::Internal::Type::BaseStream[
283
+ T.anything,
284
+ Cadenya::Internal::Type::BaseModel
285
+ ]
286
+ ]
287
+ ),
272
288
  model: T.nilable(Cadenya::Internal::Type::Converter::Input),
273
289
  options: T.nilable(Cadenya::RequestOptions::OrHash)
274
290
  ).returns(T.anything)
@@ -0,0 +1,75 @@
1
+ # typed: strong
2
+
3
+ module Cadenya
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ # This module provides a base implementation for streaming responses in the SDK.
9
+ module BaseStream
10
+ include Enumerable
11
+
12
+ Message = type_member(:in)
13
+ Elem = type_member(:out)
14
+
15
+ sig { returns(Integer) }
16
+ attr_reader :status
17
+
18
+ sig { returns(T::Hash[String, String]) }
19
+ attr_reader :headers
20
+
21
+ sig { void }
22
+ def close
23
+ end
24
+
25
+ # @api private
26
+ sig { overridable.returns(T::Enumerable[Elem]) }
27
+ private def iterator
28
+ end
29
+
30
+ sig { params(blk: T.proc.params(arg0: Elem).void).void }
31
+ def each(&blk)
32
+ end
33
+
34
+ sig { returns(T::Enumerator[Elem]) }
35
+ def to_enum
36
+ end
37
+
38
+ # @api private
39
+ sig do
40
+ params(
41
+ model:
42
+ T.any(T::Class[T.anything], Cadenya::Internal::Type::Converter),
43
+ url: URI::Generic,
44
+ status: Integer,
45
+ headers: T::Hash[String, String],
46
+ response: Net::HTTPResponse,
47
+ unwrap:
48
+ T.any(
49
+ Symbol,
50
+ Integer,
51
+ T::Array[T.any(Symbol, Integer)],
52
+ T.proc.params(arg0: T.anything).returns(T.anything)
53
+ ),
54
+ stream: T::Enumerable[Message]
55
+ ).void
56
+ end
57
+ def initialize(
58
+ model:,
59
+ url:,
60
+ status:,
61
+ headers:,
62
+ response:,
63
+ unwrap:,
64
+ stream:
65
+ )
66
+ end
67
+
68
+ # @api private
69
+ sig { returns(String) }
70
+ def inspect
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -8,29 +8,22 @@ module Cadenya
8
8
  T.any(Cadenya::AIProviderKeySpec, Cadenya::Internal::AnyHash)
9
9
  end
10
10
 
11
- # AIProviderConfig holds non-secret, provider-specific settings. The set case must
12
- # correspond to AIProviderKeySpec.provider. Providers with no settings (Anthropic,
13
- # Gemini) simply leave this unset. The endpoint of a named provider is fixed and
14
- # intentionally not overridable here; use the OpenAI-compatible provider to target
15
- # a custom endpoint.
16
- sig { returns(T.nilable(Cadenya::AIProviderKeySpec::Config)) }
17
- attr_reader :config
11
+ # The provider credential. Accepted on create/update; never populated in responses
12
+ # (the server returns an empty value to avoid leaking it).
13
+ sig { returns(T.nilable(String)) }
14
+ attr_reader :api_key
18
15
 
19
- sig { params(config: Cadenya::AIProviderKeySpec::Config::OrHash).void }
20
- attr_writer :config
16
+ sig { params(api_key: String).void }
17
+ attr_writer :api_key
21
18
 
22
- # AIProviderCredential is the secret material used to authenticate with a
23
- # provider. The set case must correspond to AIProviderKeySpec.provider. The server
24
- # encrypts the serialized message at rest and never returns it on reads.
25
- sig { returns(T.nilable(Cadenya::AIProviderKeySpec::Credentials)) }
26
- attr_reader :credentials
19
+ # OpenRouterConfig holds OpenRouter-specific settings. Empty for now; it exists as
20
+ # the oneof seam so provider-specific options (region, base URL, etc.) can be
21
+ # added later without restructuring the spec.
22
+ sig { returns(T.nilable(T.anything)) }
23
+ attr_reader :openrouter
27
24
 
28
- sig do
29
- params(
30
- credentials: Cadenya::AIProviderKeySpec::Credentials::OrHash
31
- ).void
32
- end
33
- attr_writer :credentials
25
+ sig { params(openrouter: T.anything).void }
26
+ attr_writer :openrouter
34
27
 
35
28
  # The AI provider this key authenticates against.
36
29
  sig { returns(T.nilable(Cadenya::AIProviderKeySpec::Provider::OrSymbol)) }
@@ -43,22 +36,19 @@ module Cadenya
43
36
 
44
37
  sig do
45
38
  params(
46
- config: Cadenya::AIProviderKeySpec::Config::OrHash,
47
- credentials: Cadenya::AIProviderKeySpec::Credentials::OrHash,
39
+ api_key: String,
40
+ openrouter: T.anything,
48
41
  provider: Cadenya::AIProviderKeySpec::Provider::OrSymbol
49
42
  ).returns(T.attached_class)
50
43
  end
51
44
  def self.new(
52
- # AIProviderConfig holds non-secret, provider-specific settings. The set case must
53
- # correspond to AIProviderKeySpec.provider. Providers with no settings (Anthropic,
54
- # Gemini) simply leave this unset. The endpoint of a named provider is fixed and
55
- # intentionally not overridable here; use the OpenAI-compatible provider to target
56
- # a custom endpoint.
57
- config: nil,
58
- # AIProviderCredential is the secret material used to authenticate with a
59
- # provider. The set case must correspond to AIProviderKeySpec.provider. The server
60
- # encrypts the serialized message at rest and never returns it on reads.
61
- credentials: nil,
45
+ # The provider credential. Accepted on create/update; never populated in responses
46
+ # (the server returns an empty value to avoid leaking it).
47
+ api_key: nil,
48
+ # OpenRouterConfig holds OpenRouter-specific settings. Empty for now; it exists as
49
+ # the oneof seam so provider-specific options (region, base URL, etc.) can be
50
+ # added later without restructuring the spec.
51
+ openrouter: nil,
62
52
  # The AI provider this key authenticates against.
63
53
  provider: nil
64
54
  )
@@ -67,8 +57,8 @@ module Cadenya
67
57
  sig do
68
58
  override.returns(
69
59
  {
70
- config: Cadenya::AIProviderKeySpec::Config,
71
- credentials: Cadenya::AIProviderKeySpec::Credentials,
60
+ api_key: String,
61
+ openrouter: T.anything,
72
62
  provider: Cadenya::AIProviderKeySpec::Provider::OrSymbol
73
63
  }
74
64
  )
@@ -76,315 +66,6 @@ module Cadenya
76
66
  def to_hash
77
67
  end
78
68
 
79
- class Config < Cadenya::Internal::Type::BaseModel
80
- OrHash =
81
- T.type_alias do
82
- T.any(
83
- Cadenya::AIProviderKeySpec::Config,
84
- Cadenya::Internal::AnyHash
85
- )
86
- end
87
-
88
- # OpenAIConfig holds OpenAI-specific settings.
89
- sig { returns(T.nilable(Cadenya::AIProviderKeySpec::Config::OpenAI)) }
90
- attr_reader :openai
91
-
92
- sig do
93
- params(
94
- openai: Cadenya::AIProviderKeySpec::Config::OpenAI::OrHash
95
- ).void
96
- end
97
- attr_writer :openai
98
-
99
- # OpenAICompatibleConfig configures a generic endpoint that speaks the OpenAI Chat
100
- # Completions API. The base URL is required and its model catalog is discovered
101
- # live via GET {base_url}/models.
102
- sig do
103
- returns(
104
- T.nilable(Cadenya::AIProviderKeySpec::Config::OpenAICompatible)
105
- )
106
- end
107
- attr_reader :openai_compatible
108
-
109
- sig do
110
- params(
111
- openai_compatible:
112
- Cadenya::AIProviderKeySpec::Config::OpenAICompatible::OrHash
113
- ).void
114
- end
115
- attr_writer :openai_compatible
116
-
117
- # OpenRouterConfig holds OpenRouter-specific settings.
118
- sig do
119
- returns(T.nilable(Cadenya::AIProviderKeySpec::Config::Openrouter))
120
- end
121
- attr_reader :openrouter
122
-
123
- sig do
124
- params(
125
- openrouter: Cadenya::AIProviderKeySpec::Config::Openrouter::OrHash
126
- ).void
127
- end
128
- attr_writer :openrouter
129
-
130
- # AIProviderConfig holds non-secret, provider-specific settings. The set case must
131
- # correspond to AIProviderKeySpec.provider. Providers with no settings (Anthropic,
132
- # Gemini) simply leave this unset. The endpoint of a named provider is fixed and
133
- # intentionally not overridable here; use the OpenAI-compatible provider to target
134
- # a custom endpoint.
135
- sig do
136
- params(
137
- openai: Cadenya::AIProviderKeySpec::Config::OpenAI::OrHash,
138
- openai_compatible:
139
- Cadenya::AIProviderKeySpec::Config::OpenAICompatible::OrHash,
140
- openrouter: Cadenya::AIProviderKeySpec::Config::Openrouter::OrHash
141
- ).returns(T.attached_class)
142
- end
143
- def self.new(
144
- # OpenAIConfig holds OpenAI-specific settings.
145
- openai: nil,
146
- # OpenAICompatibleConfig configures a generic endpoint that speaks the OpenAI Chat
147
- # Completions API. The base URL is required and its model catalog is discovered
148
- # live via GET {base_url}/models.
149
- openai_compatible: nil,
150
- # OpenRouterConfig holds OpenRouter-specific settings.
151
- openrouter: nil
152
- )
153
- end
154
-
155
- sig do
156
- override.returns(
157
- {
158
- openai: Cadenya::AIProviderKeySpec::Config::OpenAI,
159
- openai_compatible:
160
- Cadenya::AIProviderKeySpec::Config::OpenAICompatible,
161
- openrouter: Cadenya::AIProviderKeySpec::Config::Openrouter
162
- }
163
- )
164
- end
165
- def to_hash
166
- end
167
-
168
- class OpenAI < Cadenya::Internal::Type::BaseModel
169
- OrHash =
170
- T.type_alias do
171
- T.any(
172
- Cadenya::AIProviderKeySpec::Config::OpenAI,
173
- Cadenya::Internal::AnyHash
174
- )
175
- end
176
-
177
- # Sent as the OpenAI-Organization header when set.
178
- sig { returns(T.nilable(String)) }
179
- attr_reader :organization_id
180
-
181
- sig { params(organization_id: String).void }
182
- attr_writer :organization_id
183
-
184
- # Sent as the OpenAI-Project header when set.
185
- sig { returns(T.nilable(String)) }
186
- attr_reader :project_id
187
-
188
- sig { params(project_id: String).void }
189
- attr_writer :project_id
190
-
191
- # OpenAIConfig holds OpenAI-specific settings.
192
- sig do
193
- params(organization_id: String, project_id: String).returns(
194
- T.attached_class
195
- )
196
- end
197
- def self.new(
198
- # Sent as the OpenAI-Organization header when set.
199
- organization_id: nil,
200
- # Sent as the OpenAI-Project header when set.
201
- project_id: nil
202
- )
203
- end
204
-
205
- sig do
206
- override.returns({ organization_id: String, project_id: String })
207
- end
208
- def to_hash
209
- end
210
- end
211
-
212
- class OpenAICompatible < Cadenya::Internal::Type::BaseModel
213
- OrHash =
214
- T.type_alias do
215
- T.any(
216
- Cadenya::AIProviderKeySpec::Config::OpenAICompatible,
217
- Cadenya::Internal::AnyHash
218
- )
219
- end
220
-
221
- sig { returns(T.nilable(String)) }
222
- attr_reader :base_url
223
-
224
- sig { params(base_url: String).void }
225
- attr_writer :base_url
226
-
227
- # OpenAICompatibleConfig configures a generic endpoint that speaks the OpenAI Chat
228
- # Completions API. The base URL is required and its model catalog is discovered
229
- # live via GET {base_url}/models.
230
- sig { params(base_url: String).returns(T.attached_class) }
231
- def self.new(base_url: nil)
232
- end
233
-
234
- sig { override.returns({ base_url: String }) }
235
- def to_hash
236
- end
237
- end
238
-
239
- class Openrouter < Cadenya::Internal::Type::BaseModel
240
- OrHash =
241
- T.type_alias do
242
- T.any(
243
- Cadenya::AIProviderKeySpec::Config::Openrouter,
244
- Cadenya::Internal::AnyHash
245
- )
246
- end
247
-
248
- # Data-residency region (e.g. "us", "eu"). Empty uses the provider default.
249
- sig { returns(T.nilable(String)) }
250
- attr_reader :region
251
-
252
- sig { params(region: String).void }
253
- attr_writer :region
254
-
255
- # OpenRouterConfig holds OpenRouter-specific settings.
256
- sig { params(region: String).returns(T.attached_class) }
257
- def self.new(
258
- # Data-residency region (e.g. "us", "eu"). Empty uses the provider default.
259
- region: nil
260
- )
261
- end
262
-
263
- sig { override.returns({ region: String }) }
264
- def to_hash
265
- end
266
- end
267
- end
268
-
269
- class Credentials < Cadenya::Internal::Type::BaseModel
270
- OrHash =
271
- T.type_alias do
272
- T.any(
273
- Cadenya::AIProviderKeySpec::Credentials,
274
- Cadenya::Internal::AnyHash
275
- )
276
- end
277
-
278
- # CredentialAPIKey carries a single bearer/header API key.
279
- sig do
280
- returns(T.nilable(Cadenya::AIProviderKeySpec::Credentials::APIKey))
281
- end
282
- attr_reader :api_key
283
-
284
- sig do
285
- params(
286
- api_key: Cadenya::AIProviderKeySpec::Credentials::APIKey::OrHash
287
- ).void
288
- end
289
- attr_writer :api_key
290
-
291
- # CredentialHeaders carries arbitrary HTTP headers sent with every request to the
292
- # provider (e.g. {"Authorization": "Bearer ...", "X-Api-Key": "..."}).
293
- sig do
294
- returns(T.nilable(Cadenya::AIProviderKeySpec::Credentials::Headers))
295
- end
296
- attr_reader :headers
297
-
298
- sig do
299
- params(
300
- headers: Cadenya::AIProviderKeySpec::Credentials::Headers::OrHash
301
- ).void
302
- end
303
- attr_writer :headers
304
-
305
- # AIProviderCredential is the secret material used to authenticate with a
306
- # provider. The set case must correspond to AIProviderKeySpec.provider. The server
307
- # encrypts the serialized message at rest and never returns it on reads.
308
- sig do
309
- params(
310
- api_key: Cadenya::AIProviderKeySpec::Credentials::APIKey::OrHash,
311
- headers: Cadenya::AIProviderKeySpec::Credentials::Headers::OrHash
312
- ).returns(T.attached_class)
313
- end
314
- def self.new(
315
- # CredentialAPIKey carries a single bearer/header API key.
316
- api_key: nil,
317
- # CredentialHeaders carries arbitrary HTTP headers sent with every request to the
318
- # provider (e.g. {"Authorization": "Bearer ...", "X-Api-Key": "..."}).
319
- headers: nil
320
- )
321
- end
322
-
323
- sig do
324
- override.returns(
325
- {
326
- api_key: Cadenya::AIProviderKeySpec::Credentials::APIKey,
327
- headers: Cadenya::AIProviderKeySpec::Credentials::Headers
328
- }
329
- )
330
- end
331
- def to_hash
332
- end
333
-
334
- class APIKey < Cadenya::Internal::Type::BaseModel
335
- OrHash =
336
- T.type_alias do
337
- T.any(
338
- Cadenya::AIProviderKeySpec::Credentials::APIKey,
339
- Cadenya::Internal::AnyHash
340
- )
341
- end
342
-
343
- sig { returns(T.nilable(String)) }
344
- attr_reader :api_key
345
-
346
- sig { params(api_key: String).void }
347
- attr_writer :api_key
348
-
349
- # CredentialAPIKey carries a single bearer/header API key.
350
- sig { params(api_key: String).returns(T.attached_class) }
351
- def self.new(api_key: nil)
352
- end
353
-
354
- sig { override.returns({ api_key: String }) }
355
- def to_hash
356
- end
357
- end
358
-
359
- class Headers < Cadenya::Internal::Type::BaseModel
360
- OrHash =
361
- T.type_alias do
362
- T.any(
363
- Cadenya::AIProviderKeySpec::Credentials::Headers,
364
- Cadenya::Internal::AnyHash
365
- )
366
- end
367
-
368
- sig { returns(T.nilable(T::Hash[Symbol, String])) }
369
- attr_reader :headers
370
-
371
- sig { params(headers: T::Hash[Symbol, String]).void }
372
- attr_writer :headers
373
-
374
- # CredentialHeaders carries arbitrary HTTP headers sent with every request to the
375
- # provider (e.g. {"Authorization": "Bearer ...", "X-Api-Key": "..."}).
376
- sig do
377
- params(headers: T::Hash[Symbol, String]).returns(T.attached_class)
378
- end
379
- def self.new(headers: nil)
380
- end
381
-
382
- sig { override.returns({ headers: T::Hash[Symbol, String] }) }
383
- def to_hash
384
- end
385
- end
386
- end
387
-
388
69
  # The AI provider this key authenticates against.
389
70
  module Provider
390
71
  extend Cadenya::Internal::Type::Enum
@@ -403,26 +84,6 @@ module Cadenya
403
84
  :AI_PROVIDER_OPENROUTER,
404
85
  Cadenya::AIProviderKeySpec::Provider::TaggedSymbol
405
86
  )
406
- AI_PROVIDER_OPENAI =
407
- T.let(
408
- :AI_PROVIDER_OPENAI,
409
- Cadenya::AIProviderKeySpec::Provider::TaggedSymbol
410
- )
411
- AI_PROVIDER_ANTHROPIC =
412
- T.let(
413
- :AI_PROVIDER_ANTHROPIC,
414
- Cadenya::AIProviderKeySpec::Provider::TaggedSymbol
415
- )
416
- AI_PROVIDER_GEMINI =
417
- T.let(
418
- :AI_PROVIDER_GEMINI,
419
- Cadenya::AIProviderKeySpec::Provider::TaggedSymbol
420
- )
421
- AI_PROVIDER_OPENAI_COMPATIBLE =
422
- T.let(
423
- :AI_PROVIDER_OPENAI_COMPATIBLE,
424
- Cadenya::AIProviderKeySpec::Provider::TaggedSymbol
425
- )
426
87
 
427
88
  sig do
428
89
  override.returns(
@@ -2,13 +2,10 @@
2
2
 
3
3
  module Cadenya
4
4
  module Models
5
- class ObjectiveContinueResponse < Cadenya::Internal::Type::BaseModel
5
+ class ObjectiveEvent < Cadenya::Internal::Type::BaseModel
6
6
  OrHash =
7
7
  T.type_alias do
8
- T.any(
9
- Cadenya::Models::ObjectiveContinueResponse,
10
- Cadenya::Internal::AnyHash
11
- )
8
+ T.any(Cadenya::ObjectiveEvent, Cadenya::Internal::AnyHash)
12
9
  end
13
10
 
14
11
  sig { returns(Cadenya::ObjectiveEventData) }