From 7d92484cd933c7374a635d50d4cee540179a62ca Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 19:38:44 +0000 Subject: [PATCH 01/16] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index ac9e78a..ade26eb 100644 --- a/.stats.yml +++ b/.stats.yml @@ -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 -config_hash: a962ae71493deb11a1c903256fb25386 +config_hash: 0cc516caf1432087f40654336e0fa8cd From b41e3cb38fe07e0d19f8204b106320e3dee9c50b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 18:22:47 +0000 Subject: [PATCH 02/16] feat: Bedrock auth passthrough --- .stats.yml | 4 +- session.go | 690 +++++++++++++++++++++++++++++++++++++++++++++++- session_test.go | 65 ++++- 3 files changed, 738 insertions(+), 21 deletions(-) diff --git a/.stats.yml b/.stats.yml index ade26eb..f1d6429 100644 --- a/.stats.yml +++ b/.stats.yml @@ -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-7773ef4ca29c983daafb787ee918cfa6b5b12c5bbdc088308653f2737c26e51f.yml +openapi_spec_hash: 47fc8f2540be0b6374e4230c021072d9 config_hash: 0cc516caf1432087f40654336e0fa8cd diff --git a/session.go b/session.go index e1a9d29..29320cd 100644 --- a/session.go +++ b/session.go @@ -11,6 +11,7 @@ import ( "slices" "github.com/browserbase/stagehand-go/v3/internal/apijson" + "github.com/browserbase/stagehand-go/v3/internal/paramutil" "github.com/browserbase/stagehand-go/v3/internal/requestconfig" "github.com/browserbase/stagehand-go/v3/option" "github.com/browserbase/stagehand-go/v3/packages/param" @@ -272,12 +273,19 @@ type ModelConfigParam struct { APIKey param.Opt[string] `json:"apiKey,omitzero"` // Base URL for the model provider BaseURL param.Opt[string] `json:"baseURL,omitzero" format:"uri"` - // Custom headers sent with every request to the model provider + // When true, hosted sessions will not copy x-model-api-key into model.apiKey. Use + // this when auth is carried through providerOptions instead of an API key. + SkipAPIKeyFallback param.Opt[bool] `json:"skipApiKeyFallback,omitzero"` + // Custom headers for the model provider Headers map[string]string `json:"headers,omitzero"` // AI provider for the model (or provide a baseURL endpoint instead) // // Any of "openai", "anthropic", "google", "microsoft", "bedrock". Provider ModelConfigProvider `json:"provider,omitzero"` + // Provider-specific options passed through to the AI SDK provider constructor. For + // Bedrock: { region, accessKeyId, secretAccessKey, sessionToken }. For Vertex: { + // project, location, googleAuthOptions }. + ProviderOptions ModelConfigProviderOptionsUnionParam `json:"providerOptions,omitzero"` paramObj } @@ -300,9 +308,195 @@ const ( ModelConfigProviderBedrock ModelConfigProvider = "bedrock" ) +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ModelConfigProviderOptionsUnionParam struct { + OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions *ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam `json:",omitzero,inline"` + OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions *ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam `json:",omitzero,inline"` + OfModelConfigProviderOptionsGoogleVertexProviderOptions *ModelConfigProviderOptionsGoogleVertexProviderOptionsParam `json:",omitzero,inline"` + paramUnion +} + +func (u ModelConfigProviderOptionsUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions, u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions, u.OfModelConfigProviderOptionsGoogleVertexProviderOptions) +} +func (u *ModelConfigProviderOptionsUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ModelConfigProviderOptionsUnionParam) asAny() any { + if !param.IsOmitted(u.OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions) { + return u.OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions + } else if !param.IsOmitted(u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions) { + return u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions + } else if !param.IsOmitted(u.OfModelConfigProviderOptionsGoogleVertexProviderOptions) { + return u.OfModelConfigProviderOptionsGoogleVertexProviderOptions + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ModelConfigProviderOptionsUnionParam) GetAccessKeyID() *string { + if vt := u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { + return &vt.AccessKeyID + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ModelConfigProviderOptionsUnionParam) GetSecretAccessKey() *string { + if vt := u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { + return &vt.SecretAccessKey + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ModelConfigProviderOptionsUnionParam) GetSessionToken() *string { + if vt := u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil && vt.SessionToken.Valid() { + return &vt.SessionToken.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ModelConfigProviderOptionsUnionParam) GetGoogleAuthOptions() *ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam { + if vt := u.OfModelConfigProviderOptionsGoogleVertexProviderOptions; vt != nil { + return &vt.GoogleAuthOptions + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ModelConfigProviderOptionsUnionParam) GetHeaders() map[string]string { + if vt := u.OfModelConfigProviderOptionsGoogleVertexProviderOptions; vt != nil { + return vt.Headers + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ModelConfigProviderOptionsUnionParam) GetLocation() *string { + if vt := u.OfModelConfigProviderOptionsGoogleVertexProviderOptions; vt != nil && vt.Location.Valid() { + return &vt.Location.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ModelConfigProviderOptionsUnionParam) GetProject() *string { + if vt := u.OfModelConfigProviderOptionsGoogleVertexProviderOptions; vt != nil && vt.Project.Valid() { + return &vt.Project.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ModelConfigProviderOptionsUnionParam) GetRegion() *string { + if vt := u.OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions; vt != nil { + return (*string)(&vt.Region) + } else if vt := u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { + return (*string)(&vt.Region) + } + return nil +} + +// The property Region is required. +type ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam struct { + // AWS region for Amazon Bedrock + Region string `json:"region" api:"required"` + paramObj +} + +func (r ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam) MarshalJSON() (data []byte, err error) { + type shadow ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties AccessKeyID, Region, SecretAccessKey are required. +type ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam struct { + // AWS access key ID for Bedrock + AccessKeyID string `json:"accessKeyId" api:"required"` + // AWS region for Amazon Bedrock + Region string `json:"region" api:"required"` + // AWS secret access key for Bedrock + SecretAccessKey string `json:"secretAccessKey" api:"required"` + // Optional AWS session token for temporary credentials + SessionToken param.Opt[string] `json:"sessionToken,omitzero"` + paramObj +} + +func (r ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam) MarshalJSON() (data []byte, err error) { + type shadow ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ModelConfigProviderOptionsGoogleVertexProviderOptionsParam struct { + // Google Cloud location for Vertex AI + Location param.Opt[string] `json:"location,omitzero"` + // Google Cloud project ID for Vertex AI + Project param.Opt[string] `json:"project,omitzero"` + // Optional Google auth options for Vertex AI + GoogleAuthOptions ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam `json:"googleAuthOptions,omitzero"` + // Custom headers for Vertex AI requests + Headers map[string]string `json:"headers,omitzero"` + paramObj +} + +func (r ModelConfigProviderOptionsGoogleVertexProviderOptionsParam) MarshalJSON() (data []byte, err error) { + type shadow ModelConfigProviderOptionsGoogleVertexProviderOptionsParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ModelConfigProviderOptionsGoogleVertexProviderOptionsParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Optional Google auth options for Vertex AI +type ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam struct { + Credentials ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam `json:"credentials,omitzero"` + paramObj +} + +func (r ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam) MarshalJSON() (data []byte, err error) { + type shadow ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam struct { + AuthProviderX509CertURL param.Opt[string] `json:"auth_provider_x509_cert_url,omitzero"` + AuthUri param.Opt[string] `json:"auth_uri,omitzero"` + ClientEmail param.Opt[string] `json:"client_email,omitzero"` + ClientID param.Opt[string] `json:"client_id,omitzero"` + ClientX509CertURL param.Opt[string] `json:"client_x509_cert_url,omitzero"` + PrivateKey param.Opt[string] `json:"private_key,omitzero"` + PrivateKeyID param.Opt[string] `json:"private_key_id,omitzero"` + ProjectID param.Opt[string] `json:"project_id,omitzero"` + TokenUri param.Opt[string] `json:"token_uri,omitzero"` + Type param.Opt[string] `json:"type,omitzero"` + UniverseDomain param.Opt[string] `json:"universe_domain,omitzero"` + paramObj +} + +func (r ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam) MarshalJSON() (data []byte, err error) { + type shadow ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + // Server-Sent Event emitted during streaming responses. Events are sent as -// `event: \ndata: \n\n`, where the JSON payload has the shape -// `{ data, type, id }`. +// `data: \n\n`. Key order: data (with status first), type, id. type StreamEvent struct { // Unique identifier for this event ID string `json:"id" api:"required" format:"uuid"` @@ -1276,10 +1470,6 @@ type SessionExecuteParamsExecuteOptions struct { HighlightCursor param.Opt[bool] `json:"highlightCursor,omitzero"` // Maximum number of steps the agent can take MaxSteps param.Opt[float64] `json:"maxSteps,omitzero"` - // Timeout in milliseconds for each agent tool call - ToolTimeout param.Opt[float64] `json:"toolTimeout,omitzero"` - // Whether to enable the web search tool powered by Browserbase Search API - UseSearch param.Opt[bool] `json:"useSearch,omitzero"` paramObj } @@ -1614,6 +1804,9 @@ type SessionStartParams struct { WaitForCaptchaSolves param.Opt[bool] `json:"waitForCaptchaSolves,omitzero"` Browser SessionStartParamsBrowser `json:"browser,omitzero"` BrowserbaseSessionCreateParams SessionStartParamsBrowserbaseSessionCreateParams `json:"browserbaseSessionCreateParams,omitzero"` + // Optional provider-specific configuration for the session model (for example + // Bedrock region and credentials) + ModelClientOptions SessionStartParamsModelClientOptionsUnion `json:"modelClientOptions,omitzero"` // Logging verbosity level (0=quiet, 1=normal, 2=debug) // // Any of 0, 1, 2. @@ -2030,6 +2223,489 @@ func (r *SessionStartParamsBrowserbaseSessionCreateParamsProxiesProxyConfigListI return apijson.UnmarshalRoot(data, r) } +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type SessionStartParamsModelClientOptionsUnion struct { + OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions *SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions `json:",omitzero,inline"` + OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions `json:",omitzero,inline"` + OfSessionStartsModelClientOptionsGenericModelClientOptions *SessionStartParamsModelClientOptionsGenericModelClientOptions `json:",omitzero,inline"` + paramUnion +} + +func (u SessionStartParamsModelClientOptionsUnion) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions, u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions, u.OfSessionStartsModelClientOptionsGenericModelClientOptions) +} +func (u *SessionStartParamsModelClientOptionsUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *SessionStartParamsModelClientOptionsUnion) asAny() any { + if !param.IsOmitted(u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions) { + return u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions + } else if !param.IsOmitted(u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions) { + return u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions + } else if !param.IsOmitted(u.OfSessionStartsModelClientOptionsGenericModelClientOptions) { + return u.OfSessionStartsModelClientOptionsGenericModelClientOptions + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsUnion) GetAPIKey() *string { + if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil { + return (*string)(&vt.APIKey) + } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil && vt.APIKey.Valid() { + return &vt.APIKey.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsUnion) GetBaseURL() *string { + if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil && vt.BaseURL.Valid() { + return &vt.BaseURL.Value + } else if vt := u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions; vt != nil && vt.BaseURL.Valid() { + return &vt.BaseURL.Value + } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil && vt.BaseURL.Valid() { + return &vt.BaseURL.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsUnion) GetSkipAPIKeyFallback() *bool { + if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil && vt.SkipAPIKeyFallback.Valid() { + return &vt.SkipAPIKeyFallback.Value + } else if vt := u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions; vt != nil && vt.SkipAPIKeyFallback.Valid() { + return &vt.SkipAPIKeyFallback.Value + } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil && vt.SkipAPIKeyFallback.Valid() { + return &vt.SkipAPIKeyFallback.Value + } + return nil +} + +// Returns a subunion which exports methods to access subproperties +// +// Or use AsAny() to get the underlying value +func (u SessionStartParamsModelClientOptionsUnion) GetProviderOptions() (res sessionStartParamsModelClientOptionsUnionProviderOptions) { + if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil { + res.any = &vt.ProviderOptions + } else if vt := u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions; vt != nil { + res.any = &vt.ProviderOptions + } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil { + res.any = vt.ProviderOptions.asAny() + } + return +} + +// Can have the runtime types +// [*SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions], +// [*SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions], +// [*SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions], +// [*SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions], +// [*SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions] +type sessionStartParamsModelClientOptionsUnionProviderOptions struct{ any } + +// Use the following switch statement to get the type of the union: +// +// switch u.AsAny().(type) { +// case *stagehand.SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions: +// case *stagehand.SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: +// case *stagehand.SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions: +// case *stagehand.SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions: +// case *stagehand.SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions: +// default: +// fmt.Errorf("not present") +// } +func (u sessionStartParamsModelClientOptionsUnionProviderOptions) AsAny() any { return u.any } + +// Returns a pointer to the underlying variant's property, if present. +func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetGoogleAuthOptions() *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions { + switch vt := u.any.(type) { + case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: + return vt.GetGoogleAuthOptions() + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetHeaders() map[string]string { + switch vt := u.any.(type) { + case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: + return vt.GetHeaders() + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetLocation() *string { + switch vt := u.any.(type) { + case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: + return vt.GetLocation() + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetProject() *string { + switch vt := u.any.(type) { + case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: + return vt.GetProject() + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetRegion() *string { + switch vt := u.any.(type) { + case *SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions: + return (*string)(&vt.Region) + case *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: + return (*string)(&vt.Region) + case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: + return vt.GetRegion() + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetAccessKeyID() *string { + switch vt := u.any.(type) { + case *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: + return (*string)(&vt.AccessKeyID) + case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: + return vt.GetAccessKeyID() + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetSecretAccessKey() *string { + switch vt := u.any.(type) { + case *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: + return (*string)(&vt.SecretAccessKey) + case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: + return vt.GetSecretAccessKey() + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetSessionToken() *string { + switch vt := u.any.(type) { + case *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: + return paramutil.AddrIfPresent(vt.SessionToken) + case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: + return vt.GetSessionToken() + } + return nil +} + +// Returns a pointer to the underlying variant's Headers property, if present. +func (u SessionStartParamsModelClientOptionsUnion) GetHeaders() map[string]string { + if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil { + return vt.Headers + } else if vt := u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions; vt != nil { + return vt.Headers + } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil { + return vt.Headers + } + return nil +} + +// The properties APIKey, ProviderOptions are required. +type SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions struct { + // Short-term Bedrock API key for bearer-token auth + APIKey string `json:"apiKey" api:"required"` + ProviderOptions SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions `json:"providerOptions,omitzero" api:"required"` + // Base URL for the model provider + BaseURL param.Opt[string] `json:"baseURL,omitzero" format:"uri"` + // When true, hosted sessions will not copy x-model-api-key into model.apiKey. Use + // this when auth is carried through providerOptions instead of an API key. + SkipAPIKeyFallback param.Opt[bool] `json:"skipApiKeyFallback,omitzero"` + // Custom headers for the model provider + Headers map[string]string `json:"headers,omitzero"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The property Region is required. +type SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions struct { + // AWS region for Amazon Bedrock + Region string `json:"region" api:"required"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The property ProviderOptions is required. +type SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions struct { + ProviderOptions SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions `json:"providerOptions,omitzero" api:"required"` + // Base URL for the model provider + BaseURL param.Opt[string] `json:"baseURL,omitzero" format:"uri"` + // When true, hosted sessions will not copy x-model-api-key into model.apiKey. Use + // this when auth is carried through providerOptions instead of an API key. + SkipAPIKeyFallback param.Opt[bool] `json:"skipApiKeyFallback,omitzero"` + // Custom headers for the model provider + Headers map[string]string `json:"headers,omitzero"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties AccessKeyID, Region, SecretAccessKey are required. +type SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions struct { + // AWS access key ID for Bedrock + AccessKeyID string `json:"accessKeyId" api:"required"` + // AWS region for Amazon Bedrock + Region string `json:"region" api:"required"` + // AWS secret access key for Bedrock + SecretAccessKey string `json:"secretAccessKey" api:"required"` + // Optional AWS session token for temporary credentials + SessionToken param.Opt[string] `json:"sessionToken,omitzero"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type SessionStartParamsModelClientOptionsGenericModelClientOptions struct { + // API key for the model provider + APIKey param.Opt[string] `json:"apiKey,omitzero"` + // Base URL for the model provider + BaseURL param.Opt[string] `json:"baseURL,omitzero" format:"uri"` + // When true, hosted sessions will not copy x-model-api-key into model.apiKey. Use + // this when auth is carried through providerOptions instead of an API key. + SkipAPIKeyFallback param.Opt[bool] `json:"skipApiKeyFallback,omitzero"` + // Custom headers for the model provider + Headers map[string]string `json:"headers,omitzero"` + // Provider-specific options passed through to the AI SDK provider constructor. For + // Bedrock: { region, accessKeyId, secretAccessKey, sessionToken }. For Vertex: { + // project, location, googleAuthOptions }. + ProviderOptions SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion `json:"providerOptions,omitzero"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsGenericModelClientOptions) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsGenericModelClientOptions + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsGenericModelClientOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion struct { + OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions `json:",omitzero,inline"` + OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions `json:",omitzero,inline"` + OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions `json:",omitzero,inline"` + paramUnion +} + +func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions, u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions, u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions) +} +func (u *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) asAny() any { + if !param.IsOmitted(u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions) { + return u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions + } else if !param.IsOmitted(u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions) { + return u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions + } else if !param.IsOmitted(u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions) { + return u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetAccessKeyID() *string { + if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { + return &vt.AccessKeyID + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetSecretAccessKey() *string { + if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { + return &vt.SecretAccessKey + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetSessionToken() *string { + if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil && vt.SessionToken.Valid() { + return &vt.SessionToken.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetGoogleAuthOptions() *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions { + if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions; vt != nil { + return &vt.GoogleAuthOptions + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetHeaders() map[string]string { + if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions; vt != nil { + return vt.Headers + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetLocation() *string { + if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions; vt != nil && vt.Location.Valid() { + return &vt.Location.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetProject() *string { + if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions; vt != nil && vt.Project.Valid() { + return &vt.Project.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetRegion() *string { + if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions; vt != nil { + return (*string)(&vt.Region) + } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { + return (*string)(&vt.Region) + } + return nil +} + +// The property Region is required. +type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions struct { + // AWS region for Amazon Bedrock + Region string `json:"region" api:"required"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties AccessKeyID, Region, SecretAccessKey are required. +type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions struct { + // AWS access key ID for Bedrock + AccessKeyID string `json:"accessKeyId" api:"required"` + // AWS region for Amazon Bedrock + Region string `json:"region" api:"required"` + // AWS secret access key for Bedrock + SecretAccessKey string `json:"secretAccessKey" api:"required"` + // Optional AWS session token for temporary credentials + SessionToken param.Opt[string] `json:"sessionToken,omitzero"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions struct { + // Google Cloud location for Vertex AI + Location param.Opt[string] `json:"location,omitzero"` + // Google Cloud project ID for Vertex AI + Project param.Opt[string] `json:"project,omitzero"` + // Optional Google auth options for Vertex AI + GoogleAuthOptions SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions `json:"googleAuthOptions,omitzero"` + // Custom headers for Vertex AI requests + Headers map[string]string `json:"headers,omitzero"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Optional Google auth options for Vertex AI +type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions struct { + Credentials SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials `json:"credentials,omitzero"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials struct { + AuthProviderX509CertURL param.Opt[string] `json:"auth_provider_x509_cert_url,omitzero"` + AuthUri param.Opt[string] `json:"auth_uri,omitzero"` + ClientEmail param.Opt[string] `json:"client_email,omitzero"` + ClientID param.Opt[string] `json:"client_id,omitzero"` + ClientX509CertURL param.Opt[string] `json:"client_x509_cert_url,omitzero"` + PrivateKey param.Opt[string] `json:"private_key,omitzero"` + PrivateKeyID param.Opt[string] `json:"private_key_id,omitzero"` + ProjectID param.Opt[string] `json:"project_id,omitzero"` + TokenUri param.Opt[string] `json:"token_uri,omitzero"` + Type param.Opt[string] `json:"type,omitzero"` + UniverseDomain param.Opt[string] `json:"universe_domain,omitzero"` + paramObj +} + +func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials) MarshalJSON() (data []byte, err error) { + type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + // Whether to stream the response via SSE type SessionStartParamsXStreamResponse string diff --git a/session_test.go b/session_test.go index cc07536..6772678 100644 --- a/session_test.go +++ b/session_test.go @@ -39,13 +39,19 @@ func TestSessionActWithOptionalParams(t *testing.T) { Options: stagehand.SessionActParamsOptions{ Model: stagehand.SessionActParamsOptionsModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5.4-mini", + ModelName: "openai/gpt-5-nano", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "foo": "string", + "X-Custom-Header": "value", }, Provider: stagehand.ModelConfigProviderOpenAI, + ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ + OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ + Region: "us-east-1", + }, + }, + SkipAPIKeyFallback: stagehand.Bool(true), }, }, Timeout: stagehand.Float(30000), @@ -129,25 +135,37 @@ func TestSessionExecuteWithOptionalParams(t *testing.T) { Cua: stagehand.Bool(true), ExecutionModel: stagehand.SessionExecuteParamsAgentConfigExecutionModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5.4-mini", + ModelName: "openai/gpt-5-nano", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "foo": "string", + "X-Custom-Header": "value", }, Provider: stagehand.ModelConfigProviderOpenAI, + ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ + OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ + Region: "us-east-1", + }, + }, + SkipAPIKeyFallback: stagehand.Bool(true), }, }, Mode: "cua", Model: stagehand.SessionExecuteParamsAgentConfigModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5.4-mini", + ModelName: "openai/gpt-5-nano", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "foo": "string", + "X-Custom-Header": "value", }, Provider: stagehand.ModelConfigProviderOpenAI, + ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ + OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ + Region: "us-east-1", + }, + }, + SkipAPIKeyFallback: stagehand.Bool(true), }, }, Provider: "openai", @@ -157,8 +175,6 @@ func TestSessionExecuteWithOptionalParams(t *testing.T) { Instruction: "Log in with username 'demo' and password 'test123', then navigate to settings", HighlightCursor: stagehand.Bool(true), MaxSteps: stagehand.Float(20), - ToolTimeout: stagehand.Float(30000), - UseSearch: stagehand.Bool(true), }, FrameID: stagehand.String("frameId"), ShouldCache: stagehand.Bool(true), @@ -198,13 +214,19 @@ func TestSessionExtractWithOptionalParams(t *testing.T) { Options: stagehand.SessionExtractParamsOptions{ Model: stagehand.SessionExtractParamsOptionsModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5.4-mini", + ModelName: "openai/gpt-5-nano", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "foo": "string", + "X-Custom-Header": "value", }, Provider: stagehand.ModelConfigProviderOpenAI, + ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ + OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ + Region: "us-east-1", + }, + }, + SkipAPIKeyFallback: stagehand.Bool(true), }, }, Selector: stagehand.String("#main-content"), @@ -288,13 +310,19 @@ func TestSessionObserveWithOptionalParams(t *testing.T) { Options: stagehand.SessionObserveParamsOptions{ Model: stagehand.SessionObserveParamsOptionsModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5.4-mini", + ModelName: "openai/gpt-5-nano", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "foo": "string", + "X-Custom-Header": "value", }, Provider: stagehand.ModelConfigProviderOpenAI, + ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ + OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ + Region: "us-east-1", + }, + }, + SkipAPIKeyFallback: stagehand.Bool(true), }, }, Selector: stagehand.String("nav"), @@ -457,6 +485,19 @@ func TestSessionStartWithOptionalParams(t *testing.T) { BrowserbaseSessionID: stagehand.String("browserbaseSessionID"), DomSettleTimeoutMs: stagehand.Float(5000), Experimental: stagehand.Bool(true), + ModelClientOptions: stagehand.SessionStartParamsModelClientOptionsUnion{ + OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions: &stagehand.SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions{ + APIKey: "bedrock-short-term-api-key", + ProviderOptions: stagehand.SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions{ + Region: "us-east-1", + }, + BaseURL: stagehand.String("https://api.openai.com/v1"), + Headers: map[string]string{ + "X-Custom-Header": "value", + }, + SkipAPIKeyFallback: stagehand.Bool(true), + }, + }, SelfHeal: stagehand.Bool(true), SystemPrompt: stagehand.String("systemPrompt"), Verbose: 1, From 30133d320e2093815d9714e32a64ffe6242b94aa Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 23:32:49 +0000 Subject: [PATCH 03/16] feat: [STG-1798] feat: support Browserbase verified sessions --- .stats.yml | 6 +++--- session.go | 29 ++++++++++++++++++++--------- session_test.go | 8 ++++++-- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/.stats.yml b/.stats.yml index f1d6429..6bde59e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 8 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-7773ef4ca29c983daafb787ee918cfa6b5b12c5bbdc088308653f2737c26e51f.yml -openapi_spec_hash: 47fc8f2540be0b6374e4230c021072d9 -config_hash: 0cc516caf1432087f40654336e0fa8cd +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-a8db51c6460b3daff67b35262517848a0d4e783c6805c2edd531b155a5db71dd.yml +openapi_spec_hash: c6e7127f211f946673d6389e1d8db1ba +config_hash: a962ae71493deb11a1c903256fb25386 diff --git a/session.go b/session.go index 29320cd..7ca6d98 100644 --- a/session.go +++ b/session.go @@ -1968,15 +1968,20 @@ func init() { } type SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettings struct { - AdvancedStealth param.Opt[bool] `json:"advancedStealth,omitzero"` - BlockAds param.Opt[bool] `json:"blockAds,omitzero"` - ExtensionID param.Opt[string] `json:"extensionId,omitzero"` - LogSession param.Opt[bool] `json:"logSession,omitzero"` - RecordSession param.Opt[bool] `json:"recordSession,omitzero"` - SolveCaptchas param.Opt[bool] `json:"solveCaptchas,omitzero"` - Context SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettingsContext `json:"context,omitzero"` - Fingerprint SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettingsFingerprint `json:"fingerprint,omitzero"` - Viewport SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettingsViewport `json:"viewport,omitzero"` + AdvancedStealth param.Opt[bool] `json:"advancedStealth,omitzero"` + BlockAds param.Opt[bool] `json:"blockAds,omitzero"` + CaptchaImageSelector param.Opt[string] `json:"captchaImageSelector,omitzero"` + CaptchaInputSelector param.Opt[string] `json:"captchaInputSelector,omitzero"` + ExtensionID param.Opt[string] `json:"extensionId,omitzero"` + LogSession param.Opt[bool] `json:"logSession,omitzero"` + RecordSession param.Opt[bool] `json:"recordSession,omitzero"` + SolveCaptchas param.Opt[bool] `json:"solveCaptchas,omitzero"` + Verified param.Opt[bool] `json:"verified,omitzero"` + Context SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettingsContext `json:"context,omitzero"` + Fingerprint SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettingsFingerprint `json:"fingerprint,omitzero"` + // Any of "windows", "mac", "linux", "mobile", "tablet". + Os string `json:"os,omitzero"` + Viewport SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettingsViewport `json:"viewport,omitzero"` paramObj } @@ -1988,6 +1993,12 @@ func (r *SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettings) Unmars return apijson.UnmarshalRoot(data, r) } +func init() { + apijson.RegisterFieldValidator[SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettings]( + "os", "windows", "mac", "linux", "mobile", "tablet", + ) +} + // The property ID is required. type SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettingsContext struct { ID string `json:"id" api:"required"` diff --git a/session_test.go b/session_test.go index 6772678..95a5c81 100644 --- a/session_test.go +++ b/session_test.go @@ -442,8 +442,10 @@ func TestSessionStartWithOptionalParams(t *testing.T) { }, BrowserbaseSessionCreateParams: stagehand.SessionStartParamsBrowserbaseSessionCreateParams{ BrowserSettings: stagehand.SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettings{ - AdvancedStealth: stagehand.Bool(true), - BlockAds: stagehand.Bool(true), + AdvancedStealth: stagehand.Bool(true), + BlockAds: stagehand.Bool(true), + CaptchaImageSelector: stagehand.String("captchaImageSelector"), + CaptchaInputSelector: stagehand.String("captchaInputSelector"), Context: stagehand.SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettingsContext{ ID: "id", Persist: stagehand.Bool(true), @@ -463,8 +465,10 @@ func TestSessionStartWithOptionalParams(t *testing.T) { }, }, LogSession: stagehand.Bool(true), + Os: "windows", RecordSession: stagehand.Bool(true), SolveCaptchas: stagehand.Bool(true), + Verified: stagehand.Bool(true), Viewport: stagehand.SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettingsViewport{ Height: stagehand.Float(0), Width: stagehand.Float(0), From f56e93ff49643c78a6a39da36b30a010dbf59b7d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:32:13 +0000 Subject: [PATCH 04/16] feat: Revert "[STG-1573] Add providerOptions for extensible model auth (#1822)" --- .stats.yml | 4 +- session.go | 690 +----------------------------------------------- session_test.go | 65 +---- 3 files changed, 21 insertions(+), 738 deletions(-) diff --git a/.stats.yml b/.stats.yml index 6bde59e..d8428d4 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 8 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-a8db51c6460b3daff67b35262517848a0d4e783c6805c2edd531b155a5db71dd.yml -openapi_spec_hash: c6e7127f211f946673d6389e1d8db1ba +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-1c6caa2891a7f3bdfc0caab143f285badc9145220c9b29cd5e4cf1a9b3ac11cf.yml +openapi_spec_hash: 28c4b734a5309067c39bb4c4b709b9ab config_hash: a962ae71493deb11a1c903256fb25386 diff --git a/session.go b/session.go index 7ca6d98..2d794dd 100644 --- a/session.go +++ b/session.go @@ -11,7 +11,6 @@ import ( "slices" "github.com/browserbase/stagehand-go/v3/internal/apijson" - "github.com/browserbase/stagehand-go/v3/internal/paramutil" "github.com/browserbase/stagehand-go/v3/internal/requestconfig" "github.com/browserbase/stagehand-go/v3/option" "github.com/browserbase/stagehand-go/v3/packages/param" @@ -273,19 +272,12 @@ type ModelConfigParam struct { APIKey param.Opt[string] `json:"apiKey,omitzero"` // Base URL for the model provider BaseURL param.Opt[string] `json:"baseURL,omitzero" format:"uri"` - // When true, hosted sessions will not copy x-model-api-key into model.apiKey. Use - // this when auth is carried through providerOptions instead of an API key. - SkipAPIKeyFallback param.Opt[bool] `json:"skipApiKeyFallback,omitzero"` - // Custom headers for the model provider + // Custom headers sent with every request to the model provider Headers map[string]string `json:"headers,omitzero"` // AI provider for the model (or provide a baseURL endpoint instead) // // Any of "openai", "anthropic", "google", "microsoft", "bedrock". Provider ModelConfigProvider `json:"provider,omitzero"` - // Provider-specific options passed through to the AI SDK provider constructor. For - // Bedrock: { region, accessKeyId, secretAccessKey, sessionToken }. For Vertex: { - // project, location, googleAuthOptions }. - ProviderOptions ModelConfigProviderOptionsUnionParam `json:"providerOptions,omitzero"` paramObj } @@ -308,195 +300,9 @@ const ( ModelConfigProviderBedrock ModelConfigProvider = "bedrock" ) -// Only one field can be non-zero. -// -// Use [param.IsOmitted] to confirm if a field is set. -type ModelConfigProviderOptionsUnionParam struct { - OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions *ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam `json:",omitzero,inline"` - OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions *ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam `json:",omitzero,inline"` - OfModelConfigProviderOptionsGoogleVertexProviderOptions *ModelConfigProviderOptionsGoogleVertexProviderOptionsParam `json:",omitzero,inline"` - paramUnion -} - -func (u ModelConfigProviderOptionsUnionParam) MarshalJSON() ([]byte, error) { - return param.MarshalUnion(u, u.OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions, u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions, u.OfModelConfigProviderOptionsGoogleVertexProviderOptions) -} -func (u *ModelConfigProviderOptionsUnionParam) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, u) -} - -func (u *ModelConfigProviderOptionsUnionParam) asAny() any { - if !param.IsOmitted(u.OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions) { - return u.OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions - } else if !param.IsOmitted(u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions) { - return u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions - } else if !param.IsOmitted(u.OfModelConfigProviderOptionsGoogleVertexProviderOptions) { - return u.OfModelConfigProviderOptionsGoogleVertexProviderOptions - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u ModelConfigProviderOptionsUnionParam) GetAccessKeyID() *string { - if vt := u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { - return &vt.AccessKeyID - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u ModelConfigProviderOptionsUnionParam) GetSecretAccessKey() *string { - if vt := u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { - return &vt.SecretAccessKey - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u ModelConfigProviderOptionsUnionParam) GetSessionToken() *string { - if vt := u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil && vt.SessionToken.Valid() { - return &vt.SessionToken.Value - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u ModelConfigProviderOptionsUnionParam) GetGoogleAuthOptions() *ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam { - if vt := u.OfModelConfigProviderOptionsGoogleVertexProviderOptions; vt != nil { - return &vt.GoogleAuthOptions - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u ModelConfigProviderOptionsUnionParam) GetHeaders() map[string]string { - if vt := u.OfModelConfigProviderOptionsGoogleVertexProviderOptions; vt != nil { - return vt.Headers - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u ModelConfigProviderOptionsUnionParam) GetLocation() *string { - if vt := u.OfModelConfigProviderOptionsGoogleVertexProviderOptions; vt != nil && vt.Location.Valid() { - return &vt.Location.Value - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u ModelConfigProviderOptionsUnionParam) GetProject() *string { - if vt := u.OfModelConfigProviderOptionsGoogleVertexProviderOptions; vt != nil && vt.Project.Valid() { - return &vt.Project.Value - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u ModelConfigProviderOptionsUnionParam) GetRegion() *string { - if vt := u.OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions; vt != nil { - return (*string)(&vt.Region) - } else if vt := u.OfModelConfigProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { - return (*string)(&vt.Region) - } - return nil -} - -// The property Region is required. -type ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam struct { - // AWS region for Amazon Bedrock - Region string `json:"region" api:"required"` - paramObj -} - -func (r ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam) MarshalJSON() (data []byte, err error) { - type shadow ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -// The properties AccessKeyID, Region, SecretAccessKey are required. -type ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam struct { - // AWS access key ID for Bedrock - AccessKeyID string `json:"accessKeyId" api:"required"` - // AWS region for Amazon Bedrock - Region string `json:"region" api:"required"` - // AWS secret access key for Bedrock - SecretAccessKey string `json:"secretAccessKey" api:"required"` - // Optional AWS session token for temporary credentials - SessionToken param.Opt[string] `json:"sessionToken,omitzero"` - paramObj -} - -func (r ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam) MarshalJSON() (data []byte, err error) { - type shadow ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *ModelConfigProviderOptionsBedrockAwsCredentialsProviderOptionsParam) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -type ModelConfigProviderOptionsGoogleVertexProviderOptionsParam struct { - // Google Cloud location for Vertex AI - Location param.Opt[string] `json:"location,omitzero"` - // Google Cloud project ID for Vertex AI - Project param.Opt[string] `json:"project,omitzero"` - // Optional Google auth options for Vertex AI - GoogleAuthOptions ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam `json:"googleAuthOptions,omitzero"` - // Custom headers for Vertex AI requests - Headers map[string]string `json:"headers,omitzero"` - paramObj -} - -func (r ModelConfigProviderOptionsGoogleVertexProviderOptionsParam) MarshalJSON() (data []byte, err error) { - type shadow ModelConfigProviderOptionsGoogleVertexProviderOptionsParam - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *ModelConfigProviderOptionsGoogleVertexProviderOptionsParam) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -// Optional Google auth options for Vertex AI -type ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam struct { - Credentials ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam `json:"credentials,omitzero"` - paramObj -} - -func (r ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam) MarshalJSON() (data []byte, err error) { - type shadow ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsParam) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -type ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam struct { - AuthProviderX509CertURL param.Opt[string] `json:"auth_provider_x509_cert_url,omitzero"` - AuthUri param.Opt[string] `json:"auth_uri,omitzero"` - ClientEmail param.Opt[string] `json:"client_email,omitzero"` - ClientID param.Opt[string] `json:"client_id,omitzero"` - ClientX509CertURL param.Opt[string] `json:"client_x509_cert_url,omitzero"` - PrivateKey param.Opt[string] `json:"private_key,omitzero"` - PrivateKeyID param.Opt[string] `json:"private_key_id,omitzero"` - ProjectID param.Opt[string] `json:"project_id,omitzero"` - TokenUri param.Opt[string] `json:"token_uri,omitzero"` - Type param.Opt[string] `json:"type,omitzero"` - UniverseDomain param.Opt[string] `json:"universe_domain,omitzero"` - paramObj -} - -func (r ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam) MarshalJSON() (data []byte, err error) { - type shadow ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *ModelConfigProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentialsParam) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - // Server-Sent Event emitted during streaming responses. Events are sent as -// `data: \n\n`. Key order: data (with status first), type, id. +// `event: \ndata: \n\n`, where the JSON payload has the shape +// `{ data, type, id }`. type StreamEvent struct { // Unique identifier for this event ID string `json:"id" api:"required" format:"uuid"` @@ -1470,6 +1276,10 @@ type SessionExecuteParamsExecuteOptions struct { HighlightCursor param.Opt[bool] `json:"highlightCursor,omitzero"` // Maximum number of steps the agent can take MaxSteps param.Opt[float64] `json:"maxSteps,omitzero"` + // Timeout in milliseconds for each agent tool call + ToolTimeout param.Opt[float64] `json:"toolTimeout,omitzero"` + // Whether to enable the web search tool powered by Browserbase Search API + UseSearch param.Opt[bool] `json:"useSearch,omitzero"` paramObj } @@ -1804,9 +1614,6 @@ type SessionStartParams struct { WaitForCaptchaSolves param.Opt[bool] `json:"waitForCaptchaSolves,omitzero"` Browser SessionStartParamsBrowser `json:"browser,omitzero"` BrowserbaseSessionCreateParams SessionStartParamsBrowserbaseSessionCreateParams `json:"browserbaseSessionCreateParams,omitzero"` - // Optional provider-specific configuration for the session model (for example - // Bedrock region and credentials) - ModelClientOptions SessionStartParamsModelClientOptionsUnion `json:"modelClientOptions,omitzero"` // Logging verbosity level (0=quiet, 1=normal, 2=debug) // // Any of 0, 1, 2. @@ -2234,489 +2041,6 @@ func (r *SessionStartParamsBrowserbaseSessionCreateParamsProxiesProxyConfigListI return apijson.UnmarshalRoot(data, r) } -// Only one field can be non-zero. -// -// Use [param.IsOmitted] to confirm if a field is set. -type SessionStartParamsModelClientOptionsUnion struct { - OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions *SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions `json:",omitzero,inline"` - OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions `json:",omitzero,inline"` - OfSessionStartsModelClientOptionsGenericModelClientOptions *SessionStartParamsModelClientOptionsGenericModelClientOptions `json:",omitzero,inline"` - paramUnion -} - -func (u SessionStartParamsModelClientOptionsUnion) MarshalJSON() ([]byte, error) { - return param.MarshalUnion(u, u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions, u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions, u.OfSessionStartsModelClientOptionsGenericModelClientOptions) -} -func (u *SessionStartParamsModelClientOptionsUnion) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, u) -} - -func (u *SessionStartParamsModelClientOptionsUnion) asAny() any { - if !param.IsOmitted(u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions) { - return u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions - } else if !param.IsOmitted(u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions) { - return u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions - } else if !param.IsOmitted(u.OfSessionStartsModelClientOptionsGenericModelClientOptions) { - return u.OfSessionStartsModelClientOptionsGenericModelClientOptions - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsUnion) GetAPIKey() *string { - if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil { - return (*string)(&vt.APIKey) - } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil && vt.APIKey.Valid() { - return &vt.APIKey.Value - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsUnion) GetBaseURL() *string { - if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil && vt.BaseURL.Valid() { - return &vt.BaseURL.Value - } else if vt := u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions; vt != nil && vt.BaseURL.Valid() { - return &vt.BaseURL.Value - } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil && vt.BaseURL.Valid() { - return &vt.BaseURL.Value - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsUnion) GetSkipAPIKeyFallback() *bool { - if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil && vt.SkipAPIKeyFallback.Valid() { - return &vt.SkipAPIKeyFallback.Value - } else if vt := u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions; vt != nil && vt.SkipAPIKeyFallback.Valid() { - return &vt.SkipAPIKeyFallback.Value - } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil && vt.SkipAPIKeyFallback.Valid() { - return &vt.SkipAPIKeyFallback.Value - } - return nil -} - -// Returns a subunion which exports methods to access subproperties -// -// Or use AsAny() to get the underlying value -func (u SessionStartParamsModelClientOptionsUnion) GetProviderOptions() (res sessionStartParamsModelClientOptionsUnionProviderOptions) { - if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil { - res.any = &vt.ProviderOptions - } else if vt := u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions; vt != nil { - res.any = &vt.ProviderOptions - } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil { - res.any = vt.ProviderOptions.asAny() - } - return -} - -// Can have the runtime types -// [*SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions], -// [*SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions], -// [*SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions], -// [*SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions], -// [*SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions] -type sessionStartParamsModelClientOptionsUnionProviderOptions struct{ any } - -// Use the following switch statement to get the type of the union: -// -// switch u.AsAny().(type) { -// case *stagehand.SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions: -// case *stagehand.SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: -// case *stagehand.SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions: -// case *stagehand.SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions: -// case *stagehand.SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions: -// default: -// fmt.Errorf("not present") -// } -func (u sessionStartParamsModelClientOptionsUnionProviderOptions) AsAny() any { return u.any } - -// Returns a pointer to the underlying variant's property, if present. -func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetGoogleAuthOptions() *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions { - switch vt := u.any.(type) { - case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: - return vt.GetGoogleAuthOptions() - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetHeaders() map[string]string { - switch vt := u.any.(type) { - case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: - return vt.GetHeaders() - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetLocation() *string { - switch vt := u.any.(type) { - case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: - return vt.GetLocation() - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetProject() *string { - switch vt := u.any.(type) { - case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: - return vt.GetProject() - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetRegion() *string { - switch vt := u.any.(type) { - case *SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions: - return (*string)(&vt.Region) - case *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: - return (*string)(&vt.Region) - case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: - return vt.GetRegion() - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetAccessKeyID() *string { - switch vt := u.any.(type) { - case *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: - return (*string)(&vt.AccessKeyID) - case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: - return vt.GetAccessKeyID() - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetSecretAccessKey() *string { - switch vt := u.any.(type) { - case *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: - return (*string)(&vt.SecretAccessKey) - case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: - return vt.GetSecretAccessKey() - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u sessionStartParamsModelClientOptionsUnionProviderOptions) GetSessionToken() *string { - switch vt := u.any.(type) { - case *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions: - return paramutil.AddrIfPresent(vt.SessionToken) - case *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion: - return vt.GetSessionToken() - } - return nil -} - -// Returns a pointer to the underlying variant's Headers property, if present. -func (u SessionStartParamsModelClientOptionsUnion) GetHeaders() map[string]string { - if vt := u.OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions; vt != nil { - return vt.Headers - } else if vt := u.OfSessionStartsModelClientOptionsBedrockAwsCredentialsModelClientOptions; vt != nil { - return vt.Headers - } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptions; vt != nil { - return vt.Headers - } - return nil -} - -// The properties APIKey, ProviderOptions are required. -type SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions struct { - // Short-term Bedrock API key for bearer-token auth - APIKey string `json:"apiKey" api:"required"` - ProviderOptions SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions `json:"providerOptions,omitzero" api:"required"` - // Base URL for the model provider - BaseURL param.Opt[string] `json:"baseURL,omitzero" format:"uri"` - // When true, hosted sessions will not copy x-model-api-key into model.apiKey. Use - // this when auth is carried through providerOptions instead of an API key. - SkipAPIKeyFallback param.Opt[bool] `json:"skipApiKeyFallback,omitzero"` - // Custom headers for the model provider - Headers map[string]string `json:"headers,omitzero"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -// The property Region is required. -type SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions struct { - // AWS region for Amazon Bedrock - Region string `json:"region" api:"required"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -// The property ProviderOptions is required. -type SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions struct { - ProviderOptions SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions `json:"providerOptions,omitzero" api:"required"` - // Base URL for the model provider - BaseURL param.Opt[string] `json:"baseURL,omitzero" format:"uri"` - // When true, hosted sessions will not copy x-model-api-key into model.apiKey. Use - // this when auth is carried through providerOptions instead of an API key. - SkipAPIKeyFallback param.Opt[bool] `json:"skipApiKeyFallback,omitzero"` - // Custom headers for the model provider - Headers map[string]string `json:"headers,omitzero"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptions) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -// The properties AccessKeyID, Region, SecretAccessKey are required. -type SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions struct { - // AWS access key ID for Bedrock - AccessKeyID string `json:"accessKeyId" api:"required"` - // AWS region for Amazon Bedrock - Region string `json:"region" api:"required"` - // AWS secret access key for Bedrock - SecretAccessKey string `json:"secretAccessKey" api:"required"` - // Optional AWS session token for temporary credentials - SessionToken param.Opt[string] `json:"sessionToken,omitzero"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsBedrockAwsCredentialsModelClientOptionsProviderOptions) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -type SessionStartParamsModelClientOptionsGenericModelClientOptions struct { - // API key for the model provider - APIKey param.Opt[string] `json:"apiKey,omitzero"` - // Base URL for the model provider - BaseURL param.Opt[string] `json:"baseURL,omitzero" format:"uri"` - // When true, hosted sessions will not copy x-model-api-key into model.apiKey. Use - // this when auth is carried through providerOptions instead of an API key. - SkipAPIKeyFallback param.Opt[bool] `json:"skipApiKeyFallback,omitzero"` - // Custom headers for the model provider - Headers map[string]string `json:"headers,omitzero"` - // Provider-specific options passed through to the AI SDK provider constructor. For - // Bedrock: { region, accessKeyId, secretAccessKey, sessionToken }. For Vertex: { - // project, location, googleAuthOptions }. - ProviderOptions SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion `json:"providerOptions,omitzero"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsGenericModelClientOptions) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsGenericModelClientOptions - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsGenericModelClientOptions) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -// Only one field can be non-zero. -// -// Use [param.IsOmitted] to confirm if a field is set. -type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion struct { - OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions `json:",omitzero,inline"` - OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions `json:",omitzero,inline"` - OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions `json:",omitzero,inline"` - paramUnion -} - -func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) MarshalJSON() ([]byte, error) { - return param.MarshalUnion(u, u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions, u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions, u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions) -} -func (u *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, u) -} - -func (u *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) asAny() any { - if !param.IsOmitted(u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions) { - return u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions - } else if !param.IsOmitted(u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions) { - return u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions - } else if !param.IsOmitted(u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions) { - return u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetAccessKeyID() *string { - if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { - return &vt.AccessKeyID - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetSecretAccessKey() *string { - if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { - return &vt.SecretAccessKey - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetSessionToken() *string { - if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil && vt.SessionToken.Valid() { - return &vt.SessionToken.Value - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetGoogleAuthOptions() *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions { - if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions; vt != nil { - return &vt.GoogleAuthOptions - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetHeaders() map[string]string { - if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions; vt != nil { - return vt.Headers - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetLocation() *string { - if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions; vt != nil && vt.Location.Valid() { - return &vt.Location.Value - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetProject() *string { - if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions; vt != nil && vt.Project.Valid() { - return &vt.Project.Value - } - return nil -} - -// Returns a pointer to the underlying variant's property, if present. -func (u SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsUnion) GetRegion() *string { - if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions; vt != nil { - return (*string)(&vt.Region) - } else if vt := u.OfSessionStartsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions; vt != nil { - return (*string)(&vt.Region) - } - return nil -} - -// The property Region is required. -type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions struct { - // AWS region for Amazon Bedrock - Region string `json:"region" api:"required"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAPIKeyProviderOptions) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -// The properties AccessKeyID, Region, SecretAccessKey are required. -type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions struct { - // AWS access key ID for Bedrock - AccessKeyID string `json:"accessKeyId" api:"required"` - // AWS region for Amazon Bedrock - Region string `json:"region" api:"required"` - // AWS secret access key for Bedrock - SecretAccessKey string `json:"secretAccessKey" api:"required"` - // Optional AWS session token for temporary credentials - SessionToken param.Opt[string] `json:"sessionToken,omitzero"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsBedrockAwsCredentialsProviderOptions) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions struct { - // Google Cloud location for Vertex AI - Location param.Opt[string] `json:"location,omitzero"` - // Google Cloud project ID for Vertex AI - Project param.Opt[string] `json:"project,omitzero"` - // Optional Google auth options for Vertex AI - GoogleAuthOptions SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions `json:"googleAuthOptions,omitzero"` - // Custom headers for Vertex AI requests - Headers map[string]string `json:"headers,omitzero"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptions) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -// Optional Google auth options for Vertex AI -type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions struct { - Credentials SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials `json:"credentials,omitzero"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptions) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -type SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials struct { - AuthProviderX509CertURL param.Opt[string] `json:"auth_provider_x509_cert_url,omitzero"` - AuthUri param.Opt[string] `json:"auth_uri,omitzero"` - ClientEmail param.Opt[string] `json:"client_email,omitzero"` - ClientID param.Opt[string] `json:"client_id,omitzero"` - ClientX509CertURL param.Opt[string] `json:"client_x509_cert_url,omitzero"` - PrivateKey param.Opt[string] `json:"private_key,omitzero"` - PrivateKeyID param.Opt[string] `json:"private_key_id,omitzero"` - ProjectID param.Opt[string] `json:"project_id,omitzero"` - TokenUri param.Opt[string] `json:"token_uri,omitzero"` - Type param.Opt[string] `json:"type,omitzero"` - UniverseDomain param.Opt[string] `json:"universe_domain,omitzero"` - paramObj -} - -func (r SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials) MarshalJSON() (data []byte, err error) { - type shadow SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials - return param.MarshalObject(r, (*shadow)(&r)) -} -func (r *SessionStartParamsModelClientOptionsGenericModelClientOptionsProviderOptionsGoogleVertexProviderOptionsGoogleAuthOptionsCredentials) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - // Whether to stream the response via SSE type SessionStartParamsXStreamResponse string diff --git a/session_test.go b/session_test.go index 95a5c81..d6d501e 100644 --- a/session_test.go +++ b/session_test.go @@ -39,19 +39,13 @@ func TestSessionActWithOptionalParams(t *testing.T) { Options: stagehand.SessionActParamsOptions{ Model: stagehand.SessionActParamsOptionsModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5-nano", + ModelName: "openai/gpt-5.4-mini", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "X-Custom-Header": "value", + "foo": "string", }, Provider: stagehand.ModelConfigProviderOpenAI, - ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ - OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ - Region: "us-east-1", - }, - }, - SkipAPIKeyFallback: stagehand.Bool(true), }, }, Timeout: stagehand.Float(30000), @@ -135,37 +129,25 @@ func TestSessionExecuteWithOptionalParams(t *testing.T) { Cua: stagehand.Bool(true), ExecutionModel: stagehand.SessionExecuteParamsAgentConfigExecutionModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5-nano", + ModelName: "openai/gpt-5.4-mini", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "X-Custom-Header": "value", + "foo": "string", }, Provider: stagehand.ModelConfigProviderOpenAI, - ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ - OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ - Region: "us-east-1", - }, - }, - SkipAPIKeyFallback: stagehand.Bool(true), }, }, Mode: "cua", Model: stagehand.SessionExecuteParamsAgentConfigModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5-nano", + ModelName: "openai/gpt-5.4-mini", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "X-Custom-Header": "value", + "foo": "string", }, Provider: stagehand.ModelConfigProviderOpenAI, - ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ - OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ - Region: "us-east-1", - }, - }, - SkipAPIKeyFallback: stagehand.Bool(true), }, }, Provider: "openai", @@ -175,6 +157,8 @@ func TestSessionExecuteWithOptionalParams(t *testing.T) { Instruction: "Log in with username 'demo' and password 'test123', then navigate to settings", HighlightCursor: stagehand.Bool(true), MaxSteps: stagehand.Float(20), + ToolTimeout: stagehand.Float(30000), + UseSearch: stagehand.Bool(true), }, FrameID: stagehand.String("frameId"), ShouldCache: stagehand.Bool(true), @@ -214,19 +198,13 @@ func TestSessionExtractWithOptionalParams(t *testing.T) { Options: stagehand.SessionExtractParamsOptions{ Model: stagehand.SessionExtractParamsOptionsModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5-nano", + ModelName: "openai/gpt-5.4-mini", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "X-Custom-Header": "value", + "foo": "string", }, Provider: stagehand.ModelConfigProviderOpenAI, - ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ - OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ - Region: "us-east-1", - }, - }, - SkipAPIKeyFallback: stagehand.Bool(true), }, }, Selector: stagehand.String("#main-content"), @@ -310,19 +288,13 @@ func TestSessionObserveWithOptionalParams(t *testing.T) { Options: stagehand.SessionObserveParamsOptions{ Model: stagehand.SessionObserveParamsOptionsModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ - ModelName: "openai/gpt-5-nano", + ModelName: "openai/gpt-5.4-mini", APIKey: stagehand.String("sk-some-openai-api-key"), BaseURL: stagehand.String("https://api.openai.com/v1"), Headers: map[string]string{ - "X-Custom-Header": "value", + "foo": "string", }, Provider: stagehand.ModelConfigProviderOpenAI, - ProviderOptions: stagehand.ModelConfigProviderOptionsUnionParam{ - OfModelConfigProviderOptionsBedrockAPIKeyProviderOptions: &stagehand.ModelConfigProviderOptionsBedrockAPIKeyProviderOptionsParam{ - Region: "us-east-1", - }, - }, - SkipAPIKeyFallback: stagehand.Bool(true), }, }, Selector: stagehand.String("nav"), @@ -489,19 +461,6 @@ func TestSessionStartWithOptionalParams(t *testing.T) { BrowserbaseSessionID: stagehand.String("browserbaseSessionID"), DomSettleTimeoutMs: stagehand.Float(5000), Experimental: stagehand.Bool(true), - ModelClientOptions: stagehand.SessionStartParamsModelClientOptionsUnion{ - OfSessionStartsModelClientOptionsBedrockAPIKeyModelClientOptions: &stagehand.SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptions{ - APIKey: "bedrock-short-term-api-key", - ProviderOptions: stagehand.SessionStartParamsModelClientOptionsBedrockAPIKeyModelClientOptionsProviderOptions{ - Region: "us-east-1", - }, - BaseURL: stagehand.String("https://api.openai.com/v1"), - Headers: map[string]string{ - "X-Custom-Header": "value", - }, - SkipAPIKeyFallback: stagehand.Bool(true), - }, - }, SelfHeal: stagehand.Bool(true), SystemPrompt: stagehand.String("systemPrompt"), Verbose: 1, From 6fc0d10fc68841748a3f99cfbdc85930b18455d0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 03:48:09 +0000 Subject: [PATCH 05/16] chore(internal): more robust bootstrap script --- scripts/bootstrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/bootstrap b/scripts/bootstrap index 5ab3066..46547f1 100755 --- a/scripts/bootstrap +++ b/scripts/bootstrap @@ -4,7 +4,7 @@ set -e cd "$(dirname "$0")/.." -if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then +if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "${SKIP_BREW:-}" != "1" ] && [ -t 0 ]; then brew bundle check >/dev/null 2>&1 || { echo -n "==> Install Homebrew dependencies? (y/N): " read -r response From a8bc1d57f59c471301dce65cbbabffafeaa3ab6b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 03:46:28 +0000 Subject: [PATCH 06/16] feat(go): add default http client with timeout --- client.go | 2 +- default_http_client.go | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 default_http_client.go diff --git a/client.go b/client.go index f5d2065..c3f2bac 100644 --- a/client.go +++ b/client.go @@ -24,7 +24,7 @@ type Client struct { // MODEL_API_KEY, BROWSERBASE_PROJECT_ID, STAGEHAND_BASE_URL). This should be used // to initialize new clients. func DefaultClientOptions() []option.RequestOption { - defaults := []option.RequestOption{option.WithEnvironmentProduction()} + defaults := []option.RequestOption{option.WithHTTPClient(defaultHTTPClient()), option.WithEnvironmentProduction()} if o, ok := os.LookupEnv("STAGEHAND_BASE_URL"); ok { defaults = append(defaults, option.WithBaseURL(o)) } diff --git a/default_http_client.go b/default_http_client.go new file mode 100644 index 0000000..9338fb8 --- /dev/null +++ b/default_http_client.go @@ -0,0 +1,24 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +package stagehand + +import ( + "net/http" + "time" +) + +// defaultResponseHeaderTimeout bounds the time between a fully written request +// and the server's response headers. It does not apply to the response body, +// so long-running streams are unaffected. Without this, a server that accepts +// the connection but never responds would hang the request indefinitely. +const defaultResponseHeaderTimeout = 10 * time.Minute + +// defaultHTTPClient returns an [*http.Client] used when the caller does not +// supply one via [option.WithHTTPClient]. It clones [http.DefaultTransport] +// and adds a [http.Transport.ResponseHeaderTimeout] so stuck connections +// fail fast instead of compounding across retries. +func defaultHTTPClient() *http.Client { + transport := http.DefaultTransport.(*http.Transport).Clone() + transport.ResponseHeaderTimeout = defaultResponseHeaderTimeout + return &http.Client{Transport: transport} +} From 661576dfbbaba6e019e9f32e05f6484ec3f17c5b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 03:51:33 +0000 Subject: [PATCH 07/16] feat: support setting headers via env --- client.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/client.go b/client.go index c3f2bac..5fb6968 100644 --- a/client.go +++ b/client.go @@ -7,6 +7,7 @@ import ( "net/http" "os" "slices" + "strings" "github.com/browserbase/stagehand-go/v3/internal/requestconfig" "github.com/browserbase/stagehand-go/v3/option" @@ -37,6 +38,14 @@ func DefaultClientOptions() []option.RequestOption { if o, ok := os.LookupEnv("MODEL_API_KEY"); ok { defaults = append(defaults, option.WithModelAPIKey(o)) } + if o, ok := os.LookupEnv("STAGEHAND_CUSTOM_HEADERS"); ok { + for _, line := range strings.Split(o, "\n") { + colon := strings.Index(line, ":") + if colon >= 0 { + defaults = append(defaults, option.WithHeader(strings.TrimSpace(line[:colon]), strings.TrimSpace(line[colon+1:]))) + } + } + } return defaults } From b51b9720312318117f87aa22bcb22b77186b1434 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2026 06:01:15 +0000 Subject: [PATCH 08/16] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index d8428d4..0bd171d 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 8 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-1c6caa2891a7f3bdfc0caab143f285badc9145220c9b29cd5e4cf1a9b3ac11cf.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-1c6caa2891a7f3bdfc0caab143f285badc9145220c9b29cd5e4cf1a9b3ac11cf.yml openapi_spec_hash: 28c4b734a5309067c39bb4c4b709b9ab config_hash: a962ae71493deb11a1c903256fb25386 From 27ab3acf6cfab754cc79401eff4dd916db3cf31a Mon Sep 17 00:00:00 2001 From: monadoid Date: Thu, 30 Apr 2026 18:42:12 +0200 Subject: [PATCH 09/16] [STG-1808] Prefer STAGEHAND_API_URL env fallback --- client.go | 8 ++- client_test.go | 60 +++++++++++++++++++ examples/basic/env.go | 4 -- examples/chromedp_local_example/env.go | 4 -- examples/local/env.go | 4 -- .../local_browser_chromedp_example/env.go | 4 -- .../env.go | 4 -- .../remote_browser_chromedp_example/env.go | 4 -- 8 files changed, 65 insertions(+), 27 deletions(-) diff --git a/client.go b/client.go index 5fb6968..be55023 100644 --- a/client.go +++ b/client.go @@ -22,11 +22,13 @@ type Client struct { } // DefaultClientOptions read from the environment (BROWSERBASE_API_KEY, -// MODEL_API_KEY, BROWSERBASE_PROJECT_ID, STAGEHAND_BASE_URL). This should be used +// MODEL_API_KEY, BROWSERBASE_PROJECT_ID, STAGEHAND_API_URL). This should be used // to initialize new clients. func DefaultClientOptions() []option.RequestOption { defaults := []option.RequestOption{option.WithHTTPClient(defaultHTTPClient()), option.WithEnvironmentProduction()} - if o, ok := os.LookupEnv("STAGEHAND_BASE_URL"); ok { + if o, ok := os.LookupEnv("STAGEHAND_API_URL"); ok { + defaults = append(defaults, option.WithBaseURL(o)) + } else if o, ok := os.LookupEnv("STAGEHAND_BASE_URL"); ok { defaults = append(defaults, option.WithBaseURL(o)) } if o, ok := os.LookupEnv("BROWSERBASE_API_KEY"); ok { @@ -51,7 +53,7 @@ func DefaultClientOptions() []option.RequestOption { // NewClient generates a new client with the default option read from the // environment (BROWSERBASE_API_KEY, MODEL_API_KEY, BROWSERBASE_PROJECT_ID, -// STAGEHAND_BASE_URL). The option passed in as arguments are applied after these +// STAGEHAND_API_URL). The option passed in as arguments are applied after these // default arguments, and all option will be passed down to the services and // requests that this client makes. func NewClient(opts ...option.RequestOption) (r Client) { diff --git a/client_test.go b/client_test.go index 440e646..7684d6d 100644 --- a/client_test.go +++ b/client_test.go @@ -7,7 +7,9 @@ import ( "fmt" "io" "net/http" + "os" "reflect" + "strings" "testing" "time" @@ -49,6 +51,64 @@ func TestUserAgentHeader(t *testing.T) { } } +func TestBaseURLFromStagehandAPIURLEnv(t *testing.T) { + t.Setenv("STAGEHAND_API_URL", "http://localhost:5000/from-api-env") + t.Setenv("STAGEHAND_BASE_URL", "http://localhost:5000/from-base-env") + + var requestURL string + client := stagehand.NewClient( + option.WithBrowserbaseAPIKey("My Browserbase API Key"), + option.WithBrowserbaseProjectID("My Browserbase Project ID"), + option.WithModelAPIKey("My Model API Key"), + option.WithHTTPClient(&http.Client{ + Transport: &closureTransport{ + fn: func(req *http.Request) (*http.Response, error) { + requestURL = req.URL.String() + return &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader("{}"))}, nil + }, + }, + }), + ) + _, _ = client.Sessions.Start(context.Background(), stagehand.SessionStartParams{ + ModelName: "openai/gpt-5.4-mini", + }) + if requestURL != "http://localhost:5000/from-api-env/v1/sessions/start" { + t.Errorf("Expected STAGEHAND_API_URL to take precedence, got: %s", requestURL) + } +} + +func TestBaseURLFromLegacyStagehandBaseURLEnv(t *testing.T) { + oldAPIURL, hadAPIURL := os.LookupEnv("STAGEHAND_API_URL") + os.Unsetenv("STAGEHAND_API_URL") + t.Cleanup(func() { + if hadAPIURL { + os.Setenv("STAGEHAND_API_URL", oldAPIURL) + } + }) + t.Setenv("STAGEHAND_BASE_URL", "http://localhost:5000/from-base-env") + + var requestURL string + client := stagehand.NewClient( + option.WithBrowserbaseAPIKey("My Browserbase API Key"), + option.WithBrowserbaseProjectID("My Browserbase Project ID"), + option.WithModelAPIKey("My Model API Key"), + option.WithHTTPClient(&http.Client{ + Transport: &closureTransport{ + fn: func(req *http.Request) (*http.Response, error) { + requestURL = req.URL.String() + return &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader("{}"))}, nil + }, + }, + }), + ) + _, _ = client.Sessions.Start(context.Background(), stagehand.SessionStartParams{ + ModelName: "openai/gpt-5.4-mini", + }) + if requestURL != "http://localhost:5000/from-base-env/v1/sessions/start" { + t.Errorf("Expected STAGEHAND_BASE_URL fallback, got: %s", requestURL) + } +} + func TestRetryAfter(t *testing.T) { retryCountHeaders := make([]string, 0) client := stagehand.NewClient( diff --git a/examples/basic/env.go b/examples/basic/env.go index 9fa67a5..1b001e2 100644 --- a/examples/basic/env.go +++ b/examples/basic/env.go @@ -54,10 +54,6 @@ func loadExampleEnv() { if len(missing) > 0 { panic("Missing required env vars: " + strings.Join(missing, ", ") + " (from examples/.env)") } - - if os.Getenv("STAGEHAND_BASE_URL") == "" { - os.Setenv("STAGEHAND_BASE_URL", os.Getenv("STAGEHAND_API_URL")) - } } func findEnvPath() (string, bool) { diff --git a/examples/chromedp_local_example/env.go b/examples/chromedp_local_example/env.go index 9fa67a5..1b001e2 100644 --- a/examples/chromedp_local_example/env.go +++ b/examples/chromedp_local_example/env.go @@ -54,10 +54,6 @@ func loadExampleEnv() { if len(missing) > 0 { panic("Missing required env vars: " + strings.Join(missing, ", ") + " (from examples/.env)") } - - if os.Getenv("STAGEHAND_BASE_URL") == "" { - os.Setenv("STAGEHAND_BASE_URL", os.Getenv("STAGEHAND_API_URL")) - } } func findEnvPath() (string, bool) { diff --git a/examples/local/env.go b/examples/local/env.go index 9fa67a5..1b001e2 100644 --- a/examples/local/env.go +++ b/examples/local/env.go @@ -54,10 +54,6 @@ func loadExampleEnv() { if len(missing) > 0 { panic("Missing required env vars: " + strings.Join(missing, ", ") + " (from examples/.env)") } - - if os.Getenv("STAGEHAND_BASE_URL") == "" { - os.Setenv("STAGEHAND_BASE_URL", os.Getenv("STAGEHAND_API_URL")) - } } func findEnvPath() (string, bool) { diff --git a/examples/local_browser_chromedp_example/env.go b/examples/local_browser_chromedp_example/env.go index 9fa67a5..1b001e2 100644 --- a/examples/local_browser_chromedp_example/env.go +++ b/examples/local_browser_chromedp_example/env.go @@ -54,10 +54,6 @@ func loadExampleEnv() { if len(missing) > 0 { panic("Missing required env vars: " + strings.Join(missing, ", ") + " (from examples/.env)") } - - if os.Getenv("STAGEHAND_BASE_URL") == "" { - os.Setenv("STAGEHAND_BASE_URL", os.Getenv("STAGEHAND_API_URL")) - } } func findEnvPath() (string, bool) { diff --git a/examples/local_server_multiregion_browser_example/env.go b/examples/local_server_multiregion_browser_example/env.go index 9fa67a5..1b001e2 100644 --- a/examples/local_server_multiregion_browser_example/env.go +++ b/examples/local_server_multiregion_browser_example/env.go @@ -54,10 +54,6 @@ func loadExampleEnv() { if len(missing) > 0 { panic("Missing required env vars: " + strings.Join(missing, ", ") + " (from examples/.env)") } - - if os.Getenv("STAGEHAND_BASE_URL") == "" { - os.Setenv("STAGEHAND_BASE_URL", os.Getenv("STAGEHAND_API_URL")) - } } func findEnvPath() (string, bool) { diff --git a/examples/remote_browser_chromedp_example/env.go b/examples/remote_browser_chromedp_example/env.go index 9fa67a5..1b001e2 100644 --- a/examples/remote_browser_chromedp_example/env.go +++ b/examples/remote_browser_chromedp_example/env.go @@ -54,10 +54,6 @@ func loadExampleEnv() { if len(missing) > 0 { panic("Missing required env vars: " + strings.Join(missing, ", ") + " (from examples/.env)") } - - if os.Getenv("STAGEHAND_BASE_URL") == "" { - os.Setenv("STAGEHAND_BASE_URL", os.Getenv("STAGEHAND_API_URL")) - } } func findEnvPath() (string, bool) { From 450953b29fac47f0dcd91bb6f646c8937bc28d62 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 02:00:21 +0000 Subject: [PATCH 10/16] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 0bd171d..b17eb0a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 8 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-1c6caa2891a7f3bdfc0caab143f285badc9145220c9b29cd5e4cf1a9b3ac11cf.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-dbbff1a35360850898f7d60588e257faeac145a73cfcae634cfeb1b70109b6af.yml openapi_spec_hash: 28c4b734a5309067c39bb4c4b709b9ab config_hash: a962ae71493deb11a1c903256fb25386 From f0717577f5de09f968fac0178dacd8662ec40c44 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 02:01:53 +0000 Subject: [PATCH 11/16] chore: avoid embedding reflect.Type for dead code elimination --- internal/apiform/encoder.go | 4 ++-- internal/apijson/decoder.go | 4 ++-- internal/apijson/encoder.go | 4 ++-- internal/apiquery/encoder.go | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/apiform/encoder.go b/internal/apiform/encoder.go index 66b5879..04769ad 100644 --- a/internal/apiform/encoder.go +++ b/internal/apiform/encoder.go @@ -58,7 +58,7 @@ type encoderField struct { } type encoderEntry struct { - reflect.Type + typ reflect.Type dateFormat string arrayFmt string root bool @@ -76,7 +76,7 @@ func (e *encoder) marshal(value any, writer *multipart.Writer) error { func (e *encoder) typeEncoder(t reflect.Type) encoderFunc { entry := encoderEntry{ - Type: t, + typ: t, dateFormat: e.dateFormat, arrayFmt: e.arrayFmt, root: e.root, diff --git a/internal/apijson/decoder.go b/internal/apijson/decoder.go index 4242e2a..2d1e1fb 100644 --- a/internal/apijson/decoder.go +++ b/internal/apijson/decoder.go @@ -80,7 +80,7 @@ type decoderField struct { } type decoderEntry struct { - reflect.Type + typ reflect.Type dateFormat string root bool } @@ -108,7 +108,7 @@ func (d *decoderBuilder) unmarshalWithExactness(raw []byte, to any) (exactness, func (d *decoderBuilder) typeDecoder(t reflect.Type) decoderFunc { entry := decoderEntry{ - Type: t, + typ: t, dateFormat: d.dateFormat, root: d.root, } diff --git a/internal/apijson/encoder.go b/internal/apijson/encoder.go index 8a881d6..686161b 100644 --- a/internal/apijson/encoder.go +++ b/internal/apijson/encoder.go @@ -46,7 +46,7 @@ type encoderField struct { } type encoderEntry struct { - reflect.Type + typ reflect.Type dateFormat string root bool } @@ -63,7 +63,7 @@ func (e *encoder) marshal(value any) ([]byte, error) { func (e *encoder) typeEncoder(t reflect.Type) encoderFunc { entry := encoderEntry{ - Type: t, + typ: t, dateFormat: e.dateFormat, root: e.root, } diff --git a/internal/apiquery/encoder.go b/internal/apiquery/encoder.go index 587075a..be6989f 100644 --- a/internal/apiquery/encoder.go +++ b/internal/apiquery/encoder.go @@ -29,7 +29,7 @@ type encoderField struct { } type encoderEntry struct { - reflect.Type + typ reflect.Type dateFormat string root bool settings QuerySettings @@ -42,7 +42,7 @@ type Pair struct { func (e *encoder) typeEncoder(t reflect.Type) encoderFunc { entry := encoderEntry{ - Type: t, + typ: t, dateFormat: e.dateFormat, root: e.root, settings: e.settings, From 547119099d9201d53820f12345e44acd940cccc6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 17:06:20 +0000 Subject: [PATCH 12/16] feat: [feat]: add `ignoreSelectors` to `extract()` --- .stats.yml | 4 ++-- session.go | 2 ++ session_test.go | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index b17eb0a..128128c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 8 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-dbbff1a35360850898f7d60588e257faeac145a73cfcae634cfeb1b70109b6af.yml -openapi_spec_hash: 28c4b734a5309067c39bb4c4b709b9ab +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-7182c741edd5e22cda9bd855d31ca7e60a97a409222bb887edf87b9ce15dd493.yml +openapi_spec_hash: 174581867a9191c491b22855b64c4f19 config_hash: a962ae71493deb11a1c903256fb25386 diff --git a/session.go b/session.go index 2d794dd..741f43c 100644 --- a/session.go +++ b/session.go @@ -1327,6 +1327,8 @@ type SessionExtractParamsOptions struct { Selector param.Opt[string] `json:"selector,omitzero"` // Timeout in ms for the extraction Timeout param.Opt[float64] `json:"timeout,omitzero"` + // Selectors for elements and subtrees that should be excluded from extraction + IgnoreSelectors []string `json:"ignoreSelectors,omitzero"` // Model configuration object or model name string (e.g., 'openai/gpt-5-nano') Model SessionExtractParamsOptionsModelUnion `json:"model,omitzero"` paramObj diff --git a/session_test.go b/session_test.go index d6d501e..3eda410 100644 --- a/session_test.go +++ b/session_test.go @@ -196,6 +196,7 @@ func TestSessionExtractWithOptionalParams(t *testing.T) { FrameID: stagehand.String("frameId"), Instruction: stagehand.String("Extract all product names and prices from the page"), Options: stagehand.SessionExtractParamsOptions{ + IgnoreSelectors: []string{"nav", ".cookie-banner", "#sidebar-ads"}, Model: stagehand.SessionExtractParamsOptionsModelUnion{ OfModelConfig: &stagehand.ModelConfigParam{ ModelName: "openai/gpt-5.4-mini", From fa76f5f6c41e668a9d22a75d4a9ab92829a36f4e Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 17:12:03 +0000 Subject: [PATCH 13/16] feat: [STG-1808] Deprecate Browserbase project ID --- .stats.yml | 6 +++--- session.go | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.stats.yml b/.stats.yml index 128128c..d79c632 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 8 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-7182c741edd5e22cda9bd855d31ca7e60a97a409222bb887edf87b9ce15dd493.yml -openapi_spec_hash: 174581867a9191c491b22855b64c4f19 -config_hash: a962ae71493deb11a1c903256fb25386 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-f10429ab9f004c9a7f9f362d7fa82915e0dc04b1ba08a7bc9fd442ed5854cc77.yml +openapi_spec_hash: 818f2e6e7eb5eb6f21f346b0b9828dce +config_hash: 1fb12ae9b478488bc1e56bfbdc210b01 diff --git a/session.go b/session.go index 741f43c..cde8564 100644 --- a/session.go +++ b/session.go @@ -1750,8 +1750,12 @@ func (r *SessionStartParamsBrowserLaunchOptionsViewport) UnmarshalJSON(data []by } type SessionStartParamsBrowserbaseSessionCreateParams struct { - ExtensionID param.Opt[string] `json:"extensionId,omitzero"` - KeepAlive param.Opt[bool] `json:"keepAlive,omitzero"` + ExtensionID param.Opt[string] `json:"extensionId,omitzero"` + KeepAlive param.Opt[bool] `json:"keepAlive,omitzero"` + // Deprecated. Browserbase API keys are now project-scoped, so this field is no + // longer required. + // + // Deprecated: deprecated ProjectID param.Opt[string] `json:"projectId,omitzero"` Timeout param.Opt[float64] `json:"timeout,omitzero"` BrowserSettings SessionStartParamsBrowserbaseSessionCreateParamsBrowserSettings `json:"browserSettings,omitzero"` From 93160890e958a17d3159273abc12a33c5b1f9d57 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 18:52:33 +0000 Subject: [PATCH 14/16] feat: remove experimental requirement on agent variables (#2079) --- .stats.yml | 4 +-- session.go | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ session_test.go | 5 ++++ 3 files changed, 83 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index d79c632..391cde3 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 8 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-f10429ab9f004c9a7f9f362d7fa82915e0dc04b1ba08a7bc9fd442ed5854cc77.yml -openapi_spec_hash: 818f2e6e7eb5eb6f21f346b0b9828dce +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-6f6bfb81d092f30a5e2005328c97d61b9ea36132bb19e9e79e55294b9534ce20.yml +openapi_spec_hash: f3fc1e3688a38dc2c28f7178f7d534e5 config_hash: 1fb12ae9b478488bc1e56bfbdc210b01 diff --git a/session.go b/session.go index cde8564..f218fe0 100644 --- a/session.go +++ b/session.go @@ -1280,6 +1280,8 @@ type SessionExecuteParamsExecuteOptions struct { ToolTimeout param.Opt[float64] `json:"toolTimeout,omitzero"` // Whether to enable the web search tool powered by Browserbase Search API UseSearch param.Opt[bool] `json:"useSearch,omitzero"` + // Variables available to the agent via %variableName% syntax in supported tools + Variables map[string]SessionExecuteParamsExecuteOptionsVariableUnion `json:"variables,omitzero"` paramObj } @@ -1291,6 +1293,80 @@ func (r *SessionExecuteParamsExecuteOptions) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type SessionExecuteParamsExecuteOptionsVariableUnion struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + OfSessionExecutesExecuteOptionsVariableObject *SessionExecuteParamsExecuteOptionsVariableObject `json:",omitzero,inline"` + paramUnion +} + +func (u SessionExecuteParamsExecuteOptionsVariableUnion) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfSessionExecutesExecuteOptionsVariableObject) +} +func (u *SessionExecuteParamsExecuteOptionsVariableUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *SessionExecuteParamsExecuteOptionsVariableUnion) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } else if !param.IsOmitted(u.OfSessionExecutesExecuteOptionsVariableObject) { + return u.OfSessionExecutesExecuteOptionsVariableObject + } + return nil +} + +// The property Value is required. +type SessionExecuteParamsExecuteOptionsVariableObject struct { + Value SessionExecuteParamsExecuteOptionsVariableObjectValueUnion `json:"value,omitzero" api:"required"` + Description param.Opt[string] `json:"description,omitzero"` + paramObj +} + +func (r SessionExecuteParamsExecuteOptionsVariableObject) MarshalJSON() (data []byte, err error) { + type shadow SessionExecuteParamsExecuteOptionsVariableObject + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SessionExecuteParamsExecuteOptionsVariableObject) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type SessionExecuteParamsExecuteOptionsVariableObjectValueUnion struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + paramUnion +} + +func (u SessionExecuteParamsExecuteOptionsVariableObjectValueUnion) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool) +} +func (u *SessionExecuteParamsExecuteOptionsVariableObjectValueUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *SessionExecuteParamsExecuteOptionsVariableObjectValueUnion) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } + return nil +} + // Whether to stream the response via SSE type SessionExecuteParamsXStreamResponse string diff --git a/session_test.go b/session_test.go index 3eda410..9c26e94 100644 --- a/session_test.go +++ b/session_test.go @@ -159,6 +159,11 @@ func TestSessionExecuteWithOptionalParams(t *testing.T) { MaxSteps: stagehand.Float(20), ToolTimeout: stagehand.Float(30000), UseSearch: stagehand.Bool(true), + Variables: map[string]stagehand.SessionExecuteParamsExecuteOptionsVariableUnion{ + "foo": { + OfString: stagehand.String("string"), + }, + }, }, FrameID: stagehand.String("frameId"), ShouldCache: stagehand.Bool(true), From 15a09ae30e8ea350c63a1defd89d988c943c03a3 Mon Sep 17 00:00:00 2001 From: Sam F <43347795+monadoid@users.noreply.github.com> Date: Wed, 6 May 2026 21:55:04 +0200 Subject: [PATCH 15/16] Deprecate browserbase project ID (#23) Co-authored-by: samfinton --- README.md | 4 +- client.go | 15 +++--- client_test.go | 47 +++++++++++++++++++ examples/.env.example | 2 - examples/basic/env.go | 2 - examples/basic/main.go | 3 +- examples/chromedp_local_example/env.go | 2 - examples/local/env.go | 2 - .../local_browser_chromedp_example/env.go | 2 - .../env.go | 2 - .../main.go | 3 +- .../remote_browser_chromedp_example/env.go | 2 - .../remote_browser_chromedp_example/main.go | 2 - internal/requestconfig/requestconfig.go | 2 - lib/local/local.go | 15 +----- local_client.go | 15 ------ option/requestoption.go | 5 +- 17 files changed, 61 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index f33a90d..2a09abf 100644 --- a/README.md +++ b/README.md @@ -192,10 +192,10 @@ func main() { Set your environment variables (from `examples/.env.example`): -- `STAGEHAND_API_URL` - `MODEL_API_KEY` - `BROWSERBASE_API_KEY` -- `BROWSERBASE_PROJECT_ID` + +`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. ```bash cp examples/.env.example examples/.env diff --git a/client.go b/client.go index be55023..9852909 100644 --- a/client.go +++ b/client.go @@ -22,8 +22,8 @@ type Client struct { } // DefaultClientOptions read from the environment (BROWSERBASE_API_KEY, -// MODEL_API_KEY, BROWSERBASE_PROJECT_ID, STAGEHAND_API_URL). This should be used -// to initialize new clients. +// MODEL_API_KEY, STAGEHAND_API_URL, with STAGEHAND_BASE_URL as a fallback). This +// should be used to initialize new clients. func DefaultClientOptions() []option.RequestOption { defaults := []option.RequestOption{option.WithHTTPClient(defaultHTTPClient()), option.WithEnvironmentProduction()} if o, ok := os.LookupEnv("STAGEHAND_API_URL"); ok { @@ -34,9 +34,6 @@ func DefaultClientOptions() []option.RequestOption { if o, ok := os.LookupEnv("BROWSERBASE_API_KEY"); ok { defaults = append(defaults, option.WithBrowserbaseAPIKey(o)) } - if o, ok := os.LookupEnv("BROWSERBASE_PROJECT_ID"); ok { - defaults = append(defaults, option.WithBrowserbaseProjectID(o)) - } if o, ok := os.LookupEnv("MODEL_API_KEY"); ok { defaults = append(defaults, option.WithModelAPIKey(o)) } @@ -52,10 +49,10 @@ func DefaultClientOptions() []option.RequestOption { } // NewClient generates a new client with the default option read from the -// environment (BROWSERBASE_API_KEY, MODEL_API_KEY, BROWSERBASE_PROJECT_ID, -// STAGEHAND_API_URL). The option passed in as arguments are applied after these -// default arguments, and all option will be passed down to the services and -// requests that this client makes. +// environment (BROWSERBASE_API_KEY, MODEL_API_KEY, STAGEHAND_API_URL, with +// STAGEHAND_BASE_URL as a fallback). The option passed in as arguments are +// applied after these default arguments, and all option will be passed down to +// the services and requests that this client makes. func NewClient(opts ...option.RequestOption) (r Client) { opts = append(DefaultClientOptions(), opts...) // BEGIN CUSTOM CODE - not generated by Stainless. diff --git a/client_test.go b/client_test.go index 7684d6d..c2d00fd 100644 --- a/client_test.go +++ b/client_test.go @@ -109,6 +109,53 @@ func TestBaseURLFromLegacyStagehandBaseURLEnv(t *testing.T) { } } +func TestBrowserbaseProjectIDEnvIsIgnored(t *testing.T) { + t.Setenv("BROWSERBASE_PROJECT_ID", "My Browserbase Project ID") + + var projectIDHeader string + client := stagehand.NewClient( + option.WithBrowserbaseAPIKey("My Browserbase API Key"), + option.WithModelAPIKey("My Model API Key"), + option.WithHTTPClient(&http.Client{ + Transport: &closureTransport{ + fn: func(req *http.Request) (*http.Response, error) { + projectIDHeader = req.Header.Get("x-bb-project-id") + return &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader("{}"))}, nil + }, + }, + }), + ) + _, _ = client.Sessions.Start(context.Background(), stagehand.SessionStartParams{ + ModelName: "openai/gpt-5.4-mini", + }) + if projectIDHeader != "" { + t.Errorf("Expected x-bb-project-id header to be omitted, got: %s", projectIDHeader) + } +} + +func TestBrowserbaseProjectIDOptionIsNoOp(t *testing.T) { + var projectIDHeader string + client := stagehand.NewClient( + option.WithBrowserbaseAPIKey("My Browserbase API Key"), + option.WithModelAPIKey("My Model API Key"), + option.WithBrowserbaseProjectID("My Browserbase Project ID"), + option.WithHTTPClient(&http.Client{ + Transport: &closureTransport{ + fn: func(req *http.Request) (*http.Response, error) { + projectIDHeader = req.Header.Get("x-bb-project-id") + return &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader("{}"))}, nil + }, + }, + }), + ) + _, _ = client.Sessions.Start(context.Background(), stagehand.SessionStartParams{ + ModelName: "openai/gpt-5.4-mini", + }) + if projectIDHeader != "" { + t.Errorf("Expected x-bb-project-id header to be omitted, got: %s", projectIDHeader) + } +} + func TestRetryAfter(t *testing.T) { retryCountHeaders := make([]string, 0) client := stagehand.NewClient( diff --git a/examples/.env.example b/examples/.env.example index 6272bb0..0033442 100644 --- a/examples/.env.example +++ b/examples/.env.example @@ -1,4 +1,2 @@ -STAGEHAND_API_URL=https://api.stagehand.browserbase.com MODEL_API_KEY=sk-proj-your-llm-api-key-here BROWSERBASE_API_KEY=bb_live_your_api_key_here -BROWSERBASE_PROJECT_ID=your-bb-project-uuid-here diff --git a/examples/basic/env.go b/examples/basic/env.go index 1b001e2..019378f 100644 --- a/examples/basic/env.go +++ b/examples/basic/env.go @@ -9,10 +9,8 @@ import ( ) var requiredEnv = []string{ - "STAGEHAND_API_URL", "MODEL_API_KEY", "BROWSERBASE_API_KEY", - "BROWSERBASE_PROJECT_ID", } func loadExampleEnv() { diff --git a/examples/basic/main.go b/examples/basic/main.go index 04e4f01..157e52e 100644 --- a/examples/basic/main.go +++ b/examples/basic/main.go @@ -2,7 +2,6 @@ // // Prerequisites: // - Set BROWSERBASE_API_KEY -// - Set BROWSERBASE_PROJECT_ID // - Set MODEL_API_KEY // // Run: @@ -24,7 +23,7 @@ import ( func main() { loadExampleEnv() - client := stagehand.NewClient() // Uses env vars: BROWSERBASE_API_KEY, BROWSERBASE_PROJECT_ID, MODEL_API_KEY + client := stagehand.NewClient() // Uses env vars: BROWSERBASE_API_KEY and MODEL_API_KEY startResponse, err := client.Sessions.Start(context.TODO(), stagehand.SessionStartParams{ ModelName: "anthropic/claude-sonnet-4-6", diff --git a/examples/chromedp_local_example/env.go b/examples/chromedp_local_example/env.go index 1b001e2..019378f 100644 --- a/examples/chromedp_local_example/env.go +++ b/examples/chromedp_local_example/env.go @@ -9,10 +9,8 @@ import ( ) var requiredEnv = []string{ - "STAGEHAND_API_URL", "MODEL_API_KEY", "BROWSERBASE_API_KEY", - "BROWSERBASE_PROJECT_ID", } func loadExampleEnv() { diff --git a/examples/local/env.go b/examples/local/env.go index 1b001e2..019378f 100644 --- a/examples/local/env.go +++ b/examples/local/env.go @@ -9,10 +9,8 @@ import ( ) var requiredEnv = []string{ - "STAGEHAND_API_URL", "MODEL_API_KEY", "BROWSERBASE_API_KEY", - "BROWSERBASE_PROJECT_ID", } func loadExampleEnv() { diff --git a/examples/local_browser_chromedp_example/env.go b/examples/local_browser_chromedp_example/env.go index 1b001e2..019378f 100644 --- a/examples/local_browser_chromedp_example/env.go +++ b/examples/local_browser_chromedp_example/env.go @@ -9,10 +9,8 @@ import ( ) var requiredEnv = []string{ - "STAGEHAND_API_URL", "MODEL_API_KEY", "BROWSERBASE_API_KEY", - "BROWSERBASE_PROJECT_ID", } func loadExampleEnv() { diff --git a/examples/local_server_multiregion_browser_example/env.go b/examples/local_server_multiregion_browser_example/env.go index 1b001e2..019378f 100644 --- a/examples/local_server_multiregion_browser_example/env.go +++ b/examples/local_server_multiregion_browser_example/env.go @@ -9,10 +9,8 @@ import ( ) var requiredEnv = []string{ - "STAGEHAND_API_URL", "MODEL_API_KEY", "BROWSERBASE_API_KEY", - "BROWSERBASE_PROJECT_ID", } func loadExampleEnv() { diff --git a/examples/local_server_multiregion_browser_example/main.go b/examples/local_server_multiregion_browser_example/main.go index a174476..3ff59a0 100644 --- a/examples/local_server_multiregion_browser_example/main.go +++ b/examples/local_server_multiregion_browser_example/main.go @@ -2,7 +2,6 @@ // // Prerequisites: // - Set BROWSERBASE_API_KEY -// - Set BROWSERBASE_PROJECT_ID // - Set MODEL_API_KEY // // Run: @@ -29,7 +28,7 @@ import ( func main() { loadExampleEnv() - requireEnv("BROWSERBASE_API_KEY", "BROWSERBASE_PROJECT_ID", "MODEL_API_KEY") + requireEnv("BROWSERBASE_API_KEY", "MODEL_API_KEY") // Run the Stagehand driver locally (required for Browserbase regions other than us-west-2) client := stagehand.NewClient(option.WithServer("local")) diff --git a/examples/remote_browser_chromedp_example/env.go b/examples/remote_browser_chromedp_example/env.go index 1b001e2..019378f 100644 --- a/examples/remote_browser_chromedp_example/env.go +++ b/examples/remote_browser_chromedp_example/env.go @@ -9,10 +9,8 @@ import ( ) var requiredEnv = []string{ - "STAGEHAND_API_URL", "MODEL_API_KEY", "BROWSERBASE_API_KEY", - "BROWSERBASE_PROJECT_ID", } func loadExampleEnv() { diff --git a/examples/remote_browser_chromedp_example/main.go b/examples/remote_browser_chromedp_example/main.go index 1059d26..3dc9f06 100644 --- a/examples/remote_browser_chromedp_example/main.go +++ b/examples/remote_browser_chromedp_example/main.go @@ -2,7 +2,6 @@ // // Prerequisites: // - Set BROWSERBASE_API_KEY -// - Set BROWSERBASE_PROJECT_ID // - Set MODEL_API_KEY // // Run: @@ -32,7 +31,6 @@ func main() { loadExampleEnv() // Environment variables required (same as other examples): // - BROWSERBASE_API_KEY - // - BROWSERBASE_PROJECT_ID // - MODEL_API_KEY client := stagehand.NewClient() diff --git a/internal/requestconfig/requestconfig.go b/internal/requestconfig/requestconfig.go index 754396d..3cf94be 100644 --- a/internal/requestconfig/requestconfig.go +++ b/internal/requestconfig/requestconfig.go @@ -219,7 +219,6 @@ type RequestConfig struct { HTTPClient *http.Client Middlewares []middleware BrowserbaseAPIKey string - BrowserbaseProjectID string ModelAPIKey string // If ResponseBodyInto not nil, then we will attempt to deserialize into // ResponseBodyInto. If Destination is a []byte, then it will return the body as @@ -595,7 +594,6 @@ func (cfg *RequestConfig) Clone(ctx context.Context) *RequestConfig { HTTPClient: cfg.HTTPClient, Middlewares: cfg.Middlewares, BrowserbaseAPIKey: cfg.BrowserbaseAPIKey, - BrowserbaseProjectID: cfg.BrowserbaseProjectID, ModelAPIKey: cfg.ModelAPIKey, } diff --git a/lib/local/local.go b/lib/local/local.go index 5bd96bf..891360f 100644 --- a/lib/local/local.go +++ b/lib/local/local.go @@ -266,7 +266,6 @@ type ServerManager struct { baseURL string modelAPIKey string browserbaseAPIKey string - browserbaseProjectID string mu sync.Mutex started bool } @@ -328,14 +327,8 @@ func (m *ServerManager) SetBrowserbaseAPIKey(key string) { m.browserbaseAPIKey = key } -// SetBrowserbaseProjectID sets the Browserbase project ID used by local mode. +// SetBrowserbaseProjectID is deprecated and retained as a no-op for backwards compatibility. func (m *ServerManager) SetBrowserbaseProjectID(projectID string) { - if projectID == "" { - return - } - m.mu.Lock() - defer m.mu.Unlock() - m.browserbaseProjectID = projectID } // startLocked starts local mode. Must be called with m.mu held. @@ -350,8 +343,7 @@ func (m *ServerManager) startLocked(ctx context.Context) (string, error) { return "", fmt.Errorf("failed to find free port: %w", err) } - // Build environment - env := os.Environ() + env := append([]string{}, os.Environ()...) env = append(env, "NODE_ENV=production", "BB_ENV=local", @@ -365,9 +357,6 @@ func (m *ServerManager) startLocked(ctx context.Context) (string, error) { if m.browserbaseAPIKey != "" { env = append(env, fmt.Sprintf("BROWSERBASE_API_KEY=%s", m.browserbaseAPIKey)) } - if m.browserbaseProjectID != "" { - env = append(env, fmt.Sprintf("BROWSERBASE_PROJECT_ID=%s", m.browserbaseProjectID)) - } // Start the process m.cmd = exec.Command(m.binaryPath) diff --git a/local_client.go b/local_client.go index ae373b3..4b5dd6a 100644 --- a/local_client.go +++ b/local_client.go @@ -25,11 +25,9 @@ func newLocalServerOption() *localServerOption { func (o *localServerOption) Apply(cfg *requestconfig.RequestConfig) error { var modelAPIKey string var browserbaseAPIKey string - var browserbaseProjectID string if cfg != nil { modelAPIKey = cfg.ModelAPIKey browserbaseAPIKey = cfg.BrowserbaseAPIKey - browserbaseProjectID = cfg.BrowserbaseProjectID } if modelAPIKey == "" { if key := os.Getenv("MODEL_API_KEY"); key != "" { @@ -51,16 +49,6 @@ func (o *localServerOption) Apply(cfg *requestconfig.RequestConfig) error { } } } - if browserbaseProjectID == "" { - if key := os.Getenv("BROWSERBASE_PROJECT_ID"); key != "" { - browserbaseProjectID = key - if cfg != nil { - if err := option.WithBrowserbaseProjectID(browserbaseProjectID).Apply(cfg); err != nil { - return err - } - } - } - } if modelAPIKey == "" { return fmt.Errorf("MODEL_API_KEY is required for local mode") } @@ -75,9 +63,6 @@ func (o *localServerOption) Apply(cfg *requestconfig.RequestConfig) error { if browserbaseAPIKey != "" { manager.SetBrowserbaseAPIKey(browserbaseAPIKey) } - if browserbaseProjectID != "" { - manager.SetBrowserbaseProjectID(browserbaseProjectID) - } ctx := cfg.Context if ctx == nil { diff --git a/option/requestoption.go b/option/requestoption.go index ebee770..8a63eca 100644 --- a/option/requestoption.go +++ b/option/requestoption.go @@ -274,11 +274,10 @@ func WithBrowserbaseAPIKey(value string) RequestOption { }) } -// WithBrowserbaseProjectID returns a RequestOption that sets the client setting "BROWSERBASE_PROJECT_ID". +// WithBrowserbaseProjectID is deprecated and retained as a no-op for backwards compatibility. func WithBrowserbaseProjectID(value string) RequestOption { return requestconfig.RequestOptionFunc(func(r *requestconfig.RequestConfig) error { - r.BrowserbaseProjectID = value - return r.Apply(WithHeader("x-bb-project-id", r.BrowserbaseProjectID)) + return nil }) } From 18e143f33a725518e8e55f141e462c2eed15e331 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 19:55:35 +0000 Subject: [PATCH 16/16] release: 3.20.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 21 +++++++++++++++++++++ README.md | 2 +- internal/version.go | 2 +- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 911c623..d11c8fc 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "3.19.3" + ".": "3.20.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 55aaaec..f94f7eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## 3.20.0 (2026-05-06) + +Full Changelog: [v3.19.3...v3.20.0](https://github.com/browserbase/stagehand-go/compare/v3.19.3...v3.20.0) + +### Features + +* [feat]: add `ignoreSelectors` to `extract()` ([5471190](https://github.com/browserbase/stagehand-go/commit/547119099d9201d53820f12345e44acd940cccc6)) +* [STG-1798] feat: support Browserbase verified sessions ([30133d3](https://github.com/browserbase/stagehand-go/commit/30133d320e2093815d9714e32a64ffe6242b94aa)) +* [STG-1808] Deprecate Browserbase project ID ([fa76f5f](https://github.com/browserbase/stagehand-go/commit/fa76f5f6c41e668a9d22a75d4a9ab92829a36f4e)) +* Bedrock auth passthrough ([b41e3cb](https://github.com/browserbase/stagehand-go/commit/b41e3cb38fe07e0d19f8204b106320e3dee9c50b)) +* **go:** add default http client with timeout ([a8bc1d5](https://github.com/browserbase/stagehand-go/commit/a8bc1d57f59c471301dce65cbbabffafeaa3ab6b)) +* remove experimental requirement on agent variables ([#2079](https://github.com/browserbase/stagehand-go/issues/2079)) ([9316089](https://github.com/browserbase/stagehand-go/commit/93160890e958a17d3159273abc12a33c5b1f9d57)) +* Revert "[STG-1573] Add providerOptions for extensible model auth ([#1822](https://github.com/browserbase/stagehand-go/issues/1822))" ([f56e93f](https://github.com/browserbase/stagehand-go/commit/f56e93ff49643c78a6a39da36b30a010dbf59b7d)) +* support setting headers via env ([661576d](https://github.com/browserbase/stagehand-go/commit/661576dfbbaba6e019e9f32e05f6484ec3f17c5b)) + + +### Chores + +* avoid embedding reflect.Type for dead code elimination ([f071757](https://github.com/browserbase/stagehand-go/commit/f0717577f5de09f968fac0178dacd8662ec40c44)) +* **internal:** more robust bootstrap script ([6fc0d10](https://github.com/browserbase/stagehand-go/commit/6fc0d10fc68841748a3f99cfbdc85930b18455d0)) + ## 3.19.3 (2026-04-03) Full Changelog: [v3.18.0...v3.19.3](https://github.com/browserbase/stagehand-go/compare/v3.18.0...v3.19.3) diff --git a/README.md b/README.md index 2a09abf..841a26a 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ Or to pin the version: ```sh -go get -u 'github.com/browserbase/stagehand-go@v3.19.3' +go get -u 'github.com/browserbase/stagehand-go@v3.20.0' ``` diff --git a/internal/version.go b/internal/version.go index eb91275..2210a0d 100644 --- a/internal/version.go +++ b/internal/version.go @@ -2,4 +2,4 @@ package internal -const PackageVersion = "3.19.3" // x-release-please-version +const PackageVersion = "3.20.0" // x-release-please-version