Skip to content

Commit 3f3c1fa

Browse files
feat: [STG-2090] Add Azure Entra model auth support
1 parent 498a0bd commit 3f3c1fa

7 files changed

Lines changed: 18003 additions & 1687 deletions

File tree

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 8
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-c7910965e66e73ad8b65b6cc391d431094b2a6c6577c3e9d82feaa8138e74cff.yml
3-
openapi_spec_hash: 37748bb69c22a9ce721d9b5a5861f964
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase/stagehand-4d0d50b4f18fd74f58aca0b84d6968d1228499f2fa4e5714516f13ff6f820c9d.yml
3+
openapi_spec_hash: f7b1a869f3e412aea4d4bd42467791bb
44
config_hash: 1fb12ae9b478488bc1e56bfbdc210b01

stagehand-java-core/src/main/kotlin/com/browserbase/api/models/sessions/ModelConfig.kt

Lines changed: 2550 additions & 1 deletion
Large diffs are not rendered by default.

stagehand-java-core/src/main/kotlin/com/browserbase/api/models/sessions/SessionActParams.kt

Lines changed: 2715 additions & 1 deletion
Large diffs are not rendered by default.

stagehand-java-core/src/main/kotlin/com/browserbase/api/models/sessions/SessionExecuteParams.kt

Lines changed: 7125 additions & 1681 deletions
Large diffs are not rendered by default.

stagehand-java-core/src/main/kotlin/com/browserbase/api/models/sessions/SessionExtractParams.kt

Lines changed: 2715 additions & 1 deletion
Large diffs are not rendered by default.

stagehand-java-core/src/main/kotlin/com/browserbase/api/models/sessions/SessionObserveParams.kt

Lines changed: 2715 additions & 1 deletion
Large diffs are not rendered by default.

stagehand-java-core/src/test/kotlin/com/browserbase/api/models/sessions/ModelConfigTest.kt

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ internal class ModelConfigTest {
7474
val modelConfig = ModelConfig.ofVertexModelConfigObject(vertexModelConfigObject)
7575

7676
assertThat(modelConfig.vertexModelConfigObject()).contains(vertexModelConfigObject)
77+
assertThat(modelConfig.azureEntraModelConfigObject()).isEmpty
78+
assertThat(modelConfig.azureApiKeyModelConfigObject()).isEmpty
7779
assertThat(modelConfig.genericModelConfigObject()).isEmpty
7880
}
7981

@@ -146,6 +148,183 @@ internal class ModelConfigTest {
146148
assertThat(roundtrippedModelConfig).isEqualTo(modelConfig)
147149
}
148150

