stagehand 3.7.1 → 3.19.3

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/README.md +3 -3
  4. data/lib/stagehand/internal/stream.rb +2 -11
  5. data/lib/stagehand/internal/util.rb +50 -6
  6. data/lib/stagehand/local.rb +5 -5
  7. data/lib/stagehand/models/model_config.rb +9 -1
  8. data/lib/stagehand/models/session_act_params.rb +63 -5
  9. data/lib/stagehand/models/session_end_params.rb +9 -1
  10. data/lib/stagehand/models/session_execute_params.rb +26 -2
  11. data/lib/stagehand/models/session_extract_params.rb +9 -1
  12. data/lib/stagehand/models/session_navigate_params.rb +9 -1
  13. data/lib/stagehand/models/session_observe_params.rb +69 -2
  14. data/lib/stagehand/models/session_replay_params.rb +9 -1
  15. data/lib/stagehand/models/session_start_params.rb +7 -1
  16. data/lib/stagehand/models/stream_event.rb +2 -1
  17. data/lib/stagehand/version.rb +1 -1
  18. data/rbi/stagehand/internal/util.rbi +28 -0
  19. data/rbi/stagehand/models/model_config.rbi +11 -0
  20. data/rbi/stagehand/models/session_act_params.rbi +144 -6
  21. data/rbi/stagehand/models/session_end_params.rbi +8 -0
  22. data/rbi/stagehand/models/session_execute_params.rbi +33 -3
  23. data/rbi/stagehand/models/session_extract_params.rbi +8 -0
  24. data/rbi/stagehand/models/session_navigate_params.rbi +8 -0
  25. data/rbi/stagehand/models/session_observe_params.rbi +156 -3
  26. data/rbi/stagehand/models/session_replay_params.rbi +8 -0
  27. data/rbi/stagehand/models/session_start_params.rbi +9 -0
  28. data/rbi/stagehand/models/stream_event.rbi +2 -1
  29. data/sig/stagehand/internal/util.rbs +14 -0
  30. data/sig/stagehand/models/model_config.rbs +7 -0
  31. data/sig/stagehand/models/session_act_params.rbs +56 -5
  32. data/sig/stagehand/models/session_end_params.rbs +5 -0
  33. data/sig/stagehand/models/session_execute_params.rbs +26 -3
  34. data/sig/stagehand/models/session_extract_params.rbs +5 -0
  35. data/sig/stagehand/models/session_navigate_params.rbs +5 -0
  36. data/sig/stagehand/models/session_observe_params.rbs +61 -3
  37. data/sig/stagehand/models/session_replay_params.rbs +5 -0
  38. data/sig/stagehand/models/session_start_params.rbs +7 -0
  39. metadata +2 -2
@@ -144,6 +144,11 @@ module Stagehand
144
144
  # @return [Array<String>, nil]
145
145
  optional :args, Stagehand::Internal::Type::ArrayOf[String]
146
146
 
147
+ # @!attribute cdp_headers
148
+ #
149
+ # @return [Hash{Symbol=>String}, nil]
150
+ optional :cdp_headers, Stagehand::Internal::Type::HashOf[String], api_name: :cdpHeaders
151
+
147
152
  # @!attribute cdp_url
148
153
  #
149
154
  # @return [String, nil]
@@ -231,9 +236,10 @@ module Stagehand
231
236
  # @return [Stagehand::Models::SessionStartParams::Browser::LaunchOptions::Viewport, nil]
232
237
  optional :viewport, -> { Stagehand::SessionStartParams::Browser::LaunchOptions::Viewport }
233
238
 
234
- # @!method initialize(accept_downloads: nil, args: nil, cdp_url: nil, chromium_sandbox: nil, connect_timeout_ms: nil, device_scale_factor: nil, devtools: nil, downloads_path: nil, executable_path: nil, has_touch: nil, headless: nil, ignore_default_args: nil, ignore_https_errors: nil, locale: nil, port: nil, preserve_user_data_dir: nil, proxy: nil, user_data_dir: nil, viewport: nil)
239
+ # @!method initialize(accept_downloads: nil, args: nil, cdp_headers: nil, cdp_url: nil, chromium_sandbox: nil, connect_timeout_ms: nil, device_scale_factor: nil, devtools: nil, downloads_path: nil, executable_path: nil, has_touch: nil, headless: nil, ignore_default_args: nil, ignore_https_errors: nil, locale: nil, port: nil, preserve_user_data_dir: nil, proxy: nil, user_data_dir: nil, viewport: nil)
235
240
  # @param accept_downloads [Boolean]
