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
@@ -5,30 +5,29 @@ python functions.
5
5
  """
6
6
 
7
7
  from . import _utils
8
- from .decorator import PromptDecorator, prompt
9
- from .prompts import (
8
+ from .decorator import prompt
9
+ from .protocols import (
10
10
  AsyncContextPrompt,
11
+ AsyncContextPromptable,
11
12
  AsyncPrompt,
13
+ AsyncPromptable,
12
14
  ContextPrompt,
15
+ ContextPromptable,
13
16
  Prompt,
14
- )
15
- from .protocols import (
16
- AsyncContextMessageTemplate,
17
- AsyncMessageTemplate,
18
- ContextMessageTemplate,
19
- MessageTemplate,
17
+ Promptable,
18
+ PromptT,
20
19
  )
21
20
 
22
21
  __all__ = [
23
- "AsyncContextMessageTemplate",
24
22
  "AsyncContextPrompt",
25
- "AsyncMessageTemplate",
23
+ "AsyncContextPromptable",
26
24
  "AsyncPrompt",
27
- "ContextMessageTemplate",
25
+ "AsyncPromptable",
28
26
  "ContextPrompt",
29
- "MessageTemplate",
27
+ "ContextPromptable",
30
28
  "Prompt",
31
- "PromptDecorator",
29
+ "PromptT",
30
+ "Promptable",
32
31
  "_utils",
33
32
  "prompt",
34
33
  ]
@@ -2,30 +2,59 @@ import inspect
2
2
  from typing_extensions import TypeIs
3
3
 
4
4
  from ..context import DepsT, _utils as _context_utils
5
+ from ..messages import (
6
+ AssistantMessage,
7
+ Message,
8
+ SystemMessage,
9
+ UserContent,
10
+ UserMessage,
11
+ user,
12
+ )
5
13
  from ..types import P
6
14
  from .protocols import (
7
- AsyncContextMessageTemplate,
8
- AsyncMessageTemplate,
9
- ContextMessageTemplate,
10
- MessageTemplate,
15
+ AsyncContextPromptable,
16
+ AsyncPromptable,
17
+ ContextPromptable,
18
+ Promptable,
11
19
  )
12
20
 
13
21
 
22
+ def is_messages(
23
+ messages_or_content: list[Message] | UserContent,
24
+ ) -> TypeIs[list[Message]]:
25
+ if not messages_or_content:
26
+ raise ValueError("Prompt returned empty content")
27
+ return isinstance(messages_or_content, list) and isinstance(
28
+ messages_or_content[0], SystemMessage | UserMessage | AssistantMessage
29
+ )
30
+
31
+
32
+ def promote_to_messages(result: list[Message] | UserContent) -> list[Message]:
33
+ """Promote a prompt result to a list of messages.
34
+
35
+ If the result is already a list of Messages, returns it as-is.
36
+ If the result is UserContent, wraps it in a single user message.
37
+ """
38
+ if is_messages(result):
39
+ return result
40
+ return [user(result)]
41
+
42
+
14
43
  def is_context_promptable(
15
- fn: ContextMessageTemplate[P, DepsT]
16
- | AsyncContextMessageTemplate[P, DepsT]
17
- | MessageTemplate[P]
18
- | AsyncMessageTemplate[P],
19
- ) -> TypeIs[ContextMessageTemplate[P, DepsT] | AsyncContextMessageTemplate[P, DepsT]]:
44
+ fn: ContextPromptable[P, DepsT]
45
+ | AsyncContextPromptable[P, DepsT]
46
+ | Promptable[P]
47
+ | AsyncPromptable[P],
48
+ ) -> TypeIs[ContextPromptable[P, DepsT] | AsyncContextPromptable[P, DepsT]]:
20
49
  """Type guard to check if a function is a context promptable function."""
21
50
  return _context_utils.first_param_is_context(fn)
22
51
 
23
52
 
24
53
  def is_async_promptable(
25
- fn: ContextMessageTemplate[P, DepsT]
26
- | AsyncContextMessageTemplate[P, DepsT]
27
- | MessageTemplate[P]
28
- | AsyncMessageTemplate[P],
29
- ) -> TypeIs[AsyncMessageTemplate[P] | AsyncContextMessageTemplate[P, DepsT]]:
54
+ fn: ContextPromptable[P, DepsT]
55
+ | AsyncContextPromptable[P, DepsT]
56
+ | Promptable[P]
57
+ | AsyncPromptable[P],
58
+ ) -> TypeIs[AsyncPromptable[P] | AsyncContextPromptable[P, DepsT]]:
30
59
  """Type guard to check if a function is an async promptable function."""
31
60
  return inspect.iscoroutinefunction(fn)
@@ -1,170 +1,196 @@
1
1
  """The `prompt` decorator for writing messages as string templates."""
2
2
 
3
- from collections.abc import Sequence
4
- from typing import Generic, cast, overload
5
-
6
- from ..context import DepsT
7
- from ..formatting import Format, FormattableT, OutputParser
8
- from ..tools import (
9
- AsyncContextTool,
10
- AsyncContextToolkit,
11
- AsyncTool,
12
- AsyncToolkit,
13
- ContextTool,
14
- ContextToolkit,
15
- Tool,
16
- Toolkit,
17
- ToolT,
3
+ from typing import overload
4
+
5
+ from ..context import Context, DepsT
6
+ from ..messages import (
7
+ Message,
18
8
  )
19
9
  from ..types import P
20
10
  from . import _utils
21
- from .prompts import (
11
+ from .protocols import (
22
12
  AsyncContextPrompt,
13
+ AsyncContextPromptable,
23
14
  AsyncPrompt,
15
+ AsyncPromptable,
24
16
  ContextPrompt,
17
+ ContextPromptable,
25
18
  Prompt,
19
+ Promptable,
26
20
  )
27
- from .protocols import (
28
- AsyncContextMessageTemplate,
29
- AsyncMessageTemplate,
30
- ContextMessageTemplate,
31
- MessageTemplate,
32
- )
33
-
34
-
35
- class PromptDecorator(Generic[ToolT, FormattableT]):
36
- """Decorator for converting a `MessageTemplate` into a `Prompt`.
37
-
38
- Takes a raw prompt function that returns message content and wraps it with
39
- tools and format support, creating a `Prompt` that can be called with a model.
40
-
41
- The decorator automatically detects whether the function is async or context-aware
42
- and creates the appropriate Prompt variant (Prompt, AsyncPrompt, ContextPrompt,
43
- or AsyncContextPrompt).
44
- """
45
-
46
- tools: Sequence[ToolT] | None
47
- """The tools that are included in the prompt, if any."""
48
21
 
49
- format: (
50
- type[FormattableT] | Format[FormattableT] | OutputParser[FormattableT] | None
51
- )
52
- """The structured output format off the prompt, if any."""
53
22
 
54
- def __init__(
55
- self,
56
- tools: Sequence[ToolT] | None = None,
57
- format: type[FormattableT]
58
- | Format[FormattableT]
59
- | OutputParser[FormattableT]
60
- | None = None,
61
- ) -> None:
62
- """Initialize the decorator with optional tools and format."""
63
- self.tools = tools
64
- self.format = format
23
+ class PromptDecorator:
24
+ """Protocol for the `prompt` decorator when used without a template."""
65
25
 
66
26
  @overload
67
27
  def __call__(
68
- self: "PromptDecorator[AsyncTool | AsyncContextTool[DepsT], FormattableT]",
69
- fn: AsyncContextMessageTemplate[P, DepsT],
70
- ) -> AsyncContextPrompt[P, DepsT, FormattableT]:
71
- """Decorator for creating async context prompts."""
28
+ self,
29
+ fn: ContextPromptable[P, DepsT],
30
+ ) -> ContextPrompt[P, DepsT]:
31
+ """Decorator for creating context prompts."""
72
32
  ...
73
33
 
74
34
  @overload
75
35
  def __call__(
76
- self: "PromptDecorator[Tool | ContextTool[DepsT], FormattableT]",
77
- fn: ContextMessageTemplate[P, DepsT],
78
- ) -> ContextPrompt[P, DepsT, FormattableT]:
79
- """Decorator for creating context prompts."""
36
+ self,
37
+ fn: AsyncContextPromptable[P, DepsT],
38
+ ) -> AsyncContextPrompt[P, DepsT]:
39
+ """Decorator for creating async context prompts."""
80
40
  ...
81
41
 
82
42
  @overload
83
43
  def __call__(
84
- self: "PromptDecorator[AsyncTool, FormattableT]",
85
- fn: AsyncMessageTemplate[P],
86
- ) -> AsyncPrompt[P, FormattableT]:
87
- """Decorator for creating async prompts."""
44
+ self,
45
+ fn: Promptable[P],
46
+ ) -> Prompt[P]:
47
+ """Decorator for creating prompts."""
88
48
  ...
89
49
 
90
50
  @overload
91
51
  def __call__(
92
- self: "PromptDecorator[Tool, FormattableT]",
93
- fn: MessageTemplate[P],
94
- ) -> Prompt[P, FormattableT]:
95
- """Decorator for creating prompts."""
52
+ self,
53
+ fn: AsyncPromptable[P],
54
+ ) -> AsyncPrompt[P]:
55
+ """Decorator for creating async prompts."""
96
56
  ...
97
57
 
98
58
  def __call__(
99
59
  self,
100
- fn: ContextMessageTemplate[P, DepsT]
101
- | AsyncContextMessageTemplate[P, DepsT]
102
- | MessageTemplate[P]
103
- | AsyncMessageTemplate[P],
60
+ fn: ContextPromptable[P, DepsT]
61
+ | AsyncContextPromptable[P, DepsT]
62
+ | Promptable[P]
63
+ | AsyncPromptable[P],
104
64
  ) -> (
105
- Prompt[P, FormattableT]
106
- | AsyncPrompt[P, FormattableT]
107
- | ContextPrompt[P, DepsT, FormattableT]
108
- | AsyncContextPrompt[P, DepsT, FormattableT]
65
+ Prompt[P]
66
+ | AsyncPrompt[P]
67
+ | ContextPrompt[P, DepsT]
68
+ | AsyncContextPrompt[P, DepsT]
109
69
  ):
110
- """Decorator for creating a prompt with tools and format."""
70
+ """Decorator for creating a prompt."""
111
71
  is_context = _utils.is_context_promptable(fn)
112
72
  is_async = _utils.is_async_promptable(fn)
113
73
 
74
+ # NOTE: unused `fn` expressions work around a Pyright bug
75
+ # TODO: Clean this up once the following Pyright bug is addressed:
76
+ # https://github.com/microsoft/pyright/issues/10951
114
77
  if is_context and is_async:
115
- tools = cast(
116
- Sequence[AsyncTool | AsyncContextTool[DepsT]] | None, self.tools
117
- )
118
- return AsyncContextPrompt(
119
- fn=fn,
120
- toolkit=AsyncContextToolkit(tools=tools),
121
- format=self.format,
122
- )
78
+ fn # pyright: ignore[reportUnusedExpression] # noqa: B018
79
+
80
+ async def async_context_prompt(
81
+ ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
82
+ ) -> list[Message]:
83
+ result = await fn(ctx, *args, **kwargs)
84
+ return _utils.promote_to_messages(result)
85
+
86
+ return async_context_prompt
123
87
  elif is_context:
124
- tools = cast(Sequence[Tool | ContextTool[DepsT]] | None, self.tools)
125
- return ContextPrompt(
126
- fn=fn,
127
- toolkit=ContextToolkit(tools=tools),
128
- format=self.format,
129
- )
88
+ fn # pyright: ignore[reportUnusedExpression] # noqa: B018
89
+
90
+ def context_prompt(
91
+ ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
92
+ ) -> list[Message]:
93
+ result = fn(ctx, *args, **kwargs)
94
+ return _utils.promote_to_messages(result)
95
+
96
+ return context_prompt
130
97
  elif is_async:
131
- tools = cast(Sequence[AsyncTool] | None, self.tools)
132
- return AsyncPrompt(
133
- fn=fn, toolkit=AsyncToolkit(tools=tools), format=self.format
134
- )
98
+ fn # pyright: ignore[reportUnusedExpression] # noqa: B018
99
+
100
+ async def async_prompt(*args: P.args, **kwargs: P.kwargs) -> list[Message]:
101
+ result = await fn(*args, **kwargs)
102
+ return _utils.promote_to_messages(result)
103
+
104
+ return async_prompt
135
105
  else:
136
- tools = cast(Sequence[Tool] | None, self.tools)
137
- return Prompt(fn=fn, toolkit=Toolkit(tools=tools), format=self.format)
106
+ fn # pyright: ignore[reportUnusedExpression] # noqa: B018
107
+
108
+ def prompt(*args: P.args, **kwargs: P.kwargs) -> list[Message]:
109
+ result = fn(*args, **kwargs)
110
+ return _utils.promote_to_messages(result)
111
+
112
+ return prompt
113
+
114
+
115
+ class PromptTemplateDecorator:
116
+ """Protocol for the `prompt` decorator when used with a template."""
117
+
118
+ @overload
119
+ def __call__(
120
+ self,
121
+ fn: ContextPromptable[P, DepsT],
122
+ ) -> ContextPrompt[P, DepsT]:
123
+ """Decorator for creating context prompts from template functions."""
124
+ ...
125
+
126
+ @overload
127
+ def __call__(
128
+ self,
129
+ fn: AsyncContextPromptable[P, DepsT],
130
+ ) -> AsyncContextPrompt[P, DepsT]:
131
+ """Decorator for creating async context prompts from template functions."""
132
+ ...
133
+
134
+ @overload
135
+ def __call__(
136
+ self,
137
+ fn: Promptable[P],
138
+ ) -> Prompt[P]:
139
+ """Decorator for creating prompts from template functions."""
140
+ ...
141
+
142
+ @overload
143
+ def __call__(
144
+ self,
145
+ fn: AsyncPromptable[P],
146
+ ) -> AsyncPrompt[P]:
147
+ """Decorator for creating async prompts from template functions."""
148
+ ...
149
+
150
+ def __call__(
151
+ self,
152
+ fn: ContextPromptable[P, DepsT]
153
+ | AsyncContextPromptable[P, DepsT]
154
+ | Promptable[P]
155
+ | AsyncPromptable[P],
156
+ ) -> (
157
+ Prompt[P]
158
+ | AsyncPrompt[P]
159
+ | ContextPrompt[P, DepsT]
160
+ | AsyncContextPrompt[P, DepsT]
161
+ ):
162
+ """Decorator for creating a prompt from a template function."""
163
+ raise NotImplementedError()
138
164
 
139
165
 
140
166
  @overload
141
- def prompt( # pyright: ignore[reportOverlappingOverload]
142
- __fn: ContextMessageTemplate[P, DepsT],
143
- ) -> ContextPrompt[P, DepsT, None]:
167
+ def prompt(
168
+ __fn: ContextPromptable[P, DepsT],
169
+ ) -> ContextPrompt[P, DepsT]:
144
170
  """Create a decorator for sync ContextPrompt functions (no arguments)."""
145
171
  ...
146
172
 
147
173
 
148
174
  @overload
149
- def prompt( # pyright: ignore[reportOverlappingOverload]
150
- __fn: AsyncContextMessageTemplate[P, DepsT],
151
- ) -> AsyncContextPrompt[P, DepsT, None]:
175
+ def prompt(
176
+ __fn: AsyncContextPromptable[P, DepsT],
177
+ ) -> AsyncContextPrompt[P, DepsT]:
152
178
  """Create a decorator for async ContextPrompt functions (no arguments)."""
153
179
  ...
154
180
 
155
181
 
156
182
  @overload
157
183
  def prompt(
158
- __fn: MessageTemplate[P],
159
- ) -> Prompt[P, None]:
184
+ __fn: Promptable[P],
185
+ ) -> Prompt[P]:
160
186
  """Create a decorator for sync Prompt functions (no arguments)."""
161
187
  ...
162
188
 
163
189
 
164
190
  @overload
165
191
  def prompt(
166
- __fn: AsyncMessageTemplate[P],
167
- ) -> AsyncPrompt[P, None]:
192
+ __fn: AsyncPromptable[P],
193
+ ) -> AsyncPrompt[P]:
168
194
  """Create a decorator for async Prompt functions (no arguments)."""
169
195
  ...
170
196
 
@@ -172,55 +198,89 @@ def prompt(
172
198
  @overload
173
199
  def prompt(
174
200
  *,
175
- tools: Sequence[ToolT] | None = None,
176
- format: type[FormattableT]
177
- | Format[FormattableT]
178
- | OutputParser[FormattableT]
179
- | None = None,
180
- ) -> PromptDecorator[ToolT, FormattableT]:
181
- """Create a decorator for Prompt functions with tools and format"""
201
+ template: None = None,
202
+ ) -> PromptDecorator:
203
+ """Create a decorator for Prompt functions (no template)"""
182
204
 
183
205
 
206
+ @overload
184
207
  def prompt(
185
- __fn: AsyncContextMessageTemplate[P, DepsT]
186
- | ContextMessageTemplate[P, DepsT]
187
- | AsyncMessageTemplate[P]
188
- | MessageTemplate[P]
189
- | None = None,
190
208
  *,
191
- tools: Sequence[ToolT] | None = None,
192
- format: type[FormattableT]
193
- | Format[FormattableT]
194
- | OutputParser[FormattableT]
209
+ template: str,
210
+ ) -> PromptTemplateDecorator:
211
+ """Create a decorator for template functions."""
212
+ ...
213
+
214
+
215
+ def prompt(
216
+ __fn: ContextPromptable[P, DepsT]
217
+ | AsyncContextPromptable[P, DepsT]
218
+ | Promptable[P]
219
+ | AsyncPromptable[P]
195
220
  | None = None,
221
+ *,
222
+ template: str | None = None,
196
223
  ) -> (
197
- AsyncContextPrompt[P, DepsT, FormattableT]
198
- | ContextPrompt[P, DepsT, FormattableT]
199
- | AsyncPrompt[P, FormattableT]
200
- | Prompt[P, FormattableT]
201
- | PromptDecorator[ToolT, FormattableT]
224
+ ContextPrompt[P, DepsT]
225
+ | AsyncContextPrompt[P, DepsT]
226
+ | Prompt[P]
227
+ | AsyncPrompt[P]
228
+ | PromptDecorator
229
+ | PromptTemplateDecorator
202
230
  ):
203
- """Decorates a `MessageTemplate` to create a `Prompt` callable with a model.
231
+ """Prompt decorator for turning functions (or "Prompts") into prompts.
232
+
233
+ This decorator transforms a function into a Prompt, i.e. a function that
234
+ returns `list[llm.Message]`. Its behavior depends on whether it's called with a spec
235
+ string.
204
236
 
205
- This decorator transforms a raw prompt function (that returns message content)
206
- into a `Prompt` object that can be invoked with a model to generate LLM responses.
237
+ If the first parameter is named 'ctx' or typed as `llm.Context[T]`, it creates
238
+ a ContextPrompt. Otherwise, it creates a regular Prompt.
207
239
 
208
- The decorator automatically detects the function type:
209
- - If the first parameter is named `'ctx'` with type `llm.Context[T]`, creates a `ContextPrompt`
210
- - If the function is async, creates an `AsyncPrompt` or `AsyncContextPrompt`
211
- - Otherwise, creates a regular `Prompt`
240
+ With a template string, it returns a PromptTemplateDecorator, in which case it uses
241
+ the provided template to decorate an function with an empty body, and uses arguments
242
+ to the function for variable substitution in the template. The resulting PromptTemplate
243
+ returns messages based on the template.
244
+
245
+ Without a template string, it returns a PromptFunctionalDecorator, which
246
+ transforms a Prompt (a function returning either message content, or messages) into
247
+ a PromptTemplate. The resulting prompt template either promotes the content into a
248
+ list containing a single user message, or passes along the messages returned by the
249
+ decorated function.
212
250
 
213
251
  Args:
214
- __fn: The prompt function to decorate (optional, for decorator syntax without parens)
215
- tools: Optional `Sequence` of tools to make available to the LLM
216
- format: Optional response format class (`BaseModel`) or Format instance
252
+ template: A string template with placeholders using `{{ variable_name }}`
253
+ and optional role markers like [SYSTEM], [USER], and [ASSISTANT].
217
254
 
218
255
  Returns:
219
- A `Prompt` variant (Prompt, AsyncPrompt, ContextPrompt, or AsyncContextPrompt)
220
- or a `PromptDecorator` if called with arguments
221
- """
222
- decorator = PromptDecorator(tools=tools, format=format)
256
+ A PromptTemplateDecorator or PromptFunctionalDecorator that converts
257
+ the decorated function into a prompt.
258
+
259
+ Spec substitution rules:
260
+ - [USER], [ASSISTANT], [SYSTEM] demarcate the start of a new message with that role
261
+ - [MESSAGES] indicates the next variable contains a list of messages to include
262
+ - `{{ variable }}` injects the variable as a string, unless annotated
263
+ - Annotations: `{{ variable:annotation }}` where annotation is one of:
264
+ image, images, audio, audios, document, documents
265
+ - Single content annotations (image, audio, document) expect a file path,
266
+ URL, base64 string, or bytes, which becomes a content part with inferred mime-type
267
+ - Multiple content annotations (images, audios, documents) expect a list
268
+ of strings or bytes, each becoming a content part with inferred mime-type
269
+
270
+ Examples:
271
+ ```python
272
+ @llm.prompt
273
+ def answer_question(question: str) -> str:
274
+ return f"Answer this question: {question}"
275
+
276
+ @llm.prompt
277
+ def answer_with_context(ctx: llm.Context[str], question: str) -> str:
278
+ return f"Using context {ctx.deps}, answer: {question}"
279
+ ```
280
+ """ # TODO(docs): Update this docstring
281
+ if template:
282
+ raise NotImplementedError()
283
+ decorator = PromptDecorator()
223
284
  if __fn is None:
224
285
  return decorator
225
- # TODO: See if we can do without the pyright: ignores here
226
- return decorator(__fn) # pyright: ignore[reportUnknownVariableType, reportCallIssue]
286
+ return decorator(__fn)
@@ -1,44 +1,69 @@
1
1
  """Types for prompt functions."""
2
2
 
3
- from collections.abc import Sequence
4
- from typing import Protocol
3
+ from typing import Protocol, TypeVar
5
4
 
6
5
  from ..context import Context, DepsT
7
6
  from ..messages import Message, UserContent
8
7
  from ..types import P
9
8
 
9
+ PromptT = TypeVar(
10
+ "PromptT", bound="Prompt | AsyncPrompt | ContextPrompt | AsyncContextPrompt"
11
+ )
12
+ """Type variable for prompt types.
10
13
 
