mirascope 2.0.0a5__py3-none-any.whl → 2.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.
Files changed (349) hide show
  1. mirascope/__init__.py +10 -1
  2. mirascope/_stubs.py +363 -0
  3. mirascope/api/__init__.py +8 -0
  4. mirascope/api/_generated/__init__.py +285 -2
  5. mirascope/api/_generated/annotations/__init__.py +33 -0
  6. mirascope/api/_generated/annotations/client.py +506 -0
  7. mirascope/api/_generated/annotations/raw_client.py +1414 -0
  8. mirascope/api/_generated/annotations/types/__init__.py +31 -0
  9. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
  10. mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
  11. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
  12. mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
  13. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
  14. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
  15. mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
  16. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
  17. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
  18. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
  19. mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
  20. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
  21. mirascope/api/_generated/api_keys/__init__.py +12 -2
  22. mirascope/api/_generated/api_keys/client.py +77 -0
  23. mirascope/api/_generated/api_keys/raw_client.py +422 -39
  24. mirascope/api/_generated/api_keys/types/__init__.py +7 -1
  25. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +4 -12
  26. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +4 -12
  27. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
  28. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +4 -12
  29. mirascope/api/_generated/client.py +42 -0
  30. mirascope/api/_generated/core/client_wrapper.py +2 -14
  31. mirascope/api/_generated/core/datetime_utils.py +1 -3
  32. mirascope/api/_generated/core/file.py +2 -5
  33. mirascope/api/_generated/core/http_client.py +36 -112
  34. mirascope/api/_generated/core/jsonable_encoder.py +1 -3
  35. mirascope/api/_generated/core/pydantic_utilities.py +19 -74
  36. mirascope/api/_generated/core/query_encoder.py +1 -3
  37. mirascope/api/_generated/core/serialization.py +4 -10
  38. mirascope/api/_generated/docs/client.py +2 -6
  39. mirascope/api/_generated/docs/raw_client.py +51 -5
  40. mirascope/api/_generated/environment.py +3 -3
  41. mirascope/api/_generated/environments/__init__.py +6 -0
  42. mirascope/api/_generated/environments/client.py +117 -0
  43. mirascope/api/_generated/environments/raw_client.py +530 -51
  44. mirascope/api/_generated/environments/types/__init__.py +10 -0
  45. mirascope/api/_generated/environments/types/environments_create_response.py +1 -3
  46. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
  47. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
  48. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
  49. mirascope/api/_generated/environments/types/environments_get_response.py +1 -3
  50. mirascope/api/_generated/environments/types/environments_list_response_item.py +1 -3
  51. mirascope/api/_generated/environments/types/environments_update_response.py +1 -3
  52. mirascope/api/_generated/errors/__init__.py +8 -0
  53. mirascope/api/_generated/errors/bad_request_error.py +1 -2
  54. mirascope/api/_generated/errors/conflict_error.py +1 -2
  55. mirascope/api/_generated/errors/forbidden_error.py +1 -5
  56. mirascope/api/_generated/errors/internal_server_error.py +1 -6
  57. mirascope/api/_generated/errors/not_found_error.py +1 -5
  58. mirascope/api/_generated/errors/payment_required_error.py +15 -0
  59. mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
  60. mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
  61. mirascope/api/_generated/errors/unauthorized_error.py +11 -0
  62. mirascope/api/_generated/functions/__init__.py +39 -0
  63. mirascope/api/_generated/functions/client.py +647 -0
  64. mirascope/api/_generated/functions/raw_client.py +1890 -0
  65. mirascope/api/_generated/functions/types/__init__.py +53 -0
  66. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
  67. mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
  68. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
  69. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
  70. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
  71. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
  72. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
  73. mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
  74. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
  75. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
  76. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
  77. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
  78. mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
  79. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
  80. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
  81. mirascope/api/_generated/health/client.py +2 -6
  82. mirascope/api/_generated/health/raw_client.py +51 -5
  83. mirascope/api/_generated/health/types/health_check_response.py +1 -3
  84. mirascope/api/_generated/organization_invitations/__init__.py +33 -0
  85. mirascope/api/_generated/organization_invitations/client.py +546 -0
  86. mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
  87. mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
  88. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
  89. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
  90. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
  91. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
  92. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
  93. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
  94. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
  95. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
  96. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
  97. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
  98. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
  99. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
  100. mirascope/api/_generated/organization_memberships/__init__.py +19 -0
  101. mirascope/api/_generated/organization_memberships/client.py +302 -0
  102. mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
  103. mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
  104. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
  105. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
  106. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
  107. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
  108. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
  109. mirascope/api/_generated/organizations/__init__.py +26 -0
  110. mirascope/api/_generated/organizations/client.py +465 -0
  111. mirascope/api/_generated/organizations/raw_client.py +1799 -108
  112. mirascope/api/_generated/organizations/types/__init__.py +48 -0
  113. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
  114. mirascope/api/_generated/organizations/types/organizations_create_response.py +4 -3
  115. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +1 -3
  116. mirascope/api/_generated/organizations/types/organizations_get_response.py +4 -3
  117. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +1 -3
  118. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +4 -3
  119. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +1 -3
  120. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
  121. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
  122. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
  123. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
  124. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
  125. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
  126. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
  127. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
  128. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
  129. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
  130. mirascope/api/_generated/organizations/types/organizations_update_response.py +4 -3
  131. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +1 -3
  132. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
  133. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
  134. mirascope/api/_generated/project_memberships/__init__.py +25 -0
  135. mirascope/api/_generated/project_memberships/client.py +437 -0
  136. mirascope/api/_generated/project_memberships/raw_client.py +1039 -0
  137. mirascope/api/_generated/project_memberships/types/__init__.py +29 -0
  138. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
  139. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
  140. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
  141. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
  142. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
  143. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
  144. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
  145. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
  146. mirascope/api/_generated/projects/__init__.py +2 -12
  147. mirascope/api/_generated/projects/client.py +17 -71
  148. mirascope/api/_generated/projects/raw_client.py +295 -51
  149. mirascope/api/_generated/projects/types/__init__.py +1 -6
  150. mirascope/api/_generated/projects/types/projects_create_response.py +3 -9
  151. mirascope/api/_generated/projects/types/projects_get_response.py +3 -9
  152. mirascope/api/_generated/projects/types/projects_list_response_item.py +3 -9
  153. mirascope/api/_generated/projects/types/projects_update_response.py +3 -9
  154. mirascope/api/_generated/reference.md +3619 -182
  155. mirascope/api/_generated/tags/__init__.py +19 -0
  156. mirascope/api/_generated/tags/client.py +504 -0
  157. mirascope/api/_generated/tags/raw_client.py +1288 -0
  158. mirascope/api/_generated/tags/types/__init__.py +17 -0
  159. mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
  160. mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
  161. mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
  162. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
  163. mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
  164. mirascope/api/_generated/token_cost/__init__.py +7 -0
  165. mirascope/api/_generated/token_cost/client.py +160 -0
  166. mirascope/api/_generated/token_cost/raw_client.py +264 -0
  167. mirascope/api/_generated/token_cost/types/__init__.py +8 -0
  168. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
  169. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
  170. mirascope/api/_generated/traces/__init__.py +42 -0
  171. mirascope/api/_generated/traces/client.py +941 -0
  172. mirascope/api/_generated/traces/raw_client.py +2177 -23
  173. mirascope/api/_generated/traces/types/__init__.py +60 -0
  174. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +4 -11
  175. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +2 -6
  176. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +1 -3
  177. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +8 -24
  178. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +2 -6
  179. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +3 -9
  180. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +2 -6
  181. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +3 -9
  182. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +4 -8
  183. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +2 -6
  184. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +8 -24
  185. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +2 -6
  186. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +3 -9
  187. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +1 -3
  188. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +6 -18
  189. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +3 -9
  190. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +8 -24
  191. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +2 -6
  192. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +2 -6
  193. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +1 -3
  194. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +2 -6
  195. mirascope/api/_generated/traces/types/traces_create_response.py +2 -5
  196. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +3 -9
  197. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
  198. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
  199. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
  200. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
  201. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
  202. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
  203. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
  204. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
  205. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
  206. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
  207. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
  208. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
  209. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
  210. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
  211. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
  212. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
  213. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
  214. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
  215. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
  216. mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
  217. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
  218. mirascope/api/_generated/types/__init__.py +48 -0
  219. mirascope/api/_generated/types/already_exists_error.py +1 -3
  220. mirascope/api/_generated/types/bad_request_error_body.py +50 -0
  221. mirascope/api/_generated/types/click_house_error.py +22 -0
  222. mirascope/api/_generated/types/database_error.py +1 -3
  223. mirascope/api/_generated/types/date.py +3 -0
  224. mirascope/api/_generated/types/http_api_decode_error.py +1 -3
  225. mirascope/api/_generated/types/immutable_resource_error.py +22 -0
  226. mirascope/api/_generated/types/internal_server_error_body.py +49 -0
  227. mirascope/api/_generated/types/issue.py +1 -3
  228. mirascope/api/_generated/types/issue_tag.py +1 -8
  229. mirascope/api/_generated/types/not_found_error_body.py +1 -3
  230. mirascope/api/_generated/types/number_from_string.py +3 -0
  231. mirascope/api/_generated/types/permission_denied_error.py +1 -3
  232. mirascope/api/_generated/types/permission_denied_error_tag.py +1 -3
  233. mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
  234. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
  235. mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
  236. mirascope/api/_generated/types/property_key_key.py +1 -3
  237. mirascope/api/_generated/types/rate_limit_error.py +31 -0
  238. mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
  239. mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
  240. mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
  241. mirascope/api/_generated/types/stripe_error.py +20 -0
  242. mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
  243. mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
  244. mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
  245. mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
  246. mirascope/api/settings.py +19 -1
  247. mirascope/llm/__init__.py +55 -8
  248. mirascope/llm/calls/__init__.py +2 -1
  249. mirascope/llm/calls/calls.py +3 -1
  250. mirascope/llm/calls/decorator.py +21 -7
  251. mirascope/llm/content/tool_call.py +6 -0
  252. mirascope/llm/content/tool_output.py +22 -5
  253. mirascope/llm/exceptions.py +284 -71
  254. mirascope/llm/formatting/__init__.py +19 -2
  255. mirascope/llm/formatting/format.py +219 -30
  256. mirascope/llm/formatting/output_parser.py +178 -0
  257. mirascope/llm/formatting/partial.py +80 -7
  258. mirascope/llm/formatting/primitives.py +192 -0
  259. mirascope/llm/formatting/types.py +21 -64
  260. mirascope/llm/mcp/__init__.py +2 -2
  261. mirascope/llm/mcp/mcp_client.py +130 -0
  262. mirascope/llm/messages/__init__.py +3 -0
  263. mirascope/llm/messages/_utils.py +34 -0
  264. mirascope/llm/models/__init__.py +5 -0
  265. mirascope/llm/models/models.py +137 -69
  266. mirascope/llm/{providers/base → models}/params.py +16 -37
  267. mirascope/llm/models/thinking_config.py +61 -0
  268. mirascope/llm/prompts/_utils.py +0 -32
  269. mirascope/llm/prompts/decorator.py +16 -5
  270. mirascope/llm/prompts/prompts.py +131 -68
  271. mirascope/llm/providers/__init__.py +18 -2
  272. mirascope/llm/providers/anthropic/__init__.py +3 -21
  273. mirascope/llm/providers/anthropic/_utils/__init__.py +2 -0
  274. mirascope/llm/providers/anthropic/_utils/beta_decode.py +22 -11
  275. mirascope/llm/providers/anthropic/_utils/beta_encode.py +75 -25
  276. mirascope/llm/providers/anthropic/_utils/decode.py +22 -11
  277. mirascope/llm/providers/anthropic/_utils/encode.py +82 -20
  278. mirascope/llm/providers/anthropic/_utils/errors.py +2 -2
  279. mirascope/llm/providers/anthropic/beta_provider.py +64 -18
  280. mirascope/llm/providers/anthropic/provider.py +91 -33
  281. mirascope/llm/providers/base/__init__.py +0 -2
  282. mirascope/llm/providers/base/_utils.py +55 -11
  283. mirascope/llm/providers/base/base_provider.py +116 -37
  284. mirascope/llm/providers/google/__init__.py +2 -17
  285. mirascope/llm/providers/google/_utils/__init__.py +2 -0
  286. mirascope/llm/providers/google/_utils/decode.py +37 -15
  287. mirascope/llm/providers/google/_utils/encode.py +127 -19
  288. mirascope/llm/providers/google/_utils/errors.py +3 -2
  289. mirascope/llm/providers/google/model_info.py +1 -0
  290. mirascope/llm/providers/google/provider.py +68 -19
  291. mirascope/llm/providers/mirascope/__init__.py +5 -0
  292. mirascope/llm/providers/mirascope/_utils.py +73 -0
  293. mirascope/llm/providers/mirascope/provider.py +349 -0
  294. mirascope/llm/providers/mlx/__init__.py +2 -17
  295. mirascope/llm/providers/mlx/_utils.py +8 -3
  296. mirascope/llm/providers/mlx/encoding/base.py +5 -2
  297. mirascope/llm/providers/mlx/encoding/transformers.py +5 -2
  298. mirascope/llm/providers/mlx/mlx.py +23 -6
  299. mirascope/llm/providers/mlx/provider.py +42 -13
  300. mirascope/llm/providers/ollama/__init__.py +1 -13
  301. mirascope/llm/providers/openai/_utils/errors.py +2 -2
  302. mirascope/llm/providers/openai/completions/__init__.py +2 -20
  303. mirascope/llm/providers/openai/completions/_utils/decode.py +14 -3
  304. mirascope/llm/providers/openai/completions/_utils/encode.py +35 -28
  305. mirascope/llm/providers/openai/completions/base_provider.py +40 -11
  306. mirascope/llm/providers/openai/provider.py +40 -10
  307. mirascope/llm/providers/openai/responses/__init__.py +1 -17
  308. mirascope/llm/providers/openai/responses/_utils/__init__.py +2 -0
  309. mirascope/llm/providers/openai/responses/_utils/decode.py +21 -8
  310. mirascope/llm/providers/openai/responses/_utils/encode.py +59 -19
  311. mirascope/llm/providers/openai/responses/provider.py +56 -18
  312. mirascope/llm/providers/provider_id.py +1 -0
  313. mirascope/llm/providers/provider_registry.py +96 -19
  314. mirascope/llm/providers/together/__init__.py +1 -13
  315. mirascope/llm/responses/__init__.py +6 -1
  316. mirascope/llm/responses/_utils.py +102 -12
  317. mirascope/llm/responses/base_response.py +5 -2
  318. mirascope/llm/responses/base_stream_response.py +139 -45
  319. mirascope/llm/responses/response.py +2 -1
  320. mirascope/llm/responses/root_response.py +89 -17
  321. mirascope/llm/responses/stream_response.py +6 -9
  322. mirascope/llm/tools/decorator.py +17 -8
  323. mirascope/llm/tools/tool_schema.py +43 -10
  324. mirascope/llm/tools/toolkit.py +35 -27
  325. mirascope/llm/tools/tools.py +123 -30
  326. mirascope/ops/__init__.py +64 -109
  327. mirascope/ops/_internal/configuration.py +82 -31
  328. mirascope/ops/_internal/exporters/exporters.py +64 -11
  329. mirascope/ops/_internal/instrumentation/llm/common.py +530 -0
  330. mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
  331. mirascope/ops/_internal/instrumentation/llm/encode.py +1 -1
  332. mirascope/ops/_internal/instrumentation/llm/llm.py +116 -1243
  333. mirascope/ops/_internal/instrumentation/llm/model.py +1798 -0
  334. mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
  335. mirascope/ops/_internal/instrumentation/llm/serialize.py +300 -0
  336. mirascope/ops/_internal/protocols.py +83 -1
  337. mirascope/ops/_internal/traced_calls.py +4 -0
  338. mirascope/ops/_internal/traced_functions.py +141 -12
  339. mirascope/ops/_internal/tracing.py +78 -1
  340. mirascope/ops/_internal/utils.py +52 -4
  341. mirascope/ops/_internal/versioned_functions.py +54 -43
  342. {mirascope-2.0.0a5.dist-info → mirascope-2.0.1.dist-info}/METADATA +14 -13
  343. mirascope-2.0.1.dist-info/RECORD +423 -0
  344. {mirascope-2.0.0a5.dist-info → mirascope-2.0.1.dist-info}/licenses/LICENSE +1 -1
  345. mirascope/llm/formatting/_utils.py +0 -78
  346. mirascope/llm/mcp/client.py +0 -118
  347. mirascope/llm/providers/_missing_import_stubs.py +0 -49
  348. mirascope-2.0.0a5.dist-info/RECORD +0 -265
  349. {mirascope-2.0.0a5.dist-info → mirascope-2.0.1.dist-info}/WHEEL +0 -0