236
241
  # @param args [Array<String>]
242
+ # @param cdp_headers [Hash{Symbol=>String}]
237
243
  # @param cdp_url [String]
238
244
  # @param chromium_sandbox [Boolean]
239
245
  # @param connect_timeout_ms [Float]
@@ -22,7 +22,8 @@ module Stagehand
22
22
 
23
23
  # @!method initialize(id:, data:, type:)
24
24
  # Server-Sent Event emitted during streaming responses. Events are sent as
25
- # `data: <JSON>\n\n`. Key order: data (with status first), type, id.
25
+ # `event: <status>\ndata: <JSON>\n\n`, where the JSON payload has the shape
26
+ # `{ data, type, id }`.
26
27
  #
27
28
  # @param id [String] Unique identifier for this event
28
29
  #
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stagehand
4
- VERSION = "3.7.1"
4
+ VERSION = "3.19.3"
5
5
  end
@@ -148,12 +148,20 @@ module Stagehand
148
148
  end
149
149
  end
150
150
 
151
+ # https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3
152
+ RFC_3986_NOT_PCHARS = T.let(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/, Regexp)
153
+
151
154
  class << self
152
155
  # @api private
153
156
  sig { params(uri: URI::Generic).returns(String) }
154
157
  def uri_origin(uri)
155
158
  end
156
159
 
160
+ # @api private
161
+ sig { params(path: T.any(String, Integer)).returns(String) }
162
+ def encode_path(path)
163
+ end
164
+
157
165
  # @api private
158
166
  sig { params(path: T.any(String, T::Array[String])).returns(String) }
159
167
  def interpolate_path(path)
@@ -301,6 +309,26 @@ module Stagehand
301
309
  T.let(%r{^application/(:?x-(?:n|l)djson)|(:?(?:x-)?jsonl)}, Regexp)
302
310
 
303
311
  class << self
312
+ # @api private
313
+ sig do
314
+ params(query: Stagehand::Internal::AnyHash).returns(
315
+ Stagehand::Internal::AnyHash
316
+ )
317
+ end
318
+ def encode_query_params(query)
319
+ end
320
+
321
+ # @api private
322
+ sig do
323
+ params(
324
+ collection: Stagehand::Internal::AnyHash,
325
+ key: String,
326
+ element: T.anything
327
+ ).void
328
+ end
329
+ private def write_query_param_element!(collection, key, element)
330
+ end
331
+
304
332
  # @api private
305
333
  sig do
306
334
  params(
@@ -26,6 +26,13 @@ module Stagehand
26
26
  sig { params(base_url: String).void }
27
27
  attr_writer :base_url
28
28
 
29
+ # Custom headers sent with every request to the model provider
30
+ sig { returns(T.nilable(T::Hash[Symbol, String])) }
31
+ attr_reader :headers
32
+
33
+ sig { params(headers: T::Hash[Symbol, String]).void }
34
+ attr_writer :headers
35
+
29
36
  # AI provider for the model (or provide a baseURL endpoint instead)
30
37
  sig { returns(T.nilable(Stagehand::ModelConfig::Provider::OrSymbol)) }
31
38
  attr_reader :provider
@@ -38,6 +45,7 @@ module Stagehand
38
45
  model_name: String,
39
46
  api_key: String,
40
47
  base_url: String,
48
+ headers: T::Hash[Symbol, String],
41
49
  provider: Stagehand::ModelConfig::Provider::OrSymbol
42
50
  ).returns(T.attached_class)
43
51
  end
@@ -48,6 +56,8 @@ module Stagehand
48
56
  api_key: nil,
49
57
  # Base URL for the model provider
50
58
  base_url: nil,
59
+ # Custom headers sent with every request to the model provider
60
+ headers: nil,
51
61
  # AI provider for the model (or provide a baseURL endpoint instead)
52
62
  provider: nil
53
63
  )
@@ -59,6 +69,7 @@ module Stagehand
59
69
  model_name: String,
60
70
  api_key: String,
61
71
  base_url: String,
72
+ headers: T::Hash[Symbol, String],
62
73
  provider: Stagehand::ModelConfig::Provider::OrSymbol
63
74
  }
64
75
  )
@@ -11,6 +11,10 @@ module Stagehand
11
11
  T.any(Stagehand::SessionActParams, Stagehand::Internal::AnyHash)
12
12
  end
13
13
 
14
+ # Unique session identifier
15
+ sig { returns(String) }
16
+ attr_accessor :id
17
+
14
18
  # Natural language instruction or Action object
15
19
  sig { returns(T.any(String, Stagehand::Action)) }
