phenoml 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of phenoml might be problematic. Click here for more details.

Files changed (143) hide show
  1. phenoml/__init__.py +30 -0
  2. phenoml/agent/__init__.py +58 -0
  3. phenoml/agent/client.py +820 -0
  4. phenoml/agent/errors/__init__.py +11 -0
  5. phenoml/agent/errors/bad_request_error.py +10 -0
  6. phenoml/agent/errors/forbidden_error.py +10 -0
  7. phenoml/agent/errors/internal_server_error.py +10 -0
  8. phenoml/agent/errors/not_found_error.py +10 -0
  9. phenoml/agent/errors/unauthorized_error.py +10 -0
  10. phenoml/agent/prompts/__init__.py +7 -0
  11. phenoml/agent/prompts/client.py +707 -0
  12. phenoml/agent/prompts/raw_client.py +1345 -0
  13. phenoml/agent/prompts/types/__init__.py +8 -0
  14. phenoml/agent/prompts/types/prompts_delete_response.py +20 -0
  15. phenoml/agent/prompts/types/prompts_list_response.py +22 -0
  16. phenoml/agent/raw_client.py +1501 -0
  17. phenoml/agent/types/__init__.py +45 -0
  18. phenoml/agent/types/agent_chat_response.py +33 -0
  19. phenoml/agent/types/agent_create_request_provider.py +13 -0
  20. phenoml/agent/types/agent_create_request_provider_item.py +7 -0
  21. phenoml/agent/types/agent_delete_response.py +20 -0
  22. phenoml/agent/types/agent_fhir_config.py +31 -0
  23. phenoml/agent/types/agent_list_response.py +22 -0
  24. phenoml/agent/types/agent_prompts_response.py +22 -0
  25. phenoml/agent/types/agent_response.py +22 -0
  26. phenoml/agent/types/agent_template.py +56 -0
  27. phenoml/agent/types/agent_template_provider.py +13 -0
  28. phenoml/agent/types/agent_template_provider_item.py +5 -0
  29. phenoml/agent/types/agent_update_request_provider.py +13 -0
  30. phenoml/agent/types/agent_update_request_provider_item.py +7 -0
  31. phenoml/agent/types/chat_fhir_client_config.py +31 -0
  32. phenoml/agent/types/json_patch.py +7 -0
  33. phenoml/agent/types/json_patch_operation.py +36 -0
  34. phenoml/agent/types/json_patch_operation_op.py +5 -0
  35. phenoml/agent/types/prompt_template.py +52 -0
  36. phenoml/agent/types/success_response.py +20 -0
  37. phenoml/authtoken/__init__.py +17 -0
  38. phenoml/authtoken/auth/__init__.py +7 -0
  39. phenoml/authtoken/auth/client.py +129 -0
  40. phenoml/authtoken/auth/raw_client.py +173 -0
  41. phenoml/authtoken/auth/types/__init__.py +7 -0
  42. phenoml/authtoken/auth/types/auth_generate_token_response.py +22 -0
  43. phenoml/authtoken/client.py +39 -0
  44. phenoml/authtoken/errors/__init__.py +8 -0
  45. phenoml/authtoken/errors/bad_request_error.py +10 -0
  46. phenoml/authtoken/errors/unauthorized_error.py +10 -0
  47. phenoml/authtoken/raw_client.py +13 -0
  48. phenoml/authtoken/types/__init__.py +8 -0
  49. phenoml/authtoken/types/bad_request_error_body.py +21 -0
  50. phenoml/authtoken/types/unauthorized_error_body.py +21 -0
  51. phenoml/client.py +168 -0
  52. phenoml/cohort/__init__.py +8 -0
  53. phenoml/cohort/client.py +113 -0
  54. phenoml/cohort/errors/__init__.py +9 -0
  55. phenoml/cohort/errors/bad_request_error.py +10 -0
  56. phenoml/cohort/errors/internal_server_error.py +10 -0
  57. phenoml/cohort/errors/unauthorized_error.py +10 -0
  58. phenoml/cohort/raw_client.py +185 -0
  59. phenoml/cohort/types/__init__.py +8 -0
  60. phenoml/cohort/types/cohort_response.py +33 -0
  61. phenoml/cohort/types/search_concept.py +37 -0
  62. phenoml/construe/__init__.py +45 -0
  63. phenoml/construe/client.py +399 -0
  64. phenoml/construe/errors/__init__.py +11 -0
  65. phenoml/construe/errors/bad_request_error.py +10 -0
  66. phenoml/construe/errors/conflict_error.py +10 -0
  67. phenoml/construe/errors/failed_dependency_error.py +10 -0
  68. phenoml/construe/errors/internal_server_error.py +10 -0
  69. phenoml/construe/errors/unauthorized_error.py +10 -0
  70. phenoml/construe/raw_client.py +706 -0
  71. phenoml/construe/types/__init__.py +41 -0
  72. phenoml/construe/types/bad_request_error_body.py +27 -0
  73. phenoml/construe/types/construe_cohort_request_config.py +37 -0
  74. phenoml/construe/types/construe_cohort_response.py +33 -0
  75. phenoml/construe/types/construe_cohort_response_queries_item.py +49 -0
  76. phenoml/construe/types/construe_cohort_response_queries_item_code_extract_results_item.py +31 -0
  77. phenoml/construe/types/construe_cohort_response_queries_item_code_extract_results_item_codes_item.py +32 -0
  78. phenoml/construe/types/construe_upload_code_system_response.py +19 -0
  79. phenoml/construe/types/extract_codes_result.py +22 -0
  80. phenoml/construe/types/extract_request_config.py +23 -0
  81. phenoml/construe/types/extract_request_config_chunking_method.py +5 -0
  82. phenoml/construe/types/extract_request_system.py +37 -0
  83. phenoml/construe/types/extracted_code_result.py +41 -0
  84. phenoml/construe/types/internal_server_error_body.py +27 -0
  85. phenoml/construe/types/unauthorized_error_body.py +27 -0
  86. phenoml/construe/types/upload_request_format.py +5 -0
  87. phenoml/core/__init__.py +52 -0
  88. phenoml/core/api_error.py +23 -0
  89. phenoml/core/client_wrapper.py +85 -0
  90. phenoml/core/datetime_utils.py +28 -0
  91. phenoml/core/file.py +67 -0
  92. phenoml/core/force_multipart.py +16 -0
  93. phenoml/core/http_client.py +543 -0
  94. phenoml/core/http_response.py +55 -0
  95. phenoml/core/jsonable_encoder.py +100 -0
  96. phenoml/core/pydantic_utilities.py +255 -0
  97. phenoml/core/query_encoder.py +58 -0
  98. phenoml/core/remove_none_from_dict.py +11 -0
  99. phenoml/core/request_options.py +35 -0
  100. phenoml/core/serialization.py +276 -0
  101. phenoml/environment.py +7 -0
  102. phenoml/lang2fhir/__init__.py +27 -0
  103. phenoml/lang2fhir/client.py +430 -0
  104. phenoml/lang2fhir/errors/__init__.py +11 -0
  105. phenoml/lang2fhir/errors/bad_request_error.py +10 -0
  106. phenoml/lang2fhir/errors/failed_dependency_error.py +10 -0
  107. phenoml/lang2fhir/errors/forbidden_error.py +10 -0
  108. phenoml/lang2fhir/errors/internal_server_error.py +10 -0
  109. phenoml/lang2fhir/errors/unauthorized_error.py +10 -0
  110. phenoml/lang2fhir/raw_client.py +788 -0
  111. phenoml/lang2fhir/types/__init__.py +19 -0
  112. phenoml/lang2fhir/types/create_request_resource.py +25 -0
  113. phenoml/lang2fhir/types/document_request_file_type.py +7 -0
  114. phenoml/lang2fhir/types/document_request_resource.py +5 -0
  115. phenoml/lang2fhir/types/fhir_resource.py +5 -0
  116. phenoml/lang2fhir/types/lang2fhir_upload_profile_response.py +23 -0
  117. phenoml/lang2fhir/types/search_response.py +33 -0
  118. phenoml/py.typed +0 -0
  119. phenoml/tools/__init__.py +33 -0
  120. phenoml/tools/client.py +392 -0
  121. phenoml/tools/errors/__init__.py +11 -0
  122. phenoml/tools/errors/bad_request_error.py +10 -0
  123. phenoml/tools/errors/failed_dependency_error.py +10 -0
  124. phenoml/tools/errors/forbidden_error.py +10 -0
  125. phenoml/tools/errors/internal_server_error.py +10 -0
  126. phenoml/tools/errors/unauthorized_error.py +10 -0
  127. phenoml/tools/raw_client.py +745 -0
  128. phenoml/tools/types/__init__.py +25 -0
  129. phenoml/tools/types/cohort_request_provider.py +5 -0
  130. phenoml/tools/types/cohort_response.py +49 -0
  131. phenoml/tools/types/fhir_client_config.py +31 -0
  132. phenoml/tools/types/lang2fhir_and_create_request_provider.py +7 -0
  133. phenoml/tools/types/lang2fhir_and_create_request_resource.py +25 -0
  134. phenoml/tools/types/lang2fhir_and_create_response.py +33 -0
  135. phenoml/tools/types/lang2fhir_and_search_request_provider.py +7 -0
  136. phenoml/tools/types/lang2fhir_and_search_response.py +40 -0
  137. phenoml/tools/types/search_concept.py +41 -0
  138. phenoml/version.py +3 -0
  139. phenoml/wrapper_client.py +123 -0
  140. phenoml-0.0.1.dist-info/LICENSE +21 -0
  141. phenoml-0.0.1.dist-info/METADATA +192 -0
  142. phenoml-0.0.1.dist-info/RECORD +143 -0
  143. phenoml-0.0.1.dist-info/WHEEL +4 -0