151+
@Test
152+
fun ofAzureEntraModelConfigObject() {
153+
val azureEntraModelConfigObject =
154+
ModelConfig.AzureEntraModelConfigObject.builder()
155+
.auth(ModelConfig.AzureEntraModelConfigObject.Auth.builder().token("x").build())
156+
.modelName("openai/gpt-5.4-mini")
157+
.providerOptions(
158+
ModelConfig.AzureEntraModelConfigObject.ProviderOptions.builder()
159+
.azure(
160+
ModelConfig.AzureEntraModelConfigObject.ProviderOptions.Azure.builder()
161+
.apiVersion("2024-10-01-preview")
162+
.baseUrl("https://example.com")
163+
.headers(
164+
ModelConfig.AzureEntraModelConfigObject.ProviderOptions.Azure
165+
.Headers
166+
.builder()
167+
.putAdditionalProperty("foo", JsonValue.from("string"))
168+
.build()
169+
)
170+
.resourceName("my-azure-openai-resource")
171+
.useDeploymentBasedUrls(true)
172+
.build()
173+
)
174+
.build()
175+
)
176+
.baseUrl("https://api.openai.com/v1")
177+
.headers(
178+
ModelConfig.AzureEntraModelConfigObject.Headers.builder()
179+
.putAdditionalProperty("foo", JsonValue.from("string"))
180+
.build()
181+
)
182+
.build()
183+
184+
val modelConfig = ModelConfig.ofAzureEntraModelConfigObject(azureEntraModelConfigObject)
185+
186+
assertThat(modelConfig.vertexModelConfigObject()).isEmpty
187+
assertThat(modelConfig.azureEntraModelConfigObject()).contains(azureEntraModelConfigObject)
188+
assertThat(modelConfig.azureApiKeyModelConfigObject()).isEmpty
189+
assertThat(modelConfig.genericModelConfigObject()).isEmpty
190+
}
191+
192+
@Test
193+
fun ofAzureEntraModelConfigObjectRoundtrip() {
194+
val jsonMapper = jsonMapper()
195+
val modelConfig =
196+
ModelConfig.ofAzureEntraModelConfigObject(
197+
ModelConfig.AzureEntraModelConfigObject.builder()
198+
.auth(ModelConfig.AzureEntraModelConfigObject.Auth.builder().token("x").build())
199+
.modelName("openai/gpt-5.4-mini")
200+
.providerOptions(
201+
ModelConfig.AzureEntraModelConfigObject.ProviderOptions.builder()
202+
.azure(
203+
ModelConfig.AzureEntraModelConfigObject.ProviderOptions.Azure
204+
.builder()
205+
.apiVersion("2024-10-01-preview")
206+
.baseUrl("https://example.com")
207+
.headers(
208+
ModelConfig.AzureEntraModelConfigObject.ProviderOptions
209+
.Azure
210+
.Headers
211+
.builder()
212+
.putAdditionalProperty("foo", JsonValue.from("string"))
213+
.build()
214+
)
215+
.resourceName("my-azure-openai-resource")
216+
.useDeploymentBasedUrls(true)
217+
.build()
218+
)
219+
.build()
220+
)
221+
.baseUrl("https://api.openai.com/v1")
222+
.headers(
223+
ModelConfig.AzureEntraModelConfigObject.Headers.builder()
224+
.putAdditionalProperty("foo", JsonValue.from("string"))
225+
.build()
226+
)
227+
.build()
228+
)
229+
230+
val roundtrippedModelConfig =
231+
jsonMapper.readValue(
232+
jsonMapper.writeValueAsString(modelConfig),
233+
jacksonTypeRef<ModelConfig>(),
234+
)
235+
236+
assertThat(roundtrippedModelConfig).isEqualTo(modelConfig)
237+
}
238+
239+
@Test
240+
fun ofAzureApiKeyModelConfigObject() {
241+
val azureApiKeyModelConfigObject =
242+
ModelConfig.AzureApiKeyModelConfigObject.builder()
243+
.modelName("openai/gpt-5.4-mini")
244+
.providerOptions(
245+
ModelConfig.AzureApiKeyModelConfigObject.ProviderOptions.builder()
246+
.azure(
247+
ModelConfig.AzureApiKeyModelConfigObject.ProviderOptions.Azure.builder()
248+
.apiVersion("2024-10-01-preview")
249+
.baseUrl("https://example.com")
250+
.headers(
251+
ModelConfig.AzureApiKeyModelConfigObject.ProviderOptions.Azure
252+
.Headers
253+
.builder()
254+
.putAdditionalProperty("foo", JsonValue.from("string"))
255+
.build()
256+
)
257+
.resourceName("my-azure-openai-resource")
258+
.useDeploymentBasedUrls(true)
259+
.build()
260+
)
261+
.build()
262+
)
263+
.apiKey("sk-some-openai-api-key")
264+
.baseUrl("https://api.openai.com/v1")
265+
.headers(
266+
ModelConfig.AzureApiKeyModelConfigObject.Headers.builder()
267+
.putAdditionalProperty("foo", JsonValue.from("string"))
268+
.build()
269+
)
270+
.build()
271+
272+
val modelConfig = ModelConfig.ofAzureApiKeyModelConfigObject(azureApiKeyModelConfigObject)
273+
274+
assertThat(modelConfig.vertexModelConfigObject()).isEmpty
275+
assertThat(modelConfig.azureEntraModelConfigObject()).isEmpty
276+
assertThat(modelConfig.azureApiKeyModelConfigObject())
277+
.contains(azureApiKeyModelConfigObject)
278+
assertThat(modelConfig.genericModelConfigObject()).isEmpty
279+
}
280+
281+
@Test
282+
fun ofAzureApiKeyModelConfigObjectRoundtrip() {
283+
val jsonMapper = jsonMapper()
284+
val modelConfig =
285+
ModelConfig.ofAzureApiKeyModelConfigObject(
286+
ModelConfig.AzureApiKeyModelConfigObject.builder()
287+
.modelName("openai/gpt-5.4-mini")
288+
.providerOptions(
289+
ModelConfig.AzureApiKeyModelConfigObject.ProviderOptions.builder()
290+
.azure(
291+
ModelConfig.AzureApiKeyModelConfigObject.ProviderOptions.Azure
292+
.builder()
293+
.apiVersion("2024-10-01-preview")
294+
.baseUrl("https://example.com")
295+
.headers(
296+
ModelConfig.AzureApiKeyModelConfigObject.ProviderOptions
297+
.Azure
298+
.Headers
299+
.builder()
300+
.putAdditionalProperty("foo", JsonValue.from("string"))
301+
.build()
302+
)
303+
.resourceName("my-azure-openai-resource")
304+
.useDeploymentBasedUrls(true)
305+
.build()
306+
)
307+
.build()
308+
)
309+
.apiKey("sk-some-openai-api-key")
310+
.baseUrl("https://api.openai.com/v1")
311+
.headers(
312+
ModelConfig.AzureApiKeyModelConfigObject.Headers.builder()
313+
.putAdditionalProperty("foo", JsonValue.from("string"))
314+
.build()
315+
)
316+
.build()
317+
)
318+
319+
val roundtrippedModelConfig =
320+
jsonMapper.readValue(
321+
jsonMapper.writeValueAsString(modelConfig),
322+
jacksonTypeRef<ModelConfig>(),
323+
)
324+
325+
assertThat(roundtrippedModelConfig).isEqualTo(modelConfig)
326+
}
327+
149328
@Test
150329
fun ofGenericModelConfigObject() {
151330
val genericModelConfigObject =
@@ -164,6 +343,8 @@ internal class ModelConfigTest {
164343
val modelConfig = ModelConfig.ofGenericModelConfigObject(genericModelConfigObject)
165344

166345
assertThat(modelConfig.vertexModelConfigObject()).isEmpty
346+
assertThat(modelConfig.azureEntraModelConfigObject()).isEmpty
347+
assertThat(modelConfig.azureApiKeyModelConfigObject()).isEmpty
167348
assertThat(modelConfig.genericModelConfigObject()).contains(genericModelConfigObject)
168349
}
169350

0 commit comments

Comments
 (0)