Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .fern/metadata.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"cliVersion": "5.50.1",
"cliVersion": "5.50.4",
"generatorName": "fernapi/fern-java-sdk",
"generatorVersion": "4.9.2",
"generatorConfig": {
Expand All @@ -10,10 +10,10 @@
"enable-wire-tests": true,
"publish-to": "central"
},
"originGitCommit": "fbaef4c66e97232edfaacb20d23d476aa286ecdd",
"originGitCommit": "e2c477c4583f8f9e7d0d1a5b5591c1aa8cabef10",
"originGitCommitIsDirty": true,
"invokedBy": "ci",
"requestedVersion": "AUTO",
"ciProvider": "unknown",
"sdkVersion": "17.6.0"
}
"sdkVersion": "17.7.0"
}
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ java {

group = 'com.phenoml.maven'

version = '17.6.0'
version = '17.7.0'

jar {
dependsOn(":generatePomFileForMavenPublication")
Expand Down Expand Up @@ -79,7 +79,7 @@ publishing {
maven(MavenPublication) {
groupId = 'com.phenoml.maven'
artifactId = 'phenoml-java-sdk'
version = '17.6.0'
version = '17.7.0'
from components.java
pom {
name = 'phenoml'
Expand Down
8 changes: 8 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
## [17.7.0] - 2026-06-23
### Added
- **`PhenomlClient.voice().voice().transcribe(...)`** — new sync method that uploads raw audio bytes (WAV, FLAC, MP3, or OGG/WebM Opus) to `POST /transcribe` and returns a `TranscribeResponse`, supporting up to ~5 minutes of audio per request.
- **`AsyncPhenomlClient.voice().voice().transcribe(...)`** — new async method for the same voice transcription endpoint.
- **`TranscribeRequest`** — new request type carrying raw audio bytes plus an optional BCP-47 `language` list.
- **`TranscribeResponse.getTranscript()`** — new response accessor exposing the full transcript returned by the voice service.
- **Voice service errors** — new typed exceptions (`BadRequestError`, `UnauthorizedError`, `PaymentRequiredError`, `ContentTooLargeError`, `BadGatewayError`, `ServiceUnavailableError`, `GatewayTimeoutError`) thrown by the voice service.

## [17.6.0] - 2026-06-18
### Added
- **`ConflictError`** — new typed exception thrown by `RawChatClient.send(...)`, `RawChatClient.stream(...)`, `AsyncRawChatClient.send(...)`, and `AsyncRawChatClient.stream(...)` for HTTP 409 responses when a session already has an active turn.
Expand Down
35 changes: 33 additions & 2 deletions code-examples.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"metadata": {
"language": "java",
"packageName": "com.phenoml.maven:phenoml-java-sdk",
"sdkVersion": "17.6.0",
"specCommit": "fbaef4c66e97232edfaacb20d23d476aa286ecdd",
"sdkVersion": "17.7.0",
"specCommit": "e2c477c4583f8f9e7d0d1a5b5591c1aa8cabef10",
"generatorName": "fernapi/fern-java-sdk"
},
"renderRules": {
Expand Down Expand Up @@ -4553,6 +4553,37 @@
]
}
},
"POST /transcribe": {
"httpMethod": "POST",
"httpPath": "/transcribe",
"request": {
"body": null
},
"response": {
"body": null
},
"render": {
"callTemplate": "client.voice().voice().transcribe(TranscribeRequest.builder(){{__body__}}.build())",
"params": [],
"body": {
"fieldSeparator": "",
"fields": [
{
"jsonKey": "language",
"fieldTemplate": ".language({{value}})",
"kind": "list",
"required": false,
"items": {
"jsonKey": "",
"fieldTemplate": "{{value}}",
"kind": "string",
"required": true
}
}
]
}
}
},
"GET /workflows": {
"httpMethod": "GET",
"httpPath": "/workflows",
Expand Down
1 change: 1 addition & 0 deletions reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -5490,6 +5490,7 @@ client.tools().mcpTools().delete("mcp_server_tool_id");
</dl>
</details>

## Voice
## Workflows
<details><summary><code>client.workflows.list() -> ListWorkflowsResponse</code></summary>
<dl>
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/phenoml/api/AsyncPhenomlClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import com.phenoml.api.resources.lang2fhir.AsyncLang2FhirClient;
import com.phenoml.api.resources.summary.AsyncSummaryClient;
import com.phenoml.api.resources.tools.AsyncToolsClient;
import com.phenoml.api.resources.voice.AsyncVoiceClient;
import com.phenoml.api.resources.workflows.AsyncWorkflowsClient;
import java.util.function.Supplier;

Expand All @@ -41,6 +42,8 @@ public class AsyncPhenomlClient {

protected final Supplier<AsyncToolsClient> toolsClient;

protected final Supplier<AsyncVoiceClient> voiceClient;

protected final Supplier<AsyncWorkflowsClient> workflowsClient;

public AsyncPhenomlClient(ClientOptions clientOptions) {
Expand All @@ -55,6 +58,7 @@ public AsyncPhenomlClient(ClientOptions clientOptions) {
this.lang2FhirClient = Suppliers.memoize(() -> new AsyncLang2FhirClient(clientOptions));
this.summaryClient = Suppliers.memoize(() -> new AsyncSummaryClient(clientOptions));
this.toolsClient = Suppliers.memoize(() -> new AsyncToolsClient(clientOptions));
this.voiceClient = Suppliers.memoize(() -> new AsyncVoiceClient(clientOptions));
this.workflowsClient = Suppliers.memoize(() -> new AsyncWorkflowsClient(clientOptions));
}

Expand Down Expand Up @@ -98,6 +102,10 @@ public AsyncToolsClient tools() {
return this.toolsClient.get();
}

public AsyncVoiceClient voice() {
return this.voiceClient.get();
}

public AsyncWorkflowsClient workflows() {
return this.workflowsClient.get();
}
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/phenoml/api/PhenomlClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import com.phenoml.api.resources.lang2fhir.Lang2FhirClient;
import com.phenoml.api.resources.summary.SummaryClient;
import com.phenoml.api.resources.tools.ToolsClient;
import com.phenoml.api.resources.voice.VoiceClient;
import com.phenoml.api.resources.workflows.WorkflowsClient;
import java.util.function.Supplier;

Expand All @@ -41,6 +42,8 @@ public class PhenomlClient {

protected final Supplier<ToolsClient> toolsClient;

protected final Supplier<VoiceClient> voiceClient;

protected final Supplier<WorkflowsClient> workflowsClient;

public PhenomlClient(ClientOptions clientOptions) {
Expand All @@ -55,6 +58,7 @@ public PhenomlClient(ClientOptions clientOptions) {
this.lang2FhirClient = Suppliers.memoize(() -> new Lang2FhirClient(clientOptions));
this.summaryClient = Suppliers.memoize(() -> new SummaryClient(clientOptions));
this.toolsClient = Suppliers.memoize(() -> new ToolsClient(clientOptions));
this.voiceClient = Suppliers.memoize(() -> new VoiceClient(clientOptions));
this.workflowsClient = Suppliers.memoize(() -> new WorkflowsClient(clientOptions));
}

Expand Down Expand Up @@ -98,6 +102,10 @@ public ToolsClient tools() {
return this.toolsClient.get();
}

public VoiceClient voice() {
return this.voiceClient.get();
}

public WorkflowsClient workflows() {
return this.workflowsClient.get();
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/phenoml/api/core/ClientOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ private ClientOptions(
this.headers.putAll(headers);
this.headers.putAll(new HashMap<String, String>() {
{
put("User-Agent", "com.phenoml.maven:phenoml-java-sdk/17.6.0");
put("User-Agent", "com.phenoml.maven:phenoml-java-sdk/17.7.0");
put("X-Fern-Language", "JAVA");
put("X-Fern-SDK-Name", "com.phenoml.fern:api-sdk");
put("X-Fern-SDK-Version", "17.6.0");
put("X-Fern-SDK-Version", "17.7.0");
}
});
this.headerSuppliers = headerSuppliers;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
package com.phenoml.api.resources.voice;

import com.phenoml.api.core.ClientOptions;
import com.phenoml.api.core.Suppliers;
import java.util.function.Supplier;

public class AsyncVoiceClient {
protected final ClientOptions clientOptions;

protected final Supplier<com.phenoml.api.resources.voice.voice.AsyncVoiceClient> voiceClient;

public AsyncVoiceClient(ClientOptions clientOptions) {
this.clientOptions = clientOptions;
this.voiceClient =
Suppliers.memoize(() -> new com.phenoml.api.resources.voice.voice.AsyncVoiceClient(clientOptions));
}

public com.phenoml.api.resources.voice.voice.AsyncVoiceClient voice() {
return this.voiceClient.get();
}
}
24 changes: 24 additions & 0 deletions src/main/java/com/phenoml/api/resources/voice/VoiceClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
package com.phenoml.api.resources.voice;

import com.phenoml.api.core.ClientOptions;
import com.phenoml.api.core.Suppliers;
import java.util.function.Supplier;

public class VoiceClient {
protected final ClientOptions clientOptions;

protected final Supplier<com.phenoml.api.resources.voice.voice.VoiceClient> voiceClient;

public VoiceClient(ClientOptions clientOptions) {
this.clientOptions = clientOptions;
this.voiceClient =
Suppliers.memoize(() -> new com.phenoml.api.resources.voice.voice.VoiceClient(clientOptions));
}

public com.phenoml.api.resources.voice.voice.VoiceClient voice() {
return this.voiceClient.get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
package com.phenoml.api.resources.voice.errors;

import com.phenoml.api.core.PhenomlClientApiException;
import okhttp3.Response;

public final class BadGatewayError extends PhenomlClientApiException {
/**
* The body of the response that triggered the exception.
*/
private final Object body;

public BadGatewayError(Object body) {
super("BadGatewayError", 502, body);
this.body = body;
}

public BadGatewayError(Object body, Response rawResponse) {
super("BadGatewayError", 502, body, rawResponse);
this.body = body;
}

/**
* @return the body
*/
@java.lang.Override
public Object body() {
return this.body;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
package com.phenoml.api.resources.voice.errors;

import com.phenoml.api.core.PhenomlClientApiException;
import okhttp3.Response;

public final class BadRequestError extends PhenomlClientApiException {
/**
* The body of the response that triggered the exception.
*/
private final Object body;

public BadRequestError(Object body) {
super("BadRequestError", 400, body);
this.body = body;
}

public BadRequestError(Object body, Response rawResponse) {
super("BadRequestError", 400, body, rawResponse);
this.body = body;
}

/**
* @return the body
*/
@java.lang.Override
public Object body() {
return this.body;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
package com.phenoml.api.resources.voice.errors;

import com.phenoml.api.core.PhenomlClientApiException;
import okhttp3.Response;

public final class ContentTooLargeError extends PhenomlClientApiException {
/**
* The body of the response that triggered the exception.
*/
private final Object body;

public ContentTooLargeError(Object body) {
super("ContentTooLargeError", 413, body);
this.body = body;
}

public ContentTooLargeError(Object body, Response rawResponse) {
super("ContentTooLargeError", 413, body, rawResponse);
this.body = body;
}

/**
* @return the body
*/
@java.lang.Override
public Object body() {
return this.body;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
package com.phenoml.api.resources.voice.errors;

import com.phenoml.api.core.PhenomlClientApiException;
import okhttp3.Response;

public final class GatewayTimeoutError extends PhenomlClientApiException {
/**
* The body of the response that triggered the exception.
*/
private final Object body;

public GatewayTimeoutError(Object body) {
super("GatewayTimeoutError", 504, body);
this.body = body;
}

public GatewayTimeoutError(Object body, Response rawResponse) {
super("GatewayTimeoutError", 504, body, rawResponse);
this.body = body;
}

/**
* @return the body
*/
@java.lang.Override
public Object body() {
return this.body;
}
}
Loading