@@ -6,15 +6,53 @@ from json.decoder import JSONDecodeError
6
6
  from ..core.api_error import ApiError
7
7
  from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
8
  from ..core.http_response import AsyncHttpResponse, HttpResponse
9
+ from ..core.jsonable_encoder import jsonable_encoder
9
10
  from ..core.pydantic_utilities import parse_obj_as
10
11
  from ..core.request_options import RequestOptions
11
12
  from ..core.serialization import convert_and_respect_annotation_metadata
12
13
  from ..errors.bad_request_error import BadRequestError
13
- from ..types.http_api_decode_error import HttpApiDecodeError
14
+ from ..errors.conflict_error import ConflictError
15
+ from ..errors.forbidden_error import ForbiddenError
16
+ from ..errors.internal_server_error import InternalServerError
17
+ from ..errors.not_found_error import NotFoundError
18
+ from ..errors.payment_required_error import PaymentRequiredError
19
+ from ..errors.service_unavailable_error import ServiceUnavailableError
20
+ from ..errors.too_many_requests_error import TooManyRequestsError
21
+ from ..errors.unauthorized_error import UnauthorizedError
22
+ from ..types.not_found_error_body import NotFoundErrorBody
23
+ from ..types.number_from_string import NumberFromString
24
+ from ..types.permission_denied_error import PermissionDeniedError
25
+ from ..types.plan_limit_exceeded_error import PlanLimitExceededError
26
+ from ..types.rate_limit_error import RateLimitError
27
+ from ..types.unauthorized_error_body import UnauthorizedErrorBody
14
28
  from .types.traces_create_request_resource_spans_item import (
15
29
  TracesCreateRequestResourceSpansItem,
16
30
  )
17
31
  from .types.traces_create_response import TracesCreateResponse
32
+ from .types.traces_get_analytics_summary_response import (
33
+ TracesGetAnalyticsSummaryResponse,
34
+ )
35
+ from .types.traces_get_trace_detail_by_env_response import (
36
+ TracesGetTraceDetailByEnvResponse,
37
+ )
38
+ from .types.traces_get_trace_detail_response import TracesGetTraceDetailResponse
39
+ from .types.traces_list_by_function_hash_response import (
40
+ TracesListByFunctionHashResponse,
41
+ )
42
+ from .types.traces_search_by_env_request_attribute_filters_item import (
43
+ TracesSearchByEnvRequestAttributeFiltersItem,
44
+ )
45
+ from .types.traces_search_by_env_request_sort_by import TracesSearchByEnvRequestSortBy
46
+ from .types.traces_search_by_env_request_sort_order import (
47
+ TracesSearchByEnvRequestSortOrder,
48
+ )
49
+ from .types.traces_search_by_env_response import TracesSearchByEnvResponse
50
+ from .types.traces_search_request_attribute_filters_item import (
51
+ TracesSearchRequestAttributeFiltersItem,
52
+ )
53
+ from .types.traces_search_request_sort_by import TracesSearchRequestSortBy
54
+ from .types.traces_search_request_sort_order import TracesSearchRequestSortOrder
55
+ from .types.traces_search_response import TracesSearchResponse
18
56
 
19
57
  # this is used as the default value for optional parameters
20
58
  OMIT = typing.cast(typing.Any, ...)
@@ -73,9 +111,97 @@ class RawTracesClient:
73
111
  raise BadRequestError(
74
112
  headers=dict(_response.headers),
75
113
  body=typing.cast(
76
- HttpApiDecodeError,
114
+ typing.Optional[typing.Any],
115
+ parse_obj_as(
116
+ type_=typing.Optional[typing.Any], # type: ignore
117
+ object_=_response.json(),
118
+ ),
119
+ ),
120
+ )
121
+ if _response.status_code == 401:
122
+ raise UnauthorizedError(
123
+ headers=dict(_response.headers),
124
+ body=typing.cast(
125
+ UnauthorizedErrorBody,
126
+ parse_obj_as(
127
+ type_=UnauthorizedErrorBody, # type: ignore
128
+ object_=_response.json(),
129
+ ),
130
+ ),
131
+ )
132
+ if _response.status_code == 402:
133
+ raise PaymentRequiredError(
134
+ headers=dict(_response.headers),
135
+ body=typing.cast(
136
+ PlanLimitExceededError,
137
+ parse_obj_as(
138
+ type_=PlanLimitExceededError, # type: ignore
139
+ object_=_response.json(),
140
+ ),
141
+ ),
142
+ )
143
+ if _response.status_code == 403:
144
+ raise ForbiddenError(
145
+ headers=dict(_response.headers),
146
+ body=typing.cast(
147
+ PermissionDeniedError,
148
+ parse_obj_as(
149
+ type_=PermissionDeniedError, # type: ignore
150
+ object_=_response.json(),
151
+ ),
152
+ ),
153
+ )
154
+ if _response.status_code == 404:
155
+ raise NotFoundError(
156
+ headers=dict(_response.headers),
157
+ body=typing.cast(
158
+ NotFoundErrorBody,
159
+ parse_obj_as(
160
+ type_=NotFoundErrorBody, # type: ignore
161
+ object_=_response.json(),
162
+ ),
163
+ ),
164
+ )
165
+ if _response.status_code == 409:
166
+ raise ConflictError(
167
+ headers=dict(_response.headers),
168
+ body=typing.cast(
169
+ typing.Optional[typing.Any],
170
+ parse_obj_as(
171
+ type_=typing.Optional[typing.Any], # type: ignore
172
+ object_=_response.json(),
173
+ ),
174
+ ),
175
+ )
176
+ if _response.status_code == 429:
177
+ raise TooManyRequestsError(
178
+ headers=dict(_response.headers),
179
+ body=typing.cast(
180
+ RateLimitError,
77
181
  parse_obj_as(
78
- type_=HttpApiDecodeError, # type: ignore
182
+ type_=RateLimitError, # type: ignore
183
+ object_=_response.json(),
184
+ ),
185
+ ),
186
+ )
187
+ if _response.status_code == 500:
188
+ raise InternalServerError(
189
+ headers=dict(_response.headers),
190
+ body=typing.cast(
191
+ typing.Optional[typing.Any],
192
+ parse_obj_as(
193
+ type_=typing.Optional[typing.Any], # type: ignore
194
+ object_=_response.json(),
195
+ ),
196
+ ),
197
+ )
198
+ if _response.status_code == 503:
199
+ raise ServiceUnavailableError(
200
+ headers=dict(_response.headers),
201
+ body=typing.cast(
202
+ typing.Optional[typing.Any],
203
+ parse_obj_as(
204
+ type_=typing.Optional[typing.Any], # type: ignore
79
205
  object_=_response.json(),
80
206
  ),
81
207
  ),
@@ -93,39 +219,128 @@ class RawTracesClient:
93
219
  body=_response_json,
94
220
  )
95
221
 
