Skip to content

Commit ec581cf

Browse files
feat: x-stainless-any fix, optional frame id, ModelConfigString fix
1 parent 405811c commit ec581cf

22 files changed

Lines changed: 185 additions & 363 deletions

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 7
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-991d1530002115ecec027f98cad357d39ca1ece6784f62d48e6740b8830e1104.yml
3-
openapi_spec_hash: 303329893ced56b2c129fb9fd666144e
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-07032b695bc66ecd76328d936b41e01cfad508a870928c09c185f5faa5ea66ab.yml
3+
openapi_spec_hash: fca4b895ce36ad547fb015c3dd38821f
44
config_hash: d4df55e4b30aac2d8d0982be97f837c4

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

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,42 +30,43 @@ import java.util.Optional
3030
import kotlin.jvm.optionals.getOrNull
3131

3232
/**
33-
* Model name string with provider prefix (e.g., 'openai/gpt-5-nano', 'anthropic/claude-4.5-opus')
33+
* Model name string with provider prefix. Always use the format 'provider/model-name' (e.g.,
34+
* 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5-20250929', 'google/gemini-2.0-flash')
3435
*/
3536
@JsonDeserialize(using = ModelConfig.Deserializer::class)
3637
@JsonSerialize(using = ModelConfig.Serializer::class)
3738
class ModelConfig
3839
private constructor(
39-
private val name: String? = null,
40+
private val string: String? = null,
4041
private val modelConfigObject: ModelConfigObject? = null,
4142
private val _json: JsonValue? = null,
4243
) {
4344

4445
/**
45-
* Model name string with provider prefix (e.g., 'openai/gpt-5-nano',
46-
* 'anthropic/claude-4.5-opus')
46+
* Model name string with provider prefix. Always use the format 'provider/model-name' (e.g.,
47+
* 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5-20250929', 'google/gemini-2.0-flash')
4748
*/
48-
fun name(): Optional<String> = Optional.ofNullable(name)
49+
fun string(): Optional<String> = Optional.ofNullable(string)
4950

5051
fun modelConfigObject(): Optional<ModelConfigObject> = Optional.ofNullable(modelConfigObject)
5152

52-
fun isName(): Boolean = name != null
53+
fun isString(): Boolean = string != null
5354

5455
fun isModelConfigObject(): Boolean = modelConfigObject != null
5556

5657
/**
57-
* Model name string with provider prefix (e.g., 'openai/gpt-5-nano',
58-
* 'anthropic/claude-4.5-opus')
58+
* Model name string with provider prefix. Always use the format 'provider/model-name' (e.g.,
59+
* 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5-20250929', 'google/gemini-2.0-flash')
5960
*/
60-
fun asName(): String = name.getOrThrow("name")
61+
fun asString(): String = string.getOrThrow("string")
6162

6263
fun asModelConfigObject(): ModelConfigObject = modelConfigObject.getOrThrow("modelConfigObject")
6364

6465
fun _json(): Optional<JsonValue> = Optional.ofNullable(_json)
6566

6667
fun <T> accept(visitor: Visitor<T>): T =
6768
when {
68-
name != null -> visitor.visitName(name)
69+
string != null -> visitor.visitString(string)
6970
modelConfigObject != null -> visitor.visitModelConfigObject(modelConfigObject)
7071
else -> visitor.unknown(_json)
7172
}
@@ -79,7 +80,7 @@ private constructor(
7980

8081
accept(
8182
object : Visitor<Unit> {
82-
override fun visitName(name: String) {}
83+
override fun visitString(string: String) {}
8384

8485
override fun visitModelConfigObject(modelConfigObject: ModelConfigObject) {
8586
modelConfigObject.validate()
@@ -106,7 +107,7 @@ private constructor(
106107
internal fun validity(): Int =
107108
accept(
108109
object : Visitor<Int> {
109-
override fun visitName(name: String) = 1
110+
override fun visitString(string: String) = 1
110111

111112
override fun visitModelConfigObject(modelConfigObject: ModelConfigObject) =
112113
modelConfigObject.validity()
@@ -121,15 +122,15 @@ private constructor(
121122
}
122123

123124
return other is ModelConfig &&
124-
name == other.name &&
125+
string == other.string &&
125126
modelConfigObject == other.modelConfigObject
126127
}
127128

128-
override fun hashCode(): Int = Objects.hash(name, modelConfigObject)
129+
override fun hashCode(): Int = Objects.hash(string, modelConfigObject)
129130

130131
override fun toString(): String =
131132
when {
132-
name != null -> "ModelConfig{name=$name}"
133+
string != null -> "ModelConfig{string=$string}"
133134
modelConfigObject != null -> "ModelConfig{modelConfigObject=$modelConfigObject}"
134135
_json != null -> "ModelConfig{_unknown=$_json}"
135136
else -> throw IllegalStateException("Invalid ModelConfig")
@@ -138,10 +139,11 @@ private constructor(
138139
companion object {
139140

140141
/**
141-
* Model name string with provider prefix (e.g., 'openai/gpt-5-nano',
142-
* 'anthropic/claude-4.5-opus')
142+
* Model name string with provider prefix. Always use the format 'provider/model-name'
143+
* (e.g., 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5-20250929',
144+
* 'google/gemini-2.0-flash')
143145
*/
144-
@JvmStatic fun ofName(name: String) = ModelConfig(name = name)
146+
@JvmStatic fun ofString(string: String) = ModelConfig(string = string)
145147

146148
@JvmStatic
147149
fun ofModelConfigObject(modelConfigObject: ModelConfigObject) =
@@ -154,10 +156,11 @@ private constructor(
154156
interface Visitor<out T> {
155157

156158
/**
157-
* Model name string with provider prefix (e.g., 'openai/gpt-5-nano',
158-
* 'anthropic/claude-4.5-opus')
159+
* Model name string with provider prefix. Always use the format 'provider/model-name'
160+
* (e.g., 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5-20250929',
161+
* 'google/gemini-2.0-flash')
159162
*/
160-
fun visitName(name: String): T
163+
fun visitString(string: String): T
161164

162165
fun visitModelConfigObject(modelConfigObject: ModelConfigObject): T
163166

@@ -186,7 +189,7 @@ private constructor(
186189
ModelConfig(modelConfigObject = it, _json = json)
187190
},
188191
tryDeserialize(node, jacksonTypeRef<String>())?.let {
189-
ModelConfig(name = it, _json = json)
192+
ModelConfig(string = it, _json = json)
190193
},
191194
)
192195
.filterNotNull()
@@ -212,7 +215,7 @@ private constructor(
212215
provider: SerializerProvider,
213216
) {
214217
when {
215-
value.name != null -> generator.writeObject(value.name)
218+
value.string != null -> generator.writeObject(value.string)
216219
value.modelConfigObject != null -> generator.writeObject(value.modelConfigObject)
217220
value._json != null -> generator.writeObject(value._json)
218221
else -> throw IllegalStateException("Invalid ModelConfig")
@@ -243,7 +246,9 @@ private constructor(
243246
) : this(modelName, apiKey, baseUrl, provider, mutableMapOf())
244247

245248
/**
246-
* Model name string (e.g., 'openai/gpt-5-nano', 'anthropic/claude-4.5-opus')
249+
* Model name string with provider prefix. Always use the format 'provider/model-name'
250+
* (e.g., 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5-20250929',
251+
* 'google/gemini-2.0-flash')
247252
*
248253
* @throws StagehandInvalidDataException if the JSON field has an unexpected type or is
249254
* unexpectedly missing or null (e.g. if the server responded with an unexpected value).
@@ -345,7 +350,11 @@ private constructor(
345350
additionalProperties = modelConfigObject.additionalProperties.toMutableMap()
346351
}
347352

348-
/** Model name string (e.g., 'openai/gpt-5-nano', 'anthropic/claude-4.5-opus') */
353+
/**
354+
* Model name string with provider prefix. Always use the format 'provider/model-name'
355+
* (e.g., 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5-20250929',
356+
* 'google/gemini-2.0-flash')
357+
*/
349358
fun modelName(modelName: String) = modelName(JsonField.of(modelName))
350359

351360
/**

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

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ import com.fasterxml.jackson.databind.SerializerProvider
2828
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
2929
import com.fasterxml.jackson.databind.annotation.JsonSerialize
3030
import com.fasterxml.jackson.module.kotlin.jacksonTypeRef
31-
import java.time.OffsetDateTime
32-
import java.time.format.DateTimeFormatter
3331
import java.util.Collections
3432
import java.util.Objects
3533
import java.util.Optional
@@ -39,7 +37,6 @@ import kotlin.jvm.optionals.getOrNull
3937
class SessionActParams
4038
private constructor(
4139
private val id: String?,
42-
private val xSentAt: OffsetDateTime?,
4340
private val xStreamResponse: XStreamResponse?,
4441
private val body: Body,
4542
private val additionalHeaders: Headers,
@@ -49,9 +46,6 @@ private constructor(
4946
/** Unique session identifier */
5047
fun id(): Optional<String> = Optional.ofNullable(id)
5148

52-
/** ISO timestamp when request was sent */
53-
fun xSentAt(): Optional<OffsetDateTime> = Optional.ofNullable(xSentAt)
54-
5549
/** Whether to stream the response via SSE */
5650
fun xStreamResponse(): Optional<XStreamResponse> = Optional.ofNullable(xStreamResponse)
5751

@@ -125,7 +119,6 @@ private constructor(
125119
class Builder internal constructor() {
126120

127121
private var id: String? = null
128-
private var xSentAt: OffsetDateTime? = null
129122
private var xStreamResponse: XStreamResponse? = null
130123
private var body: Body.Builder = Body.builder()
131124
private var additionalHeaders: Headers.Builder = Headers.builder()
@@ -134,7 +127,6 @@ private constructor(
134127
@JvmSynthetic
135128
internal fun from(sessionActParams: SessionActParams) = apply {
136129
id = sessionActParams.id
137-
xSentAt = sessionActParams.xSentAt
138130
xStreamResponse = sessionActParams.xStreamResponse
139131
body = sessionActParams.body.toBuilder()
140132
additionalHeaders = sessionActParams.additionalHeaders.toBuilder()
@@ -147,12 +139,6 @@ private constructor(
147139
/** Alias for calling [Builder.id] with `id.orElse(null)`. */
148140
fun id(id: Optional<String>) = id(id.getOrNull())
149141

150-
/** ISO timestamp when request was sent */
151-
fun xSentAt(xSentAt: OffsetDateTime?) = apply { this.xSentAt = xSentAt }
152-
153-
/** Alias for calling [Builder.xSentAt] with `xSentAt.orElse(null)`. */
154-
fun xSentAt(xSentAt: Optional<OffsetDateTime>) = xSentAt(xSentAt.getOrNull())
155-
156142
/** Whether to stream the response via SSE */
157143
fun xStreamResponse(xStreamResponse: XStreamResponse?) = apply {
158144
this.xStreamResponse = xStreamResponse
@@ -191,7 +177,10 @@ private constructor(
191177
fun input(action: Action) = apply { body.input(action) }
192178

193179
/** Target frame ID for the action */
194-
fun frameId(frameId: String) = apply { body.frameId(frameId) }
180+
fun frameId(frameId: String?) = apply { body.frameId(frameId) }
181+
182+
/** Alias for calling [Builder.frameId] with `frameId.orElse(null)`. */
183+
fun frameId(frameId: Optional<String>) = frameId(frameId.getOrNull())
195184

196185
/**
197186
* Sets [Builder.frameId] to an arbitrary JSON value.
@@ -343,7 +332,6 @@ private constructor(
343332
fun build(): SessionActParams =
344333
SessionActParams(
345334
id,
346-
xSentAt,
347335
xStreamResponse,
348336
body.build(),
349337
additionalHeaders.build(),
@@ -362,7 +350,6 @@ private constructor(
362350
override fun _headers(): Headers =
363351
Headers.builder()
364352
.apply {
365-
xSentAt?.let { put("x-sent-at", DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(it)) }
366353
xStreamResponse?.let { put("x-stream-response", it.toString()) }
367354
putAll(additionalHeaders)
368355
}
@@ -489,7 +476,10 @@ private constructor(
489476
fun input(action: Action) = input(Input.ofAction(action))
490477

491478
/** Target frame ID for the action */
492-
fun frameId(frameId: String) = frameId(JsonField.of(frameId))
479+
fun frameId(frameId: String?) = frameId(JsonField.ofNullable(frameId))
480+
481+
/** Alias for calling [Builder.frameId] with `frameId.orElse(null)`. */
482+
fun frameId(frameId: Optional<String>) = frameId(frameId.getOrNull())
493483

494484
/**
495485
* Sets [Builder.frameId] to an arbitrary JSON value.
@@ -799,8 +789,9 @@ private constructor(
799789
) : this(model, timeout, variables, mutableMapOf())
800790

801791
/**
802-
* Model name string with provider prefix (e.g., 'openai/gpt-5-nano',
803-
* 'anthropic/claude-4.5-opus')
792+
* Model name string with provider prefix. Always use the format 'provider/model-name'
793+
* (e.g., 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5-20250929',
794+
* 'google/gemini-2.0-flash')
804795
*
805796
* @throws StagehandInvalidDataException if the JSON field has an unexpected type (e.g. if
806797
* the server responded with an unexpected value).
@@ -881,8 +872,9 @@ private constructor(
881872
}
882873

883874
/**
884-
* Model name string with provider prefix (e.g., 'openai/gpt-5-nano',
885-
* 'anthropic/claude-4.5-opus')
875+
* Model name string with provider prefix. Always use the format 'provider/model-name'
876+
* (e.g., 'openai/gpt-4o', 'anthropic/claude-sonnet-4-5-20250929',
877+
* 'google/gemini-2.0-flash')
886878
*/
887879
fun model(model: ModelConfig) = model(JsonField.of(model))
888880

@@ -895,8 +887,8 @@ private constructor(
895887
*/
896888
fun model(model: JsonField<ModelConfig>) = apply { this.model = model }
897889

898-
/** Alias for calling [model] with `ModelConfig.ofName(name)`. */
899-
fun model(name: String) = model(ModelConfig.ofName(name))
890+
/** Alias for calling [model] with `ModelConfig.ofString(string)`. */
891+
fun model(string: String) = model(ModelConfig.ofString(string))
900892

901893
/**
902894
* Alias for calling [model] with `ModelConfig.ofModelConfigObject(modelConfigObject)`.
@@ -1253,16 +1245,15 @@ private constructor(
12531245

12541246
return other is SessionActParams &&
12551247
id == other.id &&
1256-
xSentAt == other.xSentAt &&
12571248
xStreamResponse == other.xStreamResponse &&
12581249
body == other.body &&
12591250
additionalHeaders == other.additionalHeaders &&
12601251
additionalQueryParams == other.additionalQueryParams
12611252
}
12621253

12631254
override fun hashCode(): Int =
1264-
Objects.hash(id, xSentAt, xStreamResponse, body, additionalHeaders, additionalQueryParams)
1255+
Objects.hash(id, xStreamResponse, body, additionalHeaders, additionalQueryParams)
12651256

12661257
override fun toString() =
1267-
"SessionActParams{id=$id, xSentAt=$xSentAt, xStreamResponse=$xStreamResponse, body=$body, additionalHeaders=$additionalHeaders, additionalQueryParams=$additionalQueryParams}"
1258+
"SessionActParams{id=$id, xStreamResponse=$xStreamResponse, body=$body, additionalHeaders=$additionalHeaders, additionalQueryParams=$additionalQueryParams}"
12681259
}

0 commit comments

Comments
 (0)