stagehand 3.19.3 → 3.21.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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -0
  3. data/README.md +2 -3
  4. data/lib/stagehand/client.rb +25 -13
  5. data/lib/stagehand/internal/transport/base_client.rb +2 -0
  6. data/lib/stagehand/internal/type/union.rb +11 -0
  7. data/lib/stagehand/internal/util.rb +3 -1
  8. data/lib/stagehand/local.rb +3 -12
  9. data/lib/stagehand/models/model_config.rb +326 -56
  10. data/lib/stagehand/models/session_act_params.rb +331 -4
  11. data/lib/stagehand/models/session_execute_params.rb +719 -9
  12. data/lib/stagehand/models/session_extract_params.rb +352 -5
  13. data/lib/stagehand/models/session_observe_params.rb +340 -5
  14. data/lib/stagehand/models/session_start_params.rb +56 -2
  15. data/lib/stagehand/resources/sessions.rb +16 -4
  16. data/lib/stagehand/version.rb +1 -1
  17. data/rbi/stagehand/client.rbi +6 -6
  18. data/rbi/stagehand/models/model_config.rbi +644 -69
  19. data/rbi/stagehand/models/session_act_params.rbi +707 -5
  20. data/rbi/stagehand/models/session_execute_params.rbi +1556 -13
  21. data/rbi/stagehand/models/session_extract_params.rbi +731 -5
  22. data/rbi/stagehand/models/session_observe_params.rbi +718 -5
  23. data/rbi/stagehand/models/session_start_params.rbi +102 -0
  24. data/sig/stagehand/models/model_config.rbs +310 -42
  25. data/sig/stagehand/models/session_act_params.rbs +324 -1
  26. data/sig/stagehand/models/session_execute_params.rbs +704 -5
  27. data/sig/stagehand/models/session_extract_params.rbs +338 -1
  28. data/sig/stagehand/models/session_observe_params.rbs +331 -1
  29. data/sig/stagehand/models/session_start_params.rbs +44 -0
  30. data/sig/stagehand/models.rbs +1 -1
  31. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f3995180e65110d8a64695b7be8cb095b24e8d6fb3bc2627f13df4c0acaa15f2
4
- data.tar.gz: a0b8bcd2648d2429b55c13b50d60fb7ec46da97118390900d1acfe0989e728d4
3
+ metadata.gz: 6323bad966eabb92ea6461cf51513992a9a5ab53a20c2c59a3c926a09db69f58
4
+ data.tar.gz: 93e96e355f774540da45305016f480d525d8efd500fa7f72d997591db6460d92
5
5
  SHA512:
6
- metadata.gz: 83eae8bebac5087cda9551141db3d62bff7a0caa065ff675799610237d3ebf5114b62bb519403a3063e147b9384721d6bc0fdca28ce222c08691326f0a8b5e82
7
- data.tar.gz: 7461914b6798606c6f0a672074ed3eaba504a82794e97becf1974de15cf701ce25ceec987d6969bb833d2ef098a5562da41f7faad6b1e871c75bba3ed4b4cda9
6
+ metadata.gz: 2f7d789b0cb10ef1cec433e586e00612c8c2597ee9061369214d116277ad0cac52ff35e0cebb13b96e91398e2e6380354c713479f07384ad64cdd581b8a4e8c2
7
+ data.tar.gz: ccb32a0e15484d6ccdd7142cd711734d386a42ee68eaa02f69225f5541df166fcb7e79682dd4c47933de4407588e9688027adb2ce3644daa599305a89ed4146b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,46 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.21.0 (2026-05-27)
4
+
5
+ Full Changelog: [v3.20.0...v3.21.0](https://github.com/browserbase/stagehand-ruby/compare/v3.20.0...v3.21.0)
6
+
7
+ ### Features
8
+
9
+ * [feat]: add `ignoreSelectors` to `observe()` ([0acc093](https://github.com/browserbase/stagehand-ruby/commit/0acc093944e72ee488393ec1fb73dc16450cc825))
10
+ * [STG-1756] forward Vertex model config ([f9752bc](https://github.com/browserbase/stagehand-ruby/commit/f9752bc3297bb9feef4d4b46d7faeac2a5e73335))
11
+ * Add `screenshot` option to Extract ([7b65ca7](https://github.com/browserbase/stagehand-ruby/commit/7b65ca776e1e13c489f13991b012fa24aecc60e6))
12
+ * STG-1756 add Vertex auth params to Stagehand spec ([4b65f22](https://github.com/browserbase/stagehand-ruby/commit/4b65f221055c7d0d3d7426845fbd0e49ba13d2df))
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * **client:** elide content type header on requests without body ([6149c11](https://github.com/browserbase/stagehand-ruby/commit/6149c11d9ab60a0cac69f1e26e3a2f42425ad616))
18
+
19
+ ## 3.20.0 (2026-05-06)
20
+
21
+ Full Changelog: [v3.19.3...v3.20.0](https://github.com/browserbase/stagehand-ruby/compare/v3.19.3...v3.20.0)
22
+
23
+ ### Features
24
+
25
+ * [feat]: add `ignoreSelectors` to `extract()` ([db24a9a](https://github.com/browserbase/stagehand-ruby/commit/db24a9ab45dc464d2ad88f9b50d39952c4c76801))
26
+ * [STG-1798] feat: support Browserbase verified sessions ([9647eb3](https://github.com/browserbase/stagehand-ruby/commit/9647eb3a4df86cc9d7aedb2f0a9ddd0babd39565))
27
+ * [STG-1808] Deprecate Browserbase project ID ([7af1c21](https://github.com/browserbase/stagehand-ruby/commit/7af1c21a07e7163ffb0b86f6c199989b750e0365))
28
+ * Bedrock auth passthrough ([5cb6ecb](https://github.com/browserbase/stagehand-ruby/commit/5cb6ecbe621e894dc6c5aec379fdca1183eec4fc))
29
+ * remove experimental requirement on agent variables ([#2079](https://github.com/browserbase/stagehand-ruby/issues/2079)) ([6f106d7](https://github.com/browserbase/stagehand-ruby/commit/6f106d74feb1b3f036433ec67dda5e4c395f434e))
30
+ * Revert "[STG-1573] Add providerOptions for extensible model auth ([#1822](https://github.com/browserbase/stagehand-ruby/issues/1822))" ([0c83a09](https://github.com/browserbase/stagehand-ruby/commit/0c83a0978116f8fc11a4edf78586f3d61b8af5e8))
31
+ * support setting headers via env ([5515959](https://github.com/browserbase/stagehand-ruby/commit/5515959505685e62f9324aebf470a295dd6d8292))
32
+
33
+
34
+ ### Bug Fixes
35
+
36
+ * avoid gzip buffering during streaming ([23c3eef](https://github.com/browserbase/stagehand-ruby/commit/23c3eef17497edbf3ec03049d12c548607112c8d))
37
+ * multipart encoding for file arrays ([149b303](https://github.com/browserbase/stagehand-ruby/commit/149b303eb54f4c9af037a5e073a2d6c92d959b44))
38
+
39
+
40
+ ### Chores
41
+
42
+ * **internal:** more robust bootstrap script ([69c050a](https://github.com/browserbase/stagehand-ruby/commit/69c050a467b5fcab904331bd30bd18d46cee8cae))
43
+
3
44
  ## 3.19.3 (2026-04-03)
4
45
 
5
46
  Full Changelog: [v3.18.0...v3.19.3](https://github.com/browserbase/stagehand-ruby/compare/v3.18.0...v3.19.3)
data/README.md CHANGED
@@ -90,7 +90,6 @@ require "playwright"
90
90
 
91
91
  client = Stagehand::Client.new(
92
92
  browserbase_api_key: ENV["BROWSERBASE_API_KEY"],
93
- browserbase_project_id: ENV["BROWSERBASE_PROJECT_ID"],
94
93
  model_api_key: ENV["MODEL_API_KEY"],
95
94
  server: "remote"
96
95
  )
@@ -162,10 +161,10 @@ client.sessions.end_(session_id)
162
161
 
163
162
  Set your environment variables (from `examples/.env.example`):
164
163
 
165
- - `STAGEHAND_API_URL`
166
164
  - `MODEL_API_KEY`
167
165
  - `BROWSERBASE_API_KEY`
168
- - `BROWSERBASE_PROJECT_ID`
166
+
167
+ `STAGEHAND_API_URL` is optional and defaults to the hosted Stagehand API. `STAGEHAND_BASE_URL` remains supported as a deprecated fallback when `STAGEHAND_API_URL` is unset.
169
168
 
170
169
  ```bash
171
170
  cp examples/.env.example examples/.env
@@ -19,7 +19,8 @@ module Stagehand
19
19
  # @return [String]
20
20
  attr_reader :browserbase_api_key
21
21
 
22
- # Your [Browserbase Project ID](https://www.browserbase.com/settings)
22
+ # Deprecated. Browserbase API keys are now project-scoped, so this value is accepted for
23
+ # backwards compatibility and ignored.
23
24
  # @return [String]
24
25
  attr_reader :browserbase_project_id
25
26
 
@@ -34,7 +35,7 @@ module Stagehand
34
35
  #
35
36
  # @return [Hash{String=>String}]
36
37
  private def auth_headers
37
- {**bb_api_key_auth, **bb_project_id_auth, **llm_model_api_key_auth}
38
+ {**bb_api_key_auth, **llm_model_api_key_auth}
38
39
  end
39
40
 
40
41
  # @api private
@@ -48,7 +49,7 @@ module Stagehand
48
49
  #
49
50
  # @return [Hash{String=>String}]
50
51
  private def bb_project_id_auth
51
- {"x-bb-project-id" => @browserbase_project_id}
52
+ {}
52
53
  end
53
54
 
54
55
  # @api private
@@ -63,8 +64,8 @@ module Stagehand
63
64
  # @param browserbase_api_key [String, nil] Your [Browserbase API Key](https://www.browserbase.com/settings) Defaults to
64
65
  # `ENV["BROWSERBASE_API_KEY"]`
65
66
  #
66
- # @param browserbase_project_id [String, nil] Your [Browserbase Project ID](https://www.browserbase.com/settings) Defaults to
67
- # `ENV["BROWSERBASE_PROJECT_ID"]`
67
+ # @param browserbase_project_id [String, nil] Deprecated. Browserbase API keys are now project-scoped, so
68
+ # this value is accepted for backwards compatibility and ignored.
68
69
  #
69
70
  # @param model_api_key [String, nil] Your LLM provider API key (e.g. OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.)
70
71
  # Defaults to `ENV["MODEL_API_KEY"]`
@@ -72,7 +73,8 @@ module Stagehand
72
73
  # @param server [String] Server mode to use ("remote" or "local"). Defaults to "remote"
73
74
  #
74
75
  # @param base_url [String, nil] Override the default base URL for the API, e.g.,
75
- # `"https://api.example.com/v2/"`. Defaults to `ENV["STAGEHAND_BASE_URL"]`
76
+ # `"https://api.example.com/v2/"`. Defaults to `ENV["STAGEHAND_API_URL"]`,
77
+ # then `ENV["STAGEHAND_BASE_URL"]`
76
78
  #
77
79
  # @param max_retries [Integer] Max number of retries to attempt after a failed retryable request.
78
80
  #
@@ -83,10 +85,10 @@ module Stagehand
83
85
  # @param max_retry_delay [Float]
84
86
  def initialize(
85
87
  browserbase_api_key: ENV["BROWSERBASE_API_KEY"],
86
- browserbase_project_id: ENV["BROWSERBASE_PROJECT_ID"],
88
+ browserbase_project_id: nil,
87
89
  model_api_key: ENV["MODEL_API_KEY"],
88
90
  server: "remote",
89
- base_url: ENV["STAGEHAND_BASE_URL"],
91
+ base_url: ENV["STAGEHAND_API_URL"] || ENV["STAGEHAND_BASE_URL"],
90
92
  max_retries: self.class::DEFAULT_MAX_RETRIES,
91
93
  timeout: self.class::DEFAULT_TIMEOUT_IN_SECONDS,
92
94
  initial_retry_delay: self.class::DEFAULT_INITIAL_RETRY_DELAY,
@@ -99,15 +101,24 @@ module Stagehand
99
101
  raise ArgumentError,
100
102
  "browserbase_api_key is required, and can be set via environ: \"BROWSERBASE_API_KEY\""
101
103
  end
102
- if browserbase_project_id.nil?
103
- raise ArgumentError,
104
- "browserbase_project_id is required, and can be set via environ: \"BROWSERBASE_PROJECT_ID\""
105
- end
106
104
  if model_api_key.nil?
107
105
  raise ArgumentError,
108
106
  "model_api_key is required, and can be set via environ: \"MODEL_API_KEY\""
109
107
  end
110
108
 
109
+ headers = {}
110
+ custom_headers_env = ENV["STAGEHAND_CUSTOM_HEADERS"]
111
+ unless custom_headers_env.nil?
112
+ parsed = {}
113
+ custom_headers_env.split("\n").each do |line|
114
+ colon = line.index(":")
115
+ unless colon.nil?
116
+ parsed[line[0...colon].strip] = line[(colon + 1)..].strip
117
+ end
118
+ end
119
+ headers = parsed.merge(headers)
120
+ end
121
+
111
122
  @browserbase_api_key = browserbase_api_key.to_s
112
123
  @browserbase_project_id = browserbase_project_id.to_s
113
124
  @model_api_key = model_api_key.to_s
@@ -117,7 +128,8 @@ module Stagehand
117
128
  timeout: timeout,
118
129
  max_retries: max_retries,
119
130
  initial_retry_delay: initial_retry_delay,
120
- max_retry_delay: max_retry_delay
131
+ max_retry_delay: max_retry_delay,
132
+ headers: headers
121
133
  )
122
134
 
123
135
  @sessions = Stagehand::Resources::Sessions.new(client: self)
@@ -306,6 +306,8 @@ module Stagehand
306
306
  Stagehand::Internal::Util.deep_merge(*[req[:body], opts[:extra_body]].compact)
307
307
  end
308
308
 
309
+ headers.delete("content-type") if body.nil?
310
+
309
311
  url = Stagehand::Internal::Util.join_parsed_uri(
310
312
  @base_url_components,
311
313
  {**req, path: path, query: query}
@@ -4,6 +4,17 @@ module Stagehand
4
4
  module Internal
5
5
  module Type
6
6
  # @api private
7
+ #
8
+ # @example
9
+ # # `model_config` is a `Stagehand::ModelConfig`
10
+ # case model_config
11
+ # when Stagehand::ModelConfig::VertexModelConfigObject
12
+ # puts(model_config.auth)
13
+ # when Stagehand::ModelConfig::GenericModelConfigObject
14
+ # puts(model_config.model_name)
15
+ # else
16
+ # puts(model_config)
17
+ # end
7
18
  module Union
8
19
  include Stagehand::Internal::Type::Converter
9
20
  include Stagehand::Internal::Util::SorbetRuntimeSupport
@@ -610,6 +610,7 @@ module Stagehand
610
610
  #
611
611
  # @return [Array(String, Enumerable<String>)]
612
612
  private def encode_multipart_streaming(body)
613
+ # rubocop:disable Style/CaseEquality
613
614
  # RFC 1521 Section 7.2.1 says we should have 70 char maximum for boundary length
614
615
  boundary = SecureRandom.urlsafe_base64(46)
615
616
 
@@ -619,7 +620,7 @@ module Stagehand
619
620
  in Hash
620
621
  body.each do |key, val|
621
622
  case val
622
- in Array if val.all? { primitive?(_1) }
623
+ in Array if val.all? { primitive?(_1) || Stagehand::Internal::Type::FileInput === _1 }
623
624
  val.each do |v|
624
625
  write_multipart_chunk(y, boundary: boundary, key: key, val: v, closing: closing)
625
626
  end
@@ -635,6 +636,7 @@ module Stagehand
635
636
 
636
637
  fused_io = fused_enum(strio) { closing.each(&:call) }
637
638
  [boundary, fused_io]
639
+ # rubocop:enable Style/CaseEquality
638
640
  end
639
641
 
640
642
  # @api private
@@ -50,7 +50,6 @@ module Stagehand
50
50
 
51
51
  missing = []
52
52
  missing << "browserbase_api_key" if client.browserbase_api_key.to_s.empty?
53
- missing << "browserbase_project_id" if client.browserbase_project_id.to_s.empty?
54
53
  return if missing.empty?
55
54
 
56
55
  message =
@@ -213,10 +212,9 @@ module Stagehand
213
212
  end
214
213
 
215
214
  class ServerManager
216
- def initialize(model_api_key:, browserbase_api_key:, browserbase_project_id:)
215
+ def initialize(model_api_key:, browserbase_api_key:)
217
216
  @model_api_key = model_api_key
218
217
  @browserbase_api_key = browserbase_api_key
219
- @browserbase_project_id = browserbase_project_id
220
218
  @host = DEFAULT_HOST
221
219
  @port = 0
222
220
  @mutex = Mutex.new
@@ -335,9 +333,6 @@ module Stagehand
335
333
  if @browserbase_api_key.to_s != ""
336
334
  env["BROWSERBASE_API_KEY"] = @browserbase_api_key
337
335
  end
338
- if @browserbase_project_id.to_s != ""
339
- env["BROWSERBASE_PROJECT_ID"] = @browserbase_project_id
340
- end
341
336
  env
342
337
  end
343
338
 
@@ -376,8 +371,6 @@ module Stagehand
376
371
  kwargs[:base_url] = base_url.nil? ? "http://#{DEFAULT_HOST}" : base_url
377
372
  kwargs[:browserbase_api_key] =
378
373
  kwargs[:browserbase_api_key] || ENV["BROWSERBASE_API_KEY"] || ""
379
- kwargs[:browserbase_project_id] =
380
- kwargs[:browserbase_project_id] || ENV["BROWSERBASE_PROJECT_ID"] || ""
381
374
  end
382
375
 
383
376
  super(**kwargs)
@@ -386,8 +379,7 @@ module Stagehand
386
379
 
387
380
  @local_server_manager = Stagehand::Local::ServerManager.new(
388
381
  model_api_key: @model_api_key,
389
- browserbase_api_key: @browserbase_api_key,
390
- browserbase_project_id: @browserbase_project_id
382
+ browserbase_api_key: @browserbase_api_key
391
383
  )
392
384
  end
393
385
 
@@ -421,8 +413,7 @@ module Stagehand
421
413
  end
422
414
 
423
415
  def bb_project_id_auth
424
- return {} if @browserbase_project_id.to_s.empty?
425
- super
416
+ {}
426
417
  end
427
418
  end
428
419