96
-
97
- class AsyncRawTracesClient:
98
- def __init__(self, *, client_wrapper: AsyncClientWrapper):
99
- self._client_wrapper = client_wrapper
100
-
101
- async def create(
222
+ def search(
102
223
  self,
103
224
  *,
104
- resource_spans: typing.Sequence[TracesCreateRequestResourceSpansItem],
225
+ start_time: str,
226
+ end_time: str,
227
+ query: typing.Optional[str] = OMIT,
228
+ input_messages_query: typing.Optional[str] = OMIT,
229
+ output_messages_query: typing.Optional[str] = OMIT,
230
+ fuzzy_search: typing.Optional[bool] = OMIT,
231
+ trace_id: typing.Optional[str] = OMIT,
232
+ span_id: typing.Optional[str] = OMIT,
233
+ model: typing.Optional[typing.Sequence[str]] = OMIT,
234
+ provider: typing.Optional[typing.Sequence[str]] = OMIT,
235
+ function_id: typing.Optional[str] = OMIT,
236
+ function_name: typing.Optional[str] = OMIT,
237
+ span_name_prefix: typing.Optional[str] = OMIT,
238
+ has_error: typing.Optional[bool] = OMIT,
239
+ min_tokens: typing.Optional[float] = OMIT,
240
+ max_tokens: typing.Optional[float] = OMIT,
241
+ min_duration: typing.Optional[float] = OMIT,
242
+ max_duration: typing.Optional[float] = OMIT,
243
+ attribute_filters: typing.Optional[
244
+ typing.Sequence[TracesSearchRequestAttributeFiltersItem]
245
+ ] = OMIT,
246
+ limit: typing.Optional[float] = OMIT,
247
+ offset: typing.Optional[float] = OMIT,
248
+ sort_by: typing.Optional[TracesSearchRequestSortBy] = OMIT,
249
+ sort_order: typing.Optional[TracesSearchRequestSortOrder] = OMIT,
250
+ root_spans_only: typing.Optional[bool] = OMIT,
105
251
  request_options: typing.Optional[RequestOptions] = None,
106
- ) -> AsyncHttpResponse[TracesCreateResponse]:
252
+ ) -> HttpResponse[TracesSearchResponse]:
107
253
  """
108
254
  Parameters
109
255
  ----------
110
- resource_spans : typing.Sequence[TracesCreateRequestResourceSpansItem]
256
+ start_time : str
257
+
258
+ end_time : str
259
+
260
+ query : typing.Optional[str]
261
+
262
+ input_messages_query : typing.Optional[str]
263
+
264
+ output_messages_query : typing.Optional[str]
265
+
266
+ fuzzy_search : typing.Optional[bool]
267
+
268
+ trace_id : typing.Optional[str]
269
+
270
+ span_id : typing.Optional[str]
271
+
272
+ model : typing.Optional[typing.Sequence[str]]
273
+
274
+ provider : typing.Optional[typing.Sequence[str]]
275
+
276
+ function_id : typing.Optional[str]
277
+
278
+ function_name : typing.Optional[str]
279
+
280
+ span_name_prefix : typing.Optional[str]
281
+
282
+ has_error : typing.Optional[bool]
283
+
284
+ min_tokens : typing.Optional[float]
285
+
286
+ max_tokens : typing.Optional[float]
287
+
288
+ min_duration : typing.Optional[float]
289
+
290
+ max_duration : typing.Optional[float]
291
+
292
+ attribute_filters : typing.Optional[typing.Sequence[TracesSearchRequestAttributeFiltersItem]]
293
+
294
+ limit : typing.Optional[float]
295
+
296
+ offset : typing.Optional[float]
297
+
298
+ sort_by : typing.Optional[TracesSearchRequestSortBy]
299
+
300
+ sort_order : typing.Optional[TracesSearchRequestSortOrder]
301
+
302
+ root_spans_only : typing.Optional[bool]
111
303
 
112
304
  request_options : typing.Optional[RequestOptions]
113
305
  Request-specific configuration.
114
306
 
115
307
  Returns
116
308
  -------
117
- AsyncHttpResponse[TracesCreateResponse]
309
+ HttpResponse[TracesSearchResponse]
118
310
  Success
119
311
  """