16
20
  attr_accessor :input
@@ -43,6 +47,7 @@ module Stagehand
43
47
 
44
48
  sig do
45
49
  params(
50
+ id: String,
46
51
  input: T.any(String, Stagehand::Action::OrHash),
47
52
  frame_id: T.nilable(String),
48
53
  options: Stagehand::SessionActParams::Options::OrHash,
@@ -52,6 +57,8 @@ module Stagehand
52
57
  ).returns(T.attached_class)
53
58
  end
54
59
  def self.new(
60
+ # Unique session identifier
61
+ id:,
55
62
  # Natural language instruction or Action object
56
63
  input:,
57
64
  # Target frame ID for the action
@@ -66,6 +73,7 @@ module Stagehand
66
73
  sig do
67
74
  override.returns(
68
75
  {
76
+ id: String,
69
77
  input: T.any(String, Stagehand::Action),
70
78
  frame_id: T.nilable(String),
71
79
  options: Stagehand::SessionActParams::Options,
@@ -118,18 +126,55 @@ module Stagehand
118
126
  sig { params(timeout: Float).void }
119
127
  attr_writer :timeout
120
128
 
121
- # Variables to substitute in the action instruction
122
- sig { returns(T.nilable(T::Hash[Symbol, String])) }
129
+ # Variables to substitute in the action instruction. Accepts flat primitives or {
130
+ # value, description? } objects.
131
+ sig do
132
+ returns(
133
+ T.nilable(
134
+ T::Hash[
135
+ Symbol,
136
+ T.any(
137
+ String,
138
+ Float,
139
+ T::Boolean,
140
+ Stagehand::SessionActParams::Options::Variable::UnionMember3
141
+ )
142
+ ]
143
+ )
144
+ )
145
+ end
123
146
  attr_reader :variables
124
147
 
125
- sig { params(variables: T::Hash[Symbol, String]).void }
148
+ sig do
149
+ params(
150
+ variables:
151
+ T::Hash[
152
+ Symbol,
153
+ T.any(
154
+ String,
155
+ Float,
156
+ T::Boolean,
157
+ Stagehand::SessionActParams::Options::Variable::UnionMember3::OrHash
158
+ )
159
+ ]
160
+ ).void
161
+ end
126
162
  attr_writer :variables
127
163
 
128
164
  sig do
129
165
  params(
130
166
  model: T.any(Stagehand::ModelConfig::OrHash, String),
131
167
  timeout: Float,
132
- variables: T::Hash[Symbol, String]
168
+ variables:
169
+ T::Hash[
170
+ Symbol,
171
+ T.any(
172
+ String,
173
+ Float,
174
+ T::Boolean,
175
+ Stagehand::SessionActParams::Options::Variable::UnionMember3::OrHash
176
+ )
177
+ ]
133
178
  ).returns(T.attached_class)
134
179
  end
135
180
  def self.new(
@@ -137,7 +182,8 @@ module Stagehand
137
182
  model: nil,
138
183
  # Timeout in ms for the action
139
184
  timeout: nil,
140
- # Variables to substitute in the action instruction
185
+ # Variables to substitute in the action instruction. Accepts flat primitives or {
186
+ # value, description? } objects.
141
187
  variables: nil
142
188
  )
143
189
  end
@@ -147,7 +193,16 @@ module Stagehand
147
193
  {
148
194
  model: T.any(Stagehand::ModelConfig, String),
149
195
  timeout: Float,
150
- variables: T::Hash[Symbol, String]
196
+ variables:
197
+ T::Hash[
198
+ Symbol,
199
+ T.any(
200
+ String,
201
+ Float,
202
+ T::Boolean,
203
+ Stagehand::SessionActParams::Options::Variable::UnionMember3
204
+ )
205
+ ]
151
206
  }
152
207
  )
153
208
  end
@@ -168,6 +223,89 @@ module Stagehand
168
223
  def self.variants
169
224
  end
170
225
  end
226
+
227
+ module Variable
228
+ extend Stagehand::Internal::Type::Union
229
+
230
+ Variants =
231
+ T.type_alias do
232
+ T.any(
233
+ String,
234
+ Float,
235
+ T::Boolean,
236
+ Stagehand::SessionActParams::Options::Variable::UnionMember3
237
+ )
238
+ end
239
+
240
+ class UnionMember3 < Stagehand::Internal::Type::BaseModel
241
+ OrHash =
242
+ T.type_alias do
243
+ T.any(
244
+ Stagehand::SessionActParams::Options::Variable::UnionMember3,
245
+ Stagehand::Internal::AnyHash
246
+ )
247
+ end
248
+
249
+ sig do
250
+ returns(
251
+ Stagehand::SessionActParams::Options::Variable::UnionMember3::Value::Variants
252
+ )
253
+ end
254
+ attr_accessor :value
255
+
256
+ sig { returns(T.nilable(String)) }
257
+ attr_reader :description
258
+
259
+ sig { params(description: String).void }
260
+ attr_writer :description
261
+
262
+ sig do
263
+ params(
264
+ value:
265
+ Stagehand::SessionActParams::Options::Variable::UnionMember3::Value::Variants,
266
+ description: String
267
+ ).returns(T.attached_class)
268
+ end
269
+ def self.new(value:, description: nil)
270
+ end
271
+
272
+ sig do
273
+ override.returns(
274
+ {
275
+ value:
276
+ Stagehand::SessionActParams::Options::Variable::UnionMember3::Value::Variants,
277
+ description: String
278
+ }
279
+ )
280
+ end
281
+ def to_hash
282
+ end
283
+
284
+ module Value
285
+ extend Stagehand::Internal::Type::Union
286
+
287
+ Variants = T.type_alias { T.any(String, Float, T::Boolean) }
288
+
289
+ sig do
290
+ override.returns(
291
+ T::Array[
292
+ Stagehand::SessionActParams::Options::Variable::UnionMember3::Value::Variants
293
+ ]
294
+ )
295
+ end
296
+ def self.variants
297
+ end
298
+ end
299
+ end
300
+
301
+ sig do
302
+ override.returns(
303
+ T::Array[Stagehand::SessionActParams::Options::Variable::Variants]
304
+ )
305
+ end
306
+ def self.variants
307
+ end
308
+ end
171
309
  end
172
310
 
173
311
  # Whether to stream the response via SSE
@@ -11,6 +11,10 @@ module Stagehand
11
11
  T.any(Stagehand::SessionEndParams, Stagehand::Internal::AnyHash)
12
12
  end
13
13
 
14
+ # Unique session identifier
15
+ sig { returns(String) }
16
+ attr_accessor :id
17
+
14
18
  # Whether to stream the response via SSE
15
19
  sig do
16
20
  returns(
@@ -29,12 +33,15 @@ module Stagehand
29
33
 
30
34
  sig do
31
35
  params(
36
+ id: String,
32
37
  x_stream_response:
33
38
  Stagehand::SessionEndParams::XStreamResponse::OrSymbol,
34
39
  request_options: Stagehand::RequestOptions::OrHash
35
40
  ).returns(T.attached_class)
36
41
  end
37
42
  def self.new(
43
+ # Unique session identifier
44
+ id:,
38
45
  # Whether to stream the response via SSE
39
46
  x_stream_response: nil,
40
47
  request_options: {}
@@ -44,6 +51,7 @@ module Stagehand
44
51
  sig do
45
52
  override.returns(
46
53
  {
54
+ id: String,
47
55
  x_stream_response:
48
56
  Stagehand::SessionEndParams::XStreamResponse::OrSymbol,
49
57
  request_options: Stagehand::RequestOptions
@@ -11,6 +11,10 @@ module Stagehand
11
11
  T.any(Stagehand::SessionExecuteParams, Stagehand::Internal::AnyHash)
12
12
  end
13
13
 
14
+ # Unique session identifier
15
+ sig { returns(String) }
16
+ attr_accessor :id
17
+
14
18
  sig { returns(Stagehand::SessionExecuteParams::AgentConfig) }
15
19
  attr_reader :agent_config
16
20
 
@@ -61,6 +65,7 @@ module Stagehand
61
65
 
62
66
  sig do
63
67
  params(
68
+ id: String,
64
69
  agent_config: Stagehand::SessionExecuteParams::AgentConfig::OrHash,
65
70
  execute_options:
66
71
  Stagehand::SessionExecuteParams::ExecuteOptions::OrHash,
@@ -72,6 +77,8 @@ module Stagehand
72
77
  ).returns(T.attached_class)
73
78
  end
74
79
  def self.new(
80
+ # Unique session identifier
81
+ id:,
75
82
  agent_config:,
76
83
  execute_options:,
77
84
  # Target frame ID for the agent
@@ -87,6 +94,7 @@ module Stagehand
87
94
  sig do
88
95
  override.returns(
89
96
  {
97
+ id: String,
90
98
  agent_config: Stagehand::SessionExecuteParams::AgentConfig,
91
99
  execute_options: Stagehand::SessionExecuteParams::ExecuteOptions,
92
100
  frame_id: T.nilable(String),
@@ -379,11 +387,27 @@ module Stagehand
379
387
  sig { params(max_steps: Float).void }
380
388
  attr_writer :max_steps
381
389
 
390
+ # Timeout in milliseconds for each agent tool call
391
+ sig { returns(T.nilable(Float)) }
392
+ attr_reader :tool_timeout
393
+
394
+ sig { params(tool_timeout: Float).void }
395
+ attr_writer :tool_timeout
396
+
397
+ # Whether to enable the web search tool powered by Browserbase Search API
398
+ sig { returns(T.nilable(T::Boolean)) }
399
+ attr_reader :use_search
400
+
401
+ sig { params(use_search: T::Boolean).void }
402
+ attr_writer :use_search
403
+
382
404
  sig do
383
405
  params(
384
406
  instruction: String,
385
407
  highlight_cursor: T::Boolean,
386
- max_steps: Float
408
+ max_steps: Float,
409
+ tool_timeout: Float,
410
+ use_search: T::Boolean
387
411
  ).returns(T.attached_class)
388
412
  end
389
413
  def self.new(
@@ -392,7 +416,11 @@ module Stagehand
392
416
  # Whether to visually highlight the cursor during execution
393
417
  highlight_cursor: nil,
394
418
  # Maximum number of steps the agent can take
395
- max_steps: nil
419
+ max_steps: nil,
420
+ # Timeout in milliseconds for each agent tool call
421
+ tool_timeout: nil,
422
+ # Whether to enable the web search tool powered by Browserbase Search API
423
+ use_search: nil
396
424
  )
397
425
  end
398
426
 
@@ -401,7 +429,9 @@ module Stagehand
401
429
  {
402
430
  instruction: String,
403
431
  highlight_cursor: T::Boolean,
404
- max_steps: Float
432
+ max_steps: Float,
433
+ tool_timeout: Float,
434
+ use_search: T::Boolean
405
435
  }
406
436
  )
407
437
  end
@@ -11,6 +11,10 @@ module Stagehand
11
11
  T.any(Stagehand::SessionExtractParams, Stagehand::Internal::AnyHash)
12
12
  end
13
13
 
14
+ # Unique session identifier
15
+ sig { returns(String) }
16
+ attr_accessor :id
17
+
14
18
  # Target frame ID for the extraction
15
19
  sig { returns(T.nilable(String)) }
16
20
  attr_accessor :frame_id
@@ -55,6 +59,7 @@ module Stagehand
55
59
 
56
60
  sig do
57
61
  params(
62
+ id: String,
58
63
  frame_id: T.nilable(String),
59
64
  instruction: String,
60
65
  options: Stagehand::SessionExtractParams::Options::OrHash,
@@ -65,6 +70,8 @@ module Stagehand
65
70
  ).returns(T.attached_class)
66
71
  end
67
72
  def self.new(
73
+ # Unique session identifier
74
+ id:,
68
75
  # Target frame ID for the extraction
69
76
  frame_id: nil,
70
77
  # Natural language instruction for what to extract
@@ -81,6 +88,7 @@ module Stagehand
81
88
  sig do
82
89
  override.returns(
83
90
  {
91
+ id: String,
84
92
  frame_id: T.nilable(String),
85
93
  instruction: String,
86
94
  options: Stagehand::SessionExtractParams::Options,
@@ -11,6 +11,10 @@ module Stagehand
11
11
  T.any(Stagehand::SessionNavigateParams, Stagehand::Internal::AnyHash)
12
12
  end
13
13
 
14
+ # Unique session identifier
15
+ sig { returns(String) }
16
+ attr_accessor :id
17
+
14
18
  # URL to navigate to
15
19
  sig { returns(String) }
16
20
  attr_accessor :url
@@ -52,6 +56,7 @@ module Stagehand
52
56
 
53
57
  sig do
54
58
  params(
59
+ id: String,
55
60
  url: String,
56
61
  frame_id: T.nilable(String),
57
62
  options: Stagehand::SessionNavigateParams::Options::OrHash,
@@ -62,6 +67,8 @@ module Stagehand
62
67
  ).returns(T.attached_class)
63
68
  end
64
69
  def self.new(
70
+ # Unique session identifier
71
+ id:,
65
72
  # URL to navigate to
66
73
  url:,
67
74
  # Target frame ID for the navigation
@@ -78,6 +85,7 @@ module Stagehand
78
85
  sig do
79
86
  override.returns(
80
87
  {
88
+ id: String,
81
89
  url: String,
82
90
  frame_id: T.nilable(String),
83
91
  options: Stagehand::SessionNavigateParams::Options,