stagehand 0.0.4 → 3.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. checksums.yaml +7 -0
  2. data/.ignore +2 -0
  3. data/CHANGELOG.md +185 -0
  4. data/README.md +394 -31
  5. data/SECURITY.md +23 -0
  6. data/lib/stagehand/client.rb +123 -4
  7. data/lib/stagehand/errors.rb +228 -0
  8. data/lib/stagehand/file_part.rb +58 -0
  9. data/lib/stagehand/internal/stream.rb +56 -0
  10. data/lib/stagehand/internal/transport/base_client.rb +575 -0
  11. data/lib/stagehand/internal/transport/pooled_net_requester.rb +210 -0
  12. data/lib/stagehand/internal/type/array_of.rb +168 -0
  13. data/lib/stagehand/internal/type/base_model.rb +531 -0
  14. data/lib/stagehand/internal/type/base_page.rb +55 -0
  15. data/lib/stagehand/internal/type/base_stream.rb +83 -0
  16. data/lib/stagehand/internal/type/boolean.rb +77 -0
  17. data/lib/stagehand/internal/type/converter.rb +327 -0
  18. data/lib/stagehand/internal/type/enum.rb +131 -0
  19. data/lib/stagehand/internal/type/file_input.rb +111 -0
  20. data/lib/stagehand/internal/type/hash_of.rb +188 -0
  21. data/lib/stagehand/internal/type/request_parameters.rb +42 -0
  22. data/lib/stagehand/internal/type/union.rb +237 -0
  23. data/lib/stagehand/internal/type/unknown.rb +81 -0
  24. data/lib/stagehand/internal/util.rb +920 -0
  25. data/lib/stagehand/internal.rb +20 -0
  26. data/lib/stagehand/local.rb +439 -0
  27. data/lib/stagehand/models/action.rb +50 -0
  28. data/lib/stagehand/models/model_config.rb +55 -0
  29. data/lib/stagehand/models/session_act_params.rb +112 -0
  30. data/lib/stagehand/models/session_act_response.rb +127 -0
  31. data/lib/stagehand/models/session_end_params.rb +33 -0
  32. data/lib/stagehand/models/session_end_response.rb +17 -0
  33. data/lib/stagehand/models/session_execute_params.rb +212 -0
  34. data/lib/stagehand/models/session_execute_response.rb +212 -0
  35. data/lib/stagehand/models/session_extract_params.rb +107 -0
  36. data/lib/stagehand/models/session_extract_response.rb +46 -0
  37. data/lib/stagehand/models/session_navigate_params.rb +107 -0
  38. data/lib/stagehand/models/session_navigate_response.rb +44 -0
  39. data/lib/stagehand/models/session_observe_params.rb +99 -0
  40. data/lib/stagehand/models/session_observe_response.rb +91 -0
  41. data/lib/stagehand/models/session_replay_params.rb +33 -0
  42. data/lib/stagehand/models/session_replay_response.rb +100 -0
  43. data/lib/stagehand/models/session_start_params.rb +762 -0
  44. data/lib/stagehand/models/session_start_response.rb +55 -0
  45. data/lib/stagehand/models/stream_event.rb +120 -0
  46. data/lib/stagehand/models.rb +63 -0
  47. data/lib/stagehand/request_options.rb +77 -0
  48. data/lib/stagehand/resources/sessions.rb +488 -0
  49. data/lib/stagehand/version.rb +3 -1
  50. data/lib/stagehand.rb +74 -29
  51. data/manifest.yaml +17 -0
  52. data/rbi/stagehand/client.rbi +89 -0
  53. data/rbi/stagehand/errors.rbi +205 -0
  54. data/rbi/stagehand/file_part.rbi +37 -0
  55. data/rbi/stagehand/internal/stream.rbi +20 -0
  56. data/rbi/stagehand/internal/transport/base_client.rbi +314 -0
  57. data/rbi/stagehand/internal/transport/pooled_net_requester.rbi +83 -0
  58. data/rbi/stagehand/internal/type/array_of.rbi +104 -0
  59. data/rbi/stagehand/internal/type/base_model.rbi +308 -0
  60. data/rbi/stagehand/internal/type/base_page.rbi +42 -0
  61. data/rbi/stagehand/internal/type/base_stream.rbi +75 -0
  62. data/rbi/stagehand/internal/type/boolean.rbi +58 -0
  63. data/rbi/stagehand/internal/type/converter.rbi +216 -0
  64. data/rbi/stagehand/internal/type/enum.rbi +82 -0
  65. data/rbi/stagehand/internal/type/file_input.rbi +59 -0
  66. data/rbi/stagehand/internal/type/hash_of.rbi +104 -0
  67. data/rbi/stagehand/internal/type/request_parameters.rbi +29 -0
  68. data/rbi/stagehand/internal/type/union.rbi +128 -0
  69. data/rbi/stagehand/internal/type/unknown.rbi +58 -0
  70. data/rbi/stagehand/internal/util.rbi +487 -0
  71. data/rbi/stagehand/internal.rbi +18 -0
  72. data/rbi/stagehand/models/action.rbi +77 -0
  73. data/rbi/stagehand/models/model_config.rbi +94 -0
  74. data/rbi/stagehand/models/session_act_params.rbi +204 -0
  75. data/rbi/stagehand/models/session_act_response.rbi +250 -0
  76. data/rbi/stagehand/models/session_end_params.rbi +87 -0
  77. data/rbi/stagehand/models/session_end_response.rbi +30 -0
  78. data/rbi/stagehand/models/session_execute_params.rbi +440 -0
  79. data/rbi/stagehand/models/session_execute_response.rbi +414 -0
  80. data/rbi/stagehand/models/session_extract_params.rbi +209 -0
  81. data/rbi/stagehand/models/session_extract_response.rbi +91 -0
  82. data/rbi/stagehand/models/session_navigate_params.rbi +240 -0
  83. data/rbi/stagehand/models/session_navigate_response.rbi +91 -0
  84. data/rbi/stagehand/models/session_observe_params.rbi +198 -0
  85. data/rbi/stagehand/models/session_observe_response.rbi +184 -0
  86. data/rbi/stagehand/models/session_replay_params.rbi +89 -0
  87. data/rbi/stagehand/models/session_replay_response.rbi +286 -0
  88. data/rbi/stagehand/models/session_start_params.rbi +1703 -0
  89. data/rbi/stagehand/models/session_start_response.rbi +102 -0
  90. data/rbi/stagehand/models/stream_event.rbi +237 -0
  91. data/rbi/stagehand/models.rbi +25 -0
  92. data/rbi/stagehand/request_options.rbi +59 -0
  93. data/rbi/stagehand/resources/sessions.rbi +421 -0
  94. data/rbi/stagehand/version.rbi +5 -0
  95. data/sig/stagehand/client.rbs +41 -0
  96. data/sig/stagehand/errors.rbs +117 -0
  97. data/sig/stagehand/file_part.rbs +21 -0
  98. data/sig/stagehand/internal/stream.rbs +9 -0
  99. data/sig/stagehand/internal/transport/base_client.rbs +133 -0
  100. data/sig/stagehand/internal/transport/pooled_net_requester.rbs +48 -0
  101. data/sig/stagehand/internal/type/array_of.rbs +48 -0
  102. data/sig/stagehand/internal/type/base_model.rbs +102 -0
  103. data/sig/stagehand/internal/type/base_page.rbs +24 -0
  104. data/sig/stagehand/internal/type/base_stream.rbs +38 -0
  105. data/sig/stagehand/internal/type/boolean.rbs +26 -0
  106. data/sig/stagehand/internal/type/converter.rbs +79 -0
  107. data/sig/stagehand/internal/type/enum.rbs +32 -0
  108. data/sig/stagehand/internal/type/file_input.rbs +25 -0
  109. data/sig/stagehand/internal/type/hash_of.rbs +48 -0
  110. data/sig/stagehand/internal/type/request_parameters.rbs +19 -0
  111. data/sig/stagehand/internal/type/union.rbs +52 -0
  112. data/sig/stagehand/internal/type/unknown.rbs +26 -0
  113. data/sig/stagehand/internal/util.rbs +185 -0
  114. data/sig/stagehand/internal.rbs +9 -0
  115. data/sig/stagehand/models/action.rbs +46 -0
  116. data/sig/stagehand/models/model_config.rbs +56 -0
  117. data/sig/stagehand/models/session_act_params.rbs +111 -0
  118. data/sig/stagehand/models/session_act_response.rbs +121 -0
  119. data/sig/stagehand/models/session_end_params.rbs +41 -0
  120. data/sig/stagehand/models/session_end_response.rbs +13 -0
  121. data/sig/stagehand/models/session_execute_params.rbs +193 -0
  122. data/sig/stagehand/models/session_execute_response.rbs +215 -0
  123. data/sig/stagehand/models/session_extract_params.rbs +112 -0
  124. data/sig/stagehand/models/session_extract_response.rbs +36 -0
  125. data/sig/stagehand/models/session_navigate_params.rbs +114 -0
  126. data/sig/stagehand/models/session_navigate_response.rbs +36 -0
  127. data/sig/stagehand/models/session_observe_params.rbs +105 -0
  128. data/sig/stagehand/models/session_observe_response.rbs +89 -0
  129. data/sig/stagehand/models/session_replay_params.rbs +41 -0
  130. data/sig/stagehand/models/session_replay_response.rbs +137 -0
  131. data/sig/stagehand/models/session_start_params.rbs +866 -0
  132. data/sig/stagehand/models/session_start_response.rbs +44 -0
  133. data/sig/stagehand/models/stream_event.rbs +109 -0
  134. data/sig/stagehand/models.rbs +23 -0
  135. data/sig/stagehand/request_options.rbs +34 -0
  136. data/sig/stagehand/resources/sessions.rbs +121 -0
  137. data/sig/stagehand/version.rbs +3 -0
  138. metadata +170 -54
  139. data/.gitignore +0 -16
  140. data/Gemfile +0 -4
  141. data/Rakefile +0 -10
  142. data/lib/stagehand/client/oauth.rb +0 -32
  143. data/lib/stagehand/client/user.rb +0 -10
  144. data/lib/stagehand/rack/middleware.rb +0 -33
  145. data/lib/stagehand/railtie.rb +0 -19
  146. data/spec/spec_helper.rb +0 -7
  147. data/spec/stagehand_spec.rb +0 -44
  148. data/stagehand.gemspec +0 -25
