Skip to content
Closed
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.4",
"cliVersion": "5.50.5",
"generatorName": "fernapi/fern-java-sdk",
"generatorVersion": "4.9.2",
"generatorConfig": {
Expand All @@ -10,10 +10,10 @@
"enable-wire-tests": true,
"publish-to": "central"
},
"originGitCommit": "e2c477c4583f8f9e7d0d1a5b5591c1aa8cabef10",
"originGitCommit": "7b0a1643f56f1ba4ead44e0a90a5547a31fa6831",
"originGitCommitIsDirty": true,
"invokedBy": "ci",
"requestedVersion": "AUTO",
"ciProvider": "unknown",
"sdkVersion": "17.7.0"
}
"sdkVersion": "17.8.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.7.0'
version = '17.8.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.7.0'
version = '17.8.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.8.0] - 2026-06-23
### Added
- **`Fhir2OmopClient` / `AsyncFhir2OmopClient`** — new service clients accessible via `PhenomlClient.fhir2Omop()` / `AsyncPhenomlClient.fhir2Omop()`, exposing a `create(CreateOmopRequest)` method that maps a FHIR R4 resource or Bundle into OMOP CDM v5.4 rows via `POST /fhir2omop/create`.
- **`VoiceClient` / `AsyncVoiceClient`** — new service clients accessible via `PhenomlClient.voice()` / `AsyncPhenomlClient.voice()`, exposing `transcribe(...)` methods that upload raw audio bytes (WAV, FLAC, MP3, OGG/WebM Opus) to `POST /transcribe` and return a `TranscribeResponse`.
- **OMOP CDM response types** — new model classes `OmopTables`, `PersonRow`, `VisitOccurrenceRow`, `ConditionOccurrenceRow`, `DrugExposureRow`, `ProcedureOccurrenceRow`, `MeasurementRow`, `ObservationRow`, `ObservationPeriodRow`, `DeathRow`, `LocationRow`, `CareSiteRow`, `ProviderRow`, `MappingEntry`, `DroppedResource`, and `Summary` represent the full OMOP CDM v5.4 output of the FHIR-to-OMOP conversion.
- **`ConflictError`** — new typed exception (HTTP 409) thrown by `RawChatClient.send(...)` and `RawChatClient.stream(...)` (sync and async) when a session already has an active turn.
- **`Provider.AIDBOX`** — `"aidbox"` is now a supported constant in the `Provider` enum, including a `Value.AIDBOX` entry and `Visitor.visitAidbox()` method.

## [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.
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.7.0");
put("User-Agent", "com.phenoml.maven:phenoml-java-sdk/17.8.0");
put("X-Fern-Language", "JAVA");
put("X-Fern-SDK-Name", "com.phenoml.fern:api-sdk");
put("X-Fern-SDK-Version", "17.7.0");
put("X-Fern-SDK-Version", "17.8.0");
}
});
this.headerSuppliers = headerSuppliers;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,240 @@
/**
* This file was auto-generated by Fern from our API Definition.
*/
package com.phenoml.api.resources.fhir2omop.types;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.Nulls;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.phenoml.api.core.ObjectMappers;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;

