Skip to content

Commit 48a0841

Browse files
release: 0.1.0-beta.3 (#147)
* codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * codegen metadata * Add profile loading (#146) * codegen metadata * release: 0.1.0-beta.3 --------- Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com> Co-authored-by: Mukil Loganathan <mukil@langchain.dev>
1 parent 090c06b commit 48a0841

9 files changed

Lines changed: 447 additions & 24 deletions

File tree

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
.prism.log
22
.stdy.log
3+
.env
4+
.env.*
5+
*.pem
6+
*.key
7+
*.crt
8+
credentials.json
9+
node_modules/
10+
__pycache__/
11+
.venv/
12+
.DS_Store
313
.gradle
414
.idea
515
.kotlin

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.1.0-beta.2"
2+
".": "0.1.0-beta.3"
33
}

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 122
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/langsmith/langsmith-api-e5370829a010cbe2e9fa3521e9cd54d6fc185219a51ca24501bd8e820258b78e.yml
3-
openapi_spec_hash: 87b05a74a0007fcde5c6df8401b457dc
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/langsmith/langsmith-api-7fae91b335592b1233aa10af9133e468d6dc6e3823e3ec33a04ca633d70e3312.yml
3+
openapi_spec_hash: 2c52c9e8e7cb6b5720dea4fc4c595475
44
config_hash: 57e1c5d2f7d3f4c50121dda73a181670

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 0.1.0-beta.3 (2026-05-01)
4+
5+
Full Changelog: [v0.1.0-beta.2...v0.1.0-beta.3](https://github.com/langchain-ai/langsmith-java/compare/v0.1.0-beta.2...v0.1.0-beta.3)
6+
37
## 0.1.0-beta.2 (2026-04-30)
48

59
Full Changelog: [v0.1.0-beta.1...v0.1.0-beta.2](https://github.com/langchain-ai/langsmith-java/compare/v0.1.0-beta.1...v0.1.0-beta.2)

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
<!-- x-release-please-start-version -->
44

5-
[![Maven Central](https://img.shields.io/maven-central/v/com.langchain.smith/langsmith-java)](https://central.sonatype.com/artifact/com.langchain.smith/langsmith-java/0.1.0-beta.2)
6-
[![javadoc](https://javadoc.io/badge2/com.langchain.smith/langsmith-java/0.1.0-beta.2/javadoc.svg)](https://javadoc.io/doc/com.langchain.smith/langsmith-java/0.1.0-beta.2)
5+
[![Maven Central](https://img.shields.io/maven-central/v/com.langchain.smith/langsmith-java)](https://central.sonatype.com/artifact/com.langchain.smith/langsmith-java/0.1.0-beta.3)
6+
[![javadoc](https://javadoc.io/badge2/com.langchain.smith/langsmith-java/0.1.0-beta.3/javadoc.svg)](https://javadoc.io/doc/com.langchain.smith/langsmith-java/0.1.0-beta.3)
77

88
<!-- x-release-please-end -->
99

@@ -13,7 +13,7 @@ To learn more about LangSmith, check out the [docs](https://docs.smith.langchain
1313

1414
<!-- x-release-please-start-version -->
1515

16-
The REST API documentation can be found on [docs.smith.langchain.com](https://docs.smith.langchain.com/). Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.langchain.smith/langsmith-java/0.1.0-beta.2).
16+
The REST API documentation can be found on [docs.smith.langchain.com](https://docs.smith.langchain.com/). Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.langchain.smith/langsmith-java/0.1.0-beta.3).
1717

1818
<!-- x-release-please-end -->
1919

@@ -24,7 +24,7 @@ The REST API documentation can be found on [docs.smith.langchain.com](https://do
2424
### Gradle
2525

2626
```kotlin
27-
implementation("com.langchain.smith:langsmith-java:0.1.0-beta.2")
27+
implementation("com.langchain.smith:langsmith-java:0.1.0-beta.3")
2828
```
2929

3030
### Maven
@@ -33,7 +33,7 @@ implementation("com.langchain.smith:langsmith-java:0.1.0-beta.2")
3333
<dependency>
3434
<groupId>com.langchain.smith</groupId>
3535
<artifactId>langsmith-java</artifactId>
36-
<version>0.1.0-beta.2</version>
36+
<version>0.1.0-beta.3</version>
3737
</dependency>
3838
```
3939

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ repositories {
99

1010
allprojects {
1111
group = "com.langchain.smith"
12-
version = "0.1.0-beta.2" // x-release-please-version
12+
version = "0.1.0-beta.3" // x-release-please-version
1313
}
1414

1515
subprojects {

langsmith-java-core/src/main/kotlin/com/langchain/smith/core/ClientOptions.kt

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ private constructor(
111111
@get:JvmName("autoBatchTracing") val autoBatchTracing: Boolean,
112112
private val apiKey: String?,
113113
private val tenantId: String?,
114+
private val oauthAccessToken: String?,
114115
) {
115116

116117
init {
@@ -172,6 +173,7 @@ private constructor(
172173
private var autoBatchTracing: Boolean = true
173174
private var apiKey: String? = null
174175
private var tenantId: String? = null
176+
private var oauthAccessToken: String? = null
175177

176178
@JvmSynthetic
177179
internal fun from(clientOptions: ClientOptions) = apply {
@@ -190,6 +192,7 @@ private constructor(
190192
autoBatchTracing = clientOptions.autoBatchTracing
191193
apiKey = clientOptions.apiKey
192194
tenantId = clientOptions.tenantId
195+
oauthAccessToken = clientOptions.oauthAccessToken
193196
}
194197

195198
/**
@@ -426,14 +429,9 @@ private constructor(
426429
* System properties take precedence over environment variables.
427430
*/
428431
fun fromEnv() = apply {
429-
(System.getProperty("langchain.baseUrl") ?: System.getenv("LANGSMITH_ENDPOINT"))?.let {
430-
baseUrl(it)
431-
}
432-
(System.getProperty("langchain.langsmithApiKey") ?: System.getenv("LANGSMITH_API_KEY"))
433-
?.let { apiKey(it) }
434-
(System.getProperty("langchain.langsmithTenantId")
435-
?: System.getenv("LANGSMITH_TENANT_ID"))
436-
?.let { tenantId(it) }
432+
langsmithEndpoint()?.let { baseUrl(it) }
433+
langsmithApiKey()?.let { apiKey(it) }
434+
langsmithTenantId()?.let { tenantId(it) }
437435
System.getenv("LANGCHAIN_CUSTOM_HEADERS")?.let { customHeadersEnv ->
438436
for (line in customHeadersEnv.split("\n")) {
439437
val colon = line.indexOf(':')
@@ -442,6 +440,8 @@ private constructor(
442440
}
443441
}
444442
}
443+
loadProfileClientConfig(jsonMapper, clock, baseUrl, profileNameOverride = profileName())
444+
?.let { applyProfileConfig(it) }
445445
}
446446

447447
/**
@@ -491,16 +491,26 @@ private constructor(
491491
// We replace after all the default headers to allow end-users to overwrite them.
492492
headers.replaceAll(this.headers.build())
493493
queryParams.replaceAll(this.queryParams.build())
494-
apiKey?.let {
495-
if (!it.isEmpty()) {
494+
apiKey
495+
?.takeIf { it.isNotEmpty() }
496+
?.let {
497+
headers.remove("Authorization")
496498
headers.replace("X-API-Key", it)
497499
}
500+
if (apiKey.isNullOrEmpty()) {
501+
oauthAccessToken
502+
?.takeIf { it.isNotEmpty() }
503+
?.let {
504+
val currentHeaders = headers.build()
505+
if (
506+
currentHeaders.values("X-API-Key").all(String::isBlank) &&
507+
currentHeaders.values("Authorization").all(String::isBlank)
508+
) {
509+
headers.replace("Authorization", "Bearer $it")
510+
}
511+
}
498512
}
499-
tenantId?.let {
500-
if (!it.isEmpty()) {
501-
headers.replace("X-Tenant-Id", it)
502-
}
503-
}
513+
tenantId?.takeIf { it.isNotEmpty() }?.let { headers.replace("X-Tenant-Id", it) }
504514

505515
return ClientOptions(
506516
httpClient,
@@ -524,8 +534,48 @@ private constructor(
524534
autoBatchTracing,
525535
apiKey,
526536
tenantId,
537+
oauthAccessToken,
527538
)
528539
}
540+
541+
private fun applyProfileConfig(profile: ProfileClientConfig) {
542+
if (baseUrl.isNullOrBlank()) {
543+
profile.baseUrl?.let { baseUrl(it) }
544+
}
545+
if (tenantId.isNullOrBlank()) {
546+
profile.tenantId?.let { tenantId(it) }
547+
}
548+
if (!apiKey.isNullOrBlank() || hasAuthHeader()) {
549+
return
550+
}
551+
if (!profile.oauthAccessToken.isNullOrBlank()) {
552+
oauthAccessToken = profile.oauthAccessToken
553+
} else if (!profile.apiKey.isNullOrBlank()) {
554+
apiKey(profile.apiKey)
555+
}
556+
}
557+
558+
private fun hasAuthHeader(): Boolean {
559+
val currentHeaders = headers.build()
560+
return currentHeaders.values("X-API-Key").any { it.isNotBlank() } ||
561+
currentHeaders.values("Authorization").any { it.isNotBlank() }
562+
}
563+
564+
private fun langsmithEndpoint(): String? =
565+
System.getProperty("langchain.baseUrl")
566+
?: System.getenv("LANGSMITH_ENDPOINT")
567+
?: System.getenv("LANGCHAIN_ENDPOINT")
568+
569+
private fun langsmithApiKey(): String? =
570+
System.getProperty("langchain.langsmithApiKey")
571+
?: System.getenv("LANGSMITH_API_KEY")
572+
?: System.getenv("LANGCHAIN_API_KEY")
573+
574+
private fun langsmithTenantId(): String? =
575+
System.getProperty("langchain.langsmithTenantId")
576+
?: System.getenv("LANGSMITH_TENANT_ID")
577+
?: System.getenv("LANGSMITH_WORKSPACE_ID")
578+
?: System.getenv("LANGCHAIN_WORKSPACE_ID")
529579
}
530580

531581
/**

0 commit comments

Comments
 (0)