11
- class MessageTemplate(Protocol[P]):
12
- """Protocol for a prompt function that returns `UserContent` or `Sequence[Message]`.
14
+ This type var represents a resolved prompt, i.e. one that returns a list of messages.
15
+ """
13
16
 
14
- A `MessageTemplate` is a raw function that returns prompt content. It can be
15
- converted by the `llm.prompt` decorator into a `Prompt` (callable with a `Model`),
16
- or by the `llm.call` decorator into a `Call` (`Prompt` + `Model`).
17
+
18
+ class Prompt(Protocol[P]):
19
+ """Protocol for a `Prompt`, which returns `list[Message]`."""
20
+
21
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> list[Message]: ...
22
+
23
+
24
+ class Promptable(Protocol[P]):
25
+ """Protocol for a `Promptable` that returns `UserContent` or `list[Message]`.
26
+
27
+ May be be converted by the `prompt` decorator into a `Prompt`.
17
28
  """
18
29
 
19
30
  def __call__(
20
31
  self, *args: P.args, **kwargs: P.kwargs
21
- ) -> UserContent | Sequence[Message]: ...
32
+ ) -> UserContent | list[Message]: ...
33
+
22
34
 
35
+ class AsyncPrompt(Protocol[P]):
36
+ """Protocol for an `AsyncPrompt`, which returns `list[Message]`."""
23
37
 
