Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "3.19.3"
".": "3.20.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 8
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-b969ce378479c79ee64c05127c0ed6c6ce2edbee017ecd037242fb618a5ebc9f.yml
openapi_spec_hash: a24aabaa5214effb679808b7f2be0ad4
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-1c6caa2891a7f3bdfc0caab143f285badc9145220c9b29cd5e4cf1a9b3ac11cf.yml
openapi_spec_hash: 28c4b734a5309067c39bb4c4b709b9ab
config_hash: a962ae71493deb11a1c903256fb25386
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
# Changelog

## 3.20.0 (2026-04-28)

Full Changelog: [v3.19.3...v3.20.0](https://github.com/browserbase/stagehand-ruby/compare/v3.19.3...v3.20.0)

### Features

* [STG-1798] feat: support Browserbase verified sessions ([9647eb3](https://github.com/browserbase/stagehand-ruby/commit/9647eb3a4df86cc9d7aedb2f0a9ddd0babd39565))
* Bedrock auth passthrough ([5cb6ecb](https://github.com/browserbase/stagehand-ruby/commit/5cb6ecbe621e894dc6c5aec379fdca1183eec4fc))
* 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))
* support setting headers via env ([5515959](https://github.com/browserbase/stagehand-ruby/commit/5515959505685e62f9324aebf470a295dd6d8292))


### Bug Fixes

* avoid gzip buffering during streaming ([23c3eef](https://github.com/browserbase/stagehand-ruby/commit/23c3eef17497edbf3ec03049d12c548607112c8d))
* multipart encoding for file arrays ([149b303](https://github.com/browserbase/stagehand-ruby/commit/149b303eb54f4c9af037a5e073a2d6c92d959b44))


### Chores

* **internal:** more robust bootstrap script ([69c050a](https://github.com/browserbase/stagehand-ruby/commit/69c050a467b5fcab904331bd30bd18d46cee8cae))

## 3.19.3 (2026-04-03)

Full Changelog: [v3.18.0...v3.19.3](https://github.com/browserbase/stagehand-ruby/compare/v3.18.0...v3.19.3)
Expand Down
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ GIT
PATH
remote: .
specs:
stagehand (3.19.3)
stagehand (3.20.0)
cgi
connection_pool

Expand Down
16 changes: 15 additions & 1 deletion lib/stagehand/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,19 @@ def initialize(
"model_api_key is required, and can be set via environ: \"MODEL_API_KEY\""
end

headers = {}
custom_headers_env = ENV["STAGEHAND_CUSTOM_HEADERS"]
unless custom_headers_env.nil?
parsed = {}
custom_headers_env.split("\n").each do |line|
colon = line.index(":")
unless colon.nil?
parsed[line[0...colon].strip] = line[(colon + 1)..].strip
end
end
headers = parsed.merge(headers)
end

@browserbase_api_key = browserbase_api_key.to_s
@browserbase_project_id = browserbase_project_id.to_s
@model_api_key = model_api_key.to_s
Expand All @@ -117,7 +130,8 @@ def initialize(
timeout: timeout,
max_retries: max_retries,
initial_retry_delay: initial_retry_delay,
max_retry_delay: max_retry_delay
max_retry_delay: max_retry_delay,
headers: headers
)

@sessions = Stagehand::Resources::Sessions.new(client: self)
Expand Down
4 changes: 3 additions & 1 deletion lib/stagehand/internal/util.rb
Original file line number Diff line number Diff line change
Expand Up @@ -610,6 +610,7 @@ def encode_query_params(query)
#
# @return [Array(String, Enumerable<String>)]
private def encode_multipart_streaming(body)
# rubocop:disable Style/CaseEquality
# RFC 1521 Section 7.2.1 says we should have 70 char maximum for boundary length
boundary = SecureRandom.urlsafe_base64(46)

Expand All @@ -619,7 +620,7 @@ def encode_query_params(query)
in Hash
body.each do |key, val|
case val
in Array if val.all? { primitive?(_1) }
in Array if val.all? { primitive?(_1) || Stagehand::Internal::Type::FileInput === _1 }
val.each do |v|
write_multipart_chunk(y, boundary: boundary, key: key, val: v, closing: closing)
end
Expand All @@ -635,6 +636,7 @@ def encode_query_params(query)

fused_io = fused_enum(strio) { closing.each(&:call) }
[boundary, fused_io]
# rubocop:enable Style/CaseEquality
end

# @api private
Expand Down
41 changes: 40 additions & 1 deletion lib/stagehand/models/session_start_params.rb
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,16 @@ class BrowserSettings < Stagehand::Internal::Type::BaseModel
# @return [Boolean, nil]
optional :block_ads, Stagehand::Internal::Type::Boolean, api_name: :blockAds

# @!attribute captcha_image_selector
#
# @return [String, nil]
optional :captcha_image_selector, String, api_name: :captchaImageSelector

# @!attribute captcha_input_selector
#
# @return [String, nil]
optional :captcha_input_selector, String, api_name: :captchaInputSelector

# @!attribute context
#
# @return [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context, nil]
Expand All @@ -423,6 +433,12 @@ class BrowserSettings < Stagehand::Internal::Type::BaseModel
# @return [Boolean, nil]
optional :log_session, Stagehand::Internal::Type::Boolean, api_name: :logSession

# @!attribute os
#
# @return [Symbol, Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os, nil]
optional :os,
enum: -> { Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os }

# @!attribute record_session
#
# @return [Boolean, nil]
Expand All @@ -433,21 +449,30 @@ class BrowserSettings < Stagehand::Internal::Type::BaseModel
# @return [Boolean, nil]
optional :solve_captchas, Stagehand::Internal::Type::Boolean, api_name: :solveCaptchas

# @!attribute verified
#
# @return [Boolean, nil]
optional :verified, Stagehand::Internal::Type::Boolean

# @!attribute viewport
#
# @return [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport, nil]
optional :viewport,
-> { Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport }

# @!method initialize(advanced_stealth: nil, block_ads: nil, context: nil, extension_id: nil, fingerprint: nil, log_session: nil, record_session: nil, solve_captchas: nil, viewport: nil)
# @!method initialize(advanced_stealth: nil, block_ads: nil, captcha_image_selector: nil, captcha_input_selector: nil, context: nil, extension_id: nil, fingerprint: nil, log_session: nil, os: nil, record_session: nil, solve_captchas: nil, verified: nil, viewport: nil)
# @param advanced_stealth [Boolean]
# @param block_ads [Boolean]
# @param captcha_image_selector [String]
# @param captcha_input_selector [String]
# @param context [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context]
# @param extension_id [String]
# @param fingerprint [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Fingerprint]
# @param log_session [Boolean]
# @param os [Symbol, Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os]
# @param record_session [Boolean]
# @param solve_captchas [Boolean]
# @param verified [Boolean]
# @param viewport [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport]

# @see Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings#context
Expand Down Expand Up @@ -596,6 +621,20 @@ class Screen < Stagehand::Internal::Type::BaseModel
end
end

# @see Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings#os
module Os
extend Stagehand::Internal::Type::Enum

WINDOWS = :windows
MAC = :mac
LINUX = :linux
MOBILE = :mobile
TABLET = :tablet

# @!method self.values
# @return [Array<Symbol>]
end

# @see Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings#viewport
class Viewport < Stagehand::Internal::Type::BaseModel
# @!attribute height
Expand Down
20 changes: 16 additions & 4 deletions lib/stagehand/resources/sessions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,11 @@ def act_streaming(id, params)
path: ["v1/sessions/%1$s/act", id],
headers: {
"accept" => "text/event-stream",
"accept-encoding" => "identity",
**parsed.slice(*header_params.keys)
}.transform_keys(header_params),
}.transform_keys(
header_params
),
body: parsed.except(*header_params.keys),
stream: Stagehand::Internal::Stream,
model: Stagehand::StreamEvent,
Expand Down Expand Up @@ -193,8 +196,11 @@ def execute_streaming(id, params)
path: ["v1/sessions/%1$s/agentExecute", id],
headers: {
"accept" => "text/event-stream",
"accept-encoding" => "identity",
**parsed.slice(*header_params.keys)
}.transform_keys(header_params),
}.transform_keys(
header_params
),
body: parsed.except(*header_params.keys),
stream: Stagehand::Internal::Stream,
model: Stagehand::StreamEvent,
Expand Down Expand Up @@ -279,8 +285,11 @@ def extract_streaming(id, params = {})
path: ["v1/sessions/%1$s/extract", id],
headers: {
"accept" => "text/event-stream",
"accept-encoding" => "identity",
**parsed.slice(*header_params.keys)
}.transform_keys(header_params),
}.transform_keys(
header_params
),
body: parsed.except(*header_params.keys),
stream: Stagehand::Internal::Stream,
model: Stagehand::StreamEvent,
Expand Down Expand Up @@ -397,8 +406,11 @@ def observe_streaming(id, params = {})
path: ["v1/sessions/%1$s/observe", id],
headers: {
"accept" => "text/event-stream",
"accept-encoding" => "identity",
**parsed.slice(*header_params.keys)
}.transform_keys(header_params),
}.transform_keys(
header_params
),
body: parsed.except(*header_params.keys),
stream: Stagehand::Internal::Stream,
model: Stagehand::StreamEvent,
Expand Down
2 changes: 1 addition & 1 deletion lib/stagehand/version.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# frozen_string_literal: true

module Stagehand
VERSION = "3.19.3"
VERSION = "3.20.0"
end
Loading