@@ -0,0 +1,185 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ..core.api_error import ApiError
7
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ..core.http_response import AsyncHttpResponse, HttpResponse
9
+ from ..core.pydantic_utilities import parse_obj_as
10
+ from ..core.request_options import RequestOptions
11
+ from .errors.bad_request_error import BadRequestError
12
+ from .errors.internal_server_error import InternalServerError
13
+ from .errors.unauthorized_error import UnauthorizedError
14
+ from .types.cohort_response import CohortResponse
15
+
16
+ # this is used as the default value for optional parameters
17
+ OMIT = typing.cast(typing.Any, ...)
18
+
19
+
20
+ class RawCohortClient:
21
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
22
+ self._client_wrapper = client_wrapper
23
+
24
+ def analyze(
25
+ self, *, text: str, request_options: typing.Optional[RequestOptions] = None
26
+ ) -> HttpResponse[CohortResponse]:
27
+ """
28
+ Converts natural language text into structured FHIR search queries for patient cohort analysis
29
+
30
+ Parameters
31
+ ----------
32
+ text : str
33
+ Natural language text describing patient cohort criteria
34
+
35
+ request_options : typing.Optional[RequestOptions]
36
+ Request-specific configuration.
37
+
38
+ Returns
39
+ -------
40
+ HttpResponse[CohortResponse]
41
+ Successfully analyzed cohort criteria
42
+ """
43
+ _response = self._client_wrapper.httpx_client.request(
44
+ "cohort",
45
+ method="POST",
46
+ json={
47
+ "text": text,
48
+ },
49
+ headers={
50
+ "content-type": "application/json",
51
+ },
52
+ request_options=request_options,
53
+ omit=OMIT,
54
+ )
55
+ try:
56
+ if 200 <= _response.status_code < 300:
57
+ _data = typing.cast(
58
+ CohortResponse,
59
+ parse_obj_as(
60
+ type_=CohortResponse, # type: ignore
61
+ object_=_response.json(),
62
+ ),
63
+ )
64
+ return HttpResponse(response=_response, data=_data)
65
+ if _response.status_code == 400:
66
+ raise BadRequestError(
67
+ headers=dict(_response.headers),
68
+ body=typing.cast(
69
+ typing.Optional[typing.Any],
70
+ parse_obj_as(
71
+ type_=typing.Optional[typing.Any], # type: ignore
72
+ object_=_response.json(),
73
+ ),
74
+ ),
75
+ )
76
+ if _response.status_code == 401:
77
+ raise UnauthorizedError(
78
+ headers=dict(_response.headers),
79
+ body=typing.cast(
80
+ typing.Optional[typing.Any],
81
+ parse_obj_as(
82
+ type_=typing.Optional[typing.Any], # type: ignore
83
+ object_=_response.json(),
84
+ ),
85
+ ),
86
+ )
87
+ if _response.status_code == 500:
88
+ raise InternalServerError(
89
+ headers=dict(_response.headers),
90
+ body=typing.cast(
91
+ typing.Optional[typing.Any],
92
+ parse_obj_as(
93
+ type_=typing.Optional[typing.Any], # type: ignore
94
+ object_=_response.json(),
95
+ ),
96
+ ),
97
+ )
98
+ _response_json = _response.json()
99
+ except JSONDecodeError:
100
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
101
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
102
+
103
+
104
+ class AsyncRawCohortClient:
105
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
106
+ self._client_wrapper = client_wrapper
107
+
108
+ async def analyze(
109
+ self, *, text: str, request_options: typing.Optional[RequestOptions] = None
110
+ ) -> AsyncHttpResponse[CohortResponse]:
111
+ """
112
+ Converts natural language text into structured FHIR search queries for patient cohort analysis
113
+
114
+ Parameters
115
+ ----------
116
+ text : str
117
+ Natural language text describing patient cohort criteria
118
+
119
+ request_options : typing.Optional[RequestOptions]
120
+ Request-specific configuration.
121
+
122
+ Returns
123
+ -------
124
+ AsyncHttpResponse[CohortResponse]
125
+ Successfully analyzed cohort criteria
126
+ """
127
+ _response = await self._client_wrapper.httpx_client.request(
128
+ "cohort",
129
+ method="POST",
130
+ json={
131
+ "text": text,
132
+ },
133
+ headers={
134
+ "content-type": "application/json",
135
+ },
136
+ request_options=request_options,
137
+ omit=OMIT,
138
+ )
139
+ try:
140
+ if 200 <= _response.status_code < 300:
141
+ _data = typing.cast(
142
+ CohortResponse,
143
+ parse_obj_as(
144
+ type_=CohortResponse, # type: ignore
145
+ object_=_response.json(),
146
+ ),
147
+ )
148
+ return AsyncHttpResponse(response=_response, data=_data)
149
+ if _response.status_code == 400:
150
+ raise BadRequestError(
151
+ headers=dict(_response.headers),
152
+ body=typing.cast(
153
+ typing.Optional[typing.Any],
154
+ parse_obj_as(
155
+ type_=typing.Optional[typing.Any], # type: ignore
156
+ object_=_response.json(),
157
+ ),
158
+ ),
159
+ )
160
+ if _response.status_code == 401:
161
+ raise UnauthorizedError(
162
+ headers=dict(_response.headers),
163
+ body=typing.cast(
164
+ typing.Optional[typing.Any],
165
+ parse_obj_as(
166
+ type_=typing.Optional[typing.Any], # type: ignore
167
+ object_=_response.json(),
168
+ ),
169
+ ),
170
+ )
171
+ if _response.status_code == 500:
172
+ raise InternalServerError(
173
+ headers=dict(_response.headers),
174
+ body=typing.cast(
175
+ typing.Optional[typing.Any],
176
+ parse_obj_as(
177
+ type_=typing.Optional[typing.Any], # type: ignore
178
+ object_=_response.json(),
179
+ ),
180
+ ),
181
+ )
182
+ _response_json = _response.json()
183
+ except JSONDecodeError:
184
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
185
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
@@ -0,0 +1,8 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ # isort: skip_file
4
+
5
+ from .cohort_response import CohortResponse
6
+ from .search_concept import SearchConcept
7
+
8
+ __all__ = ["CohortResponse", "SearchConcept"]
@@ -0,0 +1,33 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+ from .search_concept import SearchConcept
8
+
9
+
10
+ class CohortResponse(UniversalBaseModel):
11
+ success: typing.Optional[bool] = pydantic.Field(default=None)
12
+ """
13
+ Whether the cohort analysis was successful
14
+ """
15
+
16
+ message: typing.Optional[str] = pydantic.Field(default=None)
17
+ """
18
+ Human-readable message about the analysis result
19
+ """
20
+
21
+ queries: typing.Optional[typing.List[SearchConcept]] = pydantic.Field(default=None)
22
+ """
23
+ Array of search concepts converted to FHIR search queries
24
+ """
25
+
26
+ if IS_PYDANTIC_V2:
27
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
28
+ else:
29
+
30
+ class Config:
31
+ frozen = True
32
+ smart_union = True
33
+ extra = pydantic.Extra.allow
@@ -0,0 +1,37 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class SearchConcept(UniversalBaseModel):
10
+ resource_type: typing.Optional[str] = pydantic.Field(default=None)
11
+ """
12
+ The FHIR resource type for this search concept
13
+ """
14
+
15
+ search_params: typing.Optional[str] = pydantic.Field(default=None)
16
+ """
17
+ FHIR search parameters in standard format
18
+ """
19
+
20
+ concept: typing.Optional[str] = pydantic.Field(default=None)
21
+ """
22
+ The original concept description
23
+ """
24
+
25
+ exclude: typing.Optional[bool] = pydantic.Field(default=None)
26
+ """
27
+ Whether this concept should be excluded from the search
28
+ """
29
+
30
+ if IS_PYDANTIC_V2:
31
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
32
+ else:
33
+
34
+ class Config:
35
+ frozen = True
36
+ smart_union = True
37
+ extra = pydantic.Extra.allow
@@ -0,0 +1,45 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ # isort: skip_file
4
+
5
+ from .types import (
6
+ BadRequestErrorBody,
7
+ ConstrueCohortRequestConfig,
8
+ ConstrueCohortResponse,
9
+ ConstrueCohortResponseQueriesItem,
10
+ ConstrueCohortResponseQueriesItemCodeExtractResultsItem,
11
+ ConstrueCohortResponseQueriesItemCodeExtractResultsItemCodesItem,
12
+ ConstrueUploadCodeSystemResponse,
13
+ ExtractCodesResult,
14
+ ExtractRequestConfig,
15
+ ExtractRequestConfigChunkingMethod,
16
+ ExtractRequestSystem,
17
+ ExtractedCodeResult,
18
+ InternalServerErrorBody,
19
+ UnauthorizedErrorBody,
20
+ UploadRequestFormat,
21
+ )
22
+ from .errors import BadRequestError, ConflictError, FailedDependencyError, InternalServerError, UnauthorizedError
23
+
24
+ __all__ = [
25
+ "BadRequestError",
26
+ "BadRequestErrorBody",
27
+ "ConflictError",
28
+ "ConstrueCohortRequestConfig",
29
+ "ConstrueCohortResponse",
30
+ "ConstrueCohortResponseQueriesItem",
31
+ "ConstrueCohortResponseQueriesItemCodeExtractResultsItem",
32
+ "ConstrueCohortResponseQueriesItemCodeExtractResultsItemCodesItem",
33
+ "ConstrueUploadCodeSystemResponse",
34
+ "ExtractCodesResult",
35
+ "ExtractRequestConfig",
36
+ "ExtractRequestConfigChunkingMethod",
37
+ "ExtractRequestSystem",
38
+ "ExtractedCodeResult",
39
+ "FailedDependencyError",
40
+ "InternalServerError",
41
+ "InternalServerErrorBody",
42
+ "UnauthorizedError",
43
+ "UnauthorizedErrorBody",
44
+ "UploadRequestFormat",
45
+ ]