From 143bf93c8a6e2cf1c96b3174c42402096aa01fe7 Mon Sep 17 00:00:00 2001 From: fern-api <115122769+fern-api[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:09:08 +0000 Subject: [PATCH 1/4] [fern-generated] Update SDK Generated by Fern CLI Version: unknown Generators: - fernapi/fern-java-sdk: 4.9.2 --- .fern/metadata.json | 6 +-- build.gradle | 4 +- reference.md | 39 ++++++++++++-- .../com/phenoml/api/core/ClientOptions.java | 4 +- .../agent/chat/AsyncRawChatClient.java | 11 ++++ .../resources/agent/chat/RawChatClient.java | 7 +++ .../agent/chat/requests/AgentChatRequest.java | 8 +-- .../chat/requests/AgentStreamChatRequest.java | 8 +-- .../resources/agent/errors/ConflictError.java | 32 ++++++++++++ .../fhir2omop/AsyncFhir2OmopClient.java | 52 +++++++++++++++++++ .../fhir2omop/AsyncRawFhir2OmopClient.java | 52 +++++++++++++++++++ .../resources/fhir2omop/Fhir2OmopClient.java | 52 +++++++++++++++++++ .../fhir2omop/RawFhir2OmopClient.java | 52 +++++++++++++++++++ .../fhir2omop/requests/CreateOmopRequest.java | 18 ++++--- .../fhir2omop/types/CreateOmopResponse.java | 10 +++- 15 files changed, 327 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/phenoml/api/resources/agent/errors/ConflictError.java diff --git a/.fern/metadata.json b/.fern/metadata.json index fcc5c6d..1318ecc 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -1,5 +1,5 @@ { - "cliVersion": "5.49.1", + "cliVersion": "5.50.1", "generatorName": "fernapi/fern-java-sdk", "generatorVersion": "4.9.2", "generatorConfig": { @@ -10,10 +10,10 @@ "enable-wire-tests": true, "publish-to": "central" }, - "originGitCommit": "64f369254225bd6c2d4c58d87f59165d7e8e8dc9", + "originGitCommit": "fbaef4c66e97232edfaacb20d23d476aa286ecdd", "originGitCommitIsDirty": true, "invokedBy": "ci", "requestedVersion": "AUTO", "ciProvider": "unknown", - "sdkVersion": "17.5.0" + "sdkVersion": "0.0.0-fern-placeholder" } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2c5ccc2..e9f35ce 100644 --- a/build.gradle +++ b/build.gradle @@ -48,7 +48,7 @@ java { group = 'com.phenoml.maven' -version = '17.5.0' +version = '0.0.0-fern-placeholder' jar { dependsOn(":generatePomFileForMavenPublication") @@ -79,7 +79,7 @@ publishing { maven(MavenPublication) { groupId = 'com.phenoml.maven' artifactId = 'phenoml-java-sdk' - version = '17.5.0' + version = '0.0.0-fern-placeholder' from components.java pom { name = 'phenoml' diff --git a/reference.md b/reference.md index 4792978..6731113 100644 --- a/reference.md +++ b/reference.md @@ -486,7 +486,7 @@ Multiple FHIR provider integrations can be provided as comma-separated values.
Optional session ID for conversation continuity
+ *Optional session ID for conversation continuity. Only one request may be active for a session at a time; overlapping turns for the same session return 409 Conflict.
*/ _FinalStage sessionId(OptionalOptional session ID for conversation continuity
+ *Optional session ID for conversation continuity. Only one request may be active for a session at a time; overlapping turns for the same session return 409 Conflict.
* @return Reference to {@code this} so that method calls can be chained together. */ @java.lang.Override @@ -306,7 +306,7 @@ public _FinalStage sessionId(String sessionId) { } /** - *Optional session ID for conversation continuity
+ *Optional session ID for conversation continuity. Only one request may be active for a session at a time; overlapping turns for the same session return 409 Conflict.
*/ @java.lang.Override @JsonSetter(value = "session_id", nulls = Nulls.SKIP) diff --git a/src/main/java/com/phenoml/api/resources/agent/chat/requests/AgentStreamChatRequest.java b/src/main/java/com/phenoml/api/resources/agent/chat/requests/AgentStreamChatRequest.java index 30db732..b62762c 100644 --- a/src/main/java/com/phenoml/api/resources/agent/chat/requests/AgentStreamChatRequest.java +++ b/src/main/java/com/phenoml/api/resources/agent/chat/requests/AgentStreamChatRequest.java @@ -92,7 +92,7 @@ public OptionalOptional session ID for conversation continuity
+ *Optional session ID for conversation continuity. Only one request may be active for a session at a time; overlapping turns for the same session return 409 Conflict.
*/ _FinalStage sessionId(OptionalOptional session ID for conversation continuity
+ *Optional session ID for conversation continuity. Only one request may be active for a session at a time; overlapping turns for the same session return 409 Conflict.
* @return Reference to {@code this} so that method calls can be chained together. */ @java.lang.Override @@ -306,7 +306,7 @@ public _FinalStage sessionId(String sessionId) { } /** - *Optional session ID for conversation continuity
+ *Optional session ID for conversation continuity. Only one request may be active for a session at a time; overlapping turns for the same session return 409 Conflict.
*/ @java.lang.Override @JsonSetter(value = "session_id", nulls = Nulls.SKIP) diff --git a/src/main/java/com/phenoml/api/resources/agent/errors/ConflictError.java b/src/main/java/com/phenoml/api/resources/agent/errors/ConflictError.java new file mode 100644 index 0000000..31e9f23 --- /dev/null +++ b/src/main/java/com/phenoml/api/resources/agent/errors/ConflictError.java @@ -0,0 +1,32 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.phenoml.api.resources.agent.errors; + +import com.phenoml.api.core.PhenomlClientApiException; +import okhttp3.Response; + +public final class ConflictError extends PhenomlClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final Object body; + + public ConflictError(Object body) { + super("ConflictError", 409, body); + this.body = body; + } + + public ConflictError(Object body, Response rawResponse) { + super("ConflictError", 409, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @java.lang.Override + public Object body() { + return this.body; + } +} diff --git a/src/main/java/com/phenoml/api/resources/fhir2omop/AsyncFhir2OmopClient.java b/src/main/java/com/phenoml/api/resources/fhir2omop/AsyncFhir2OmopClient.java index 907d42a..509fc77 100644 --- a/src/main/java/com/phenoml/api/resources/fhir2omop/AsyncFhir2OmopClient.java +++ b/src/main/java/com/phenoml/api/resources/fhir2omop/AsyncFhir2OmopClient.java @@ -30,6 +30,32 @@ public AsyncRawFhir2OmopClient withRawResponse() { * Maps a FHIR R4 resource or Bundle into OMOP Common Data Model v5.4 rows * (person, visit_occurrence, condition_occurrence, drug_exposure, * procedure_occurrence, measurement, observation). + *Resource support is intentionally limited to the OMOP tables returned by + * this endpoint:
+ *Patient -> personEncounter -> visit_occurrenceCondition -> condition_occurrenceProcedure -> procedure_occurrenceMedicationRequest, MedicationStatement, and
+ * MedicationAdministration -> drug_exposureImmunization -> drug_exposureObservation with a numeric valueQuantity, valueInteger, or
+ * numeric-looking valueString (for example "<2") -> measurementObservation -> observationAllergyIntolerance -> observationMedication is supported only as reference data for medication
+ * resources; it is not emitted as its own row because OMOP CDM has no
+ * Medication table. Other reference/admin resources such as Practitioner,
+ * Organization, Location, Coverage, and Claim, and clinical
+ * workflow/document resources such as DiagnosticReport, ServiceRequest,
+ * CarePlan, DocumentReference, Composition, Specimen, and
+ * DeviceUseStatement, are currently accepted in a Bundle but are not
+ * shaped into OMOP rows. Unsupported resource types are ignored rather than
+ * listed under dropped; dropped is reserved for supported resource types
+ * that were missing the subject/patient, code, or medication reference data
+ * needed to produce a valid row.
Each resource's primary clinical coding is resolved to a standard OMOP
* Resource support is intentionally limited to the OMOP tables returned by
+ * this endpoint: Each resource's primary clinical coding is resolved to a standard OMOP
* Resource support is intentionally limited to the OMOP tables returned by
+ * this endpoint: Each resource's primary clinical coding is resolved to a standard OMOP
* Resource support is intentionally limited to the OMOP tables returned by
+ * this endpoint: Each resource's primary clinical coding is resolved to a standard OMOP
* Resource support is intentionally limited to the OMOP tables returned by
+ * this endpoint: Each resource's primary clinical coding is resolved to a standard OMOP
* Resource support is intentionally limited to the OMOP tables returned by
+ * this endpoint: Each resource's primary clinical coding is resolved to a standard OMOP
* Resource support is intentionally limited to the OMOP tables returned by
+ * this endpoint: Each resource's primary clinical coding is resolved to a standard OMOP
* Resource support is intentionally limited to the OMOP tables returned by
+ * this endpoint: Each resource's primary clinical coding is resolved to a standard OMOP
* FHIR resources (single resource or Bundle). Must contain at least one
- * Patient resource. Resources are mapped to OMOP rows; standalone
- * Medication resources are consumed by medication references rather than
- * mapped to their own table. Resources that could not be shaped into an OMOP row (rather than emitted as blank rows). Supported resource instances that could not be shaped into an OMOP
+ * row because required subject/patient, code, or medication reference
+ * data was missing. Unsupported resource types are ignored and do not
+ * appear here.concept_id. Alongside the OMOP rows grouped by table (tables), the
* response carries mappings (how each source coding resolved, linked back
@@ -62,6 +88,32 @@ public CompletableFuture
+ *
+ * Patient -> personEncounter -> visit_occurrenceCondition -> condition_occurrenceProcedure -> procedure_occurrenceMedicationRequest, MedicationStatement, and
+ * MedicationAdministration -> drug_exposureImmunization -> drug_exposureObservation with a numeric valueQuantity, valueInteger, or
+ * numeric-looking valueString (for example "<2") -> measurementObservation -> observationAllergyIntolerance -> observationMedication is supported only as reference data for medication
+ * resources; it is not emitted as its own row because OMOP CDM has no
+ * Medication table. Other reference/admin resources such as Practitioner,
+ * Organization, Location, Coverage, and Claim, and clinical
+ * workflow/document resources such as DiagnosticReport, ServiceRequest,
+ * CarePlan, DocumentReference, Composition, Specimen, and
+ * DeviceUseStatement, are currently accepted in a Bundle but are not
+ * shaped into OMOP rows. Unsupported resource types are ignored rather than
+ * listed under dropped; dropped is reserved for supported resource types
+ * that were missing the subject/patient, code, or medication reference data
+ * needed to produce a valid row.concept_id. Alongside the OMOP rows grouped by table (tables), the
* response carries mappings (how each source coding resolved, linked back
diff --git a/src/main/java/com/phenoml/api/resources/fhir2omop/AsyncRawFhir2OmopClient.java b/src/main/java/com/phenoml/api/resources/fhir2omop/AsyncRawFhir2OmopClient.java
index a6f3f84..4536efc 100644
--- a/src/main/java/com/phenoml/api/resources/fhir2omop/AsyncRawFhir2OmopClient.java
+++ b/src/main/java/com/phenoml/api/resources/fhir2omop/AsyncRawFhir2OmopClient.java
@@ -41,6 +41,32 @@ public AsyncRawFhir2OmopClient(ClientOptions clientOptions) {
* Maps a FHIR R4 resource or Bundle into OMOP Common Data Model v5.4 rows
* (person, visit_occurrence, condition_occurrence, drug_exposure,
* procedure_occurrence, measurement, observation).
+ *
+ *
+ * Patient -> personEncounter -> visit_occurrenceCondition -> condition_occurrenceProcedure -> procedure_occurrenceMedicationRequest, MedicationStatement, and
+ * MedicationAdministration -> drug_exposureImmunization -> drug_exposureObservation with a numeric valueQuantity, valueInteger, or
+ * numeric-looking valueString (for example "<2") -> measurementObservation -> observationAllergyIntolerance -> observationMedication is supported only as reference data for medication
+ * resources; it is not emitted as its own row because OMOP CDM has no
+ * Medication table. Other reference/admin resources such as Practitioner,
+ * Organization, Location, Coverage, and Claim, and clinical
+ * workflow/document resources such as DiagnosticReport, ServiceRequest,
+ * CarePlan, DocumentReference, Composition, Specimen, and
+ * DeviceUseStatement, are currently accepted in a Bundle but are not
+ * shaped into OMOP rows. Unsupported resource types are ignored rather than
+ * listed under dropped; dropped is reserved for supported resource types
+ * that were missing the subject/patient, code, or medication reference data
+ * needed to produce a valid row.concept_id. Alongside the OMOP rows grouped by table (tables), the
* response carries mappings (how each source coding resolved, linked back
@@ -73,6 +99,32 @@ public CompletableFuture
+ *
+ * Patient -> personEncounter -> visit_occurrenceCondition -> condition_occurrenceProcedure -> procedure_occurrenceMedicationRequest, MedicationStatement, and
+ * MedicationAdministration -> drug_exposureImmunization -> drug_exposureObservation with a numeric valueQuantity, valueInteger, or
+ * numeric-looking valueString (for example "<2") -> measurementObservation -> observationAllergyIntolerance -> observationMedication is supported only as reference data for medication
+ * resources; it is not emitted as its own row because OMOP CDM has no
+ * Medication table. Other reference/admin resources such as Practitioner,
+ * Organization, Location, Coverage, and Claim, and clinical
+ * workflow/document resources such as DiagnosticReport, ServiceRequest,
+ * CarePlan, DocumentReference, Composition, Specimen, and
+ * DeviceUseStatement, are currently accepted in a Bundle but are not
+ * shaped into OMOP rows. Unsupported resource types are ignored rather than
+ * listed under dropped; dropped is reserved for supported resource types
+ * that were missing the subject/patient, code, or medication reference data
+ * needed to produce a valid row.concept_id. Alongside the OMOP rows grouped by table (tables), the
* response carries mappings (how each source coding resolved, linked back
diff --git a/src/main/java/com/phenoml/api/resources/fhir2omop/Fhir2OmopClient.java b/src/main/java/com/phenoml/api/resources/fhir2omop/Fhir2OmopClient.java
index 8f44914..5def4f5 100644
--- a/src/main/java/com/phenoml/api/resources/fhir2omop/Fhir2OmopClient.java
+++ b/src/main/java/com/phenoml/api/resources/fhir2omop/Fhir2OmopClient.java
@@ -29,6 +29,32 @@ public RawFhir2OmopClient withRawResponse() {
* Maps a FHIR R4 resource or Bundle into OMOP Common Data Model v5.4 rows
* (person, visit_occurrence, condition_occurrence, drug_exposure,
* procedure_occurrence, measurement, observation).
+ *
+ *
+ * Patient -> personEncounter -> visit_occurrenceCondition -> condition_occurrenceProcedure -> procedure_occurrenceMedicationRequest, MedicationStatement, and
+ * MedicationAdministration -> drug_exposureImmunization -> drug_exposureObservation with a numeric valueQuantity, valueInteger, or
+ * numeric-looking valueString (for example "<2") -> measurementObservation -> observationAllergyIntolerance -> observationMedication is supported only as reference data for medication
+ * resources; it is not emitted as its own row because OMOP CDM has no
+ * Medication table. Other reference/admin resources such as Practitioner,
+ * Organization, Location, Coverage, and Claim, and clinical
+ * workflow/document resources such as DiagnosticReport, ServiceRequest,
+ * CarePlan, DocumentReference, Composition, Specimen, and
+ * DeviceUseStatement, are currently accepted in a Bundle but are not
+ * shaped into OMOP rows. Unsupported resource types are ignored rather than
+ * listed under dropped; dropped is reserved for supported resource types
+ * that were missing the subject/patient, code, or medication reference data
+ * needed to produce a valid row.concept_id. Alongside the OMOP rows grouped by table (tables), the
* response carries mappings (how each source coding resolved, linked back
@@ -61,6 +87,32 @@ public CreateOmopResponse create(CreateOmopRequest request) {
* Maps a FHIR R4 resource or Bundle into OMOP Common Data Model v5.4 rows
* (person, visit_occurrence, condition_occurrence, drug_exposure,
* procedure_occurrence, measurement, observation).
+ *
+ *
+ * Patient -> personEncounter -> visit_occurrenceCondition -> condition_occurrenceProcedure -> procedure_occurrenceMedicationRequest, MedicationStatement, and
+ * MedicationAdministration -> drug_exposureImmunization -> drug_exposureObservation with a numeric valueQuantity, valueInteger, or
+ * numeric-looking valueString (for example "<2") -> measurementObservation -> observationAllergyIntolerance -> observationMedication is supported only as reference data for medication
+ * resources; it is not emitted as its own row because OMOP CDM has no
+ * Medication table. Other reference/admin resources such as Practitioner,
+ * Organization, Location, Coverage, and Claim, and clinical
+ * workflow/document resources such as DiagnosticReport, ServiceRequest,
+ * CarePlan, DocumentReference, Composition, Specimen, and
+ * DeviceUseStatement, are currently accepted in a Bundle but are not
+ * shaped into OMOP rows. Unsupported resource types are ignored rather than
+ * listed under dropped; dropped is reserved for supported resource types
+ * that were missing the subject/patient, code, or medication reference data
+ * needed to produce a valid row.concept_id. Alongside the OMOP rows grouped by table (tables), the
* response carries mappings (how each source coding resolved, linked back
diff --git a/src/main/java/com/phenoml/api/resources/fhir2omop/RawFhir2OmopClient.java b/src/main/java/com/phenoml/api/resources/fhir2omop/RawFhir2OmopClient.java
index 5f16e04..fe8d28d 100644
--- a/src/main/java/com/phenoml/api/resources/fhir2omop/RawFhir2OmopClient.java
+++ b/src/main/java/com/phenoml/api/resources/fhir2omop/RawFhir2OmopClient.java
@@ -37,6 +37,32 @@ public RawFhir2OmopClient(ClientOptions clientOptions) {
* Maps a FHIR R4 resource or Bundle into OMOP Common Data Model v5.4 rows
* (person, visit_occurrence, condition_occurrence, drug_exposure,
* procedure_occurrence, measurement, observation).
+ *
+ *
+ * Patient -> personEncounter -> visit_occurrenceCondition -> condition_occurrenceProcedure -> procedure_occurrenceMedicationRequest, MedicationStatement, and
+ * MedicationAdministration -> drug_exposureImmunization -> drug_exposureObservation with a numeric valueQuantity, valueInteger, or
+ * numeric-looking valueString (for example "<2") -> measurementObservation -> observationAllergyIntolerance -> observationMedication is supported only as reference data for medication
+ * resources; it is not emitted as its own row because OMOP CDM has no
+ * Medication table. Other reference/admin resources such as Practitioner,
+ * Organization, Location, Coverage, and Claim, and clinical
+ * workflow/document resources such as DiagnosticReport, ServiceRequest,
+ * CarePlan, DocumentReference, Composition, Specimen, and
+ * DeviceUseStatement, are currently accepted in a Bundle but are not
+ * shaped into OMOP rows. Unsupported resource types are ignored rather than
+ * listed under dropped; dropped is reserved for supported resource types
+ * that were missing the subject/patient, code, or medication reference data
+ * needed to produce a valid row.concept_id. Alongside the OMOP rows grouped by table (tables), the
* response carries mappings (how each source coding resolved, linked back
@@ -69,6 +95,32 @@ public PhenomlClientHttpResponse
+ *
+ * Patient -> personEncounter -> visit_occurrenceCondition -> condition_occurrenceProcedure -> procedure_occurrenceMedicationRequest, MedicationStatement, and
+ * MedicationAdministration -> drug_exposureImmunization -> drug_exposureObservation with a numeric valueQuantity, valueInteger, or
+ * numeric-looking valueString (for example "<2") -> measurementObservation -> observationAllergyIntolerance -> observationMedication is supported only as reference data for medication
+ * resources; it is not emitted as its own row because OMOP CDM has no
+ * Medication table. Other reference/admin resources such as Practitioner,
+ * Organization, Location, Coverage, and Claim, and clinical
+ * workflow/document resources such as DiagnosticReport, ServiceRequest,
+ * CarePlan, DocumentReference, Composition, Specimen, and
+ * DeviceUseStatement, are currently accepted in a Bundle but are not
+ * shaped into OMOP rows. Unsupported resource types are ignored rather than
+ * listed under dropped; dropped is reserved for supported resource types
+ * that were missing the subject/patient, code, or medication reference data
+ * needed to produce a valid row.concept_id. Alongside the OMOP rows grouped by table (tables), the
* response carries mappings (how each source coding resolved, linked back
diff --git a/src/main/java/com/phenoml/api/resources/fhir2omop/requests/CreateOmopRequest.java b/src/main/java/com/phenoml/api/resources/fhir2omop/requests/CreateOmopRequest.java
index 1ac4436..34b8f6d 100644
--- a/src/main/java/com/phenoml/api/resources/fhir2omop/requests/CreateOmopRequest.java
+++ b/src/main/java/com/phenoml/api/resources/fhir2omop/requests/CreateOmopRequest.java
@@ -31,9 +31,12 @@ private CreateOmopRequest(Map> getMappings() {
}
/**
- * @return Resources that could not be shaped into an OMOP row (rather than emitted as blank rows).
+ * @return Supported resource instances that could not be shaped into an OMOP
+ * row because required subject/patient, code, or medication reference
+ * data was missing. Unsupported resource types are ignored and do not
+ * appear here.
*/
@JsonProperty("dropped")
public Optional
> getDropped() {
@@ -218,7 +221,10 @@ public Builder mappings(List
> dropped) {
From 55c4207055541c6ec18341e3a3e9e5f46f089c4f Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Thu, 18 Jun 2026 18:09:54 +0000
Subject: [PATCH 2/4] [fern-autoversion] feat: add Fhir2Omop client and
ConflictError for agent chat
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Introduce the FHIR-to-OMOP mapping service as a first-class SDK client,
and add HTTP 409 Conflict error handling to the agent chat endpoints.
Key changes:
- Add `Fhir2OmopClient` and `AsyncFhir2OmopClient` (plus raw variants) accessible via `PhenomlClient.fhir2Omop()` and `AsyncPhenomlClient.fhir2Omop()`, exposing `POST /fhir2omop/create`
- Add new request/response types: `CreateOmopRequest`, `CreateOmopResponse`, `OmopTables`, `PersonRow`, `VisitOccurrenceRow`, `ConditionOccurrenceRow`, `DrugExposureRow`, `ProcedureOccurrenceRow`, `MeasurementRow`, `ObservationRow`, `MappingEntry`, `Summary`, and `DroppedResource`
- Add `ConflictError` (HTTP 409) to agent chat sync and async clients (`RawChatClient`, `AsyncRawChatClient`)
🌿 Generated with Fern
---
.fern/metadata.json | 2 +-
build.gradle | 4 ++--
changelog.md | 8 ++++++++
src/main/java/com/phenoml/api/core/ClientOptions.java | 4 ++--
4 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/.fern/metadata.json b/.fern/metadata.json
index 1318ecc..0ebdc43 100644
--- a/.fern/metadata.json
+++ b/.fern/metadata.json
@@ -15,5 +15,5 @@
"invokedBy": "ci",
"requestedVersion": "AUTO",
"ciProvider": "unknown",
- "sdkVersion": "0.0.0-fern-placeholder"
+ "sdkVersion": "17.6.0"
}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index e9f35ce..842382d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -48,7 +48,7 @@ java {
group = 'com.phenoml.maven'
-version = '0.0.0-fern-placeholder'
+version = '17.6.0'
jar {
dependsOn(":generatePomFileForMavenPublication")
@@ -79,7 +79,7 @@ publishing {
maven(MavenPublication) {
groupId = 'com.phenoml.maven'
artifactId = 'phenoml-java-sdk'
- version = '0.0.0-fern-placeholder'
+ version = '17.6.0'
from components.java
pom {
name = 'phenoml'
diff --git a/changelog.md b/changelog.md
index 4afe10a..76bc78d 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,11 @@
+## [17.6.0] - 2026-06-18
+### Added
+- **`PhenomlClient.fhir2Omop()` / `AsyncPhenomlClient.fhir2Omop()`** — new client accessors exposing the `POST /fhir2omop/create` endpoint that maps a FHIR R4 resource or Bundle into OMOP CDM v5.4 rows.
+- **`Fhir2OmopClient`**, **`AsyncFhir2OmopClient`**, **`RawFhir2OmopClient`**, and **`AsyncRawFhir2OmopClient`** — new synchronous, asynchronous, and raw-response client classes with a `create(CreateOmopRequest)` method returning a `CreateOmopResponse`.
+- **OMOP CDM v5.4 row and supporting types** — new `PersonRow`, `VisitOccurrenceRow`, `ConditionOccurrenceRow`, `DrugExposureRow`, `ProcedureOccurrenceRow`, `MeasurementRow`, and `ObservationRow` classes aggregated under `OmopTables`, plus `MappingEntry`, `Summary`, `CreateOmopResponse`, and `DroppedResource` supporting types.
+- **`ConflictError`** — new typed exception (HTTP 409) thrown by `RawChatClient` and `AsyncRawChatClient` when the agent chat endpoint returns a conflict response; `BadRequestError`, `UnauthorizedError`, `InternalServerError`, and `ServiceUnavailableError` are also thrown by `RawFhir2OmopClient`.
+- **`Provider.AIDBOX`** — `"aidbox"` added as a supported value in the `Provider` enum, with a corresponding `Visitor.visitAidbox()` method.
+
## [17.5.0] - 2026-06-15
### Added
- **`Provider.AIDBOX`** — `"aidbox"` is now a supported value in the `Provider` enum (with a corresponding `Visitor.visitAidbox()` method).
diff --git a/src/main/java/com/phenoml/api/core/ClientOptions.java b/src/main/java/com/phenoml/api/core/ClientOptions.java
index b1f15e2..af95a7f 100644
--- a/src/main/java/com/phenoml/api/core/ClientOptions.java
+++ b/src/main/java/com/phenoml/api/core/ClientOptions.java
@@ -38,10 +38,10 @@ private ClientOptions(
this.headers.putAll(headers);
this.headers.putAll(new HashMap