120
- _response = await self._client_wrapper.httpx_client.request(
121
- "traces",
312
+ _response = self._client_wrapper.httpx_client.request(
313
+ "traces/search",
122
314
  method="POST",
123
315
  json={
124
- "resourceSpans": convert_and_respect_annotation_metadata(
125
- object_=resource_spans,
126
- annotation=typing.Sequence[TracesCreateRequestResourceSpansItem],
316
+ "startTime": start_time,
317
+ "endTime": end_time,
318
+ "query": query,
319
+ "inputMessagesQuery": input_messages_query,
320
+ "outputMessagesQuery": output_messages_query,
321
+ "fuzzySearch": fuzzy_search,
322
+ "traceId": trace_id,
323
+ "spanId": span_id,
324
+ "model": model,
325
+ "provider": provider,
326
+ "functionId": function_id,
327
+ "functionName": function_name,
328
+ "spanNamePrefix": span_name_prefix,
329
+ "hasError": has_error,
330
+ "minTokens": min_tokens,
331
+ "maxTokens": max_tokens,
332
+ "minDuration": min_duration,
333
+ "maxDuration": max_duration,
334
+ "attributeFilters": convert_and_respect_annotation_metadata(
335
+ object_=attribute_filters,
336
+ annotation=typing.Sequence[TracesSearchRequestAttributeFiltersItem],
127
337
  direction="write",
128
338
  ),
339
+ "limit": limit,
340
+ "offset": offset,
341
+ "sortBy": sort_by,
342
+ "sortOrder": sort_order,
343
+ "rootSpansOnly": root_spans_only,
129
344
  },
130
345
  headers={
131
346
  "content-type": "application/json",
@@ -136,20 +351,1959 @@ class AsyncRawTracesClient:
136
351
  try:
137
352
  if 200 <= _response.status_code < 300:
138
353
  _data = typing.cast(
139
- TracesCreateResponse,
354
+ TracesSearchResponse,
140
355
  parse_obj_as(
141
- type_=TracesCreateResponse, # type: ignore
356
+ type_=TracesSearchResponse, # type: ignore
142
357
  object_=_response.json(),
143
358
  ),
144
359
  )
145
- return AsyncHttpResponse(response=_response, data=_data)
360
+ return HttpResponse(response=_response, data=_data)
361
+ if _response.status_code == 400:
362
+ raise BadRequestError(
363
+ headers=dict(_response.headers),
364
+ body=typing.cast(
365
+ typing.Optional[typing.Any],
366
+ parse_obj_as(
367
+ type_=typing.Optional[typing.Any], # type: ignore
368
+ object_=_response.json(),
369
+ ),
370
+ ),
371
+ )
372
+ if _response.status_code == 401:
373
+ raise UnauthorizedError(
374
+ headers=dict(_response.headers),
375
+ body=typing.cast(
376
+ UnauthorizedErrorBody,
377
+ parse_obj_as(
378
+ type_=UnauthorizedErrorBody, # type: ignore
379
+ object_=_response.json(),
380
+ ),
381
+ ),
382
+ )
383
+ if _response.status_code == 403:
384
+ raise ForbiddenError(
385
+ headers=dict(_response.headers),
386
+ body=typing.cast(
387
+ PermissionDeniedError,
388
+ parse_obj_as(
389
+ type_=PermissionDeniedError, # type: ignore
390
+ object_=_response.json(),
391
+ ),
392
+ ),
393
+ )
394
+ if _response.status_code == 429:
395
+ raise TooManyRequestsError(
396
+ headers=dict(_response.headers),
397
+ body=typing.cast(
398
+ RateLimitError,
399
+ parse_obj_as(
400
+ type_=RateLimitError, # type: ignore
401
+ object_=_response.json(),
402
+ ),
403
+ ),
404
+ )
405
+ if _response.status_code == 500:
406
+ raise InternalServerError(
407
+ headers=dict(_response.headers),
408
+ body=typing.cast(
409
+ typing.Optional[typing.Any],
410
+ parse_obj_as(
411
+ type_=typing.Optional[typing.Any], # type: ignore
412
+ object_=_response.json(),
413
+ ),
414
+ ),
415
+ )
416
+ if _response.status_code == 503:
417
+ raise ServiceUnavailableError(
418
+ headers=dict(_response.headers),
419
+ body=typing.cast(
420
+ typing.Optional[typing.Any],
421
+ parse_obj_as(
422
+ type_=typing.Optional[typing.Any], # type: ignore
423
+ object_=_response.json(),
424
+ ),
425
+ ),
426
+ )
427
+ _response_json = _response.json()
428
+ except JSONDecodeError:
429
+ raise ApiError(
430
+ status_code=_response.status_code,
431
+ headers=dict(_response.headers),
432
+ body=_response.text,
433
+ )
434
+ raise ApiError(
435
+ status_code=_response.status_code,
436
+ headers=dict(_response.headers),
437
+ body=_response_json,
438
+ )
439
+
440
+ def gettracedetail(
441
+ self, trace_id: str, *, request_options: typing.Optional[RequestOptions] = None
442
+ ) -> HttpResponse[TracesGetTraceDetailResponse]:
443
+ """
444
+ Parameters
445
+ ----------
446
+ trace_id : str
447
+
448
+ request_options : typing.Optional[RequestOptions]
449
+ Request-specific configuration.
450
+
451
+ Returns
452
+ -------
453
+ HttpResponse[TracesGetTraceDetailResponse]
454
+ Success
455
+ """
456
+ _response = self._client_wrapper.httpx_client.request(
457
+ f"traces/{jsonable_encoder(trace_id)}",
458
+ method="GET",
459
+ request_options=request_options,
460
+ )
461
+ try:
462
+ if 200 <= _response.status_code < 300:
463
+ _data = typing.cast(
464
+ TracesGetTraceDetailResponse,
465
+ parse_obj_as(
466
+ type_=TracesGetTraceDetailResponse, # type: ignore
467
+ object_=_response.json(),
468
+ ),
469
+ )
470
+ return HttpResponse(response=_response, data=_data)
146
471
  if _response.status_code == 400:
147
472
  raise BadRequestError(
148
473
  headers=dict(_response.headers),
149
474
  body=typing.cast(
150
- HttpApiDecodeError,
475
+ typing.Optional[typing.Any],
476
+ parse_obj_as(
477
+ type_=typing.Optional[typing.Any], # type: ignore
478
+ object_=_response.json(),
479
+ ),
480
+ ),
481
+ )
482
+ if _response.status_code == 401:
483
+ raise UnauthorizedError(
484
+ headers=dict(_response.headers),
485
+ body=typing.cast(
486
+ UnauthorizedErrorBody,
487
+ parse_obj_as(
488
+ type_=UnauthorizedErrorBody, # type: ignore
489
+ object_=_response.json(),
490
+ ),
491
+ ),
492
+ )
493
+ if _response.status_code == 403:
494
+ raise ForbiddenError(
495
+ headers=dict(_response.headers),
496
+ body=typing.cast(
497
+ PermissionDeniedError,
498
+ parse_obj_as(
499
+ type_=PermissionDeniedError, # type: ignore
500
+ object_=_response.json(),
501
+ ),
502
+ ),
503
+ )
504
+ if _response.status_code == 404:
505
+ raise NotFoundError(
506
+ headers=dict(_response.headers),
507
+ body=typing.cast(
508
+ NotFoundErrorBody,
509
+ parse_obj_as(
510
+ type_=NotFoundErrorBody, # type: ignore
511
+ object_=_response.json(),
512
+ ),
513
+ ),
514
+ )
515
+ if _response.status_code == 429:
516
+ raise TooManyRequestsError(
517
+ headers=dict(_response.headers),
518
+ body=typing.cast(
519
+ RateLimitError,
520
+ parse_obj_as(
521
+ type_=RateLimitError, # type: ignore
522
+ object_=_response.json(),
523
+ ),
524
+ ),
525
+ )
526
+ if _response.status_code == 500:
527
+ raise InternalServerError(
528
+ headers=dict(_response.headers),
529
+ body=typing.cast(
530
+ typing.Optional[typing.Any],
531
+ parse_obj_as(
532
+ type_=typing.Optional[typing.Any], # type: ignore
533
+ object_=_response.json(),
534
+ ),
535
+ ),
536
+ )
537
+ if _response.status_code == 503:
538
+ raise ServiceUnavailableError(
539
+ headers=dict(_response.headers),
540
+ body=typing.cast(
541
+ typing.Optional[typing.Any],
542
+ parse_obj_as(
543
+ type_=typing.Optional[typing.Any], # type: ignore
544
+ object_=_response.json(),
545
+ ),
546
+ ),
547
+ )
548
+ _response_json = _response.json()
549
+ except JSONDecodeError:
550
+ raise ApiError(
551
+ status_code=_response.status_code,
552
+ headers=dict(_response.headers),
553
+ body=_response.text,
554
+ )
555
+ raise ApiError(
556
+ status_code=_response.status_code,
557
+ headers=dict(_response.headers),
558
+ body=_response_json,
559
+ )
560
+
561
+ def getanalyticssummary(
562
+ self,
563
+ *,
564
+ start_time: str,
565
+ end_time: str,
566
+ function_id: typing.Optional[str] = None,
567
+ request_options: typing.Optional[RequestOptions] = None,
568
+ ) -> HttpResponse[TracesGetAnalyticsSummaryResponse]:
569
+ """
570
+ Parameters
571
+ ----------
572
+ start_time : str
573
+
574
+ end_time : str
575
+
576
+ function_id : typing.Optional[str]
577
+
578
+ request_options : typing.Optional[RequestOptions]
579
+ Request-specific configuration.
580
+
581
+ Returns
582
+ -------
583
+ HttpResponse[TracesGetAnalyticsSummaryResponse]
584
+ Success
585
+ """
586
+ _response = self._client_wrapper.httpx_client.request(
587
+ "traces/analytics",
588
+ method="GET",
589
+ params={
590
+ "startTime": start_time,
591
+ "endTime": end_time,
592
+ "functionId": function_id,
593
+ },
594
+ request_options=request_options,
595
+ )
596
+ try:
597
+ if 200 <= _response.status_code < 300:
598
+ _data = typing.cast(
599
+ TracesGetAnalyticsSummaryResponse,
600
+ parse_obj_as(
601
+ type_=TracesGetAnalyticsSummaryResponse, # type: ignore
602
+ object_=_response.json(),
603
+ ),
604
+ )
605
+ return HttpResponse(response=_response, data=_data)
606
+ if _response.status_code == 400:
607
+ raise BadRequestError(
608
+ headers=dict(_response.headers),
609
+ body=typing.cast(
610
+ typing.Optional[typing.Any],
611
+ parse_obj_as(
612
+ type_=typing.Optional[typing.Any], # type: ignore
613
+ object_=_response.json(),
614
+ ),
615
+ ),
616
+ )
617
+ if _response.status_code == 401:
618
+ raise UnauthorizedError(
619
+ headers=dict(_response.headers),
620
+ body=typing.cast(
621
+ UnauthorizedErrorBody,
622
+ parse_obj_as(
623
+ type_=UnauthorizedErrorBody, # type: ignore
624
+ object_=_response.json(),
625
+ ),
626
+ ),
627
+ )
628
+ if _response.status_code == 403:
629
+ raise ForbiddenError(
630
+ headers=dict(_response.headers),
631
+ body=typing.cast(
632
+ PermissionDeniedError,
633
+ parse_obj_as(
634
+ type_=PermissionDeniedError, # type: ignore
635
+ object_=_response.json(),
636
+ ),
637
+ ),
638
+ )
639
+ if _response.status_code == 429:
640
+ raise TooManyRequestsError(
641
+ headers=dict(_response.headers),
642
+ body=typing.cast(
643
+ RateLimitError,
644
+ parse_obj_as(
645
+ type_=RateLimitError, # type: ignore
646
+ object_=_response.json(),
647
+ ),
648
+ ),
649
+ )
650
+ if _response.status_code == 500:
651
+ raise InternalServerError(
652
+ headers=dict(_response.headers),
653
+ body=typing.cast(
654
+ typing.Optional[typing.Any],
655
+ parse_obj_as(
656
+ type_=typing.Optional[typing.Any], # type: ignore
657
+ object_=_response.json(),
658
+ ),
659
+ ),
660
+ )
661
+ if _response.status_code == 503:
662
+ raise ServiceUnavailableError(
663
+ headers=dict(_response.headers),
664
+ body=typing.cast(
665
+ typing.Optional[typing.Any],
666
+ parse_obj_as(
667
+ type_=typing.Optional[typing.Any], # type: ignore
668
+ object_=_response.json(),
669
+ ),
670
+ ),
671
+ )
672
+ _response_json = _response.json()
673
+ except JSONDecodeError:
674
+ raise ApiError(
675
+ status_code=_response.status_code,
676
+ headers=dict(_response.headers),
677
+ body=_response.text,
678
+ )
679
+ raise ApiError(
680
+ status_code=_response.status_code,
681
+ headers=dict(_response.headers),
682
+ body=_response_json,
683
+ )
684
+
685
+ def listbyfunctionhash(
686
+ self,
687
+ hash: str,
688
+ *,
689
+ limit: typing.Optional[NumberFromString] = None,
690
+ offset: typing.Optional[NumberFromString] = None,
691
+ request_options: typing.Optional[RequestOptions] = None,
692
+ ) -> HttpResponse[TracesListByFunctionHashResponse]:
693
+ """
694
+ Parameters
695
+ ----------
696
+ hash : str
697
+
698
+ limit : typing.Optional[NumberFromString]
699
+
700
+ offset : typing.Optional[NumberFromString]
701
+
702
+ request_options : typing.Optional[RequestOptions]
703
+ Request-specific configuration.
704
+
705
+ Returns
706
+ -------
707
+ HttpResponse[TracesListByFunctionHashResponse]
708
+ Success
709
+ """
710
+ _response = self._client_wrapper.httpx_client.request(
711
+ f"traces/function/hash/{jsonable_encoder(hash)}",
712
+ method="GET",
713
+ params={
714
+ "limit": limit,
715
+ "offset": offset,
716
+ },
717
+ request_options=request_options,
718
+ )
719
+ try:
720
+ if 200 <= _response.status_code < 300:
721
+ _data = typing.cast(
722
+ TracesListByFunctionHashResponse,
723
+ parse_obj_as(
724
+ type_=TracesListByFunctionHashResponse, # type: ignore
725
+ object_=_response.json(),
726
+ ),
727
+ )
728
+ return HttpResponse(response=_response, data=_data)
729
+ if _response.status_code == 400:
730
+ raise BadRequestError(
731
+ headers=dict(_response.headers),
732
+ body=typing.cast(
733
+ typing.Optional[typing.Any],
734
+ parse_obj_as(
735
+ type_=typing.Optional[typing.Any], # type: ignore
736
+ object_=_response.json(),
737
+ ),
738
+ ),
739
+ )
740
+ if _response.status_code == 401:
741
+ raise UnauthorizedError(
742
+ headers=dict(_response.headers),
743
+ body=typing.cast(
744
+ UnauthorizedErrorBody,
745
+ parse_obj_as(
746
+ type_=UnauthorizedErrorBody, # type: ignore
747
+ object_=_response.json(),
748
+ ),
749
+ ),
750
+ )
751
+ if _response.status_code == 403:
752
+ raise ForbiddenError(
753
+ headers=dict(_response.headers),
754
+ body=typing.cast(
755
+ PermissionDeniedError,
756
+ parse_obj_as(
757
+ type_=PermissionDeniedError, # type: ignore
758
+ object_=_response.json(),
759
+ ),
760
+ ),
761
+ )
762
+ if _response.status_code == 404:
763
+ raise NotFoundError(
764
+ headers=dict(_response.headers),
765
+ body=typing.cast(
766
+ NotFoundErrorBody,
767
+ parse_obj_as(
768
+ type_=NotFoundErrorBody, # type: ignore
769
+ object_=_response.json(),
770
+ ),
771
+ ),
772
+ )
773
+ if _response.status_code == 429:
774
+ raise TooManyRequestsError(
775
+ headers=dict(_response.headers),
776
+ body=typing.cast(
777
+ RateLimitError,
778
+ parse_obj_as(
779
+ type_=RateLimitError, # type: ignore
780
+ object_=_response.json(),
781
+ ),
782
+ ),
783
+ )
784
+ if _response.status_code == 500:
785
+ raise InternalServerError(
786
+ headers=dict(_response.headers),
787
+ body=typing.cast(
788
+ typing.Optional[typing.Any],
789
+ parse_obj_as(
790
+ type_=typing.Optional[typing.Any], # type: ignore
791
+ object_=_response.json(),
792
+ ),
793
+ ),
794
+ )
795
+ if _response.status_code == 503:
796
+ raise ServiceUnavailableError(
797
+ headers=dict(_response.headers),
798
+ body=typing.cast(
799
+ typing.Optional[typing.Any],
800
+ parse_obj_as(
801
+ type_=typing.Optional[typing.Any], # type: ignore
802
+ object_=_response.json(),
803
+ ),
804
+ ),
805
+ )
806
+ _response_json = _response.json()
807
+ except JSONDecodeError:
808
+ raise ApiError(
809
+ status_code=_response.status_code,
810
+ headers=dict(_response.headers),
811
+ body=_response.text,
812
+ )
813
+ raise ApiError(
814
+ status_code=_response.status_code,
815
+ headers=dict(_response.headers),
816
+ body=_response_json,
817
+ )
818
+
819
+ def searchbyenv(
820
+ self,
821
+ organization_id: str,
822
+ project_id: str,
823
+ environment_id: str,
824
+ *,
825
+ start_time: str,
826
+ end_time: str,
827
+ query: typing.Optional[str] = OMIT,
828
+ input_messages_query: typing.Optional[str] = OMIT,
829
+ output_messages_query: typing.Optional[str] = OMIT,
830
+ fuzzy_search: typing.Optional[bool] = OMIT,
831
+ trace_id: typing.Optional[str] = OMIT,
832
+ span_id: typing.Optional[str] = OMIT,
833
+ model: typing.Optional[typing.Sequence[str]] = OMIT,
834
+ provider: typing.Optional[typing.Sequence[str]] = OMIT,
835
+ function_id: typing.Optional[str] = OMIT,
836
+ function_name: typing.Optional[str] = OMIT,
837
+ span_name_prefix: typing.Optional[str] = OMIT,
838
+ has_error: typing.Optional[bool] = OMIT,
839
+ min_tokens: typing.Optional[float] = OMIT,
840
+ max_tokens: typing.Optional[float] = OMIT,
841
+ min_duration: typing.Optional[float] = OMIT,
842
+ max_duration: typing.Optional[float] = OMIT,
843
+ attribute_filters: typing.Optional[
844
+ typing.Sequence[TracesSearchByEnvRequestAttributeFiltersItem]
845
+ ] = OMIT,
846
+ limit: typing.Optional[float] = OMIT,
847
+ offset: typing.Optional[float] = OMIT,
848
+ sort_by: typing.Optional[TracesSearchByEnvRequestSortBy] = OMIT,
849
+ sort_order: typing.Optional[TracesSearchByEnvRequestSortOrder] = OMIT,
850
+ root_spans_only: typing.Optional[bool] = OMIT,
851
+ request_options: typing.Optional[RequestOptions] = None,
852
+ ) -> HttpResponse[TracesSearchByEnvResponse]:
853
+ """
854
+ Parameters
855
+ ----------
856
+ organization_id : str
857
+
858
+ project_id : str
859
+
860
+ environment_id : str
861
+
862
+ start_time : str
863
+
864
+ end_time : str
865
+
866
+ query : typing.Optional[str]
867
+
868
+ input_messages_query : typing.Optional[str]
869
+
870
+ output_messages_query : typing.Optional[str]
871
+
872
+ fuzzy_search : typing.Optional[bool]
873
+
874
+ trace_id : typing.Optional[str]
875
+
876
+ span_id : typing.Optional[str]
877
+
878
+ model : typing.Optional[typing.Sequence[str]]
879
+
880
+ provider : typing.Optional[typing.Sequence[str]]
881
+
882
+ function_id : typing.Optional[str]
883
+
884
+ function_name : typing.Optional[str]
885
+
886
+ span_name_prefix : typing.Optional[str]
887
+
888
+ has_error : typing.Optional[bool]
889
+
890
+ min_tokens : typing.Optional[float]
891
+
892
+ max_tokens : typing.Optional[float]
893
+
894
+ min_duration : typing.Optional[float]
895
+
896
+ max_duration : typing.Optional[float]
897
+
898
+ attribute_filters : typing.Optional[typing.Sequence[TracesSearchByEnvRequestAttributeFiltersItem]]
899
+
900
+ limit : typing.Optional[float]
901
+
902
+ offset : typing.Optional[float]
903
+
904
+ sort_by : typing.Optional[TracesSearchByEnvRequestSortBy]
905
+
906
+ sort_order : typing.Optional[TracesSearchByEnvRequestSortOrder]
907
+
908
+ root_spans_only : typing.Optional[bool]
909
+
910
+ request_options : typing.Optional[RequestOptions]
911
+ Request-specific configuration.
912
+
913
+ Returns
914
+ -------
915
+ HttpResponse[TracesSearchByEnvResponse]
916
+ Success
917
+ """
918
+ _response = self._client_wrapper.httpx_client.request(
919
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}/traces/search",
920
+ method="POST",
921
+ json={
922
+ "startTime": start_time,
923
+ "endTime": end_time,
924
+ "query": query,
925
+ "inputMessagesQuery": input_messages_query,
926
+ "outputMessagesQuery": output_messages_query,
927
+ "fuzzySearch": fuzzy_search,
928
+ "traceId": trace_id,
929
+ "spanId": span_id,
930
+ "model": model,
931
+ "provider": provider,
932
+ "functionId": function_id,
933
+ "functionName": function_name,
934
+ "spanNamePrefix": span_name_prefix,
935
+ "hasError": has_error,
936
+ "minTokens": min_tokens,
937
+ "maxTokens": max_tokens,
938
+ "minDuration": min_duration,
939
+ "maxDuration": max_duration,
940
+ "attributeFilters": convert_and_respect_annotation_metadata(
941
+ object_=attribute_filters,
942
+ annotation=typing.Sequence[
943
+ TracesSearchByEnvRequestAttributeFiltersItem
944
+ ],
945
+ direction="write",
946
+ ),
947
+ "limit": limit,
948
+ "offset": offset,
949
+ "sortBy": sort_by,
950
+ "sortOrder": sort_order,
951
+ "rootSpansOnly": root_spans_only,
952
+ },
953
+ headers={
954
+ "content-type": "application/json",
955
+ },
956
+ request_options=request_options,
957
+ omit=OMIT,
958
+ )
959
+ try:
960
+ if 200 <= _response.status_code < 300:
961
+ _data = typing.cast(
962
+ TracesSearchByEnvResponse,
963
+ parse_obj_as(
964
+ type_=TracesSearchByEnvResponse, # type: ignore
965
+ object_=_response.json(),
966
+ ),
967
+ )
968
+ return HttpResponse(response=_response, data=_data)
969
+ if _response.status_code == 400:
970
+ raise BadRequestError(
971
+ headers=dict(_response.headers),
972
+ body=typing.cast(
973
+ typing.Optional[typing.Any],
974
+ parse_obj_as(
975
+ type_=typing.Optional[typing.Any], # type: ignore
976
+ object_=_response.json(),
977
+ ),
978
+ ),
979
+ )
980
+ if _response.status_code == 401:
981
+ raise UnauthorizedError(
982
+ headers=dict(_response.headers),
983
+ body=typing.cast(
984
+ UnauthorizedErrorBody,
985
+ parse_obj_as(
986
+ type_=UnauthorizedErrorBody, # type: ignore
987
+ object_=_response.json(),
988
+ ),
989
+ ),
990
+ )
991
+ if _response.status_code == 403:
992
+ raise ForbiddenError(
993
+ headers=dict(_response.headers),
994
+ body=typing.cast(
995
+ PermissionDeniedError,
996
+ parse_obj_as(
997
+ type_=PermissionDeniedError, # type: ignore
998
+ object_=_response.json(),
999
+ ),
1000
+ ),
1001
+ )
1002
+ if _response.status_code == 404:
1003
+ raise NotFoundError(
1004
+ headers=dict(_response.headers),
1005
+ body=typing.cast(
1006
+ NotFoundErrorBody,
1007
+ parse_obj_as(
1008
+ type_=NotFoundErrorBody, # type: ignore
1009
+ object_=_response.json(),
1010
+ ),
1011
+ ),
1012
+ )
1013
+ if _response.status_code == 429:
1014
+ raise TooManyRequestsError(
1015
+ headers=dict(_response.headers),
1016
+ body=typing.cast(
1017
+ RateLimitError,
1018
+ parse_obj_as(
1019
+ type_=RateLimitError, # type: ignore
1020
+ object_=_response.json(),
1021
+ ),
1022
+ ),
1023
+ )
1024
+ if _response.status_code == 500:
1025
+ raise InternalServerError(
1026
+ headers=dict(_response.headers),
1027
+ body=typing.cast(
1028
+ typing.Optional[typing.Any],
1029
+ parse_obj_as(
1030
+ type_=typing.Optional[typing.Any], # type: ignore
1031
+ object_=_response.json(),
1032
+ ),
1033
+ ),
1034
+ )
1035
+ if _response.status_code == 503:
1036
+ raise ServiceUnavailableError(
1037
+ headers=dict(_response.headers),
1038
+ body=typing.cast(
1039
+ typing.Optional[typing.Any],
1040
+ parse_obj_as(
1041
+ type_=typing.Optional[typing.Any], # type: ignore
1042
+ object_=_response.json(),
1043
+ ),
1044
+ ),
1045
+ )
1046
+ _response_json = _response.json()
1047
+ except JSONDecodeError:
1048
+ raise ApiError(
1049
+ status_code=_response.status_code,
1050
+ headers=dict(_response.headers),
1051
+ body=_response.text,
1052
+ )
1053
+ raise ApiError(
1054
+ status_code=_response.status_code,
1055
+ headers=dict(_response.headers),
1056
+ body=_response_json,
1057
+ )
1058
+
1059
+ def gettracedetailbyenv(
1060
+ self,
1061
+ organization_id: str,
1062
+ project_id: str,
1063
+ environment_id: str,
1064
+ trace_id: str,
1065
+ *,
1066
+ request_options: typing.Optional[RequestOptions] = None,
1067
+ ) -> HttpResponse[TracesGetTraceDetailByEnvResponse]:
1068
+ """
1069
+ Parameters
1070
+ ----------
1071
+ organization_id : str
1072
+
1073
+ project_id : str
1074
+
1075
+ environment_id : str
1076
+
1077
+ trace_id : str
1078
+
1079
+ request_options : typing.Optional[RequestOptions]
1080
+ Request-specific configuration.
1081
+
1082
+ Returns
1083
+ -------
1084
+ HttpResponse[TracesGetTraceDetailByEnvResponse]
1085
+ Success
1086
+ """
1087
+ _response = self._client_wrapper.httpx_client.request(
1088
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}/traces/{jsonable_encoder(trace_id)}",
1089
+ method="GET",
1090
+ request_options=request_options,
1091
+ )
1092
+ try:
1093
+ if 200 <= _response.status_code < 300:
1094
+ _data = typing.cast(
1095
+ TracesGetTraceDetailByEnvResponse,
1096
+ parse_obj_as(
1097
+ type_=TracesGetTraceDetailByEnvResponse, # type: ignore
1098
+ object_=_response.json(),
1099
+ ),
1100
+ )
1101
+ return HttpResponse(response=_response, data=_data)
1102
+ if _response.status_code == 400:
1103
+ raise BadRequestError(
1104
+ headers=dict(_response.headers),
1105
+ body=typing.cast(
1106
+ typing.Optional[typing.Any],
1107
+ parse_obj_as(
1108
+ type_=typing.Optional[typing.Any], # type: ignore
1109
+ object_=_response.json(),
1110
+ ),
1111
+ ),
1112
+ )
1113
+ if _response.status_code == 401:
1114
+ raise UnauthorizedError(
1115
+ headers=dict(_response.headers),
1116
+ body=typing.cast(
1117
+ UnauthorizedErrorBody,
1118
+ parse_obj_as(
1119
+ type_=UnauthorizedErrorBody, # type: ignore
1120
+ object_=_response.json(),
1121
+ ),
1122
+ ),
1123
+ )
1124
+ if _response.status_code == 403:
1125
+ raise ForbiddenError(
1126
+ headers=dict(_response.headers),
1127
+ body=typing.cast(
1128
+ PermissionDeniedError,
1129
+ parse_obj_as(
1130
+ type_=PermissionDeniedError, # type: ignore
1131
+ object_=_response.json(),
1132
+ ),
1133
+ ),
1134
+ )
1135
+ if _response.status_code == 404:
1136
+ raise NotFoundError(
1137
+ headers=dict(_response.headers),
1138
+ body=typing.cast(
1139
+ NotFoundErrorBody,
1140
+ parse_obj_as(
1141
+ type_=NotFoundErrorBody, # type: ignore
1142
+ object_=_response.json(),
1143
+ ),
1144
+ ),
1145
+ )
1146
+ if _response.status_code == 429:
1147
+ raise TooManyRequestsError(
1148
+ headers=dict(_response.headers),
1149
+ body=typing.cast(
1150
+ RateLimitError,
1151
+ parse_obj_as(
1152
+ type_=RateLimitError, # type: ignore
1153
+ object_=_response.json(),
1154
+ ),
1155
+ ),
1156
+ )
1157
+ if _response.status_code == 500:
1158
+ raise InternalServerError(
1159
+ headers=dict(_response.headers),
1160
+ body=typing.cast(
1161
+ typing.Optional[typing.Any],
1162
+ parse_obj_as(
1163
+ type_=typing.Optional[typing.Any], # type: ignore
1164
+ object_=_response.json(),
1165
+ ),
1166
+ ),
1167
+ )
1168
+ if _response.status_code == 503:
1169
+ raise ServiceUnavailableError(
1170
+ headers=dict(_response.headers),
1171
+ body=typing.cast(
1172
+ typing.Optional[typing.Any],
1173
+ parse_obj_as(
1174
+ type_=typing.Optional[typing.Any], # type: ignore
1175
+ object_=_response.json(),
1176
+ ),
1177
+ ),
1178
+ )
1179
+ _response_json = _response.json()
1180
+ except JSONDecodeError:
1181
+ raise ApiError(
1182
+ status_code=_response.status_code,
1183
+ headers=dict(_response.headers),
1184
+ body=_response.text,
1185
+ )
1186
+ raise ApiError(
1187
+ status_code=_response.status_code,
1188
+ headers=dict(_response.headers),
1189
+ body=_response_json,
1190
+ )
1191
+
1192
+
1193
+ class AsyncRawTracesClient:
1194
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
1195
+ self._client_wrapper = client_wrapper
1196
+
1197
+ async def create(
1198
+ self,
1199
+ *,
1200
+ resource_spans: typing.Sequence[TracesCreateRequestResourceSpansItem],
1201
+ request_options: typing.Optional[RequestOptions] = None,
1202
+ ) -> AsyncHttpResponse[TracesCreateResponse]:
1203
+ """
1204
+ Parameters
1205
+ ----------
1206
+ resource_spans : typing.Sequence[TracesCreateRequestResourceSpansItem]
1207
+
1208
+ request_options : typing.Optional[RequestOptions]
1209
+ Request-specific configuration.
1210
+
1211
+ Returns
1212
+ -------
1213
+ AsyncHttpResponse[TracesCreateResponse]
1214
+ Success
1215
+ """
1216
+ _response = await self._client_wrapper.httpx_client.request(
1217
+ "traces",
1218
+ method="POST",
1219
+ json={
1220
+ "resourceSpans": convert_and_respect_annotation_metadata(
1221
+ object_=resource_spans,
1222
+ annotation=typing.Sequence[TracesCreateRequestResourceSpansItem],
1223
+ direction="write",
1224
+ ),
1225
+ },
1226
+ headers={
1227
+ "content-type": "application/json",
1228
+ },
1229
+ request_options=request_options,
1230
+ omit=OMIT,
1231
+ )
1232
+ try:
1233
+ if 200 <= _response.status_code < 300:
1234
+ _data = typing.cast(
1235
+ TracesCreateResponse,
1236
+ parse_obj_as(
1237
+ type_=TracesCreateResponse, # type: ignore
1238
+ object_=_response.json(),
1239
+ ),
1240
+ )
1241
+ return AsyncHttpResponse(response=_response, data=_data)
1242
+ if _response.status_code == 400:
1243
+ raise BadRequestError(
1244
+ headers=dict(_response.headers),
1245
+ body=typing.cast(
1246
+ typing.Optional[typing.Any],
1247
+ parse_obj_as(
1248
+ type_=typing.Optional[typing.Any], # type: ignore
1249
+ object_=_response.json(),
1250
+ ),
1251
+ ),
1252
+ )
1253
+ if _response.status_code == 401:
1254
+ raise UnauthorizedError(
1255
+ headers=dict(_response.headers),
1256
+ body=typing.cast(
1257
+ UnauthorizedErrorBody,
1258
+ parse_obj_as(
1259
+ type_=UnauthorizedErrorBody, # type: ignore
1260
+ object_=_response.json(),
1261
+ ),
1262
+ ),
1263
+ )
1264
+ if _response.status_code == 402:
1265
+ raise PaymentRequiredError(
1266
+ headers=dict(_response.headers),
1267
+ body=typing.cast(
1268
+ PlanLimitExceededError,
1269
+ parse_obj_as(
1270
+ type_=PlanLimitExceededError, # type: ignore
1271
+ object_=_response.json(),
1272
+ ),
1273
+ ),
1274
+ )
1275
+ if _response.status_code == 403:
1276
+ raise ForbiddenError(
1277
+ headers=dict(_response.headers),
1278
+ body=typing.cast(
1279
+ PermissionDeniedError,
1280
+ parse_obj_as(
1281
+ type_=PermissionDeniedError, # type: ignore
1282
+ object_=_response.json(),
1283
+ ),
1284
+ ),
1285
+ )
1286
+ if _response.status_code == 404:
1287
+ raise NotFoundError(
1288
+ headers=dict(_response.headers),
1289
+ body=typing.cast(
1290
+ NotFoundErrorBody,
1291
+ parse_obj_as(
1292
+ type_=NotFoundErrorBody, # type: ignore
1293
+ object_=_response.json(),
1294
+ ),
1295
+ ),
1296
+ )
1297
+ if _response.status_code == 409:
1298
+ raise ConflictError(
1299
+ headers=dict(_response.headers),
1300
+ body=typing.cast(
1301
+ typing.Optional[typing.Any],
1302
+ parse_obj_as(
1303
+ type_=typing.Optional[typing.Any], # type: ignore
1304
+ object_=_response.json(),
1305
+ ),
1306
+ ),
1307
+ )
1308
+ if _response.status_code == 429:
1309
+ raise TooManyRequestsError(
1310
+ headers=dict(_response.headers),
1311
+ body=typing.cast(
1312
+ RateLimitError,
1313
+ parse_obj_as(
1314
+ type_=RateLimitError, # type: ignore
1315
+ object_=_response.json(),
1316
+ ),
1317
+ ),
1318
+ )
1319
+ if _response.status_code == 500:
1320
+ raise InternalServerError(
1321
+ headers=dict(_response.headers),
1322
+ body=typing.cast(
1323
+ typing.Optional[typing.Any],
1324
+ parse_obj_as(
1325
+ type_=typing.Optional[typing.Any], # type: ignore
1326
+ object_=_response.json(),
1327
+ ),
1328
+ ),
1329
+ )
1330
+ if _response.status_code == 503:
1331
+ raise ServiceUnavailableError(
1332
+ headers=dict(_response.headers),
1333
+ body=typing.cast(
1334
+ typing.Optional[typing.Any],
1335
+ parse_obj_as(
1336
+ type_=typing.Optional[typing.Any], # type: ignore
1337
+ object_=_response.json(),
1338
+ ),
1339
+ ),
1340
+ )
1341
+ _response_json = _response.json()
1342
+ except JSONDecodeError:
1343
+ raise ApiError(
1344
+ status_code=_response.status_code,
1345
+ headers=dict(_response.headers),
1346
+ body=_response.text,
1347
+ )
1348
+ raise ApiError(
1349
+ status_code=_response.status_code,
1350
+ headers=dict(_response.headers),
1351
+ body=_response_json,
1352
+ )
1353
+
1354
+ async def search(
1355
+ self,
1356
+ *,
1357
+ start_time: str,
1358
+ end_time: str,
1359
+ query: typing.Optional[str] = OMIT,
1360
+ input_messages_query: typing.Optional[str] = OMIT,
1361
+ output_messages_query: typing.Optional[str] = OMIT,
1362
+ fuzzy_search: typing.Optional[bool] = OMIT,
1363
+ trace_id: typing.Optional[str] = OMIT,
1364
+ span_id: typing.Optional[str] = OMIT,
1365
+ model: typing.Optional[typing.Sequence[str]] = OMIT,
1366
+ provider: typing.Optional[typing.Sequence[str]] = OMIT,
1367
+ function_id: typing.Optional[str] = OMIT,
1368
+ function_name: typing.Optional[str] = OMIT,
1369
+ span_name_prefix: typing.Optional[str] = OMIT,
1370
+ has_error: typing.Optional[bool] = OMIT,
1371
+ min_tokens: typing.Optional[float] = OMIT,
1372
+ max_tokens: typing.Optional[float] = OMIT,
1373
+ min_duration: typing.Optional[float] = OMIT,
1374
+ max_duration: typing.Optional[float] = OMIT,
1375
+ attribute_filters: typing.Optional[
1376
+ typing.Sequence[TracesSearchRequestAttributeFiltersItem]
1377
+ ] = OMIT,
1378
+ limit: typing.Optional[float] = OMIT,
1379
+ offset: typing.Optional[float] = OMIT,
1380
+ sort_by: typing.Optional[TracesSearchRequestSortBy] = OMIT,
1381
+ sort_order: typing.Optional[TracesSearchRequestSortOrder] = OMIT,
1382
+ root_spans_only: typing.Optional[bool] = OMIT,
1383
+ request_options: typing.Optional[RequestOptions] = None,
1384
+ ) -> AsyncHttpResponse[TracesSearchResponse]:
1385
+ """
1386
+ Parameters
1387
+ ----------
1388
+ start_time : str
1389
+
1390
+ end_time : str
1391
+
1392
+ query : typing.Optional[str]
1393
+
1394
+ input_messages_query : typing.Optional[str]
1395
+
1396
+ output_messages_query : typing.Optional[str]
1397
+
1398
+ fuzzy_search : typing.Optional[bool]
1399
+
1400
+ trace_id : typing.Optional[str]
1401
+
1402
+ span_id : typing.Optional[str]
1403
+
1404
+ model : typing.Optional[typing.Sequence[str]]
1405
+
1406
+ provider : typing.Optional[typing.Sequence[str]]
1407
+
1408
+ function_id : typing.Optional[str]
1409
+
1410
+ function_name : typing.Optional[str]
1411
+
1412
+ span_name_prefix : typing.Optional[str]
1413
+
1414
+ has_error : typing.Optional[bool]
1415
+
1416
+ min_tokens : typing.Optional[float]
1417
+
1418
+ max_tokens : typing.Optional[float]
1419
+
1420
+ min_duration : typing.Optional[float]
1421
+
1422
+ max_duration : typing.Optional[float]
1423
+
1424
+ attribute_filters : typing.Optional[typing.Sequence[TracesSearchRequestAttributeFiltersItem]]
1425
+
1426
+ limit : typing.Optional[float]
1427
+
1428
+ offset : typing.Optional[float]
1429
+
1430
+ sort_by : typing.Optional[TracesSearchRequestSortBy]
1431
+
1432
+ sort_order : typing.Optional[TracesSearchRequestSortOrder]
1433
+
1434
+ root_spans_only : typing.Optional[bool]
1435
+
1436
+ request_options : typing.Optional[RequestOptions]
1437
+ Request-specific configuration.
1438
+
1439
+ Returns
1440
+ -------
1441
+ AsyncHttpResponse[TracesSearchResponse]
1442
+ Success
1443
+ """
1444
+ _response = await self._client_wrapper.httpx_client.request(
1445
+ "traces/search",
1446
+ method="POST",
1447
+ json={
1448
+ "startTime": start_time,
1449
+ "endTime": end_time,
1450
+ "query": query,
1451
+ "inputMessagesQuery": input_messages_query,
1452
+ "outputMessagesQuery": output_messages_query,
1453
+ "fuzzySearch": fuzzy_search,
1454
+ "traceId": trace_id,
1455
+ "spanId": span_id,
1456
+ "model": model,
1457
+ "provider": provider,
1458
+ "functionId": function_id,
1459
+ "functionName": function_name,
1460
+ "spanNamePrefix": span_name_prefix,
1461
+ "hasError": has_error,
1462
+ "minTokens": min_tokens,
1463
+ "maxTokens": max_tokens,
1464
+ "minDuration": min_duration,
1465
+ "maxDuration": max_duration,
1466
+ "attributeFilters": convert_and_respect_annotation_metadata(
1467
+ object_=attribute_filters,
1468
+ annotation=typing.Sequence[TracesSearchRequestAttributeFiltersItem],
1469
+ direction="write",
1470
+ ),
1471
+ "limit": limit,
1472
+ "offset": offset,
1473
+ "sortBy": sort_by,
1474
+ "sortOrder": sort_order,
1475
+ "rootSpansOnly": root_spans_only,
1476
+ },
1477
+ headers={
1478
+ "content-type": "application/json",
1479
+ },
1480
+ request_options=request_options,
1481
+ omit=OMIT,
1482
+ )
1483
+ try:
1484
+ if 200 <= _response.status_code < 300:
1485
+ _data = typing.cast(
1486
+ TracesSearchResponse,
1487
+ parse_obj_as(
1488
+ type_=TracesSearchResponse, # type: ignore
1489
+ object_=_response.json(),
1490
+ ),
1491
+ )
1492
+ return AsyncHttpResponse(response=_response, data=_data)
1493
+ if _response.status_code == 400:
1494
+ raise BadRequestError(
1495
+ headers=dict(_response.headers),
1496
+ body=typing.cast(
1497
+ typing.Optional[typing.Any],
1498
+ parse_obj_as(
1499
+ type_=typing.Optional[typing.Any], # type: ignore
1500
+ object_=_response.json(),
1501
+ ),
1502
+ ),
1503
+ )
1504
+ if _response.status_code == 401:
1505
+ raise UnauthorizedError(
1506
+ headers=dict(_response.headers),
1507
+ body=typing.cast(
1508
+ UnauthorizedErrorBody,
1509
+ parse_obj_as(
1510
+ type_=UnauthorizedErrorBody, # type: ignore
1511
+ object_=_response.json(),
1512
+ ),
1513
+ ),
1514
+ )
1515
+ if _response.status_code == 403:
1516
+ raise ForbiddenError(
1517
+ headers=dict(_response.headers),
1518
+ body=typing.cast(
1519
+ PermissionDeniedError,
1520
+ parse_obj_as(
1521
+ type_=PermissionDeniedError, # type: ignore
1522
+ object_=_response.json(),
1523
+ ),
1524
+ ),
1525
+ )
1526
+ if _response.status_code == 429:
1527
+ raise TooManyRequestsError(
1528
+ headers=dict(_response.headers),
1529
+ body=typing.cast(
1530
+ RateLimitError,
1531
+ parse_obj_as(
1532
+ type_=RateLimitError, # type: ignore
1533
+ object_=_response.json(),
1534
+ ),
1535
+ ),
1536
+ )
1537
+ if _response.status_code == 500:
1538
+ raise InternalServerError(
1539
+ headers=dict(_response.headers),
1540
+ body=typing.cast(
1541
+ typing.Optional[typing.Any],
1542
+ parse_obj_as(
1543
+ type_=typing.Optional[typing.Any], # type: ignore
1544
+ object_=_response.json(),
1545
+ ),
1546
+ ),
1547
+ )
1548
+ if _response.status_code == 503:
1549
+ raise ServiceUnavailableError(
1550
+ headers=dict(_response.headers),
1551
+ body=typing.cast(
1552
+ typing.Optional[typing.Any],
1553
+ parse_obj_as(
1554
+ type_=typing.Optional[typing.Any], # type: ignore
1555
+ object_=_response.json(),
1556
+ ),
1557
+ ),
1558
+ )
1559
+ _response_json = _response.json()
1560
+ except JSONDecodeError:
1561
+ raise ApiError(
1562
+ status_code=_response.status_code,
1563
+ headers=dict(_response.headers),
1564
+ body=_response.text,
1565
+ )
1566
+ raise ApiError(
1567
+ status_code=_response.status_code,
1568
+ headers=dict(_response.headers),
1569
+ body=_response_json,
1570
+ )
1571
+
1572
+ async def gettracedetail(
1573
+ self, trace_id: str, *, request_options: typing.Optional[RequestOptions] = None
1574
+ ) -> AsyncHttpResponse[TracesGetTraceDetailResponse]:
1575
+ """
1576
+ Parameters
1577
+ ----------
1578
+ trace_id : str
1579
+
1580
+ request_options : typing.Optional[RequestOptions]
1581
+ Request-specific configuration.
1582
+
1583
+ Returns
1584
+ -------
1585
+ AsyncHttpResponse[TracesGetTraceDetailResponse]
1586
+ Success
1587
+ """
1588
+ _response = await self._client_wrapper.httpx_client.request(
1589
+ f"traces/{jsonable_encoder(trace_id)}",
1590
+ method="GET",
1591
+ request_options=request_options,
1592
+ )
1593
+ try:
1594
+ if 200 <= _response.status_code < 300:
1595
+ _data = typing.cast(
1596
+ TracesGetTraceDetailResponse,
1597
+ parse_obj_as(
1598
+ type_=TracesGetTraceDetailResponse, # type: ignore
1599
+ object_=_response.json(),
1600
+ ),
1601
+ )
1602
+ return AsyncHttpResponse(response=_response, data=_data)
1603
+ if _response.status_code == 400:
1604
+ raise BadRequestError(
1605
+ headers=dict(_response.headers),
1606
+ body=typing.cast(
1607
+ typing.Optional[typing.Any],
1608
+ parse_obj_as(
1609
+ type_=typing.Optional[typing.Any], # type: ignore
1610
+ object_=_response.json(),
1611
+ ),
1612
+ ),
1613
+ )
1614
+ if _response.status_code == 401:
1615
+ raise UnauthorizedError(
1616
+ headers=dict(_response.headers),
1617
+ body=typing.cast(
1618
+ UnauthorizedErrorBody,
1619
+ parse_obj_as(
1620
+ type_=UnauthorizedErrorBody, # type: ignore
1621
+ object_=_response.json(),
1622
+ ),
1623
+ ),
1624
+ )
1625
+ if _response.status_code == 403:
1626
+ raise ForbiddenError(
1627
+ headers=dict(_response.headers),
1628
+ body=typing.cast(
1629
+ PermissionDeniedError,
1630
+ parse_obj_as(
1631
+ type_=PermissionDeniedError, # type: ignore
1632
+ object_=_response.json(),
1633
+ ),
1634
+ ),
1635
+ )
1636
+ if _response.status_code == 404:
1637
+ raise NotFoundError(
1638
+ headers=dict(_response.headers),
1639
+ body=typing.cast(
1640
+ NotFoundErrorBody,
1641
+ parse_obj_as(
1642
+ type_=NotFoundErrorBody, # type: ignore
1643
+ object_=_response.json(),
1644
+ ),
1645
+ ),
1646
+ )
1647
+ if _response.status_code == 429:
1648
+ raise TooManyRequestsError(
1649
+ headers=dict(_response.headers),
1650
+ body=typing.cast(
1651
+ RateLimitError,
1652
+ parse_obj_as(
1653
+ type_=RateLimitError, # type: ignore
1654
+ object_=_response.json(),
1655
+ ),
1656
+ ),
1657
+ )
1658
+ if _response.status_code == 500:
1659
+ raise InternalServerError(
1660
+ headers=dict(_response.headers),
1661
+ body=typing.cast(
1662
+ typing.Optional[typing.Any],
1663
+ parse_obj_as(
1664
+ type_=typing.Optional[typing.Any], # type: ignore
1665
+ object_=_response.json(),
1666
+ ),
1667
+ ),
1668
+ )
1669
+ if _response.status_code == 503:
1670
+ raise ServiceUnavailableError(
1671
+ headers=dict(_response.headers),
1672
+ body=typing.cast(
1673
+ typing.Optional[typing.Any],
1674
+ parse_obj_as(
1675
+ type_=typing.Optional[typing.Any], # type: ignore
1676
+ object_=_response.json(),
1677
+ ),
1678
+ ),
1679
+ )
1680
+ _response_json = _response.json()
1681
+ except JSONDecodeError:
1682
+ raise ApiError(
1683
+ status_code=_response.status_code,
1684
+ headers=dict(_response.headers),
1685
+ body=_response.text,
1686
+ )
1687
+ raise ApiError(
1688
+ status_code=_response.status_code,
1689
+ headers=dict(_response.headers),
1690
+ body=_response_json,
1691
+ )
1692
+
1693
+ async def getanalyticssummary(
1694
+ self,
1695
+ *,
1696
+ start_time: str,
1697
+ end_time: str,
1698
+ function_id: typing.Optional[str] = None,
1699
+ request_options: typing.Optional[RequestOptions] = None,
1700
+ ) -> AsyncHttpResponse[TracesGetAnalyticsSummaryResponse]:
1701
+ """
1702
+ Parameters
1703
+ ----------
1704
+ start_time : str
1705
+
1706
+ end_time : str
1707
+
1708
+ function_id : typing.Optional[str]
1709
+
1710
+ request_options : typing.Optional[RequestOptions]
1711
+ Request-specific configuration.
1712
+
1713
+ Returns
1714
+ -------
1715
+ AsyncHttpResponse[TracesGetAnalyticsSummaryResponse]
1716
+ Success
1717
+ """
1718
+ _response = await self._client_wrapper.httpx_client.request(
1719
+ "traces/analytics",
1720
+ method="GET",
1721
+ params={
1722
+ "startTime": start_time,
1723
+ "endTime": end_time,
1724
+ "functionId": function_id,
1725
+ },
1726
+ request_options=request_options,
1727
+ )
1728
+ try:
1729
+ if 200 <= _response.status_code < 300:
1730
+ _data = typing.cast(
1731
+ TracesGetAnalyticsSummaryResponse,
1732
+ parse_obj_as(
1733
+ type_=TracesGetAnalyticsSummaryResponse, # type: ignore
1734
+ object_=_response.json(),
1735
+ ),
1736
+ )
1737
+ return AsyncHttpResponse(response=_response, data=_data)
1738
+ if _response.status_code == 400:
1739
+ raise BadRequestError(
1740
+ headers=dict(_response.headers),
1741
+ body=typing.cast(
1742
+ typing.Optional[typing.Any],
1743
+ parse_obj_as(
1744
+ type_=typing.Optional[typing.Any], # type: ignore
1745
+ object_=_response.json(),
1746
+ ),
1747
+ ),
1748
+ )
1749
+ if _response.status_code == 401:
1750
+ raise UnauthorizedError(
1751
+ headers=dict(_response.headers),
1752
+ body=typing.cast(
1753
+ UnauthorizedErrorBody,
1754
+ parse_obj_as(
1755
+ type_=UnauthorizedErrorBody, # type: ignore
1756
+ object_=_response.json(),
1757
+ ),
1758
+ ),
1759
+ )
1760
+ if _response.status_code == 403:
1761
+ raise ForbiddenError(
1762
+ headers=dict(_response.headers),
1763
+ body=typing.cast(
1764
+ PermissionDeniedError,
1765
+ parse_obj_as(
1766
+ type_=PermissionDeniedError, # type: ignore
1767
+ object_=_response.json(),
1768
+ ),
1769
+ ),
1770
+ )
1771
+ if _response.status_code == 429:
1772
+ raise TooManyRequestsError(
1773
+ headers=dict(_response.headers),
1774
+ body=typing.cast(
1775
+ RateLimitError,
1776
+ parse_obj_as(
1777
+ type_=RateLimitError, # type: ignore
1778
+ object_=_response.json(),
1779
+ ),
1780
+ ),
1781
+ )
1782
+ if _response.status_code == 500:
1783
+ raise InternalServerError(
1784
+ headers=dict(_response.headers),
1785
+ body=typing.cast(
1786
+ typing.Optional[typing.Any],
1787
+ parse_obj_as(
1788
+ type_=typing.Optional[typing.Any], # type: ignore
1789
+ object_=_response.json(),
1790
+ ),
1791
+ ),
1792
+ )
1793
+ if _response.status_code == 503:
1794
+ raise ServiceUnavailableError(
1795
+ headers=dict(_response.headers),
1796
+ body=typing.cast(
1797
+ typing.Optional[typing.Any],
1798
+ parse_obj_as(
1799
+ type_=typing.Optional[typing.Any], # type: ignore
1800
+ object_=_response.json(),
1801
+ ),
1802
+ ),
1803
+ )
1804
+ _response_json = _response.json()
1805
+ except JSONDecodeError:
1806
+ raise ApiError(
1807
+ status_code=_response.status_code,
1808
+ headers=dict(_response.headers),
1809
+ body=_response.text,
1810
+ )
1811
+ raise ApiError(
1812
+ status_code=_response.status_code,
1813
+ headers=dict(_response.headers),
1814
+ body=_response_json,
1815
+ )
1816
+
1817
+ async def listbyfunctionhash(
1818
+ self,
1819
+ hash: str,
1820
+ *,
1821
+ limit: typing.Optional[NumberFromString] = None,
1822
+ offset: typing.Optional[NumberFromString] = None,
1823
+ request_options: typing.Optional[RequestOptions] = None,
1824
+ ) -> AsyncHttpResponse[TracesListByFunctionHashResponse]:
1825
+ """
1826
+ Parameters
1827
+ ----------
1828
+ hash : str
1829
+
1830
+ limit : typing.Optional[NumberFromString]
1831
+
1832
+ offset : typing.Optional[NumberFromString]
1833
+
1834
+ request_options : typing.Optional[RequestOptions]
1835
+ Request-specific configuration.
1836
+
1837
+ Returns
1838
+ -------
1839
+ AsyncHttpResponse[TracesListByFunctionHashResponse]
1840
+ Success
1841
+ """
1842
+ _response = await self._client_wrapper.httpx_client.request(
1843
+ f"traces/function/hash/{jsonable_encoder(hash)}",
1844
+ method="GET",
1845
+ params={
1846
+ "limit": limit,
1847
+ "offset": offset,
1848
+ },
1849
+ request_options=request_options,
1850
+ )
1851
+ try:
1852
+ if 200 <= _response.status_code < 300:
1853
+ _data = typing.cast(
1854
+ TracesListByFunctionHashResponse,
1855
+ parse_obj_as(
1856
+ type_=TracesListByFunctionHashResponse, # type: ignore
1857
+ object_=_response.json(),
1858
+ ),
1859
+ )
1860
+ return AsyncHttpResponse(response=_response, data=_data)
1861
+ if _response.status_code == 400:
1862
+ raise BadRequestError(
1863
+ headers=dict(_response.headers),
1864
+ body=typing.cast(
1865
+ typing.Optional[typing.Any],
1866
+ parse_obj_as(
1867
+ type_=typing.Optional[typing.Any], # type: ignore
1868
+ object_=_response.json(),
1869
+ ),
1870
+ ),
1871
+ )
1872
+ if _response.status_code == 401:
1873
+ raise UnauthorizedError(
1874
+ headers=dict(_response.headers),
1875
+ body=typing.cast(
1876
+ UnauthorizedErrorBody,
1877
+ parse_obj_as(
1878
+ type_=UnauthorizedErrorBody, # type: ignore
1879
+ object_=_response.json(),
1880
+ ),
1881
+ ),
1882
+ )
1883
+ if _response.status_code == 403:
1884
+ raise ForbiddenError(
1885
+ headers=dict(_response.headers),
1886
+ body=typing.cast(
1887
+ PermissionDeniedError,
1888
+ parse_obj_as(
1889
+ type_=PermissionDeniedError, # type: ignore
1890
+ object_=_response.json(),
1891
+ ),
1892
+ ),
1893
+ )
1894
+ if _response.status_code == 404:
1895
+ raise NotFoundError(
1896
+ headers=dict(_response.headers),
1897
+ body=typing.cast(
1898
+ NotFoundErrorBody,
1899
+ parse_obj_as(
1900
+ type_=NotFoundErrorBody, # type: ignore
1901
+ object_=_response.json(),
1902
+ ),
1903
+ ),
1904
+ )
1905
+ if _response.status_code == 429:
1906
+ raise TooManyRequestsError(
1907
+ headers=dict(_response.headers),
1908
+ body=typing.cast(
1909
+ RateLimitError,
1910
+ parse_obj_as(
1911
+ type_=RateLimitError, # type: ignore
1912
+ object_=_response.json(),
1913
+ ),
1914
+ ),
1915
+ )
1916
+ if _response.status_code == 500:
1917
+ raise InternalServerError(
1918
+ headers=dict(_response.headers),
1919
+ body=typing.cast(
1920
+ typing.Optional[typing.Any],
1921
+ parse_obj_as(
1922
+ type_=typing.Optional[typing.Any], # type: ignore
1923
+ object_=_response.json(),
1924
+ ),
1925
+ ),
1926
+ )
1927
+ if _response.status_code == 503:
1928
+ raise ServiceUnavailableError(
1929
+ headers=dict(_response.headers),
1930
+ body=typing.cast(
1931
+ typing.Optional[typing.Any],
1932
+ parse_obj_as(
1933
+ type_=typing.Optional[typing.Any], # type: ignore
1934
+ object_=_response.json(),
1935
+ ),
1936
+ ),
1937
+ )
1938
+ _response_json = _response.json()
1939
+ except JSONDecodeError:
1940
+ raise ApiError(
1941
+ status_code=_response.status_code,
1942
+ headers=dict(_response.headers),
1943
+ body=_response.text,
1944
+ )
1945
+ raise ApiError(
1946
+ status_code=_response.status_code,
1947
+ headers=dict(_response.headers),
1948
+ body=_response_json,
1949
+ )
1950
+
1951
+ async def searchbyenv(
1952
+ self,
1953
+ organization_id: str,
1954
+ project_id: str,
1955
+ environment_id: str,
1956
+ *,
1957
+ start_time: str,
1958
+ end_time: str,
1959
+ query: typing.Optional[str] = OMIT,
1960
+ input_messages_query: typing.Optional[str] = OMIT,
1961
+ output_messages_query: typing.Optional[str] = OMIT,
1962
+ fuzzy_search: typing.Optional[bool] = OMIT,
1963
+ trace_id: typing.Optional[str] = OMIT,
1964
+ span_id: typing.Optional[str] = OMIT,
1965
+ model: typing.Optional[typing.Sequence[str]] = OMIT,
1966
+ provider: typing.Optional[typing.Sequence[str]] = OMIT,
1967
+ function_id: typing.Optional[str] = OMIT,
1968
+ function_name: typing.Optional[str] = OMIT,
1969
+ span_name_prefix: typing.Optional[str] = OMIT,
1970
+ has_error: typing.Optional[bool] = OMIT,
1971
+ min_tokens: typing.Optional[float] = OMIT,
1972
+ max_tokens: typing.Optional[float] = OMIT,
1973
+ min_duration: typing.Optional[float] = OMIT,
1974
+ max_duration: typing.Optional[float] = OMIT,
1975
+ attribute_filters: typing.Optional[
1976
+ typing.Sequence[TracesSearchByEnvRequestAttributeFiltersItem]
1977
+ ] = OMIT,
1978
+ limit: typing.Optional[float] = OMIT,
1979
+ offset: typing.Optional[float] = OMIT,
1980
+ sort_by: typing.Optional[TracesSearchByEnvRequestSortBy] = OMIT,
1981
+ sort_order: typing.Optional[TracesSearchByEnvRequestSortOrder] = OMIT,
1982
+ root_spans_only: typing.Optional[bool] = OMIT,
1983
+ request_options: typing.Optional[RequestOptions] = None,
1984
+ ) -> AsyncHttpResponse[TracesSearchByEnvResponse]:
1985
+ """
1986
+ Parameters
1987
+ ----------
1988
+ organization_id : str
1989
+
1990
+ project_id : str
1991
+
1992
+ environment_id : str
1993
+
1994
+ start_time : str
1995
+
1996
+ end_time : str
1997
+
1998
+ query : typing.Optional[str]
1999
+
2000
+ input_messages_query : typing.Optional[str]
2001
+
2002
+ output_messages_query : typing.Optional[str]
2003
+
2004
+ fuzzy_search : typing.Optional[bool]
2005
+
2006
+ trace_id : typing.Optional[str]
2007
+
2008
+ span_id : typing.Optional[str]
2009
+
2010
+ model : typing.Optional[typing.Sequence[str]]
2011
+
2012
+ provider : typing.Optional[typing.Sequence[str]]
2013
+
2014
+ function_id : typing.Optional[str]
2015
+
2016
+ function_name : typing.Optional[str]
2017
+
2018
+ span_name_prefix : typing.Optional[str]
2019
+
2020
+ has_error : typing.Optional[bool]
2021
+
2022
+ min_tokens : typing.Optional[float]
2023
+
2024
+ max_tokens : typing.Optional[float]
2025
+
2026
+ min_duration : typing.Optional[float]
2027
+
2028
+ max_duration : typing.Optional[float]
2029
+
2030
+ attribute_filters : typing.Optional[typing.Sequence[TracesSearchByEnvRequestAttributeFiltersItem]]
2031
+
2032
+ limit : typing.Optional[float]
2033
+
2034
+ offset : typing.Optional[float]
2035
+
2036
+ sort_by : typing.Optional[TracesSearchByEnvRequestSortBy]
2037
+
2038
+ sort_order : typing.Optional[TracesSearchByEnvRequestSortOrder]
2039
+
2040
+ root_spans_only : typing.Optional[bool]
2041
+
2042
+ request_options : typing.Optional[RequestOptions]
2043
+ Request-specific configuration.
2044
+
2045
+ Returns
2046
+ -------
2047
+ AsyncHttpResponse[TracesSearchByEnvResponse]
2048
+ Success
2049
+ """
2050
+ _response = await self._client_wrapper.httpx_client.request(
2051
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}/traces/search",
2052
+ method="POST",
2053
+ json={
2054
+ "startTime": start_time,
2055
+ "endTime": end_time,
2056
+ "query": query,
2057
+ "inputMessagesQuery": input_messages_query,
2058
+ "outputMessagesQuery": output_messages_query,
2059
+ "fuzzySearch": fuzzy_search,
2060
+ "traceId": trace_id,
2061
+ "spanId": span_id,
2062
+ "model": model,
2063
+ "provider": provider,
2064
+ "functionId": function_id,
2065
+ "functionName": function_name,
2066
+ "spanNamePrefix": span_name_prefix,
2067
+ "hasError": has_error,
2068
+ "minTokens": min_tokens,
2069
+ "maxTokens": max_tokens,
2070
+ "minDuration": min_duration,
2071
+ "maxDuration": max_duration,
2072
+ "attributeFilters": convert_and_respect_annotation_metadata(
2073
+ object_=attribute_filters,
2074
+ annotation=typing.Sequence[
2075
+ TracesSearchByEnvRequestAttributeFiltersItem
2076
+ ],
2077
+ direction="write",
2078
+ ),
2079
+ "limit": limit,
2080
+ "offset": offset,
2081
+ "sortBy": sort_by,
2082
+ "sortOrder": sort_order,
2083
+ "rootSpansOnly": root_spans_only,
2084
+ },
2085
+ headers={
2086
+ "content-type": "application/json",
2087
+ },
2088
+ request_options=request_options,
2089
+ omit=OMIT,
2090
+ )
2091
+ try:
2092
+ if 200 <= _response.status_code < 300:
2093
+ _data = typing.cast(
2094
+ TracesSearchByEnvResponse,
2095
+ parse_obj_as(
2096
+ type_=TracesSearchByEnvResponse, # type: ignore
2097
+ object_=_response.json(),
2098
+ ),
2099
+ )
2100
+ return AsyncHttpResponse(response=_response, data=_data)
2101
+ if _response.status_code == 400:
2102
+ raise BadRequestError(
2103
+ headers=dict(_response.headers),
2104
+ body=typing.cast(
2105
+ typing.Optional[typing.Any],
2106
+ parse_obj_as(
2107
+ type_=typing.Optional[typing.Any], # type: ignore
2108
+ object_=_response.json(),
2109
+ ),
2110
+ ),
2111
+ )
2112
+ if _response.status_code == 401:
2113
+ raise UnauthorizedError(
2114
+ headers=dict(_response.headers),
2115
+ body=typing.cast(
2116
+ UnauthorizedErrorBody,
2117
+ parse_obj_as(
2118
+ type_=UnauthorizedErrorBody, # type: ignore
2119
+ object_=_response.json(),
2120
+ ),
2121
+ ),
2122
+ )
2123
+ if _response.status_code == 403:
2124
+ raise ForbiddenError(
2125
+ headers=dict(_response.headers),
2126
+ body=typing.cast(
2127
+ PermissionDeniedError,
2128
+ parse_obj_as(
2129
+ type_=PermissionDeniedError, # type: ignore
2130
+ object_=_response.json(),
2131
+ ),
2132
+ ),
2133
+ )
2134
+ if _response.status_code == 404:
2135
+ raise NotFoundError(
2136
+ headers=dict(_response.headers),
2137
+ body=typing.cast(
2138
+ NotFoundErrorBody,
2139
+ parse_obj_as(
2140
+ type_=NotFoundErrorBody, # type: ignore
2141
+ object_=_response.json(),
2142
+ ),
2143
+ ),
2144
+ )
2145
+ if _response.status_code == 429:
2146
+ raise TooManyRequestsError(
2147
+ headers=dict(_response.headers),
2148
+ body=typing.cast(
2149
+ RateLimitError,
2150
+ parse_obj_as(
2151
+ type_=RateLimitError, # type: ignore
2152
+ object_=_response.json(),
2153
+ ),
2154
+ ),
2155
+ )
2156
+ if _response.status_code == 500:
2157
+ raise InternalServerError(
2158
+ headers=dict(_response.headers),
2159
+ body=typing.cast(
2160
+ typing.Optional[typing.Any],
2161
+ parse_obj_as(
2162
+ type_=typing.Optional[typing.Any], # type: ignore
2163
+ object_=_response.json(),
2164
+ ),
2165
+ ),
2166
+ )
2167
+ if _response.status_code == 503:
2168
+ raise ServiceUnavailableError(
2169
+ headers=dict(_response.headers),
2170
+ body=typing.cast(
2171
+ typing.Optional[typing.Any],
2172
+ parse_obj_as(
2173
+ type_=typing.Optional[typing.Any], # type: ignore
2174
+ object_=_response.json(),
2175
+ ),
2176
+ ),
2177
+ )
2178
+ _response_json = _response.json()
2179
+ except JSONDecodeError:
2180
+ raise ApiError(
2181
+ status_code=_response.status_code,
2182
+ headers=dict(_response.headers),
2183
+ body=_response.text,
2184
+ )
2185
+ raise ApiError(
2186
+ status_code=_response.status_code,
2187
+ headers=dict(_response.headers),
2188
+ body=_response_json,
2189
+ )
2190
+
2191
+ async def gettracedetailbyenv(
2192
+ self,
2193
+ organization_id: str,
2194
+ project_id: str,
2195
+ environment_id: str,
2196
+ trace_id: str,
2197
+ *,
2198
+ request_options: typing.Optional[RequestOptions] = None,
2199
+ ) -> AsyncHttpResponse[TracesGetTraceDetailByEnvResponse]:
2200
+ """
2201
+ Parameters
2202
+ ----------
2203
+ organization_id : str
2204
+
2205
+ project_id : str
2206
+
2207
+ environment_id : str
2208
+
2209
+ trace_id : str
2210
+
2211
+ request_options : typing.Optional[RequestOptions]
2212
+ Request-specific configuration.
2213
+
2214
+ Returns
2215
+ -------
2216
+ AsyncHttpResponse[TracesGetTraceDetailByEnvResponse]
2217
+ Success
2218
+ """
2219
+ _response = await self._client_wrapper.httpx_client.request(
2220
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}/traces/{jsonable_encoder(trace_id)}",
2221
+ method="GET",
2222
+ request_options=request_options,
2223
+ )
2224
+ try:
2225
+ if 200 <= _response.status_code < 300:
2226
+ _data = typing.cast(
2227
+ TracesGetTraceDetailByEnvResponse,
2228
+ parse_obj_as(
2229
+ type_=TracesGetTraceDetailByEnvResponse, # type: ignore
2230
+ object_=_response.json(),
2231
+ ),
2232
+ )
2233
+ return AsyncHttpResponse(response=_response, data=_data)
2234
+ if _response.status_code == 400:
2235
+ raise BadRequestError(
2236
+ headers=dict(_response.headers),
2237
+ body=typing.cast(
2238
+ typing.Optional[typing.Any],
2239
+ parse_obj_as(
2240
+ type_=typing.Optional[typing.Any], # type: ignore
2241
+ object_=_response.json(),
2242
+ ),
2243
+ ),
2244
+ )
2245
+ if _response.status_code == 401:
2246
+ raise UnauthorizedError(
2247
+ headers=dict(_response.headers),
2248
+ body=typing.cast(
2249
+ UnauthorizedErrorBody,
2250
+ parse_obj_as(
2251
+ type_=UnauthorizedErrorBody, # type: ignore
2252
+ object_=_response.json(),
2253
+ ),
2254
+ ),
2255
+ )
2256
+ if _response.status_code == 403:
2257
+ raise ForbiddenError(
2258
+ headers=dict(_response.headers),
2259
+ body=typing.cast(
2260
+ PermissionDeniedError,
2261
+ parse_obj_as(
2262
+ type_=PermissionDeniedError, # type: ignore
2263
+ object_=_response.json(),
2264
+ ),
2265
+ ),
2266
+ )
2267
+ if _response.status_code == 404:
2268
+ raise NotFoundError(
2269
+ headers=dict(_response.headers),
2270
+ body=typing.cast(
2271
+ NotFoundErrorBody,
2272
+ parse_obj_as(
2273
+ type_=NotFoundErrorBody, # type: ignore
2274
+ object_=_response.json(),
2275
+ ),
2276
+ ),
2277
+ )
2278
+ if _response.status_code == 429:
2279
+ raise TooManyRequestsError(
2280
+ headers=dict(_response.headers),
2281
+ body=typing.cast(
2282
+ RateLimitError,
2283
+ parse_obj_as(
2284
+ type_=RateLimitError, # type: ignore
2285
+ object_=_response.json(),
2286
+ ),
2287
+ ),
2288
+ )
2289
+ if _response.status_code == 500:
2290
+ raise InternalServerError(
2291
+ headers=dict(_response.headers),
2292
+ body=typing.cast(
2293
+ typing.Optional[typing.Any],
2294
+ parse_obj_as(
2295
+ type_=typing.Optional[typing.Any], # type: ignore
2296
+ object_=_response.json(),
2297
+ ),
2298
+ ),
2299
+ )
2300
+ if _response.status_code == 503:
2301
+ raise ServiceUnavailableError(
2302
+ headers=dict(_response.headers),
2303
+ body=typing.cast(
2304
+ typing.Optional[typing.Any],
151
2305
  parse_obj_as(
152
- type_=HttpApiDecodeError, # type: ignore
2306
+ type_=typing.Optional[typing.Any], # type: ignore
153
2307
  object_=_response.json(),
154
2308
  ),
155
2309
  ),