24
- class AsyncMessageTemplate(Protocol[P]):
25
- """Protocol for an async prompt function that returns `UserContent` or `Sequence[Message]`.
38
+ async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> list[Message]: ...
26
39
 
27
- An async `MessageTemplate` that can be converted by the `llm.prompt` decorator
28
- into an `AsyncPrompt`, or by the `llm.call` decorator into an `AsyncCall`.
40
+
41
+ class AsyncPromptable(Protocol[P]):
42
+ """Protocol for an `AsyncPromptable` that returns `UserContent` or `list[Message]`.
43
+
44
+ May be converted by the `prompt` decorator into an `AsyncPrompt`.
29
45
  """
30
46
 
31
47
  async def __call__(
32
48
  self, *args: P.args, **kwargs: P.kwargs
33
- ) -> UserContent | Sequence[Message]: ...
49
+ ) -> UserContent | list[Message]: ...
50
+
51
+
52
+ class ContextPrompt(Protocol[P, DepsT]):
53
+ """Protocol for a `ContextPrompt`, which returns `list[Message]`."""
54
+
55
+ def __call__(
56
+ self,
57
+ ctx: Context[DepsT],
58
+ *args: P.args,
59
+ **kwargs: P.kwargs,
60
+ ) -> list[Message]: ...
34
61
 
35
62
 
36
- class ContextMessageTemplate(Protocol[P, DepsT]):
37
- """Protocol for a context-aware prompt function that returns `UserContent` or `Sequence[Message]`.
63
+ class ContextPromptable(Protocol[P, DepsT]):
64
+ """Protocol for a `ContextPromptable` that returns `UserContent` or `list[Message]`.
38
65
 
39
- A `MessageTemplate` with a first parameter named `'ctx'` of type `Context[DepsT]`.
40
- Can be converted by the `llm.prompt` decorator into a `ContextPrompt`, or by
41
- the `llm.call` decorator into a `ContextCall`.
66
+ May be converted by the `prompt` decorator into a `ContextPrompt`.
42
67
  """
