mirascope 2.0.0__py3-none-any.whl → 2.0.0a0__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 (442) 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 +16 -101
  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/anthropic/__init__.py +11 -0
  15. mirascope/llm/{providers/openai/completions → clients/anthropic}/_utils/__init__.py +0 -2
  16. mirascope/llm/{providers → clients}/anthropic/_utils/decode.py +22 -66
  17. mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
  18. mirascope/llm/clients/anthropic/clients.py +819 -0
  19. mirascope/llm/clients/anthropic/model_ids.py +8 -0
  20. mirascope/llm/{providers → clients}/base/__init__.py +5 -4
  21. mirascope/llm/{providers → clients}/base/_utils.py +17 -78
  22. mirascope/llm/{providers/base/base_provider.py → clients/base/client.py} +145 -468
  23. mirascope/llm/{models → clients/base}/params.py +37 -16
  24. mirascope/llm/clients/google/__init__.py +6 -0
  25. mirascope/llm/{providers/openai/responses → clients/google}/_utils/__init__.py +0 -2
  26. mirascope/llm/{providers → clients}/google/_utils/decode.py +22 -98
  27. mirascope/llm/{providers → clients}/google/_utils/encode.py +46 -168
  28. mirascope/llm/clients/google/clients.py +853 -0
  29. mirascope/llm/clients/google/model_ids.py +15 -0
  30. mirascope/llm/clients/openai/__init__.py +25 -0
  31. mirascope/llm/clients/openai/completions/__init__.py +9 -0
  32. mirascope/llm/{providers/google → clients/openai/completions}/_utils/__init__.py +0 -4
  33. mirascope/llm/{providers → clients}/openai/completions/_utils/decode.py +9 -74
  34. mirascope/llm/{providers → clients}/openai/completions/_utils/encode.py +52 -70
  35. mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
  36. mirascope/llm/clients/openai/completions/clients.py +833 -0
  37. mirascope/llm/clients/openai/completions/model_ids.py +8 -0
  38. mirascope/llm/clients/openai/responses/__init__.py +9 -0
  39. mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
  40. mirascope/llm/{providers → clients}/openai/responses/_utils/decode.py +14 -80
  41. mirascope/llm/{providers → clients}/openai/responses/_utils/encode.py +41 -92
  42. mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
  43. mirascope/llm/clients/openai/responses/clients.py +832 -0
  44. mirascope/llm/clients/openai/responses/model_ids.py +8 -0
  45. mirascope/llm/clients/openai/shared/__init__.py +7 -0
  46. mirascope/llm/clients/openai/shared/_utils.py +55 -0
  47. mirascope/llm/clients/providers.py +175 -0
  48. mirascope/llm/content/__init__.py +2 -3
  49. mirascope/llm/content/tool_call.py +0 -6
  50. mirascope/llm/content/tool_output.py +5 -22
  51. mirascope/llm/context/_utils.py +6 -19
  52. mirascope/llm/exceptions.py +43 -298
  53. mirascope/llm/formatting/__init__.py +2 -19
  54. mirascope/llm/formatting/_utils.py +74 -0
  55. mirascope/llm/formatting/format.py +30 -219
  56. mirascope/llm/formatting/from_call_args.py +2 -2
  57. mirascope/llm/formatting/partial.py +7 -80
  58. mirascope/llm/formatting/types.py +64 -21
  59. mirascope/llm/mcp/__init__.py +2 -2
  60. mirascope/llm/mcp/client.py +118 -0
  61. mirascope/llm/messages/__init__.py +0 -3
  62. mirascope/llm/messages/message.py +5 -13
  63. mirascope/llm/models/__init__.py +2 -7
  64. mirascope/llm/models/models.py +139 -315
  65. mirascope/llm/prompts/__init__.py +12 -13
  66. mirascope/llm/prompts/_utils.py +43 -14
  67. mirascope/llm/prompts/decorator.py +204 -144
  68. mirascope/llm/prompts/protocols.py +59 -25
  69. mirascope/llm/responses/__init__.py +1 -9
  70. mirascope/llm/responses/_utils.py +12 -102
  71. mirascope/llm/responses/base_response.py +6 -18
  72. mirascope/llm/responses/base_stream_response.py +50 -173
  73. mirascope/llm/responses/finish_reason.py +0 -1
  74. mirascope/llm/responses/response.py +13 -34
  75. mirascope/llm/responses/root_response.py +29 -100
  76. mirascope/llm/responses/stream_response.py +31 -40
  77. mirascope/llm/tools/__init__.py +2 -9
  78. mirascope/llm/tools/_utils.py +3 -12
  79. mirascope/llm/tools/decorator.py +16 -25
  80. mirascope/llm/tools/protocols.py +4 -4
  81. mirascope/llm/tools/tool_schema.py +19 -87
  82. mirascope/llm/tools/toolkit.py +27 -35
  83. mirascope/llm/tools/tools.py +41 -135
  84. {mirascope-2.0.0.dist-info → mirascope-2.0.0a0.dist-info}/METADATA +9 -95
  85. mirascope-2.0.0a0.dist-info/RECORD +101 -0
  86. {mirascope-2.0.0.dist-info → mirascope-2.0.0a0.dist-info}/WHEEL +1 -1
  87. {mirascope-2.0.0.dist-info → mirascope-2.0.0a0.dist-info}/licenses/LICENSE +1 -1
  88. mirascope/_stubs.py +0 -363
  89. mirascope/api/__init__.py +0 -14
  90. mirascope/api/_generated/README.md +0 -207
  91. mirascope/api/_generated/__init__.py +0 -440
  92. mirascope/api/_generated/annotations/__init__.py +0 -33
  93. mirascope/api/_generated/annotations/client.py +0 -506
  94. mirascope/api/_generated/annotations/raw_client.py +0 -1414
  95. mirascope/api/_generated/annotations/types/__init__.py +0 -31
  96. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +0 -5
  97. mirascope/api/_generated/annotations/types/annotations_create_response.py +0 -48
  98. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +0 -5
  99. mirascope/api/_generated/annotations/types/annotations_get_response.py +0 -48
  100. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +0 -5
  101. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +0 -5
  102. mirascope/api/_generated/annotations/types/annotations_list_response.py +0 -21
  103. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +0 -50
  104. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +0 -5
  105. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +0 -5
  106. mirascope/api/_generated/annotations/types/annotations_update_response.py +0 -48
  107. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +0 -5
  108. mirascope/api/_generated/api_keys/__init__.py +0 -17
  109. mirascope/api/_generated/api_keys/client.py +0 -530
  110. mirascope/api/_generated/api_keys/raw_client.py +0 -1236
  111. mirascope/api/_generated/api_keys/types/__init__.py +0 -15
  112. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +0 -28
  113. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +0 -27
  114. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +0 -40
  115. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +0 -27
  116. mirascope/api/_generated/client.py +0 -211
  117. mirascope/api/_generated/core/__init__.py +0 -52
  118. mirascope/api/_generated/core/api_error.py +0 -23
  119. mirascope/api/_generated/core/client_wrapper.py +0 -46
  120. mirascope/api/_generated/core/datetime_utils.py +0 -28
  121. mirascope/api/_generated/core/file.py +0 -67
  122. mirascope/api/_generated/core/force_multipart.py +0 -16
  123. mirascope/api/_generated/core/http_client.py +0 -543
  124. mirascope/api/_generated/core/http_response.py +0 -55
  125. mirascope/api/_generated/core/jsonable_encoder.py +0 -100
  126. mirascope/api/_generated/core/pydantic_utilities.py +0 -255
  127. mirascope/api/_generated/core/query_encoder.py +0 -58
  128. mirascope/api/_generated/core/remove_none_from_dict.py +0 -11
  129. mirascope/api/_generated/core/request_options.py +0 -35
  130. mirascope/api/_generated/core/serialization.py +0 -276
  131. mirascope/api/_generated/docs/__init__.py +0 -4
  132. mirascope/api/_generated/docs/client.py +0 -91
  133. mirascope/api/_generated/docs/raw_client.py +0 -178
  134. mirascope/api/_generated/environment.py +0 -9
  135. mirascope/api/_generated/environments/__init__.py +0 -23
  136. mirascope/api/_generated/environments/client.py +0 -649
  137. mirascope/api/_generated/environments/raw_client.py +0 -1567
  138. mirascope/api/_generated/environments/types/__init__.py +0 -25
  139. mirascope/api/_generated/environments/types/environments_create_response.py +0 -24
  140. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +0 -60
  141. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +0 -24
  142. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +0 -22
  143. mirascope/api/_generated/environments/types/environments_get_response.py +0 -24
  144. mirascope/api/_generated/environments/types/environments_list_response_item.py +0 -24
  145. mirascope/api/_generated/environments/types/environments_update_response.py +0 -24
  146. mirascope/api/_generated/errors/__init__.py +0 -25
  147. mirascope/api/_generated/errors/bad_request_error.py +0 -14
  148. mirascope/api/_generated/errors/conflict_error.py +0 -14
  149. mirascope/api/_generated/errors/forbidden_error.py +0 -11
  150. mirascope/api/_generated/errors/internal_server_error.py +0 -10
  151. mirascope/api/_generated/errors/not_found_error.py +0 -11
  152. mirascope/api/_generated/errors/payment_required_error.py +0 -15
  153. mirascope/api/_generated/errors/service_unavailable_error.py +0 -14
  154. mirascope/api/_generated/errors/too_many_requests_error.py +0 -15
  155. mirascope/api/_generated/errors/unauthorized_error.py +0 -11
  156. mirascope/api/_generated/functions/__init__.py +0 -39
  157. mirascope/api/_generated/functions/client.py +0 -647
  158. mirascope/api/_generated/functions/raw_client.py +0 -1890
  159. mirascope/api/_generated/functions/types/__init__.py +0 -53
  160. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +0 -20
  161. mirascope/api/_generated/functions/types/functions_create_response.py +0 -37
  162. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +0 -20
  163. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +0 -39
  164. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +0 -20
  165. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +0 -53
  166. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +0 -22
  167. mirascope/api/_generated/functions/types/functions_get_response.py +0 -37
  168. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +0 -20
  169. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +0 -25
  170. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +0 -56
  171. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +0 -22
  172. mirascope/api/_generated/functions/types/functions_list_response.py +0 -21
  173. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +0 -41
  174. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +0 -20
  175. mirascope/api/_generated/health/__init__.py +0 -7
  176. mirascope/api/_generated/health/client.py +0 -92
  177. mirascope/api/_generated/health/raw_client.py +0 -175
  178. mirascope/api/_generated/health/types/__init__.py +0 -8
  179. mirascope/api/_generated/health/types/health_check_response.py +0 -22
  180. mirascope/api/_generated/health/types/health_check_response_status.py +0 -5
  181. mirascope/api/_generated/organization_invitations/__init__.py +0 -33
  182. mirascope/api/_generated/organization_invitations/client.py +0 -546
  183. mirascope/api/_generated/organization_invitations/raw_client.py +0 -1519
  184. mirascope/api/_generated/organization_invitations/types/__init__.py +0 -53
  185. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +0 -34
  186. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +0 -7
  187. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +0 -7
  188. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +0 -48
  189. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +0 -7
  190. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +0 -7
  191. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +0 -48
  192. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +0 -7
  193. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +0 -7
  194. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +0 -48
  195. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +0 -7
  196. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +0 -7
  197. mirascope/api/_generated/organization_memberships/__init__.py +0 -19
  198. mirascope/api/_generated/organization_memberships/client.py +0 -302
  199. mirascope/api/_generated/organization_memberships/raw_client.py +0 -736
  200. mirascope/api/_generated/organization_memberships/types/__init__.py +0 -27
  201. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +0 -33
  202. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +0 -7
  203. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +0 -7
  204. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +0 -31
  205. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +0 -7
  206. mirascope/api/_generated/organizations/__init__.py +0 -51
  207. mirascope/api/_generated/organizations/client.py +0 -869
  208. mirascope/api/_generated/organizations/raw_client.py +0 -2593
  209. mirascope/api/_generated/organizations/types/__init__.py +0 -71
  210. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +0 -24
  211. mirascope/api/_generated/organizations/types/organizations_create_response.py +0 -26
  212. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +0 -5
  213. mirascope/api/_generated/organizations/types/organizations_get_response.py +0 -26
  214. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +0 -5
  215. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +0 -26
  216. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +0 -5
  217. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +0 -7
  218. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +0 -47
  219. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +0 -33
  220. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +0 -7
  221. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +0 -24
  222. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +0 -53
  223. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +0 -7
  224. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +0 -26
  225. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +0 -34
  226. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +0 -7
  227. mirascope/api/_generated/organizations/types/organizations_update_response.py +0 -26
  228. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +0 -5
  229. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +0 -7
  230. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +0 -35
  231. mirascope/api/_generated/project_memberships/__init__.py +0 -25
  232. mirascope/api/_generated/project_memberships/client.py +0 -437
  233. mirascope/api/_generated/project_memberships/raw_client.py +0 -1039
  234. mirascope/api/_generated/project_memberships/types/__init__.py +0 -29
  235. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +0 -7
  236. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +0 -35
  237. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +0 -7
  238. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +0 -33
  239. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +0 -7
  240. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +0 -7
  241. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +0 -35
  242. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +0 -7
  243. mirascope/api/_generated/projects/__init__.py +0 -7
  244. mirascope/api/_generated/projects/client.py +0 -428
  245. mirascope/api/_generated/projects/raw_client.py +0 -1302
  246. mirascope/api/_generated/projects/types/__init__.py +0 -10
  247. mirascope/api/_generated/projects/types/projects_create_response.py +0 -25
  248. mirascope/api/_generated/projects/types/projects_get_response.py +0 -25
  249. mirascope/api/_generated/projects/types/projects_list_response_item.py +0 -25
  250. mirascope/api/_generated/projects/types/projects_update_response.py +0 -25
  251. mirascope/api/_generated/reference.md +0 -4915
  252. mirascope/api/_generated/tags/__init__.py +0 -19
  253. mirascope/api/_generated/tags/client.py +0 -504
  254. mirascope/api/_generated/tags/raw_client.py +0 -1288
  255. mirascope/api/_generated/tags/types/__init__.py +0 -17
  256. mirascope/api/_generated/tags/types/tags_create_response.py +0 -41
  257. mirascope/api/_generated/tags/types/tags_get_response.py +0 -41
  258. mirascope/api/_generated/tags/types/tags_list_response.py +0 -23
  259. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +0 -41
  260. mirascope/api/_generated/tags/types/tags_update_response.py +0 -41
  261. mirascope/api/_generated/token_cost/__init__.py +0 -7
  262. mirascope/api/_generated/token_cost/client.py +0 -160
  263. mirascope/api/_generated/token_cost/raw_client.py +0 -264
  264. mirascope/api/_generated/token_cost/types/__init__.py +0 -8
  265. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +0 -54
  266. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +0 -52
  267. mirascope/api/_generated/traces/__init__.py +0 -97
  268. mirascope/api/_generated/traces/client.py +0 -1103
  269. mirascope/api/_generated/traces/raw_client.py +0 -2322
  270. mirascope/api/_generated/traces/types/__init__.py +0 -155
  271. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +0 -29
  272. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +0 -27
  273. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +0 -23
  274. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +0 -38
  275. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +0 -19
  276. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +0 -22
  277. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +0 -20
  278. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +0 -29
  279. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +0 -31
  280. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +0 -23
  281. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +0 -38
  282. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +0 -19
  283. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +0 -22
  284. 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
  285. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +0 -48
  286. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +0 -23
  287. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +0 -38
  288. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +0 -19
  289. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +0 -24
  290. 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
  291. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +0 -20
  292. mirascope/api/_generated/traces/types/traces_create_response.py +0 -24
  293. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +0 -22
  294. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +0 -60
  295. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +0 -24
  296. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +0 -22
  297. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +0 -33
  298. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +0 -88
  299. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +0 -33
  300. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +0 -88
  301. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +0 -25
  302. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +0 -44
  303. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +0 -26
  304. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +0 -7
  305. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +0 -7
  306. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +0 -7
  307. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +0 -26
  308. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +0 -50
  309. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +0 -26
  310. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +0 -7
  311. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +0 -7
  312. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +0 -5
  313. mirascope/api/_generated/traces/types/traces_search_response.py +0 -26
  314. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +0 -50
  315. mirascope/api/_generated/types/__init__.py +0 -85
  316. mirascope/api/_generated/types/already_exists_error.py +0 -22
  317. mirascope/api/_generated/types/already_exists_error_tag.py +0 -5
  318. mirascope/api/_generated/types/bad_request_error_body.py +0 -50
  319. mirascope/api/_generated/types/click_house_error.py +0 -22
  320. mirascope/api/_generated/types/database_error.py +0 -22
  321. mirascope/api/_generated/types/database_error_tag.py +0 -5
  322. mirascope/api/_generated/types/date.py +0 -3
  323. mirascope/api/_generated/types/http_api_decode_error.py +0 -27
  324. mirascope/api/_generated/types/http_api_decode_error_tag.py +0 -5
  325. mirascope/api/_generated/types/immutable_resource_error.py +0 -22
  326. mirascope/api/_generated/types/internal_server_error_body.py +0 -49
  327. mirascope/api/_generated/types/issue.py +0 -38
  328. mirascope/api/_generated/types/issue_tag.py +0 -10
  329. mirascope/api/_generated/types/not_found_error_body.py +0 -22
  330. mirascope/api/_generated/types/not_found_error_tag.py +0 -5
  331. mirascope/api/_generated/types/number_from_string.py +0 -3
  332. mirascope/api/_generated/types/permission_denied_error.py +0 -22
  333. mirascope/api/_generated/types/permission_denied_error_tag.py +0 -5
  334. mirascope/api/_generated/types/plan_limit_exceeded_error.py +0 -32
  335. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +0 -7
  336. mirascope/api/_generated/types/pricing_unavailable_error.py +0 -23
  337. mirascope/api/_generated/types/property_key.py +0 -7
  338. mirascope/api/_generated/types/property_key_key.py +0 -25
  339. mirascope/api/_generated/types/property_key_key_tag.py +0 -5
  340. mirascope/api/_generated/types/rate_limit_error.py +0 -31
  341. mirascope/api/_generated/types/rate_limit_error_tag.py +0 -5
  342. mirascope/api/_generated/types/service_unavailable_error_body.py +0 -24
  343. mirascope/api/_generated/types/service_unavailable_error_tag.py +0 -7
  344. mirascope/api/_generated/types/stripe_error.py +0 -20
  345. mirascope/api/_generated/types/subscription_past_due_error.py +0 -31
  346. mirascope/api/_generated/types/subscription_past_due_error_tag.py +0 -7
  347. mirascope/api/_generated/types/unauthorized_error_body.py +0 -21
  348. mirascope/api/_generated/types/unauthorized_error_tag.py +0 -5
  349. mirascope/api/client.py +0 -255
  350. mirascope/api/settings.py +0 -99
  351. mirascope/llm/formatting/output_parser.py +0 -178
  352. mirascope/llm/formatting/primitives.py +0 -192
  353. mirascope/llm/mcp/mcp_client.py +0 -130
  354. mirascope/llm/messages/_utils.py +0 -34
  355. mirascope/llm/models/thinking_config.py +0 -61
  356. mirascope/llm/prompts/prompts.py +0 -487
  357. mirascope/llm/providers/__init__.py +0 -62
  358. mirascope/llm/providers/anthropic/__init__.py +0 -11
  359. mirascope/llm/providers/anthropic/_utils/__init__.py +0 -27
  360. mirascope/llm/providers/anthropic/_utils/beta_decode.py +0 -282
  361. mirascope/llm/providers/anthropic/_utils/beta_encode.py +0 -266
  362. mirascope/llm/providers/anthropic/_utils/encode.py +0 -418
  363. mirascope/llm/providers/anthropic/_utils/errors.py +0 -46
  364. mirascope/llm/providers/anthropic/beta_provider.py +0 -374
  365. mirascope/llm/providers/anthropic/model_id.py +0 -23
  366. mirascope/llm/providers/anthropic/model_info.py +0 -87
  367. mirascope/llm/providers/anthropic/provider.py +0 -479
  368. mirascope/llm/providers/google/__init__.py +0 -6
  369. mirascope/llm/providers/google/_utils/errors.py +0 -50
  370. mirascope/llm/providers/google/model_id.py +0 -22
  371. mirascope/llm/providers/google/model_info.py +0 -63
  372. mirascope/llm/providers/google/provider.py +0 -492
  373. mirascope/llm/providers/mirascope/__init__.py +0 -5
  374. mirascope/llm/providers/mirascope/_utils.py +0 -73
  375. mirascope/llm/providers/mirascope/provider.py +0 -349
  376. mirascope/llm/providers/mlx/__init__.py +0 -9
  377. mirascope/llm/providers/mlx/_utils.py +0 -141
  378. mirascope/llm/providers/mlx/encoding/__init__.py +0 -8
  379. mirascope/llm/providers/mlx/encoding/base.py +0 -72
  380. mirascope/llm/providers/mlx/encoding/transformers.py +0 -150
  381. mirascope/llm/providers/mlx/mlx.py +0 -254
  382. mirascope/llm/providers/mlx/model_id.py +0 -17
  383. mirascope/llm/providers/mlx/provider.py +0 -452
  384. mirascope/llm/providers/model_id.py +0 -16
  385. mirascope/llm/providers/ollama/__init__.py +0 -7
  386. mirascope/llm/providers/ollama/provider.py +0 -71
  387. mirascope/llm/providers/openai/__init__.py +0 -15
  388. mirascope/llm/providers/openai/_utils/__init__.py +0 -5
  389. mirascope/llm/providers/openai/_utils/errors.py +0 -46
  390. mirascope/llm/providers/openai/completions/__init__.py +0 -7
  391. mirascope/llm/providers/openai/completions/base_provider.py +0 -542
  392. mirascope/llm/providers/openai/completions/provider.py +0 -22
  393. mirascope/llm/providers/openai/model_id.py +0 -31
  394. mirascope/llm/providers/openai/model_info.py +0 -303
  395. mirascope/llm/providers/openai/provider.py +0 -441
  396. mirascope/llm/providers/openai/responses/__init__.py +0 -5
  397. mirascope/llm/providers/openai/responses/provider.py +0 -513
  398. mirascope/llm/providers/provider_id.py +0 -24
  399. mirascope/llm/providers/provider_registry.py +0 -299
  400. mirascope/llm/providers/together/__init__.py +0 -7
  401. mirascope/llm/providers/together/provider.py +0 -40
  402. mirascope/llm/responses/usage.py +0 -95
  403. mirascope/ops/__init__.py +0 -111
  404. mirascope/ops/_internal/__init__.py +0 -5
  405. mirascope/ops/_internal/closure.py +0 -1169
  406. mirascope/ops/_internal/configuration.py +0 -177
  407. mirascope/ops/_internal/context.py +0 -76
  408. mirascope/ops/_internal/exporters/__init__.py +0 -26
  409. mirascope/ops/_internal/exporters/exporters.py +0 -395
  410. mirascope/ops/_internal/exporters/processors.py +0 -104
  411. mirascope/ops/_internal/exporters/types.py +0 -165
  412. mirascope/ops/_internal/exporters/utils.py +0 -29
  413. mirascope/ops/_internal/instrumentation/__init__.py +0 -8
  414. mirascope/ops/_internal/instrumentation/llm/__init__.py +0 -8
  415. mirascope/ops/_internal/instrumentation/llm/common.py +0 -530
  416. mirascope/ops/_internal/instrumentation/llm/cost.py +0 -190
  417. mirascope/ops/_internal/instrumentation/llm/encode.py +0 -238
  418. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +0 -38
  419. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +0 -31
  420. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +0 -38
  421. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +0 -18
  422. mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +0 -100
  423. mirascope/ops/_internal/instrumentation/llm/llm.py +0 -161
  424. mirascope/ops/_internal/instrumentation/llm/model.py +0 -1798
  425. mirascope/ops/_internal/instrumentation/llm/response.py +0 -521
  426. mirascope/ops/_internal/instrumentation/llm/serialize.py +0 -300
  427. mirascope/ops/_internal/propagation.py +0 -198
  428. mirascope/ops/_internal/protocols.py +0 -133
  429. mirascope/ops/_internal/session.py +0 -139
  430. mirascope/ops/_internal/spans.py +0 -232
  431. mirascope/ops/_internal/traced_calls.py +0 -375
  432. mirascope/ops/_internal/traced_functions.py +0 -523
  433. mirascope/ops/_internal/tracing.py +0 -353
  434. mirascope/ops/_internal/types.py +0 -13
  435. mirascope/ops/_internal/utils.py +0 -123
  436. mirascope/ops/_internal/versioned_calls.py +0 -512
  437. mirascope/ops/_internal/versioned_functions.py +0 -357
  438. mirascope/ops/_internal/versioning.py +0 -303
  439. mirascope/ops/exceptions.py +0 -21
  440. mirascope-2.0.0.dist-info/RECORD +0 -423
  441. /mirascope/llm/{providers → clients}/base/kwargs.py +0 -0
  442. /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