From 2b6827d291c7072a516df1842c95df2b8482ef65 Mon Sep 17 00:00:00 2001 From: fern-api <115122769+fern-api[bot]@users.noreply.github.com> Date: Tue, 23 Jun 2026 21:44:34 +0000 Subject: [PATCH 1/3] [fern-generated] Update SDK Generated by Fern CLI Version: unknown Generators: - fernapi/fern-python-sdk: 5.14.13 --- .fern/metadata.json | 6 ++-- pyproject.toml | 5 +-- src/phenoml/core/client_wrapper.py | 4 +-- src/phenoml/fhir2omop/__init__.py | 15 ++++++++ src/phenoml/fhir2omop/types/__init__.py | 15 ++++++++ src/phenoml/fhir2omop/types/care_site_row.py | 24 +++++++++++++ .../types/condition_occurrence_row.py | 1 + src/phenoml/fhir2omop/types/death_row.py | 25 +++++++++++++ .../fhir2omop/types/drug_exposure_row.py | 1 + src/phenoml/fhir2omop/types/location_row.py | 36 +++++++++++++++++++ .../fhir2omop/types/measurement_row.py | 1 + .../fhir2omop/types/observation_period_row.py | 23 ++++++++++++ .../fhir2omop/types/observation_row.py | 1 + src/phenoml/fhir2omop/types/omop_tables.py | 10 ++++++ src/phenoml/fhir2omop/types/person_row.py | 1 + .../types/procedure_occurrence_row.py | 1 + src/phenoml/fhir2omop/types/provider_row.py | 31 ++++++++++++++++ .../fhir2omop/types/visit_occurrence_row.py | 2 ++ wiremock/wiremock-mappings.json | 2 +- 19 files changed, 194 insertions(+), 10 deletions(-) create mode 100644 src/phenoml/fhir2omop/types/care_site_row.py create mode 100644 src/phenoml/fhir2omop/types/death_row.py create mode 100644 src/phenoml/fhir2omop/types/location_row.py create mode 100644 src/phenoml/fhir2omop/types/observation_period_row.py create mode 100644 src/phenoml/fhir2omop/types/provider_row.py diff --git a/.fern/metadata.json b/.fern/metadata.json index 69b204f..82283d7 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -1,5 +1,5 @@ { - "cliVersion": "5.50.4", + "cliVersion": "5.50.5", "generatorName": "fernapi/fern-python-sdk", "generatorVersion": "5.14.13", "generatorConfig": { @@ -8,10 +8,10 @@ "enabled": true } }, - "originGitCommit": "e2c477c4583f8f9e7d0d1a5b5591c1aa8cabef10", + "originGitCommit": "7b0a1643f56f1ba4ead44e0a90a5547a31fa6831", "originGitCommitIsDirty": true, "invokedBy": "ci", "requestedVersion": "AUTO", "ciProvider": "unknown", - "sdkVersion": "16.4.0" + "sdkVersion": "0.0.0.dev0" } \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 6c649b6..cc86d42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ dynamic = ["version"] [tool.poetry] name = "phenoml" -version = "16.4.0" +version = "0.0.0.dev0" description = "" readme = "README.md" authors = [] @@ -31,9 +31,6 @@ classifiers = [ packages = [ { include = "phenoml", from = "src"} ] -include = [ - { path = "src/phenoml/openapi/openapi.json", format = ["sdist", "wheel"] } -] [tool.poetry.urls] Repository = 'https://github.com/phenoml/phenoml-python-sdk' diff --git a/src/phenoml/core/client_wrapper.py b/src/phenoml/core/client_wrapper.py index 536cb52..3421d69 100644 --- a/src/phenoml/core/client_wrapper.py +++ b/src/phenoml/core/client_wrapper.py @@ -29,12 +29,12 @@ def get_headers(self) -> typing.Dict[str, str]: import platform headers: typing.Dict[str, str] = { - "User-Agent": "phenoml/16.4.0", + "User-Agent": "phenoml/0.0.0.dev0", "X-Fern-Language": "Python", "X-Fern-Runtime": f"python/{platform.python_version()}", "X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}", "X-Fern-SDK-Name": "phenoml", - "X-Fern-SDK-Version": "16.4.0", + "X-Fern-SDK-Version": "0.0.0.dev0", **(self.get_custom_headers() or {}), } token = self._get_token() diff --git a/src/phenoml/fhir2omop/__init__.py b/src/phenoml/fhir2omop/__init__.py index fa39886..8906ff1 100644 --- a/src/phenoml/fhir2omop/__init__.py +++ b/src/phenoml/fhir2omop/__init__.py @@ -7,33 +7,43 @@ if typing.TYPE_CHECKING: from .types import ( + CareSiteRow, ConditionOccurrenceRow, CreateOmopResponse, + DeathRow, DroppedResource, DrugExposureRow, + LocationRow, MappingEntry, MeasurementRow, + ObservationPeriodRow, ObservationRow, OmopTables, PersonRow, ProcedureOccurrenceRow, + ProviderRow, Summary, VisitOccurrenceRow, ) from .errors import BadRequestError, InternalServerError, ServiceUnavailableError, UnauthorizedError _dynamic_imports: typing.Dict[str, str] = { "BadRequestError": ".errors", + "CareSiteRow": ".types", "ConditionOccurrenceRow": ".types", "CreateOmopResponse": ".types", + "DeathRow": ".types", "DroppedResource": ".types", "DrugExposureRow": ".types", "InternalServerError": ".errors", + "LocationRow": ".types", "MappingEntry": ".types", "MeasurementRow": ".types", + "ObservationPeriodRow": ".types", "ObservationRow": ".types", "OmopTables": ".types", "PersonRow": ".types", "ProcedureOccurrenceRow": ".types", + "ProviderRow": ".types", "ServiceUnavailableError": ".errors", "Summary": ".types", "UnauthorizedError": ".errors", @@ -64,17 +74,22 @@ def __dir__(): __all__ = [ "BadRequestError", + "CareSiteRow", "ConditionOccurrenceRow", "CreateOmopResponse", + "DeathRow", "DroppedResource", "DrugExposureRow", "InternalServerError", + "LocationRow", "MappingEntry", "MeasurementRow", + "ObservationPeriodRow", "ObservationRow", "OmopTables", "PersonRow", "ProcedureOccurrenceRow", + "ProviderRow", "ServiceUnavailableError", "Summary", "UnauthorizedError", diff --git a/src/phenoml/fhir2omop/types/__init__.py b/src/phenoml/fhir2omop/types/__init__.py index 693397b..669a67a 100644 --- a/src/phenoml/fhir2omop/types/__init__.py +++ b/src/phenoml/fhir2omop/types/__init__.py @@ -6,29 +6,39 @@ from importlib import import_module if typing.TYPE_CHECKING: + from .care_site_row import CareSiteRow from .condition_occurrence_row import ConditionOccurrenceRow from .create_omop_response import CreateOmopResponse + from .death_row import DeathRow from .dropped_resource import DroppedResource from .drug_exposure_row import DrugExposureRow + from .location_row import LocationRow from .mapping_entry import MappingEntry from .measurement_row import MeasurementRow + from .observation_period_row import ObservationPeriodRow from .observation_row import ObservationRow from .omop_tables import OmopTables from .person_row import PersonRow from .procedure_occurrence_row import ProcedureOccurrenceRow + from .provider_row import ProviderRow from .summary import Summary from .visit_occurrence_row import VisitOccurrenceRow _dynamic_imports: typing.Dict[str, str] = { + "CareSiteRow": ".care_site_row", "ConditionOccurrenceRow": ".condition_occurrence_row", "CreateOmopResponse": ".create_omop_response", + "DeathRow": ".death_row", "DroppedResource": ".dropped_resource", "DrugExposureRow": ".drug_exposure_row", + "LocationRow": ".location_row", "MappingEntry": ".mapping_entry", "MeasurementRow": ".measurement_row", + "ObservationPeriodRow": ".observation_period_row", "ObservationRow": ".observation_row", "OmopTables": ".omop_tables", "PersonRow": ".person_row", "ProcedureOccurrenceRow": ".procedure_occurrence_row", + "ProviderRow": ".provider_row", "Summary": ".summary", "VisitOccurrenceRow": ".visit_occurrence_row", } @@ -56,16 +66,21 @@ def __dir__(): __all__ = [ + "CareSiteRow", "ConditionOccurrenceRow", "CreateOmopResponse", + "DeathRow", "DroppedResource", "DrugExposureRow", + "LocationRow", "MappingEntry", "MeasurementRow", + "ObservationPeriodRow", "ObservationRow", "OmopTables", "PersonRow", "ProcedureOccurrenceRow", + "ProviderRow", "Summary", "VisitOccurrenceRow", ] diff --git a/src/phenoml/fhir2omop/types/care_site_row.py b/src/phenoml/fhir2omop/types/care_site_row.py new file mode 100644 index 0000000..e60c4d2 --- /dev/null +++ b/src/phenoml/fhir2omop/types/care_site_row.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CareSiteRow(UniversalBaseModel): + care_site_id: typing.Optional[int] = None + care_site_name: typing.Optional[str] = None + place_of_service_concept_id: typing.Optional[int] = None + location_id: typing.Optional[int] = None + care_site_source_value: typing.Optional[str] = None + place_of_service_source_value: typing.Optional[str] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/phenoml/fhir2omop/types/condition_occurrence_row.py b/src/phenoml/fhir2omop/types/condition_occurrence_row.py index 22edfe9..0e7d829 100644 --- a/src/phenoml/fhir2omop/types/condition_occurrence_row.py +++ b/src/phenoml/fhir2omop/types/condition_occurrence_row.py @@ -15,6 +15,7 @@ class ConditionOccurrenceRow(UniversalBaseModel): condition_end_date: typing.Optional[str] = None condition_type_concept_id: typing.Optional[int] = None visit_occurrence_id: typing.Optional[int] = None + provider_id: typing.Optional[int] = None condition_source_value: typing.Optional[str] = None condition_source_concept_id: typing.Optional[int] = None condition_status_source_value: typing.Optional[str] = None diff --git a/src/phenoml/fhir2omop/types/death_row.py b/src/phenoml/fhir2omop/types/death_row.py new file mode 100644 index 0000000..0afd6ce --- /dev/null +++ b/src/phenoml/fhir2omop/types/death_row.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class DeathRow(UniversalBaseModel): + person_id: typing.Optional[int] = None + death_date: typing.Optional[str] = None + death_datetime: typing.Optional[str] = None + death_type_concept_id: typing.Optional[int] = None + cause_concept_id: typing.Optional[int] = None + cause_source_value: typing.Optional[str] = None + cause_source_concept_id: typing.Optional[int] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/phenoml/fhir2omop/types/drug_exposure_row.py b/src/phenoml/fhir2omop/types/drug_exposure_row.py index 69ea538..48803cb 100644 --- a/src/phenoml/fhir2omop/types/drug_exposure_row.py +++ b/src/phenoml/fhir2omop/types/drug_exposure_row.py @@ -17,6 +17,7 @@ class DrugExposureRow(UniversalBaseModel): stop_reason: typing.Optional[str] = None sig: typing.Optional[str] = None visit_occurrence_id: typing.Optional[int] = None + provider_id: typing.Optional[int] = None drug_source_value: typing.Optional[str] = None drug_source_concept_id: typing.Optional[int] = None diff --git a/src/phenoml/fhir2omop/types/location_row.py b/src/phenoml/fhir2omop/types/location_row.py new file mode 100644 index 0000000..395a274 --- /dev/null +++ b/src/phenoml/fhir2omop/types/location_row.py @@ -0,0 +1,36 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...core.serialization import FieldMetadata + + +class LocationRow(UniversalBaseModel): + location_id: typing.Optional[int] = None + address1: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="address_1"), pydantic.Field(alias="address_1") + ] = None + address2: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="address_2"), pydantic.Field(alias="address_2") + ] = None + city: typing.Optional[str] = None + state: typing.Optional[str] = None + zip: typing.Optional[str] = None + county: typing.Optional[str] = None + location_source_value: typing.Optional[str] = None + country_concept_id: typing.Optional[int] = None + country_source_value: typing.Optional[str] = None + latitude: typing.Optional[float] = None + longitude: typing.Optional[float] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/phenoml/fhir2omop/types/measurement_row.py b/src/phenoml/fhir2omop/types/measurement_row.py index d48243d..169fc17 100644 --- a/src/phenoml/fhir2omop/types/measurement_row.py +++ b/src/phenoml/fhir2omop/types/measurement_row.py @@ -24,6 +24,7 @@ class MeasurementRow(UniversalBaseModel): range_low: typing.Optional[float] = None range_high: typing.Optional[float] = None visit_occurrence_id: typing.Optional[int] = None + provider_id: typing.Optional[int] = None measurement_source_value: typing.Optional[str] = None measurement_source_concept_id: typing.Optional[int] = None unit_source_value: typing.Optional[str] = None diff --git a/src/phenoml/fhir2omop/types/observation_period_row.py b/src/phenoml/fhir2omop/types/observation_period_row.py new file mode 100644 index 0000000..8dc956f --- /dev/null +++ b/src/phenoml/fhir2omop/types/observation_period_row.py @@ -0,0 +1,23 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ObservationPeriodRow(UniversalBaseModel): + observation_period_id: typing.Optional[int] = None + person_id: typing.Optional[int] = None + observation_period_start_date: typing.Optional[str] = None + observation_period_end_date: typing.Optional[str] = None + period_type_concept_id: typing.Optional[int] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/phenoml/fhir2omop/types/observation_row.py b/src/phenoml/fhir2omop/types/observation_row.py index 43df628..8a1732f 100644 --- a/src/phenoml/fhir2omop/types/observation_row.py +++ b/src/phenoml/fhir2omop/types/observation_row.py @@ -18,6 +18,7 @@ class ObservationRow(UniversalBaseModel): value_as_concept_id: typing.Optional[int] = None unit_concept_id: typing.Optional[int] = None visit_occurrence_id: typing.Optional[int] = None + provider_id: typing.Optional[int] = None observation_source_value: typing.Optional[str] = None observation_source_concept_id: typing.Optional[int] = None unit_source_value: typing.Optional[str] = None diff --git a/src/phenoml/fhir2omop/types/omop_tables.py b/src/phenoml/fhir2omop/types/omop_tables.py index 906c038..10f0cba 100644 --- a/src/phenoml/fhir2omop/types/omop_tables.py +++ b/src/phenoml/fhir2omop/types/omop_tables.py @@ -4,12 +4,17 @@ import pydantic from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .care_site_row import CareSiteRow from .condition_occurrence_row import ConditionOccurrenceRow +from .death_row import DeathRow from .drug_exposure_row import DrugExposureRow +from .location_row import LocationRow from .measurement_row import MeasurementRow +from .observation_period_row import ObservationPeriodRow from .observation_row import ObservationRow from .person_row import PersonRow from .procedure_occurrence_row import ProcedureOccurrenceRow +from .provider_row import ProviderRow from .visit_occurrence_row import VisitOccurrenceRow @@ -18,7 +23,12 @@ class OmopTables(UniversalBaseModel): OMOP CDM v5.4 rows grouped by destination table. """ + location: typing.Optional[typing.List[LocationRow]] = None + care_site: typing.Optional[typing.List[CareSiteRow]] = None + provider: typing.Optional[typing.List[ProviderRow]] = None person: typing.Optional[typing.List[PersonRow]] = None + death: typing.Optional[typing.List[DeathRow]] = None + observation_period: typing.Optional[typing.List[ObservationPeriodRow]] = None visit_occurrence: typing.Optional[typing.List[VisitOccurrenceRow]] = None condition_occurrence: typing.Optional[typing.List[ConditionOccurrenceRow]] = None drug_exposure: typing.Optional[typing.List[DrugExposureRow]] = None diff --git a/src/phenoml/fhir2omop/types/person_row.py b/src/phenoml/fhir2omop/types/person_row.py index 2ed1a8f..39c31ee 100644 --- a/src/phenoml/fhir2omop/types/person_row.py +++ b/src/phenoml/fhir2omop/types/person_row.py @@ -15,6 +15,7 @@ class PersonRow(UniversalBaseModel): birth_datetime: typing.Optional[str] = None race_concept_id: typing.Optional[int] = None ethnicity_concept_id: typing.Optional[int] = None + location_id: typing.Optional[int] = None person_source_value: typing.Optional[str] = None gender_source_value: typing.Optional[str] = None race_source_value: typing.Optional[str] = None diff --git a/src/phenoml/fhir2omop/types/procedure_occurrence_row.py b/src/phenoml/fhir2omop/types/procedure_occurrence_row.py index 3266117..ace4167 100644 --- a/src/phenoml/fhir2omop/types/procedure_occurrence_row.py +++ b/src/phenoml/fhir2omop/types/procedure_occurrence_row.py @@ -14,6 +14,7 @@ class ProcedureOccurrenceRow(UniversalBaseModel): procedure_datetime: typing.Optional[str] = None procedure_type_concept_id: typing.Optional[int] = None visit_occurrence_id: typing.Optional[int] = None + provider_id: typing.Optional[int] = None procedure_source_value: typing.Optional[str] = None procedure_source_concept_id: typing.Optional[int] = None diff --git a/src/phenoml/fhir2omop/types/provider_row.py b/src/phenoml/fhir2omop/types/provider_row.py new file mode 100644 index 0000000..4ba4745 --- /dev/null +++ b/src/phenoml/fhir2omop/types/provider_row.py @@ -0,0 +1,31 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ProviderRow(UniversalBaseModel): + provider_id: typing.Optional[int] = None + provider_name: typing.Optional[str] = None + npi: typing.Optional[str] = None + dea: typing.Optional[str] = None + specialty_concept_id: typing.Optional[int] = None + care_site_id: typing.Optional[int] = None + year_of_birth: typing.Optional[int] = None + gender_concept_id: typing.Optional[int] = None + provider_source_value: typing.Optional[str] = None + specialty_source_value: typing.Optional[str] = None + specialty_source_concept_id: typing.Optional[int] = None + gender_source_value: typing.Optional[str] = None + gender_source_concept_id: typing.Optional[int] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/phenoml/fhir2omop/types/visit_occurrence_row.py b/src/phenoml/fhir2omop/types/visit_occurrence_row.py index 901160d..c7b6a1a 100644 --- a/src/phenoml/fhir2omop/types/visit_occurrence_row.py +++ b/src/phenoml/fhir2omop/types/visit_occurrence_row.py @@ -15,6 +15,8 @@ class VisitOccurrenceRow(UniversalBaseModel): visit_end_date: typing.Optional[str] = None visit_end_datetime: typing.Optional[str] = None visit_type_concept_id: typing.Optional[int] = None + provider_id: typing.Optional[int] = None + care_site_id: typing.Optional[int] = None visit_source_value: typing.Optional[str] = None if IS_PYDANTIC_V2: diff --git a/wiremock/wiremock-mappings.json b/wiremock/wiremock-mappings.json index de3b3de..39f5e7a 100644 --- a/wiremock/wiremock-mappings.json +++ b/wiremock/wiremock-mappings.json @@ -1092,7 +1092,7 @@ }, "response": { "status": 200, - "body": "{\n \"success\": true,\n \"message\": \"FHIR resources mapped to OMOP CDM v5.4\",\n \"tables\": {\n \"person\": [\n {\n \"person_id\": 1,\n \"gender_concept_id\": 0,\n \"year_of_birth\": 1985,\n \"month_of_birth\": 7,\n \"day_of_birth\": 22,\n \"birth_datetime\": \"1985-07-22\",\n \"race_concept_id\": 0,\n \"ethnicity_concept_id\": 0,\n \"person_source_value\": \"patient-1\",\n \"gender_source_value\": \"female\"\n }\n ],\n \"visit_occurrence\": [\n {}\n ],\n \"condition_occurrence\": [\n {\n \"condition_occurrence_id\": 1,\n \"person_id\": 1,\n \"condition_concept_id\": 201826,\n \"condition_start_date\": \"2024-01-15\",\n \"condition_start_datetime\": \"2024-01-15\",\n \"condition_type_concept_id\": 32817,\n \"condition_source_value\": \"http://snomed.info/sct#44054006\",\n \"condition_source_concept_id\": 201826\n }\n ],\n \"drug_exposure\": [\n {\n \"drug_exposure_id\": 1,\n \"person_id\": 1,\n \"drug_concept_id\": 40163924,\n \"drug_exposure_start_date\": \"2024-01-16\",\n \"drug_exposure_start_datetime\": \"2024-01-16\",\n \"drug_type_concept_id\": 32817,\n \"drug_source_value\": \"http://www.nlm.nih.gov/research/umls/rxnorm#860975\",\n \"drug_source_concept_id\": 40163924\n }\n ],\n \"procedure_occurrence\": [\n {}\n ],\n \"measurement\": [\n {}\n ],\n \"observation\": [\n {}\n ]\n },\n \"mappings\": [\n {\n \"resource_type\": \"Condition\",\n \"resource_id\": \"condition-1\",\n \"omop_table\": \"condition_occurrence\",\n \"omop_id\": 1,\n \"source_system\": \"http://snomed.info/sct\",\n \"source_code\": \"44054006\",\n \"source_name\": \"Type 2 diabetes mellitus\",\n \"target_vocabulary\": \"SNOMED\",\n \"target_code\": \"44054006\",\n \"target_name\": \"Type 2 diabetes mellitus\",\n \"mapping_status\": \"ALREADY_STANDARD\",\n \"note\": \"note\"\n },\n {\n \"resource_type\": \"MedicationRequest\",\n \"resource_id\": \"medreq-1\",\n \"omop_table\": \"drug_exposure\",\n \"omop_id\": 1,\n \"source_system\": \"http://www.nlm.nih.gov/research/umls/rxnorm\",\n \"source_code\": \"860975\",\n \"source_name\": \"metformin hydrochloride 500 MG\",\n \"target_vocabulary\": \"RXNORM\",\n \"target_code\": \"860975\",\n \"target_name\": \"metformin hydrochloride 500 MG\",\n \"mapping_status\": \"ALREADY_STANDARD\",\n \"note\": \"note\"\n }\n ],\n \"dropped\": [\n {\n \"resource_type\": \"resource_type\",\n \"resource_id\": \"resource_id\",\n \"reason\": \"reason\"\n }\n ],\n \"vocab_version\": \"v20240229\",\n \"summary\": {\n \"codes_already_standard\": 2,\n \"codes_normalized\": 0,\n \"codes_unmapped\": 0,\n \"off_vocab_rate\": 0\n }\n}", + "body": "{\n \"success\": true,\n \"message\": \"FHIR resources mapped to OMOP CDM v5.4\",\n \"tables\": {\n \"location\": [\n {}\n ],\n \"care_site\": [\n {}\n ],\n \"provider\": [\n {}\n ],\n \"person\": [\n {\n \"person_id\": 1,\n \"gender_concept_id\": 0,\n \"year_of_birth\": 1985,\n \"month_of_birth\": 7,\n \"day_of_birth\": 22,\n \"birth_datetime\": \"1985-07-22\",\n \"race_concept_id\": 0,\n \"ethnicity_concept_id\": 0,\n \"person_source_value\": \"patient-1\",\n \"gender_source_value\": \"female\"\n }\n ],\n \"death\": [\n {}\n ],\n \"observation_period\": [\n {}\n ],\n \"visit_occurrence\": [\n {}\n ],\n \"condition_occurrence\": [\n {\n \"condition_occurrence_id\": 1,\n \"person_id\": 1,\n \"condition_concept_id\": 201826,\n \"condition_start_date\": \"2024-01-15\",\n \"condition_start_datetime\": \"2024-01-15\",\n \"condition_type_concept_id\": 32817,\n \"condition_source_value\": \"http://snomed.info/sct#44054006\",\n \"condition_source_concept_id\": 201826\n }\n ],\n \"drug_exposure\": [\n {\n \"drug_exposure_id\": 1,\n \"person_id\": 1,\n \"drug_concept_id\": 40163924,\n \"drug_exposure_start_date\": \"2024-01-16\",\n \"drug_exposure_start_datetime\": \"2024-01-16\",\n \"drug_type_concept_id\": 32817,\n \"drug_source_value\": \"http://www.nlm.nih.gov/research/umls/rxnorm#860975\",\n \"drug_source_concept_id\": 40163924\n }\n ],\n \"procedure_occurrence\": [\n {}\n ],\n \"measurement\": [\n {}\n ],\n \"observation\": [\n {}\n ]\n },\n \"mappings\": [\n {\n \"resource_type\": \"Condition\",\n \"resource_id\": \"condition-1\",\n \"omop_table\": \"condition_occurrence\",\n \"omop_id\": 1,\n \"source_system\": \"http://snomed.info/sct\",\n \"source_code\": \"44054006\",\n \"source_name\": \"Type 2 diabetes mellitus\",\n \"target_vocabulary\": \"SNOMED\",\n \"target_code\": \"44054006\",\n \"target_name\": \"Type 2 diabetes mellitus\",\n \"mapping_status\": \"ALREADY_STANDARD\",\n \"note\": \"note\"\n },\n {\n \"resource_type\": \"MedicationRequest\",\n \"resource_id\": \"medreq-1\",\n \"omop_table\": \"drug_exposure\",\n \"omop_id\": 1,\n \"source_system\": \"http://www.nlm.nih.gov/research/umls/rxnorm\",\n \"source_code\": \"860975\",\n \"source_name\": \"metformin hydrochloride 500 MG\",\n \"target_vocabulary\": \"RXNORM\",\n \"target_code\": \"860975\",\n \"target_name\": \"metformin hydrochloride 500 MG\",\n \"mapping_status\": \"ALREADY_STANDARD\",\n \"note\": \"note\"\n }\n ],\n \"dropped\": [\n {\n \"resource_type\": \"resource_type\",\n \"resource_id\": \"resource_id\",\n \"reason\": \"reason\"\n }\n ],\n \"vocab_version\": \"v20240229\",\n \"summary\": {\n \"codes_already_standard\": 2,\n \"codes_normalized\": 0,\n \"codes_unmapped\": 0,\n \"off_vocab_rate\": 0\n }\n}", "headers": { "Content-Type": "application/json" } From c7ee52e97b6db32e3549967bd9b7d10450a1e841 Mon Sep 17 00:00:00 2001 From: fern-api <115122769+fern-api[bot]@users.noreply.github.com> Date: Tue, 23 Jun 2026 21:44:48 +0000 Subject: [PATCH 2/3] [fern-autoversion] feat: add OMOP CDM v5.4 table types and provider linkage fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expand the fhir2omop module with five new OMOP CDM v5.4 row types and add `provider_id` / `care_site_id` / `location_id` linkage fields to existing row models. The `OmopTables` aggregate now surfaces the new tables so callers can access location, care-site, provider, death, and observation-period data returned by the conversion endpoint. Key changes: - Add `CareSiteRow`, `DeathRow`, `LocationRow`, `ObservationPeriodRow`, and `ProviderRow` Pydantic models under `phenoml.fhir2omop` - Add optional `location`, `care_site`, `provider`, `death`, and `observation_period` list fields to `OmopTables` - Add optional `provider_id` field to `ConditionOccurrenceRow`, `DrugExposureRow`, `MeasurementRow`, `ObservationRow`, `ProcedureOccurrenceRow`, and `VisitOccurrenceRow` - Add optional `care_site_id` to `VisitOccurrenceRow` and `location_id` to `PersonRow` - Export all new types from `phenoml.fhir2omop` and `phenoml.fhir2omop.types` 🌿 Generated with Fern --- .fern/metadata.json | 2 +- .fern/replay.lock | 2 +- changelog.md | 7 +++++++ pyproject.toml | 2 +- src/phenoml/core/client_wrapper.py | 4 ++-- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.fern/metadata.json b/.fern/metadata.json index 82283d7..c3a3ecb 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -13,5 +13,5 @@ "invokedBy": "ci", "requestedVersion": "AUTO", "ciProvider": "unknown", - "sdkVersion": "0.0.0.dev0" + "sdkVersion": "16.5.0" } \ No newline at end of file diff --git a/.fern/replay.lock b/.fern/replay.lock index ae7ed39..d6d0218 100644 --- a/.fern/replay.lock +++ b/.fern/replay.lock @@ -79,7 +79,7 @@ patches: [tool.poetry] name = "phenoml" - -version = "0.0.0.dev0" + -version = "16.5.0" +version = "16.4.0" description = "" readme = "README.md" diff --git a/changelog.md b/changelog.md index dfb6bc0..e1a2546 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,10 @@ +## [16.5.0] - 2026-06-23 +### Added +- **`CareSiteRow`**, **`DeathRow`**, **`LocationRow`**, **`ObservationPeriodRow`**, and **`ProviderRow`** — new Pydantic models under `phenoml.fhir2omop` representing the corresponding OMOP CDM v5.4 destination tables. +- **`OmopTables.location`**, **`.care_site`**, **`.provider`**, **`.death`**, and **`.observation_period`** — new optional list fields on `OmopTables` that surface rows for the newly supported OMOP tables returned by the FHIR-to-OMOP conversion endpoint. +- **`provider_id`** optional field added to `ConditionOccurrenceRow`, `DrugExposureRow`, `MeasurementRow`, `ObservationRow`, `ProcedureOccurrenceRow`, and `VisitOccurrenceRow` to link clinical events to their performing provider. +- **`care_site_id`** optional field added to `VisitOccurrenceRow`; **`location_id`** optional field added to `PersonRow` to capture physical location linkage. + ## [16.4.0] - 2026-06-23 ### Added - **`client.voice.voice.transcribe(...)`** — new sync and async method that accepts raw audio bytes (WAV, FLAC, MP3, OGG/WebM Opus) and returns a `TranscribeResponse` with the full transcript, supporting up to ~5 minutes of audio per request. diff --git a/pyproject.toml b/pyproject.toml index cc86d42..dbc2088 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ dynamic = ["version"] [tool.poetry] name = "phenoml" -version = "0.0.0.dev0" +version = "16.5.0" description = "" readme = "README.md" authors = [] diff --git a/src/phenoml/core/client_wrapper.py b/src/phenoml/core/client_wrapper.py index 3421d69..eb404b1 100644 --- a/src/phenoml/core/client_wrapper.py +++ b/src/phenoml/core/client_wrapper.py @@ -29,12 +29,12 @@ def get_headers(self) -> typing.Dict[str, str]: import platform headers: typing.Dict[str, str] = { - "User-Agent": "phenoml/0.0.0.dev0", + "User-Agent": "phenoml/16.5.0", "X-Fern-Language": "Python", "X-Fern-Runtime": f"python/{platform.python_version()}", "X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}", "X-Fern-SDK-Name": "phenoml", - "X-Fern-SDK-Version": "0.0.0.dev0", + "X-Fern-SDK-Version": "16.5.0", **(self.get_custom_headers() or {}), } token = self._get_token() From 0d970369ff87beaadfd126fe21433e78a85da76d Mon Sep 17 00:00:00 2001 From: fern-api <115122769+fern-api[bot]@users.noreply.github.com> Date: Tue, 23 Jun 2026 21:44:50 +0000 Subject: [PATCH 3/3] [fern-replay] Applied customizations Patches with unresolved conflicts (1): - patch-6516695e: Release 15.0.2: restore bundled openapi.json packaging (#169) Run `fern-replay resolve` to apply these customizations. --- .fern/replay.lock | 11 +++++++++-- pyproject.toml | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.fern/replay.lock b/.fern/replay.lock index d6d0218..f24adeb 100644 --- a/.fern/replay.lock +++ b/.fern/replay.lock @@ -60,7 +60,13 @@ generations: cli_version: unknown generator_versions: fernapi/fern-python-sdk: 5.14.13 -current_generation: e0932f75557c87fc1914f6c54c5917b59231d3a1 + - commit_sha: 2b6827d291c7072a516df1842c95df2b8482ef65 + tree_hash: 8410901f787ee520308a3ff10870411d9ba38efd + timestamp: 2026-06-23T21:44:35.062Z + cli_version: unknown + generator_versions: + fernapi/fern-python-sdk: 5.14.13 +current_generation: 2b6827d291c7072a516df1842c95df2b8482ef65 patches: - id: patch-6516695e content_hash: sha256:d2b3264c983a6bb7ce6db1b48d80d28aa93b1f5c838f654cd489a6e8569bee20 @@ -79,7 +85,7 @@ patches: [tool.poetry] name = "phenoml" - -version = "16.5.0" + -version = "0.0.0.dev0" +version = "16.4.0" description = "" readme = "README.md" @@ -197,3 +203,4 @@ patches: [tool.poetry.extras] aiohttp=["aiohttp", "httpx-aiohttp"] + status: unresolved diff --git a/pyproject.toml b/pyproject.toml index dbc2088..7204936 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,9 @@ classifiers = [ packages = [ { include = "phenoml", from = "src"} ] +include = [ + { path = "src/phenoml/openapi/openapi.json", format = ["sdist", "wheel"] } +] [tool.poetry.urls] Repository = 'https://github.com/phenoml/phenoml-python-sdk'