mirascope 2.0.0__py3-none-any.whl → 2.0.0a1__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 (443) hide show
  1. mirascope/__init__.py +2 -11
  2. mirascope/graphs/__init__.py +22 -0
  3. mirascope/graphs/finite_state_machine.py +625 -0
  4. mirascope/llm/__init__.py +15 -96
  5. mirascope/llm/agents/__init__.py +15 -0
  6. mirascope/llm/agents/agent.py +97 -0
  7. mirascope/llm/agents/agent_template.py +45 -0
  8. mirascope/llm/agents/decorator.py +176 -0
  9. mirascope/llm/calls/__init__.py +1 -2
  10. mirascope/llm/calls/base_call.py +33 -0
  11. mirascope/llm/calls/calls.py +58 -84
  12. mirascope/llm/calls/decorator.py +120 -140
  13. mirascope/llm/clients/__init__.py +34 -0
  14. mirascope/llm/clients/_missing_import_stubs.py +47 -0
  15. mirascope/llm/clients/anthropic/__init__.py +25 -0
  16. mirascope/llm/{providers/openai/completions → clients/anthropic}/_utils/__init__.py +0 -2
  17. mirascope/llm/{providers → clients}/anthropic/_utils/decode.py +22 -66
  18. mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
  19. mirascope/llm/clients/anthropic/clients.py +819 -0
  20. mirascope/llm/clients/anthropic/model_ids.py +8 -0
  21. mirascope/llm/{providers → clients}/base/__init__.py +5 -4
  22. mirascope/llm/{providers → clients}/base/_utils.py +17 -78
  23. mirascope/llm/{providers/base/base_provider.py → clients/base/client.py} +145 -468
  24. mirascope/llm/{models → clients/base}/params.py +37 -16
  25. mirascope/llm/clients/google/__init__.py +20 -0
  26. mirascope/llm/{providers/openai/responses → clients/google}/_utils/__init__.py +0 -2
  27. mirascope/llm/{providers → clients}/google/_utils/decode.py +22 -98
  28. mirascope/llm/{providers → clients}/google/_utils/encode.py +46 -168
  29. mirascope/llm/clients/google/clients.py +853 -0
  30. mirascope/llm/clients/google/model_ids.py +15 -0
  31. mirascope/llm/clients/openai/__init__.py +25 -0
  32. mirascope/llm/clients/openai/completions/__init__.py +28 -0
  33. mirascope/llm/{providers/google → clients/openai/completions}/_utils/__init__.py +0 -4
  34. mirascope/llm/{providers → clients}/openai/completions/_utils/decode.py +9 -74
  35. mirascope/llm/{providers → clients}/openai/completions/_utils/encode.py +52 -70
  36. mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
  37. mirascope/llm/clients/openai/completions/clients.py +833 -0
  38. mirascope/llm/clients/openai/completions/model_ids.py +8 -0
  39. mirascope/llm/clients/openai/responses/__init__.py +26 -0
  40. mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
  41. mirascope/llm/{providers → clients}/openai/responses/_utils/decode.py +14 -80
  42. mirascope/llm/{providers → clients}/openai/responses/_utils/encode.py +41 -92
  43. mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
  44. mirascope/llm/clients/openai/responses/clients.py +832 -0
  45. mirascope/llm/clients/openai/responses/model_ids.py +8 -0
  46. mirascope/llm/clients/openai/shared/__init__.py +7 -0
  47. mirascope/llm/clients/openai/shared/_utils.py +55 -0
  48. mirascope/llm/clients/providers.py +175 -0
  49. mirascope/llm/content/__init__.py +2 -3
  50. mirascope/llm/content/tool_call.py +0 -6
  51. mirascope/llm/content/tool_output.py +5 -22
  52. mirascope/llm/context/_utils.py +6 -19
  53. mirascope/llm/exceptions.py +43 -298
  54. mirascope/llm/formatting/__init__.py +2 -19
  55. mirascope/llm/formatting/_utils.py +74 -0
  56. mirascope/llm/formatting/format.py +30 -219
  57. mirascope/llm/formatting/from_call_args.py +2 -2
  58. mirascope/llm/formatting/partial.py +7 -80
  59. mirascope/llm/formatting/types.py +64 -21
  60. mirascope/llm/mcp/__init__.py +2 -2
  61. mirascope/llm/mcp/client.py +118 -0
  62. mirascope/llm/messages/__init__.py +0 -3
  63. mirascope/llm/messages/message.py +5 -13
  64. mirascope/llm/models/__init__.py +2 -7
  65. mirascope/llm/models/models.py +139 -315
  66. mirascope/llm/prompts/__init__.py +12 -13
  67. mirascope/llm/prompts/_utils.py +43 -14
  68. mirascope/llm/prompts/decorator.py +204 -144
  69. mirascope/llm/prompts/protocols.py +59 -25
  70. mirascope/llm/responses/__init__.py +1 -9
  71. mirascope/llm/responses/_utils.py +12 -102
  72. mirascope/llm/responses/base_response.py +6 -18
  73. mirascope/llm/responses/base_stream_response.py +50 -173
  74. mirascope/llm/responses/finish_reason.py +0 -1
  75. mirascope/llm/responses/response.py +13 -34
  76. mirascope/llm/responses/root_response.py +29 -100
  77. mirascope/llm/responses/stream_response.py +31 -40
  78. mirascope/llm/tools/__init__.py +2 -9
  79. mirascope/llm/tools/_utils.py +3 -12
  80. mirascope/llm/tools/decorator.py +16 -25
  81. mirascope/llm/tools/protocols.py +4 -4
  82. mirascope/llm/tools/tool_schema.py +19 -87
  83. mirascope/llm/tools/toolkit.py +27 -35
  84. mirascope/llm/tools/tools.py +41 -135
  85. {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/METADATA +13 -90
  86. mirascope-2.0.0a1.dist-info/RECORD +102 -0
  87. {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/WHEEL +1 -1
  88. {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/licenses/LICENSE +1 -1
  89. mirascope/_stubs.py +0 -363
  90. mirascope/api/__init__.py +0 -14
  91. mirascope/api/_generated/README.md +0 -207
  92. mirascope/api/_generated/__init__.py +0 -440
  93. mirascope/api/_generated/annotations/__init__.py +0 -33
  94. mirascope/api/_generated/annotations/client.py +0 -506
  95. mirascope/api/_generated/annotations/raw_client.py +0 -1414
  96. mirascope/api/_generated/annotations/types/__init__.py +0 -31
  97. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +0 -5
  98. mirascope/api/_generated/annotations/types/annotations_create_response.py +0 -48
  99. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +0 -5
  100. mirascope/api/_generated/annotations/types/annotations_get_response.py +0 -48
  101. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +0 -5
  102. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +0 -5
  103. mirascope/api/_generated/annotations/types/annotations_list_response.py +0 -21
  104. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +0 -50
  105. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +0 -5
  106. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +0 -5
  107. mirascope/api/_generated/annotations/types/annotations_update_response.py +0 -48
  108. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +0 -5
  109. mirascope/api/_generated/api_keys/__init__.py +0 -17
  110. mirascope/api/_generated/api_keys/client.py +0 -530
  111. mirascope/api/_generated/api_keys/raw_client.py +0 -1236
  112. mirascope/api/_generated/api_keys/types/__init__.py +0 -15
  113. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +0 -28
  114. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +0 -27
  115. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +0 -40
  116. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +0 -27
  117. mirascope/api/_generated/client.py +0 -211
  118. mirascope/api/_generated/core/__init__.py +0 -52
  119. mirascope/api/_generated/core/api_error.py +0 -23
  120. mirascope/api/_generated/core/client_wrapper.py +0 -46
  121. mirascope/api/_generated/core/datetime_utils.py +0 -28
  122. mirascope/api/_generated/core/file.py +0 -67
  123. mirascope/api/_generated/core/force_multipart.py +0 -16
  124. mirascope/api/_generated/core/http_client.py +0 -543
  125. mirascope/api/_generated/core/http_response.py +0 -55
  126. mirascope/api/_generated/core/jsonable_encoder.py +0 -100
  127. mirascope/api/_generated/core/pydantic_utilities.py +0 -255
  128. mirascope/api/_generated/core/query_encoder.py +0 -58
  129. mirascope/api/_generated/core/remove_none_from_dict.py +0 -11
  130. mirascope/api/_generated/core/request_options.py +0 -35
  131. mirascope/api/_generated/core/serialization.py +0 -276
  132. mirascope/api/_generated/docs/__init__.py +0 -4
  133. mirascope/api/_generated/docs/client.py +0 -91
  134. mirascope/api/_generated/docs/raw_client.py +0 -178
  135. mirascope/api/_generated/environment.py +0 -9
  136. mirascope/api/_generated/environments/__init__.py +0 -23
  137. mirascope/api/_generated/environments/client.py +0 -649
  138. mirascope/api/_generated/environments/raw_client.py +0 -1567
  139. mirascope/api/_generated/environments/types/__init__.py +0 -25
  140. mirascope/api/_generated/environments/types/environments_create_response.py +0 -24
  141. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +0 -60
  142. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +0 -24
  143. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +0 -22
  144. mirascope/api/_generated/environments/types/environments_get_response.py +0 -24
  145. mirascope/api/_generated/environments/types/environments_list_response_item.py +0 -24
  146. mirascope/api/_generated/environments/types/environments_update_response.py +0 -24
  147. mirascope/api/_generated/errors/__init__.py +0 -25
  148. mirascope/api/_generated/errors/bad_request_error.py +0 -14
  149. mirascope/api/_generated/errors/conflict_error.py +0 -14
  150. mirascope/api/_generated/errors/forbidden_error.py +0 -11
  151. mirascope/api/_generated/errors/internal_server_error.py +0 -10
  152. mirascope/api/_generated/errors/not_found_error.py +0 -11
  153. mirascope/api/_generated/errors/payment_required_error.py +0 -15
  154. mirascope/api/_generated/errors/service_unavailable_error.py +0 -14
  155. mirascope/api/_generated/errors/too_many_requests_error.py +0 -15
  156. mirascope/api/_generated/errors/unauthorized_error.py +0 -11
  157. mirascope/api/_generated/functions/__init__.py +0 -39
  158. mirascope/api/_generated/functions/client.py +0 -647
  159. mirascope/api/_generated/functions/raw_client.py +0 -1890
  160. mirascope/api/_generated/functions/types/__init__.py +0 -53
  161. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +0 -20
  162. mirascope/api/_generated/functions/types/functions_create_response.py +0 -37
  163. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +0 -20
  164. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +0 -39
  165. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +0 -20
  166. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +0 -53
  167. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +0 -22
  168. mirascope/api/_generated/functions/types/functions_get_response.py +0 -37
  169. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +0 -20
  170. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +0 -25
  171. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +0 -56
  172. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +0 -22
  173. mirascope/api/_generated/functions/types/functions_list_response.py +0 -21
  174. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +0 -41
  175. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +0 -20
  176. mirascope/api/_generated/health/__init__.py +0 -7
  177. mirascope/api/_generated/health/client.py +0 -92
  178. mirascope/api/_generated/health/raw_client.py +0 -175
  179. mirascope/api/_generated/health/types/__init__.py +0 -8
  180. mirascope/api/_generated/health/types/health_check_response.py +0 -22
  181. mirascope/api/_generated/health/types/health_check_response_status.py +0 -5
  182. mirascope/api/_generated/organization_invitations/__init__.py +0 -33
  183. mirascope/api/_generated/organization_invitations/client.py +0 -546
  184. mirascope/api/_generated/organization_invitations/raw_client.py +0 -1519
  185. mirascope/api/_generated/organization_invitations/types/__init__.py +0 -53
  186. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +0 -34
  187. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +0 -7
  188. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +0 -7
  189. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +0 -48
  190. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +0 -7
  191. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +0 -7
  192. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +0 -48
  193. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +0 -7
  194. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +0 -7
  195. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +0 -48
  196. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +0 -7
  197. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +0 -7
  198. mirascope/api/_generated/organization_memberships/__init__.py +0 -19
  199. mirascope/api/_generated/organization_memberships/client.py +0 -302
  200. mirascope/api/_generated/organization_memberships/raw_client.py +0 -736
  201. mirascope/api/_generated/organization_memberships/types/__init__.py +0 -27
  202. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +0 -33
  203. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +0 -7
  204. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +0 -7
  205. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +0 -31
  206. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +0 -7
  207. mirascope/api/_generated/organizations/__init__.py +0 -51
  208. mirascope/api/_generated/organizations/client.py +0 -869
  209. mirascope/api/_generated/organizations/raw_client.py +0 -2593
  210. mirascope/api/_generated/organizations/types/__init__.py +0 -71
  211. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +0 -24
  212. mirascope/api/_generated/organizations/types/organizations_create_response.py +0 -26
  213. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +0 -5
  214. mirascope/api/_generated/organizations/types/organizations_get_response.py +0 -26
  215. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +0 -5
  216. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +0 -26
  217. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +0 -5
  218. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +0 -7
  219. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +0 -47
  220. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +0 -33
  221. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +0 -7
  222. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +0 -24
  223. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +0 -53
  224. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +0 -7
  225. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +0 -26
  226. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +0 -34
  227. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +0 -7
  228. mirascope/api/_generated/organizations/types/organizations_update_response.py +0 -26
  229. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +0 -5
  230. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +0 -7
  231. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +0 -35
  232. mirascope/api/_generated/project_memberships/__init__.py +0 -25
  233. mirascope/api/_generated/project_memberships/client.py +0 -437
  234. mirascope/api/_generated/project_memberships/raw_client.py +0 -1039
  235. mirascope/api/_generated/project_memberships/types/__init__.py +0 -29
  236. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +0 -7
  237. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +0 -35
  238. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +0 -7
  239. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +0 -33
  240. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +0 -7
  241. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +0 -7
  242. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +0 -35
  243. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +0 -7
  244. mirascope/api/_generated/projects/__init__.py +0 -7
  245. mirascope/api/_generated/projects/client.py +0 -428
  246. mirascope/api/_generated/projects/raw_client.py +0 -1302
  247. mirascope/api/_generated/projects/types/__init__.py +0 -10
  248. mirascope/api/_generated/projects/types/projects_create_response.py +0 -25
  249. mirascope/api/_generated/projects/types/projects_get_response.py +0 -25
  250. mirascope/api/_generated/projects/types/projects_list_response_item.py +0 -25
  251. mirascope/api/_generated/projects/types/projects_update_response.py +0 -25
  252. mirascope/api/_generated/reference.md +0 -4915
  253. mirascope/api/_generated/tags/__init__.py +0 -19
  254. mirascope/api/_generated/tags/client.py +0 -504
  255. mirascope/api/_generated/tags/raw_client.py +0 -1288
  256. mirascope/api/_generated/tags/types/__init__.py +0 -17
  257. mirascope/api/_generated/tags/types/tags_create_response.py +0 -41
  258. mirascope/api/_generated/tags/types/tags_get_response.py +0 -41
  259. mirascope/api/_generated/tags/types/tags_list_response.py +0 -23
  260. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +0 -41
  261. mirascope/api/_generated/tags/types/tags_update_response.py +0 -41
  262. mirascope/api/_generated/token_cost/__init__.py +0 -7
  263. mirascope/api/_generated/token_cost/client.py +0 -160
  264. mirascope/api/_generated/token_cost/raw_client.py +0 -264
  265. mirascope/api/_generated/token_cost/types/__init__.py +0 -8
  266. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +0 -54
  267. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +0 -52
  268. mirascope/api/_generated/traces/__init__.py +0 -97
  269. mirascope/api/_generated/traces/client.py +0 -1103
  270. mirascope/api/_generated/traces/raw_client.py +0 -2322
  271. mirascope/api/_generated/traces/types/__init__.py +0 -155
  272. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +0 -29
  273. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +0 -27
  274. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +0 -23
  275. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +0 -38
  276. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +0 -19
  277. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +0 -22
  278. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +0 -20
  279. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +0 -29
  280. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +0 -31
  281. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +0 -23
  282. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +0 -38
  283. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +0 -19
  284. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +0 -22
  285. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +0 -22
  286. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +0 -48
  287. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +0 -23
  288. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +0 -38
  289. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +0 -19
  290. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +0 -24
  291. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +0 -22
  292. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +0 -20
  293. mirascope/api/_generated/traces/types/traces_create_response.py +0 -24
  294. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +0 -22
  295. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +0 -60
  296. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +0 -24
  297. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +0 -22
  298. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +0 -33
  299. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +0 -88
  300. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +0 -33
  301. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +0 -88
  302. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +0 -25
  303. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +0 -44
  304. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +0 -26
  305. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +0 -7
  306. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +0 -7
  307. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +0 -7
  308. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +0 -26
  309. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +0 -50
  310. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +0 -26
  311. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +0 -7
  312. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +0 -7
  313. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +0 -5
  314. mirascope/api/_generated/traces/types/traces_search_response.py +0 -26
  315. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +0 -50
  316. mirascope/api/_generated/types/__init__.py +0 -85
  317. mirascope/api/_generated/types/already_exists_error.py +0 -22
  318. mirascope/api/_generated/types/already_exists_error_tag.py +0 -5
  319. mirascope/api/_generated/types/bad_request_error_body.py +0 -50
  320. mirascope/api/_generated/types/click_house_error.py +0 -22
  321. mirascope/api/_generated/types/database_error.py +0 -22
  322. mirascope/api/_generated/types/database_error_tag.py +0 -5
  323. mirascope/api/_generated/types/date.py +0 -3
  324. mirascope/api/_generated/types/http_api_decode_error.py +0 -27
  325. mirascope/api/_generated/types/http_api_decode_error_tag.py +0 -5
  326. mirascope/api/_generated/types/immutable_resource_error.py +0 -22
  327. mirascope/api/_generated/types/internal_server_error_body.py +0 -49
  328. mirascope/api/_generated/types/issue.py +0 -38
  329. mirascope/api/_generated/types/issue_tag.py +0 -10
  330. mirascope/api/_generated/types/not_found_error_body.py +0 -22
  331. mirascope/api/_generated/types/not_found_error_tag.py +0 -5
  332. mirascope/api/_generated/types/number_from_string.py +0 -3
  333. mirascope/api/_generated/types/permission_denied_error.py +0 -22
  334. mirascope/api/_generated/types/permission_denied_error_tag.py +0 -5
  335. mirascope/api/_generated/types/plan_limit_exceeded_error.py +0 -32
  336. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +0 -7
  337. mirascope/api/_generated/types/pricing_unavailable_error.py +0 -23
  338. mirascope/api/_generated/types/property_key.py +0 -7
  339. mirascope/api/_generated/types/property_key_key.py +0 -25
  340. mirascope/api/_generated/types/property_key_key_tag.py +0 -5
  341. mirascope/api/_generated/types/rate_limit_error.py +0 -31
  342. mirascope/api/_generated/types/rate_limit_error_tag.py +0 -5
  343. mirascope/api/_generated/types/service_unavailable_error_body.py +0 -24
  344. mirascope/api/_generated/types/service_unavailable_error_tag.py +0 -7
  345. mirascope/api/_generated/types/stripe_error.py +0 -20
  346. mirascope/api/_generated/types/subscription_past_due_error.py +0 -31
  347. mirascope/api/_generated/types/subscription_past_due_error_tag.py +0 -7
  348. mirascope/api/_generated/types/unauthorized_error_body.py +0 -21
  349. mirascope/api/_generated/types/unauthorized_error_tag.py +0 -5
  350. mirascope/api/client.py +0 -255
  351. mirascope/api/settings.py +0 -99
  352. mirascope/llm/formatting/output_parser.py +0 -178
  353. mirascope/llm/formatting/primitives.py +0 -192
  354. mirascope/llm/mcp/mcp_client.py +0 -130
  355. mirascope/llm/messages/_utils.py +0 -34
  356. mirascope/llm/models/thinking_config.py +0 -61
  357. mirascope/llm/prompts/prompts.py +0 -487
  358. mirascope/llm/providers/__init__.py +0 -62
  359. mirascope/llm/providers/anthropic/__init__.py +0 -11
  360. mirascope/llm/providers/anthropic/_utils/__init__.py +0 -27
  361. mirascope/llm/providers/anthropic/_utils/beta_decode.py +0 -282
  362. mirascope/llm/providers/anthropic/_utils/beta_encode.py +0 -266
  363. mirascope/llm/providers/anthropic/_utils/encode.py +0 -418
  364. mirascope/llm/providers/anthropic/_utils/errors.py +0 -46
  365. mirascope/llm/providers/anthropic/beta_provider.py +0 -374
  366. mirascope/llm/providers/anthropic/model_id.py +0 -23
  367. mirascope/llm/providers/anthropic/model_info.py +0 -87
  368. mirascope/llm/providers/anthropic/provider.py +0 -479
  369. mirascope/llm/providers/google/__init__.py +0 -6
  370. mirascope/llm/providers/google/_utils/errors.py +0 -50
  371. mirascope/llm/providers/google/model_id.py +0 -22
  372. mirascope/llm/providers/google/model_info.py +0 -63
  373. mirascope/llm/providers/google/provider.py +0 -492
  374. mirascope/llm/providers/mirascope/__init__.py +0 -5
  375. mirascope/llm/providers/mirascope/_utils.py +0 -73
  376. mirascope/llm/providers/mirascope/provider.py +0 -349
  377. mirascope/llm/providers/mlx/__init__.py +0 -9
  378. mirascope/llm/providers/mlx/_utils.py +0 -141
  379. mirascope/llm/providers/mlx/encoding/__init__.py +0 -8
  380. mirascope/llm/providers/mlx/encoding/base.py +0 -72
  381. mirascope/llm/providers/mlx/encoding/transformers.py +0 -150
  382. mirascope/llm/providers/mlx/mlx.py +0 -254
  383. mirascope/llm/providers/mlx/model_id.py +0 -17
  384. mirascope/llm/providers/mlx/provider.py +0 -452
  385. mirascope/llm/providers/model_id.py +0 -16
  386. mirascope/llm/providers/ollama/__init__.py +0 -7
  387. mirascope/llm/providers/ollama/provider.py +0 -71
  388. mirascope/llm/providers/openai/__init__.py +0 -15
  389. mirascope/llm/providers/openai/_utils/__init__.py +0 -5
  390. mirascope/llm/providers/openai/_utils/errors.py +0 -46
  391. mirascope/llm/providers/openai/completions/__init__.py +0 -7
  392. mirascope/llm/providers/openai/completions/base_provider.py +0 -542
  393. mirascope/llm/providers/openai/completions/provider.py +0 -22
  394. mirascope/llm/providers/openai/model_id.py +0 -31
  395. mirascope/llm/providers/openai/model_info.py +0 -303
  396. mirascope/llm/providers/openai/provider.py +0 -441
  397. mirascope/llm/providers/openai/responses/__init__.py +0 -5
  398. mirascope/llm/providers/openai/responses/provider.py +0 -513
  399. mirascope/llm/providers/provider_id.py +0 -24
  400. mirascope/llm/providers/provider_registry.py +0 -299
  401. mirascope/llm/providers/together/__init__.py +0 -7
  402. mirascope/llm/providers/together/provider.py +0 -40
  403. mirascope/llm/responses/usage.py +0 -95
  404. mirascope/ops/__init__.py +0 -111
  405. mirascope/ops/_internal/__init__.py +0 -5
  406. mirascope/ops/_internal/closure.py +0 -1169
  407. mirascope/ops/_internal/configuration.py +0 -177
  408. mirascope/ops/_internal/context.py +0 -76
  409. mirascope/ops/_internal/exporters/__init__.py +0 -26
  410. mirascope/ops/_internal/exporters/exporters.py +0 -395
  411. mirascope/ops/_internal/exporters/processors.py +0 -104
  412. mirascope/ops/_internal/exporters/types.py +0 -165
  413. mirascope/ops/_internal/exporters/utils.py +0 -29
  414. mirascope/ops/_internal/instrumentation/__init__.py +0 -8
  415. mirascope/ops/_internal/instrumentation/llm/__init__.py +0 -8
  416. mirascope/ops/_internal/instrumentation/llm/common.py +0 -530
  417. mirascope/ops/_internal/instrumentation/llm/cost.py +0 -190
  418. mirascope/ops/_internal/instrumentation/llm/encode.py +0 -238
  419. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +0 -38
  420. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +0 -31
  421. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +0 -38
  422. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +0 -18
  423. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +0 -100
  424. mirascope/ops/_internal/instrumentation/llm/llm.py +0 -161
  425. mirascope/ops/_internal/instrumentation/llm/model.py +0 -1798
  426. mirascope/ops/_internal/instrumentation/llm/response.py +0 -521
  427. mirascope/ops/_internal/instrumentation/llm/serialize.py +0 -300
  428. mirascope/ops/_internal/propagation.py +0 -198
  429. mirascope/ops/_internal/protocols.py +0 -133
  430. mirascope/ops/_internal/session.py +0 -139
  431. mirascope/ops/_internal/spans.py +0 -232
  432. mirascope/ops/_internal/traced_calls.py +0 -375
  433. mirascope/ops/_internal/traced_functions.py +0 -523
  434. mirascope/ops/_internal/tracing.py +0 -353
  435. mirascope/ops/_internal/types.py +0 -13
  436. mirascope/ops/_internal/utils.py +0 -123
  437. mirascope/ops/_internal/versioned_calls.py +0 -512
  438. mirascope/ops/_internal/versioned_functions.py +0 -357
  439. mirascope/ops/_internal/versioning.py +0 -303
  440. mirascope/ops/exceptions.py +0 -21
  441. mirascope-2.0.0.dist-info/RECORD +0 -423
  442. /mirascope/llm/{providers → clients}/base/kwargs.py +0 -0
  443. /mirascope/llm/{providers → clients}/google/message.py +0 -0
@@ -1,353 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from collections.abc import Sequence
4
- from dataclasses import dataclass, field
5
- from typing import (
6
- TYPE_CHECKING,
7
- overload,
8
- )
9
-
10
- from ...llm.calls import AsyncCall, AsyncContextCall, Call, ContextCall
11
- from ...llm.context import DepsT
12
- from .protocols import (
13
- AsyncFunction,
14
- AsyncSpanFunction,
15
- SyncFunction,
16
- SyncSpanFunction,
17
- fn_is_async,
18
- fn_wants_span,
19
- )
20
- from .traced_calls import (
21
- TracedAsyncCall,
22
- TracedAsyncContextCall,
23
- TracedCall,
24
- TracedContextCall,
25
- is_call_type,
26
- wrap_call,
27
- )
28
- from .traced_functions import (
29
- AsyncTracedFunction,
30
- AsyncTracedSpanFunction,
31
- TracedFunction,
32
- TracedSpanFunction,
33
- )
34
- from .types import P, R
35
-
36
- if TYPE_CHECKING:
37
- from ...llm.formatting import FormattableT
38
-
39
-
40
- @dataclass(kw_only=True)
41
- class TraceDecorator:
42
- """Decorator implementation for adding tracing capabilities to functions."""
43
-
44
- tags: tuple[str, ...] = ()
45
- """Tags to be associated with traced function calls."""
46
-
47
- metadata: dict[str, str] = field(default_factory=dict)
48
- """Arbitrary key-value pairs for additional metadata."""
49
-
50
- # IMPORTANT: The order of these overloads matters for type inference.
51
- # Call type overloads come first, then span function overloads, then regular functions.
52
- @overload
53
- def __call__( # pyright: ignore[reportOverlappingOverload]
54
- self,
55
- fn: AsyncContextCall[P, DepsT, FormattableT],
56
- ) -> TracedAsyncContextCall[P, DepsT, FormattableT]:
57
- """Overload for applying decorator to an AsyncContextCall."""
58
- ...
59
-
60
- @overload
61
- def __call__(
62
- self,
63
- fn: ContextCall[P, DepsT, FormattableT],
64
- ) -> TracedContextCall[P, DepsT, FormattableT]:
65
- """Overload for applying decorator to a ContextCall."""
66
- ...
67
-
68
- @overload
69
- def __call__(
70
- self,
71
- fn: AsyncCall[P, FormattableT],
72
- ) -> TracedAsyncCall[P, FormattableT]:
73
- """Overload for applying decorator to an AsyncCall."""
74
- ...
75
-
76
- @overload
77
- def __call__(
78
- self,
79
- fn: Call[P, FormattableT],
80
- ) -> TracedCall[P, FormattableT]:
81
- """Overload for applying decorator to a Call."""
82
- ...
83
-
84
- @overload
85
- def __call__( # pyright: ignore[reportOverlappingOverload]
86
- self,
87
- fn: AsyncSpanFunction[P, R],
88
- ) -> AsyncTracedSpanFunction[P, R]:
89
- """Overload for applying decorator to an async function with span injection."""
90
- ...
91
-
92
- @overload
93
- def __call__(
94
- self,
95
- fn: SyncSpanFunction[P, R],
96
- ) -> TracedSpanFunction[P, R]:
97
- """Overload for applying decorator to a sync function with span injection."""
98
- ...
99
-
100
- @overload
101
- def __call__(
102
- self,
103
- fn: AsyncFunction[P, R],
104
- ) -> AsyncTracedFunction[P, R]:
105
- """Overload for applying decorator to an async function."""
106
- ...
107
-
108
- @overload
109
- def __call__(
110
- self,
111
- fn: SyncFunction[P, R],
112
- ) -> TracedFunction[P, R]:
113
- """Overload for applying decorator to a sync function."""
114
- ...
115
-
116
- def __call__( # pyright: ignore[reportGeneralTypeIssues]
117
- self,
118
- fn: (
119
- AsyncContextCall[P, DepsT, FormattableT]
120
- | ContextCall[P, DepsT, FormattableT]
121
- | AsyncCall[P, FormattableT]
122
- | Call[P, FormattableT]
123
- | AsyncSpanFunction[P, R]
124
- | SyncSpanFunction[P, R]
125
- | AsyncFunction[P, R]
126
- | SyncFunction[P, R]
127
- ),
128
- ) -> (
129
- TracedAsyncContextCall[P, DepsT, FormattableT]
130
- | TracedContextCall[P, DepsT, FormattableT]
131
- | TracedAsyncCall[P, FormattableT]
132
- | TracedCall[P, FormattableT]
133
- | AsyncTracedSpanFunction[P, R]
134
- | TracedSpanFunction[P, R]
135
- | AsyncTracedFunction[P, R]
136
- | TracedFunction[P, R]
137
- ):
138
- """Applies the decorator to the given function or Call object."""
139
- if is_call_type(fn):
140
- return wrap_call(fn=fn, tags=self.tags, metadata=self.metadata)
141
- elif fn_wants_span(fn):
142
- if fn_is_async(fn):
143
- return AsyncTracedSpanFunction(
144
- fn=fn, tags=self.tags, metadata=self.metadata
145
- )
146
- else:
147
- return TracedSpanFunction(fn=fn, tags=self.tags, metadata=self.metadata)
148
- elif fn_is_async(fn):
149
- return AsyncTracedFunction(fn=fn, tags=self.tags, metadata=self.metadata)
150
- else:
151
- return TracedFunction(fn=fn, tags=self.tags, metadata=self.metadata)
152
-
153
-
154
- @overload
155
- def trace(
156
- __fn: None = None,
157
- *,
158
- tags: list[str] | None = None,
159
- metadata: dict[str, str] | None = None,
160
- ) -> TraceDecorator:
161
- """Overload for providing kwargs before decorating (e.g. tags)."""
162
- ...
163
-
164
-
165
- @overload
166
- def trace( # pyright: ignore[reportOverlappingOverload]
167
- __fn: AsyncContextCall[P, DepsT, FormattableT],
168
- *,
169
- tags: None = None,
170
- metadata: None = None,
171
- ) -> TracedAsyncContextCall[P, DepsT, FormattableT]:
172
- """Overload for directly decorating an AsyncContextCall."""
173
- ...
174
-
175
-
176
- @overload
177
- def trace(
178
- __fn: ContextCall[P, DepsT, FormattableT],
179
- *,
180
- tags: None = None,
181
- metadata: None = None,
182
- ) -> TracedContextCall[P, DepsT, FormattableT]:
183
- """Overload for directly decorating a ContextCall."""
184
- ...
185
-
186
-
187
- @overload
188
- def trace(
189
- __fn: AsyncCall[P, FormattableT],
190
- *,
191
- tags: None = None,
192
- metadata: None = None,
193
- ) -> TracedAsyncCall[P, FormattableT]:
194
- """Overload for directly decorating an AsyncCall."""
195
- ...
196
-
197
-
198
- @overload
199
- def trace(
200
- __fn: Call[P, FormattableT],
201
- *,
202
- tags: None = None,
203
- metadata: None = None,
204
- ) -> TracedCall[P, FormattableT]:
205
- """Overload for directly decorating a Call."""
206
- ...
207
-
208
-
209
- @overload
210
- def trace( # pyright: ignore[reportOverlappingOverload]
211
- __fn: AsyncSpanFunction[P, R],
212
- *,
213
- tags: None = None,
214
- metadata: None = None,
215
- ) -> AsyncTracedSpanFunction[P, R]:
216
- """Overload for directly decorating an async function with span injection."""
217
- ...
218
-
219
-
220
- @overload
221
- def trace(
222
- __fn: SyncSpanFunction[P, R],
223
- *,
224
- tags: None = None,
225
- metadata: None = None,
226
- ) -> TracedSpanFunction[P, R]:
227
- """Overload for directly decorating a sync function with span injection."""
228
- ...
229
-
230
-
231
- @overload
232
- def trace(
233
- __fn: AsyncFunction[P, R],
234
- *,
235
- tags: None = None,
236
- metadata: None = None,
237
- ) -> AsyncTracedFunction[P, R]:
238
- """Overload for directly (no argument) decorating an asynchronous function"""
239
- ...
240
-
241
-
242
- @overload
243
- def trace(
244
- __fn: SyncFunction[P, R],
245
- *,
246
- tags: None = None,
247
- metadata: None = None,
248
- ) -> TracedFunction[P, R]:
249
- """Overload for directly (no argument) decorating a synchronous function"""
250
- ...
251
-
252
-
253
- def trace( # pyright: ignore[reportGeneralTypeIssues]
254
- __fn: (
255
- AsyncContextCall[P, DepsT, FormattableT]
256
- | ContextCall[P, DepsT, FormattableT]
257
- | AsyncCall[P, FormattableT]
258
- | Call[P, FormattableT]
259
- | AsyncSpanFunction[P, R]
260
- | SyncSpanFunction[P, R]
261
- | AsyncFunction[P, R]
262
- | SyncFunction[P, R]
263
- | None
264
- ) = None,
265
- *,
266
- tags: Sequence[str] | None = None,
267
- metadata: dict[str, str] | None = None,
268
- ) -> (
269
- TracedAsyncContextCall[P, DepsT, FormattableT]
270
- | TracedContextCall[P, DepsT, FormattableT]
271
- | TracedAsyncCall[P, FormattableT]
272
- | TracedCall[P, FormattableT]
273
- | AsyncTracedSpanFunction[P, R]
274
- | TracedSpanFunction[P, R]
275
- | AsyncTracedFunction[P, R]
276
- | TracedFunction[P, R]
277
- | TraceDecorator
278
- ):
279
- """Decorator for adding tracing capabilities to functions and LLM calls.
280
-
281
- Creates a wrapper that enables distributed tracing, performance monitoring,
282
- and execution tracking for decorated functions. When called, the decorated
283
- function returns a Trace containing both the result and span info.
284
-
285
- When decorating an @llm.call function, returns a TracedCall that wraps both
286
- the call and stream methods with tracing capabilities.
287
-
288
- If the decorated function has `trace_ctx: Span` as its first parameter,
289
- the span will be injected automatically and callers should NOT pass it.
290
-
291
- Args:
292
- __fn: The function or Call object to decorate.
293
- tags: Optional list of string tags to associate with traced executions.
294
- metadata: Arbitrary key-value pairs for additional metadata.
295
-
296
- Returns:
297
- A decorator that wraps functions with tracing capabilities.
298
-
299
- Example:
300
- ```python
301
- @ops.trace
302
- def process_data(data: dict) -> dict:
303
- return {"processed": data}
304
-
305
- traced_result = process_data({"key": "value"})
306
- print(traced_result.result) # {"processed": {"key": "value"}}
307
- print(traced_result.span_id) # Access span ID
308
- ```
309
-
310
- Example:
311
- ```python
312
- @ops.trace
313
- @llm.call("gpt-4o-mini")
314
- def recommend_book(genre: str):
315
- return f"Recommend a {genre} book"
316
-
317
- # Returns Response directly (execution is still traced)
318
- response = recommend_book("fantasy")
319
- print(response.content)
320
-
321
- # Use .wrapped() to get Trace[Response] with span info
322
- trace = recommend_book.wrapped("fantasy")
323
- print(trace.result.content)
324
- print(trace.span_id)
325
- ```
326
-
327
- Example:
328
- ```python
329
- @ops.trace
330
- def my_fn(trace_ctx: Span, arg: str) -> str:
331
- trace_ctx.info(f"Processing: {arg}")
332
- return arg.upper()
333
-
334
- # Call without trace_ctx - it's injected automatically
335
- result = my_fn("hello") # Returns "HELLO"
336
- ```
337
- """
338
- tags = tuple(sorted(set(tags or [])))
339
- metadata = metadata or {}
340
- if __fn is None:
341
- return TraceDecorator(tags=tags, metadata=metadata)
342
-
343
- if is_call_type(__fn):
344
- return wrap_call(fn=__fn, tags=tags, metadata=metadata)
345
- elif fn_wants_span(__fn):
346
- if fn_is_async(__fn):
347
- return AsyncTracedSpanFunction(fn=__fn, tags=tags, metadata=metadata)
348
- else:
349
- return TracedSpanFunction(fn=__fn, tags=tags, metadata=metadata)
350
- elif fn_is_async(__fn):
351
- return AsyncTracedFunction(fn=__fn, tags=tags, metadata=metadata)
352
- else:
353
- return TracedFunction(fn=__fn, tags=tags, metadata=metadata)
@@ -1,13 +0,0 @@
1
- """Type definitions for Mirascope tracing and capabilities."""
2
-
3
- from collections.abc import Mapping, Sequence
4
- from typing import ParamSpec, TypeAlias
5
- from typing_extensions import TypeVar
6
-
7
- P = ParamSpec("P")
8
- R = TypeVar("R", infer_variance=True)
9
-
10
- Jsonable: TypeAlias = (
11
- None | str | int | float | bool | Sequence["Jsonable"] | Mapping[str, "Jsonable"]
12
- )
13
- """Simple type alias for JSON-serializable types."""
@@ -1,123 +0,0 @@
1
- """Internal utility functions for the Mirascope."""
2
-
3
- import inspect
4
- from collections.abc import Callable
5
- from typing import Any, TypeAlias
6
-
7
- import orjson
8
-
9
- from .protocols import P, fn_wants_span
10
-
11
- ORJSON_OPTS = (
12
- orjson.OPT_NON_STR_KEYS
13
- | orjson.OPT_NAIVE_UTC
14
- | orjson.OPT_SERIALIZE_NUMPY
15
- | orjson.OPT_SERIALIZE_DATACLASS
16
- | orjson.OPT_SERIALIZE_UUID
17
- )
18
-
19
- PrimitiveType: TypeAlias = str | int | float | bool
20
-
21
-
22
- def json_dumps(obj: Any) -> str: # noqa: ANN401
23
- """Serialize Python objects to JSON using orjson."""
24
- # json should be utf-8 encoded, json key should be str
25
- return orjson.dumps(obj, option=ORJSON_OPTS).decode("utf-8")
26
-
27
-
28
- def _is_call_method(fn: Callable[..., Any]) -> bool:
29
- """Check if fn is a bound method of a Call object (e.g., Call.call or Call.stream)."""
30
- return (
31
- hasattr(fn, "__self__") and hasattr(fn.__self__, "prompt") # pyright: ignore[reportFunctionMemberAccess]
32
- )
33
-
34
-
35
- def get_original_fn(fn: Callable[..., Any]) -> Callable[..., Any]:
36
- """Get the original function from a Call method or return fn as-is.
37
-
38
- When fn is a bound method of a Call object (e.g., Call.call or Call.stream),
39
- returns the original decorated function from prompt.fn. Otherwise returns fn.
40
- """
41
- if _is_call_method(fn):
42
- prompt = fn.__self__.prompt # pyright: ignore[reportFunctionMemberAccess]
43
- if hasattr(prompt, "fn"):
44
- return prompt.fn
45
- return fn
46
-
47
-
48
- def get_qualified_name(fn: Callable[..., Any]) -> str:
49
- """Return the simplified qualified name of a function.
50
-
51
- If the function is a bound method of a Call object (e.g., Call.call or Call.stream),
52
- returns the qualified name of the original decorated function from prompt.fn,
53
- suffixed with the method name (e.g., "recommend.call" or "recommend.stream").
54
-
55
- If the function is defined locally, return the name after '<locals>.'; otherwise,
56
- return the last non-empty part after splitting by '.'.
57
- """
58
- # Check if this is a Call method and capture the method name
59
- method_suffix = f".{fn.__name__}" if _is_call_method(fn) else ""
60
-
61
- fn = get_original_fn(fn)
62
- qualified_name = fn.__qualname__
63
- if "<locals>." in qualified_name:
64
- base_name = qualified_name.split("<locals>.")[-1]
65
- else:
66
- parts = [part for part in qualified_name.split(".") if part]
67
- base_name = parts[-1] if parts else qualified_name
68
-
69
- return f"{base_name}{method_suffix}"
70
-
71
-
72
- def extract_arguments(
73
- fn: Callable[P, Any],
74
- *args: P.args,
75
- **kwargs: P.kwargs,
76
- ) -> tuple[dict[str, str], dict[str, Any]]:
77
- """Returns a tuple of (arg_types, arg_values) dictionaries from function call.
78
-
79
- If the function is a Call method (e.g., Call.call), uses the original
80
- decorated function's signature to get proper parameter names and types.
81
-
82
- If the function has `trace_ctx: Span` as first parameter (detected via
83
- fn_wants_span), that parameter is skipped since it's injected by the
84
- decorator and shouldn't be recorded in span attributes.
85
- """
86
- # Use original function signature for Call methods
87
- fn = get_original_fn(fn)
88
- signature = inspect.signature(fn)
89
-
90
- # If function wants span injection, skip the first parameter
91
- if fn_wants_span(fn):
92
- params = list(signature.parameters.values())
93
- if params:
94
- remaining_params = params[1:]
95
- signature = signature.replace(parameters=remaining_params)
96
-
97
- bound_arguments = signature.bind(*args, **kwargs)
98
- bound_arguments.apply_defaults()
99
-
100
- arg_types: dict[str, str] = {}
101
- arg_values: dict[str, Any] = {}
102
-
103
- for param_name, param_value in bound_arguments.arguments.items():
104
- parameter = signature.parameters[param_name]
105
- if parameter.annotation != inspect.Parameter.empty:
106
- if hasattr(parameter.annotation, "__name__"):
107
- type_str = parameter.annotation.__name__
108
- else:
109
- type_str = str(parameter.annotation)
110
- arg_types[param_name] = type_str
111
- else:
112
- arg_types[param_name] = type(param_value).__name__
113
-
114
- if isinstance(param_value, PrimitiveType) or param_value is None:
115
- arg_values[param_name] = param_value
116
- else:
117
- try:
118
- json_dumps(param_value)
119
- arg_values[param_name] = param_value
120
- except (TypeError, ValueError):
121
- arg_values[param_name] = repr(param_value)
122
-
123
- return arg_types, arg_values