@JsonInclude(JsonInclude.Include.NON_ABSENT)
@JsonDeserialize(builder = CareSiteRow.Builder.class)
public final class CareSiteRow {
private final Optional<Long> careSiteId;

private final Optional<String> careSiteName;

private final Optional<Long> placeOfServiceConceptId;

private final Optional<Long> locationId;

private final Optional<String> careSiteSourceValue;

private final Optional<String> placeOfServiceSourceValue;

private final Map<String, Object> additionalProperties;

private CareSiteRow(
Optional<Long> careSiteId,
Optional<String> careSiteName,
Optional<Long> placeOfServiceConceptId,
Optional<Long> locationId,
Optional<String> careSiteSourceValue,
Optional<String> placeOfServiceSourceValue,
Map<String, Object> additionalProperties) {
this.careSiteId = careSiteId;
this.careSiteName = careSiteName;
this.placeOfServiceConceptId = placeOfServiceConceptId;
this.locationId = locationId;
this.careSiteSourceValue = careSiteSourceValue;
this.placeOfServiceSourceValue = placeOfServiceSourceValue;
this.additionalProperties = additionalProperties;
}

@JsonProperty("care_site_id")
public Optional<Long> getCareSiteId() {
return careSiteId;
}

@JsonProperty("care_site_name")
public Optional<String> getCareSiteName() {
return careSiteName;
}

@JsonProperty("place_of_service_concept_id")
public Optional<Long> getPlaceOfServiceConceptId() {
return placeOfServiceConceptId;
}

@JsonProperty("location_id")
public Optional<Long> getLocationId() {
return locationId;
}

@JsonProperty("care_site_source_value")
public Optional<String> getCareSiteSourceValue() {
return careSiteSourceValue;
}

@JsonProperty("place_of_service_source_value")
public Optional<String> getPlaceOfServiceSourceValue() {
return placeOfServiceSourceValue;
}

@java.lang.Override
public boolean equals(Object other) {
if (this == other) return true;
return other instanceof CareSiteRow && equalTo((CareSiteRow) other);
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

private boolean equalTo(CareSiteRow other) {
return careSiteId.equals(other.careSiteId)
&& careSiteName.equals(other.careSiteName)
&& placeOfServiceConceptId.equals(other.placeOfServiceConceptId)
&& locationId.equals(other.locationId)
&& careSiteSourceValue.equals(other.careSiteSourceValue)
&& placeOfServiceSourceValue.equals(other.placeOfServiceSourceValue);
}

@java.lang.Override
public int hashCode() {
return Objects.hash(
this.careSiteId,
this.careSiteName,
this.placeOfServiceConceptId,
this.locationId,
this.careSiteSourceValue,
this.placeOfServiceSourceValue);
}

@java.lang.Override
public String toString() {
return ObjectMappers.stringify(this);
}

public static Builder builder() {
return new Builder();
}

@JsonIgnoreProperties(ignoreUnknown = true)
public static final class Builder {
private Optional<Long> careSiteId = Optional.empty();

private Optional<String> careSiteName = Optional.empty();

private Optional<Long> placeOfServiceConceptId = Optional.empty();

private Optional<Long> locationId = Optional.empty();

private Optional<String> careSiteSourceValue = Optional.empty();

private Optional<String> placeOfServiceSourceValue = Optional.empty();

@JsonAnySetter
private Map<String, Object> additionalProperties = new HashMap<>();

private Builder() {}

public Builder from(CareSiteRow other) {
careSiteId(other.getCareSiteId());
careSiteName(other.getCareSiteName());
placeOfServiceConceptId(other.getPlaceOfServiceConceptId());
locationId(other.getLocationId());
careSiteSourceValue(other.getCareSiteSourceValue());
placeOfServiceSourceValue(other.getPlaceOfServiceSourceValue());
return this;
}

@JsonSetter(value = "care_site_id", nulls = Nulls.SKIP)
public Builder careSiteId(Optional<Long> careSiteId) {
this.careSiteId = careSiteId;
return this;
}

public Builder careSiteId(Long careSiteId) {
this.careSiteId = Optional.ofNullable(careSiteId);
return this;
}

@JsonSetter(value = "care_site_name", nulls = Nulls.SKIP)
public Builder careSiteName(Optional<String> careSiteName) {
this.careSiteName = careSiteName;
return this;
}

public Builder careSiteName(String careSiteName) {
this.careSiteName = Optional.ofNullable(careSiteName);
return this;
}

@JsonSetter(value = "place_of_service_concept_id", nulls = Nulls.SKIP)
public Builder placeOfServiceConceptId(Optional<Long> placeOfServiceConceptId) {
this.placeOfServiceConceptId = placeOfServiceConceptId;
return this;
}

public Builder placeOfServiceConceptId(Long placeOfServiceConceptId) {
this.placeOfServiceConceptId = Optional.ofNullable(placeOfServiceConceptId);
return this;
}

@JsonSetter(value = "location_id", nulls = Nulls.SKIP)
public Builder locationId(Optional<Long> locationId) {
this.locationId = locationId;
return this;
}

public Builder locationId(Long locationId) {
this.locationId = Optional.ofNullable(locationId);
return this;
}

@JsonSetter(value = "care_site_source_value", nulls = Nulls.SKIP)
public Builder careSiteSourceValue(Optional<String> careSiteSourceValue) {
this.careSiteSourceValue = careSiteSourceValue;
return this;
}

public Builder careSiteSourceValue(String careSiteSourceValue) {
this.careSiteSourceValue = Optional.ofNullable(careSiteSourceValue);
return this;
}

@JsonSetter(value = "place_of_service_source_value", nulls = Nulls.SKIP)
public Builder placeOfServiceSourceValue(Optional<String> placeOfServiceSourceValue) {
this.placeOfServiceSourceValue = placeOfServiceSourceValue;
return this;
}

public Builder placeOfServiceSourceValue(String placeOfServiceSourceValue) {
this.placeOfServiceSourceValue = Optional.ofNullable(placeOfServiceSourceValue);
return this;
}

public CareSiteRow build() {
return new CareSiteRow(
careSiteId,
careSiteName,
placeOfServiceConceptId,
locationId,
careSiteSourceValue,
placeOfServiceSourceValue,
additionalProperties);
}

public Builder additionalProperty(String key, Object value) {
this.additionalProperties.put(key, value);
return this;
}

public Builder additionalProperties(Map<String, Object> additionalProperties) {
this.additionalProperties.putAll(additionalProperties);
return this;
}
}
}
Loading
Loading