43
68
 
44
69
  def __call__(
@@ -46,15 +71,24 @@ class ContextMessageTemplate(Protocol[P, DepsT]):
46
71
  ctx: Context[DepsT],
47
72
  *args: P.args,
48
73
  **kwargs: P.kwargs,
49
- ) -> UserContent | Sequence[Message]: ...
74
+ ) -> UserContent | list[Message]: ...
75
+
76
+
77
+ class AsyncContextPrompt(Protocol[P, DepsT]):
78
+ """Protocol for an `AsyncContextPrompt`, which returns `list[Message]`."""
79
+
80
+ async def __call__(
81
+ self,
82
+ ctx: Context[DepsT],
83
+ *args: P.args,
84
+ **kwargs: P.kwargs,
85
+ ) -> list[Message]: ...
50
86
 
51
87
 
52
- class AsyncContextMessageTemplate(Protocol[P, DepsT]):
53
- """Protocol for an async context-aware prompt function that returns `UserContent` or `Sequence[Message]`.
88
+ class AsyncContextPromptable(Protocol[P, DepsT]):
89
+ """Protocol for an `AsyncContextPromptable` that returns `UserContent` or `list[Message]`.
54
90
 
55
- An async `MessageTemplate` with a first parameter named `'ctx'` of type `Context[DepsT]`.
56
- Can be converted by the `llm.prompt` decorator into an `AsyncContextPrompt`, or by
57
- the `llm.call` decorator into an `AsyncContextCall`.
91
+ May be converted by the `prompt` decorator into an `AsyncContextPrompt`.
58
92
  """
59
93
 
60
94
  async def __call__(
@@ -62,4 +96,4 @@ class AsyncContextMessageTemplate(Protocol[P, DepsT]):
62
96
  ctx: Context[DepsT],
63
97
  *args: P.args,
64
98
  **kwargs: P.kwargs,
65
- ) -> UserContent | Sequence[Message]: ...
99
+ ) -> UserContent | list[Message]: ...