@@ -0,0 +1,89 @@
1
+ # typed: strong
2
+
3
+ module Stagehand
4
+ class Client < Stagehand::Internal::Transport::BaseClient
5
+ DEFAULT_MAX_RETRIES = 2
6
+
7
+ DEFAULT_TIMEOUT_IN_SECONDS = T.let(60.0, Float)
8
+
9
+ DEFAULT_INITIAL_RETRY_DELAY = T.let(0.5, Float)
10
+
11
+ DEFAULT_MAX_RETRY_DELAY = T.let(8.0, Float)
12
+
13
+ # Your [Browserbase API Key](https://www.browserbase.com/settings)
14
+ sig { returns(String) }
15
+ attr_reader :browserbase_api_key
16
+
17
+ # Your [Browserbase Project ID](https://www.browserbase.com/settings)
18
+ sig { returns(String) }
19
+ attr_reader :browserbase_project_id
20
+
21
+ # Your LLM provider API key (e.g. OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.)
22
+ sig { returns(String) }
23
+ attr_reader :model_api_key
24
+
25
+ sig { returns(Stagehand::Resources::Sessions) }
26
+ attr_reader :sessions
27
+
28
+ # @api private
29
+ sig { override.returns(T::Hash[String, String]) }
30
+ private def auth_headers
31
+ end
32
+
33
+ # @api private
34
+ sig { returns(T::Hash[String, String]) }
35
+ private def bb_api_key_auth
36
+ end
37
+
38
+ # @api private
39
+ sig { returns(T::Hash[String, String]) }
40
+ private def bb_project_id_auth
41
+ end
42
+
43
+ # @api private
44
+ sig { returns(T::Hash[String, String]) }
45
+ private def llm_model_api_key_auth
46
+ end
47
+
48
+ # Creates and returns a new client for interacting with the API.
49
+ sig do
50
+ params(
51
+ browserbase_api_key: T.nilable(String),
52
+ browserbase_project_id: T.nilable(String),
53
+ model_api_key: T.nilable(String),
54
+ server: String,
55
+ base_url: T.nilable(String),
56
+ max_retries: Integer,
57
+ timeout: Float,
58
+ initial_retry_delay: Float,
59
+ max_retry_delay: Float
60
+ ).returns(T.attached_class)
61
+ end
62
+ def self.new(
63
+ # Your [Browserbase API Key](https://www.browserbase.com/settings) Defaults to
64
+ # `ENV["BROWSERBASE_API_KEY"]`
65
+ browserbase_api_key: ENV["BROWSERBASE_API_KEY"],
66
+ # Your [Browserbase Project ID](https://www.browserbase.com/settings) Defaults to
67
+ # `ENV["BROWSERBASE_PROJECT_ID"]`
68
+ browserbase_project_id: ENV["BROWSERBASE_PROJECT_ID"],
69
+ # Your LLM provider API key (e.g. OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.)
70
+ # Defaults to `ENV["MODEL_API_KEY"]`
71
+ model_api_key: ENV["MODEL_API_KEY"],
72
+ # Server mode to use ("remote" or "local"). Defaults to "remote"
73
+ server: "remote",
74
+ # Override the default base URL for the API, e.g.,
75
+ # `"https://api.example.com/v2/"`. Defaults to `ENV["STAGEHAND_BASE_URL"]`
76
+ base_url: ENV["STAGEHAND_BASE_URL"],
77
+ # Max number of retries to attempt after a failed retryable request.
78
+ max_retries: Stagehand::Client::DEFAULT_MAX_RETRIES,
79
+ timeout: Stagehand::Client::DEFAULT_TIMEOUT_IN_SECONDS,
80
+ initial_retry_delay: Stagehand::Client::DEFAULT_INITIAL_RETRY_DELAY,
81
+ max_retry_delay: Stagehand::Client::DEFAULT_MAX_RETRY_DELAY
82
+ )
83
+ end
84
+
85
+ sig { void }
86
+ def close
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,205 @@
1
+ # typed: strong
2
+
3
+ module Stagehand
4
+ module Errors
5
+ class Error < StandardError
6
+ sig { returns(T.nilable(StandardError)) }
7
+ attr_accessor :cause
8
+ end
9
+
10
+ class ConversionError < Stagehand::Errors::Error
11
+ sig { returns(T.nilable(StandardError)) }
12
+ def cause
13
+ end
14
+
15
+ # @api private
16
+ sig do
17
+ params(
18
+ on: T::Class[StandardError],
19
+ method: Symbol,
20
+ target: T.anything,
21
+ value: T.anything,
22
+ cause: T.nilable(StandardError)
23
+ ).returns(T.attached_class)
24
+ end
25
+ def self.new(on:, method:, target:, value:, cause: nil)
26
+ end
27
+ end
28
+
29
+ class APIError < Stagehand::Errors::Error
30
+ sig { returns(URI::Generic) }
31
+ attr_accessor :url
32
+
33
+ sig { returns(T.nilable(Integer)) }
34
+ attr_accessor :status
35
+
36
+ sig { returns(T.nilable(T::Hash[String, String])) }
37
+ attr_accessor :headers
38
+
39
+ sig { returns(T.nilable(T.anything)) }
40
+ attr_accessor :body
41
+
42
+ # @api private
43
+ sig do
44
+ params(
45
+ url: URI::Generic,
46
+ status: T.nilable(Integer),
47
+ headers: T.nilable(T::Hash[String, String]),
48
+ body: T.nilable(Object),
49
+ request: NilClass,
50
+ response: NilClass,
51
+ message: T.nilable(String)
52
+ ).returns(T.attached_class)
53
+ end
54
+ def self.new(
55
+ url:,
56
+ status: nil,
57
+ headers: nil,
58
+ body: nil,
59
+ request: nil,
60
+ response: nil,
61
+ message: nil
62
+ )
63
+ end
64
+ end
65
+
66
+ class APIConnectionError < Stagehand::Errors::APIError
67
+ sig { returns(NilClass) }
68
+ attr_accessor :status
69
+
70
+ sig { returns(NilClass) }
71
+ attr_accessor :body
72
+
73
+ # @api private
74
+ sig do
75
+ params(
76
+ url: URI::Generic,
77
+ status: NilClass,
78
+ headers: T.nilable(T::Hash[String, String]),
79
+ body: NilClass,
80
+ request: NilClass,
81
+ response: NilClass,
82
+ message: T.nilable(String)
83
+ ).returns(T.attached_class)
84
+ end
85
+ def self.new(
86
+ url:,
87
+ status: nil,
88
+ headers: nil,
89
+ body: nil,
90
+ request: nil,
91
+ response: nil,
92
+ message: "Connection error."
93
+ )
94
+ end
95
+ end
96
+
97
+ class APITimeoutError < Stagehand::Errors::APIConnectionError
98
+ # @api private
99
+ sig do
100
+ params(
101
+ url: URI::Generic,
102
+ status: NilClass,
103
+ headers: T.nilable(T::Hash[String, String]),
104
+ body: NilClass,
105
+ request: NilClass,
106
+ response: NilClass,
107
+ message: T.nilable(String)
108
+ ).returns(T.attached_class)
109
+ end
110
+ def self.new(
111
+ url:,
112
+ status: nil,
113
+ headers: nil,
114
+ body: nil,
115
+ request: nil,
116
+ response: nil,
117
+ message: "Request timed out."
118
+ )
119
+ end
120
+ end
121
+
122
+ class APIStatusError < Stagehand::Errors::APIError
123
+ # @api private
124
+ sig do
125
+ params(
126
+ url: URI::Generic,
127
+ status: Integer,
128
+ headers: T.nilable(T::Hash[String, String]),
129
+ body: T.nilable(Object),
130
+ request: NilClass,
131
+ response: NilClass,
132
+ message: T.nilable(String)
133
+ ).returns(T.attached_class)
134
+ end
135
+ def self.for(
136
+ url:,
137
+ status:,
138
+ headers:,
139
+ body:,
140
+ request:,
141
+ response:,
142
+ message: nil
143
+ )
144
+ end
145
+
146
+ sig { returns(Integer) }
147
+ attr_accessor :status
148
+
149
+ # @api private
150
+ sig do
151
+ params(
152
+ url: URI::Generic,
153
+ status: Integer,
154
+ headers: T.nilable(T::Hash[String, String]),
155
+ body: T.nilable(Object),
156
+ request: NilClass,
157
+ response: NilClass,
158
+ message: T.nilable(String)
159
+ ).returns(T.attached_class)
160
+ end
161
+ def self.new(
162
+ url:,
163
+ status:,
164
+ headers:,
165
+ body:,
166
+ request:,
167
+ response:,
168
+ message: nil
169
+ )
170
+ end
171
+ end
172
+
173
+ class BadRequestError < Stagehand::Errors::APIStatusError
174
+ HTTP_STATUS = 400
175
+ end
176
+
177
+ class AuthenticationError < Stagehand::Errors::APIStatusError
178
+ HTTP_STATUS = 401
179
+ end
180
+
181
+ class PermissionDeniedError < Stagehand::Errors::APIStatusError
182
+ HTTP_STATUS = 403
183
+ end
184
+
185
+ class NotFoundError < Stagehand::Errors::APIStatusError
186
+ HTTP_STATUS = 404
187
+ end
188
+
189
+ class ConflictError < Stagehand::Errors::APIStatusError
190
+ HTTP_STATUS = 409
191
+ end
192
+
193
+ class UnprocessableEntityError < Stagehand::Errors::APIStatusError
194
+ HTTP_STATUS = 422
195
+ end
196
+
197
+ class RateLimitError < Stagehand::Errors::APIStatusError
198
+ HTTP_STATUS = 429
199
+ end
200
+
201
+ class InternalServerError < Stagehand::Errors::APIStatusError
202
+ HTTP_STATUS = T.let((500..), T::Range[Integer])
203
+ end
204
+ end
205
+ end
@@ -0,0 +1,37 @@
1
+ # typed: strong
2
+
3
+ module Stagehand
4
+ class FilePart
5
+ sig { returns(T.any(Pathname, StringIO, IO, String)) }
6
+ attr_reader :content
7
+
8
+ sig { returns(T.nilable(String)) }
9
+ attr_reader :content_type
10
+
11
+ sig { returns(T.nilable(String)) }
12
+ attr_reader :filename
13
+
14
+ # @api private
15
+ sig { returns(String) }
16
+ private def read
17
+ end
18
+
19
+ sig { params(a: T.anything).returns(String) }
20
+ def to_json(*a)
21
+ end
22
+
23
+ sig { params(a: T.anything).returns(String) }
24
+ def to_yaml(*a)
25
+ end
26
+
27
+ sig do
28
+ params(
29
+ content: T.any(Pathname, StringIO, IO, String),
30
+ filename: T.nilable(T.any(Pathname, String)),
31
+ content_type: T.nilable(String)
32
+ ).returns(T.attached_class)
33
+ end
34
+ def self.new(content, filename: nil, content_type: nil)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ # typed: strong
2
+
3
+ module Stagehand
4
+ module Internal
5
+ class Stream
6
+ Message =
7
+ type_member(:in) do
8
+ { fixed: Stagehand::Internal::Util::ServerSentEvent }
9
+ end
10
+ Elem = type_member(:out)
11
+
12
+ include Stagehand::Internal::Type::BaseStream
13
+
14
+ # @api private
15
+ sig { override.returns(T::Enumerable[Elem]) }
16
+ private def iterator
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,314 @@
1
+ # typed: strong
2
+
3
+ module Stagehand
4
+ module Internal
5
+ module Transport
6
+ # @api private
7
+ class BaseClient
8
+ extend Stagehand::Internal::Util::SorbetRuntimeSupport
9
+
10
+ abstract!
11
+
12
+ RequestComponents =
13
+ T.type_alias do
14
+ {
15
+ method: Symbol,
16
+ path: T.any(String, T::Array[String]),
17
+ query:
18
+ T.nilable(
19
+ T::Hash[String, T.nilable(T.any(T::Array[String], String))]
20
+ ),
21
+ headers:
22
+ T.nilable(
23
+ T::Hash[
24
+ String,
25
+ T.nilable(
26
+ T.any(
27
+ String,
28
+ Integer,
29
+ T::Array[T.nilable(T.any(String, Integer))]
30
+ )
31
+ )
32
+ ]
33
+ ),
34
+ body: T.nilable(T.anything),
35
+ unwrap:
36
+ T.nilable(
37
+ T.any(
38
+ Symbol,
39
+ Integer,
40
+ T::Array[T.any(Symbol, Integer)],
41
+ T.proc.params(arg0: T.anything).returns(T.anything)
42
+ )
43
+ ),
44
+ page:
45
+ T.nilable(
46
+ T::Class[
47
+ Stagehand::Internal::Type::BasePage[
48
+ Stagehand::Internal::Type::BaseModel
49
+ ]
50
+ ]
51
+ ),
52
+ stream:
53
+ T.nilable(
54
+ T::Class[
55
+ Stagehand::Internal::Type::BaseStream[
56
+ T.anything,
57
+ Stagehand::Internal::Type::BaseModel
58
+ ]
59
+ ]
60
+ ),
61
+ model: T.nilable(Stagehand::Internal::Type::Converter::Input),
62
+ options: T.nilable(Stagehand::RequestOptions::OrHash)
63
+ }
64
+ end
65
+
66
+ RequestInput =
67
+ T.type_alias do
68
+ {
69
+ method: Symbol,
70
+ url: URI::Generic,
71
+ headers: T::Hash[String, String],
72
+ body: T.anything,
73
+ max_retries: Integer,
74
+ timeout: Float
75
+ }
76
+ end
77
+
78
+ # from whatwg fetch spec
79
+ MAX_REDIRECTS = 20
80
+
81
+ PLATFORM_HEADERS = T::Hash[String, String]
82
+
83
+ class << self
84
+ # @api private
85
+ sig do
86
+ params(
87
+ req: Stagehand::Internal::Transport::BaseClient::RequestComponents
88
+ ).void
89
+ end
90
+ def validate!(req)
91
+ end
92
+
93
+ # @api private
94
+ sig do
95
+ params(status: Integer, headers: T::Hash[String, String]).returns(
96
+ T::Boolean
97
+ )
98
+ end
99
+ def should_retry?(status, headers:)
100
+ end
101
+
102
+ # @api private
103
+ sig do
104
+ params(
105
+ request: Stagehand::Internal::Transport::BaseClient::RequestInput,
106
+ status: Integer,
107
+ response_headers: T::Hash[String, String]
108
+ ).returns(Stagehand::Internal::Transport::BaseClient::RequestInput)
109
+ end
110
+ def follow_redirect(request, status:, response_headers:)
111
+ end
112
+
113
+ # @api private
114
+ sig do
115
+ params(
116
+ status: T.any(Integer, Stagehand::Errors::APIConnectionError),
117
+ stream: T.nilable(T::Enumerable[String])
118
+ ).void
119
+ end
120
+ def reap_connection!(status, stream:)
121
+ end
122
+ end
123
+
124
+ sig { returns(URI::Generic) }
125
+ attr_reader :base_url
126
+
127
+ sig { returns(Float) }
128
+ attr_reader :timeout
129
+
130
+ sig { returns(Integer) }
131
+ attr_reader :max_retries
132
+
133
+ sig { returns(Float) }
134
+ attr_reader :initial_retry_delay
135
+
136
+ sig { returns(Float) }
137
+ attr_reader :max_retry_delay
138
+
139
+ sig { returns(T::Hash[String, String]) }
140
+ attr_reader :headers
141
+
142
+ sig { returns(T.nilable(String)) }
143
+ attr_reader :idempotency_header
144
+
145
+ # @api private
146
+ sig { returns(Stagehand::Internal::Transport::PooledNetRequester) }
147
+ attr_reader :requester
148
+
149
+ # @api private
150
+ sig do
151
+ params(
152
+ base_url: String,
153
+ timeout: Float,
154
+ max_retries: Integer,
155
+ initial_retry_delay: Float,
156
+ max_retry_delay: Float,
157
+ headers:
158
+ T::Hash[
159
+ String,
160
+ T.nilable(
161
+ T.any(
162
+ String,
163
+ Integer,
164
+ T::Array[T.nilable(T.any(String, Integer))]
165
+ )
166
+ )
167
+ ],
168
+ idempotency_header: T.nilable(String)
169
+ ).returns(T.attached_class)
170
+ end
171
+ def self.new(
172
+ base_url:,
173
+ timeout: 0.0,
174
+ max_retries: 0,
175
+ initial_retry_delay: 0.0,
176
+ max_retry_delay: 0.0,
177
+ headers: {},
178
+ idempotency_header: nil
179
+ )
180
+ end
181
+
182
+ # @api private
183
+ sig { overridable.returns(T::Hash[String, String]) }
184
+ private def auth_headers
185
+ end
186
+
187
+ # @api private
188
+ sig { returns(String) }
189
+ private def user_agent
190
+ end
191
+
192
+ # @api private
193
+ sig { returns(String) }
194
+ private def generate_idempotency_key
195
+ end
196
+
197
+ # @api private
198
+ sig do
199
+ overridable
200
+ .params(
201
+ req:
202
+ Stagehand::Internal::Transport::BaseClient::RequestComponents,
203
+ opts: Stagehand::Internal::AnyHash
204
+ )
205
+ .returns(Stagehand::Internal::Transport::BaseClient::RequestInput)
206
+ end
207
+ private def build_request(req, opts)
208
+ end
209
+
210
+ # @api private
211
+ sig do
212
+ params(
213
+ headers: T::Hash[String, String],
214
+ retry_count: Integer
215
+ ).returns(Float)
216
+ end
217
+ private def retry_delay(headers, retry_count:)
218
+ end
219
+
220
+ # @api private
221
+ sig do
222
+ params(
223
+ request: Stagehand::Internal::Transport::BaseClient::RequestInput,
224
+ redirect_count: Integer,
225
+ retry_count: Integer,
226
+ send_retry_header: T::Boolean
227
+ ).returns([Integer, Net::HTTPResponse, T::Enumerable[String]])
228
+ end
229
+ def send_request(
230
+ request,
231
+ redirect_count:,
232
+ retry_count:,
233
+ send_retry_header:
234
+ )
235
+ end
236
+
237
+ # Execute the request specified by `req`. This is the method that all resource
238
+ # methods call into.
239
+ #
240
+ # @overload request(method, path, query: {}, headers: {}, body: nil, unwrap: nil, page: nil, stream: nil, model: Stagehand::Internal::Type::Unknown, options: {})
241
+ sig do
242
+ params(
243
+ method: Symbol,
244
+ path: T.any(String, T::Array[String]),
245
+ query:
246
+ T.nilable(
247
+ T::Hash[String, T.nilable(T.any(T::Array[String], String))]
248
+ ),
249
+ headers:
250
+ T.nilable(
251
+ T::Hash[
252
+ String,
253
+ T.nilable(
254
+ T.any(
255
+ String,
256
+ Integer,
257
+ T::Array[T.nilable(T.any(String, Integer))]
258
+ )
259
+ )
260
+ ]
261
+ ),
262
+ body: T.nilable(T.anything),
263
+ unwrap:
264
+ T.nilable(
265
+ T.any(
266
+ Symbol,
267
+ Integer,
268
+ T::Array[T.any(Symbol, Integer)],
269
+ T.proc.params(arg0: T.anything).returns(T.anything)
270
+ )
271
+ ),
272
+ page:
273
+ T.nilable(
274
+ T::Class[
275
+ Stagehand::Internal::Type::BasePage[
276
+ Stagehand::Internal::Type::BaseModel
277
+ ]
278
+ ]
279
+ ),
280
+ stream:
281
+ T.nilable(
282
+ T::Class[
283
+ Stagehand::Internal::Type::BaseStream[
284
+ T.anything,
285
+ Stagehand::Internal::Type::BaseModel
286
+ ]
287
+ ]
288
+ ),
289
+ model: T.nilable(Stagehand::Internal::Type::Converter::Input),
290
+ options: T.nilable(Stagehand::RequestOptions::OrHash)
291
+ ).returns(T.anything)
292
+ end
293
+ def request(
294
+ method,
295
+ path,
296
+ query: {},
297
+ headers: {},
298
+ body: nil,
299
+ unwrap: nil,
300
+ page: nil,
301
+ stream: nil,
302
+ model: Stagehand::Internal::Type::Unknown,
303
+ options: {}
304
+ )
305
+ end
306
+
307
+ # @api private
308
+ sig { returns(String) }
309
+ def inspect
310
+ end
311
+ end
312
+ end
313
+ end
314
+ end