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
@@ -0,0 +1,8 @@
1
+ """OpenAI ChatCompletions registered LLM models."""
2
+
3
+ from typing import TypeAlias
4
+
5
+ from openai.types import ChatModel
6
+
7
+ OpenAICompletionsModelId: TypeAlias = ChatModel | str
8
+ """The OpenAI ChatCompletions model ids registered with Mirascope."""
@@ -0,0 +1,9 @@
1
+ from .clients import OpenAIResponsesClient, client, get_client
2
+ from .model_ids import OpenAIResponsesModelId
3
+
4
+ __all__ = [
5
+ "OpenAIResponsesClient",
6
+ "OpenAIResponsesModelId",
7
+ "client",
8
+ "get_client",
9
+ ]
@@ -0,0 +1,13 @@
1
+ from .decode import (
2
+ decode_async_stream,
3
+ decode_response,
4
+ decode_stream,
5
+ )
6
+ from .encode import encode_request
7
+
8
+ __all__ = [
9
+ "decode_async_stream",
10
+ "decode_response",
11
+ "decode_stream",
12
+ "encode_request",
13
+ ]
@@ -29,10 +29,8 @@ from .....responses import (
29
29
  FinishReasonChunk,
30
30
  RawMessageChunk,
31
31
  RawStreamEventChunk,
32
- Usage,
33
- UsageDeltaChunk,
34
32
  )
35
- from ...model_id import OpenAIModelId, model_name
33
+ from ..model_ids import OpenAIResponsesModelId
36
34
 
37
35
  INCOMPLETE_DETAILS_TO_FINISH_REASON = {
38
36
  "max_output_tokens": FinishReason.MAX_TOKENS,
@@ -40,33 +38,6 @@ INCOMPLETE_DETAILS_TO_FINISH_REASON = {
40
38
  }
41
39
 
42
40
 
43
- def _decode_usage(
44
- usage: openai_types.ResponseUsage | None,
45
- ) -> Usage | None:
46
- """Convert OpenAI ResponseUsage to Mirascope Usage."""
47
- if usage is None: # pragma: no cover
48
- return None
49
-
50
- return Usage(
51
- input_tokens=usage.input_tokens,
52
- output_tokens=usage.output_tokens,
53
- cache_read_tokens=(
54
- usage.input_tokens_details.cached_tokens
55
- if usage.input_tokens_details
56
- else None
57
- )
58
- or 0,
59
- cache_write_tokens=0,
60
- reasoning_tokens=(
61
- usage.output_tokens_details.reasoning_tokens
62
- if usage.output_tokens_details
63
- else None
64
- )
65
- or 0,
66
- raw=usage,
67
- )
68
-
69
-
70
41
  def _serialize_output_item(
71
42
  item: openai_types.ResponseOutputItem,
72
43
  ) -> dict[str, Any]:
@@ -76,12 +47,9 @@ def _serialize_output_item(
76
47
 
77
48
  def decode_response(
78
49
  response: openai_types.Response,
79
- model_id: OpenAIModelId,
80
- provider_id: str,
81
- *,
82
- include_thoughts: bool,
83
- ) -> tuple[AssistantMessage, FinishReason | None, Usage | None]:
84
- """Convert OpenAI Responses Response to mirascope AssistantMessage and usage."""
50
+ model_id: OpenAIResponsesModelId,
51
+ ) -> tuple[AssistantMessage, FinishReason | None]:
52
+ """Convert OpenAI Responses Response to mirascope AssistantMessage."""
85
53
  parts: list[AssistantContentPart] = []
86
54
  finish_reason: FinishReason | None = None
87
55
  refused = False
@@ -116,9 +84,6 @@ def decode_response(
116
84
  else:
117
85
  raise NotImplementedError(f"Unsupported output item: {output_item.type}")
118
86
 
119
- if not include_thoughts:
120
- parts = [part for part in parts if part.type != "thought"]
121
-
122
87
  if refused:
123
88
  finish_reason = FinishReason.REFUSAL
124
89
  elif details := response.incomplete_details:
@@ -126,25 +91,22 @@ def decode_response(
126
91
 
127
92
  assistant_message = AssistantMessage(
128
93
  content=parts,
129
- provider_id=provider_id,
94
+ provider="openai:responses",
130
95
  model_id=model_id,
131
- provider_model_name=model_name(model_id, "responses"),
132
96
  raw_message=[
133
97
  _serialize_output_item(output_item) for output_item in response.output
134
98
  ],
135
99
  )
136
100
 
137
- usage = _decode_usage(response.usage)
138
- return assistant_message, finish_reason, usage
101
+ return assistant_message, finish_reason
139
102
 
140
103
 
141
104
  class _OpenAIResponsesChunkProcessor:
142
105
  """Processes OpenAI Responses streaming events and maintains state across chunks."""
143
106
 
144
- def __init__(self, *, include_thoughts: bool) -> None:
107
+ def __init__(self) -> None:
145
108
  self.current_content_type: Literal["text", "tool_call", "thought"] | None = None
146
109
  self.refusal_encountered = False
147
- self.include_thoughts = include_thoughts
148
110
 
149
111
  def process_chunk(self, event: ResponseStreamEvent) -> ChunkIterator:
150
112
  """Process a single OpenAI Responses stream event and yield the appropriate content chunks."""
@@ -179,26 +141,23 @@ class _OpenAIResponsesChunkProcessor:
179
141
  )
180
142
  self.current_content_type = "tool_call"
181
143
  elif event.type == "response.function_call_arguments.delta":
182
- yield ToolCallChunk(id=self.current_tool_call_id, delta=event.delta)
144
+ yield ToolCallChunk(delta=event.delta)
183
145
  elif event.type == "response.function_call_arguments.done":
184
- yield ToolCallEndChunk(id=self.current_tool_call_id)
146
+ yield ToolCallEndChunk()
185
147
  self.current_content_type = None
186
148
  elif (
187
149
  event.type == "response.reasoning_text.delta"
188
150
  or event.type == "response.reasoning_summary_text.delta"
189
151
  ):
190
152
  if not self.current_content_type:
191
- if self.include_thoughts:
192
- yield ThoughtStartChunk()
153
+ yield ThoughtStartChunk()
193
154
  self.current_content_type = "thought"
194
- if self.include_thoughts:
195
- yield ThoughtChunk(delta=event.delta)
155
+ yield ThoughtChunk(delta=event.delta)
196
156
  elif (
197
157
  event.type == "response.reasoning_summary_text.done"
198
158
  or event.type == "response.reasoning_text.done"
199
159
  ):
200
- if self.include_thoughts:
201
- yield ThoughtEndChunk()
160
+ yield ThoughtEndChunk()
202
161
  self.current_content_type = None
203
162
  elif event.type == "response.incomplete":
204
163
  details = event.response.incomplete_details
@@ -215,46 +174,21 @@ class _OpenAIResponsesChunkProcessor:
215
174
  if self.refusal_encountered:
216
175
  yield FinishReasonChunk(finish_reason=FinishReason.REFUSAL)
217
176
 
218
- # Emit usage delta if present
219
- if event.response.usage:
220
- usage = event.response.usage
221
- yield UsageDeltaChunk(
222
- input_tokens=usage.input_tokens,
223
- output_tokens=usage.output_tokens,
224
- cache_read_tokens=(
225
- usage.input_tokens_details.cached_tokens
226
- if usage.input_tokens_details
227
- else None
228
- )
229
- or 0,
230
- cache_write_tokens=0,
231
- reasoning_tokens=(
232
- usage.output_tokens_details.reasoning_tokens
233
- if usage.output_tokens_details
234
- else None
235
- )
236
- or 0,
237
- )
238
-
239
177
 
240
178
  def decode_stream(
241
179
  openai_stream: Stream[ResponseStreamEvent],
242
- *,
243
- include_thoughts: bool,
244
180
  ) -> ChunkIterator:
245
181
  """Returns a ChunkIterator converted from an OpenAI Stream[ResponseStreamEvent]"""
246
- processor = _OpenAIResponsesChunkProcessor(include_thoughts=include_thoughts)
182
+ processor = _OpenAIResponsesChunkProcessor()
247
183
  for event in openai_stream:
248
184
  yield from processor.process_chunk(event)
249
185
 
250
186
 
251
187
  async def decode_async_stream(
252
188
  openai_stream: AsyncStream[ResponseStreamEvent],
253
- *,
254
- include_thoughts: bool,
255
189
  ) -> AsyncChunkIterator:
256
190
  """Returns an AsyncChunkIterator converted from an OpenAI AsyncStream[ResponseStreamEvent]"""
257
- processor = _OpenAIResponsesChunkProcessor(include_thoughts=include_thoughts)
191
+ processor = _OpenAIResponsesChunkProcessor()
258
192
  async for event in openai_stream:
259
193
  for item in processor.process_chunk(event):
260
194
  yield item
@@ -1,9 +1,7 @@
1
1
  """OpenAI Responses message encoding and request preparation."""
2
2
 
3
- from __future__ import annotations
4
-
5
3
  from collections.abc import Sequence
6
- from typing import TYPE_CHECKING, TypedDict, cast
4
+ from typing import TypedDict, cast
7
5
 
8
6
  from openai import Omit
9
7
  from openai.types.responses import (
@@ -25,7 +23,7 @@ from openai.types.responses.response_input_param import (
25
23
  FunctionCallOutput,
26
24
  Message as ResponseInputMessageParam,
27
25
  )
28
- from openai.types.shared_params import Reasoning, ReasoningEffort
26
+ from openai.types.shared_params import Reasoning
29
27
  from openai.types.shared_params.response_format_json_object import (
30
28
  ResponseFormatJSONObject,
31
29
  )
@@ -35,32 +33,15 @@ from .....exceptions import FeatureNotSupportedError
35
33
  from .....formatting import (
36
34
  Format,
37
35
  FormattableT,
38
- OutputParser,
36
+ _utils as _formatting_utils,
39
37
  resolve_format,
40
38
  )
41
39
  from .....messages import AssistantMessage, Message, UserMessage
42
- from .....tools import FORMAT_TOOL_NAME, AnyToolSchema, BaseToolkit
43
- from ....base import _utils as _base_utils
44
- from ...model_id import OpenAIModelId, model_name
45
- from ...model_info import (
46
- MODELS_WITHOUT_JSON_OBJECT_SUPPORT,
47
- MODELS_WITHOUT_JSON_SCHEMA_SUPPORT,
48
- NON_REASONING_MODELS,
49
- )
50
-
51
- if TYPE_CHECKING:
52
- from .....models import Params, ThinkingLevel
53
-
54
- # Thinking level to a float multiplier % of max tokens
55
- THINKING_LEVEL_TO_EFFORT: dict[ThinkingLevel, ReasoningEffort] = {
56
- "default": "medium",
57
- "none": "none",
58
- "minimal": "minimal",
59
- "low": "low",
60
- "medium": "medium",
61
- "high": "high",
62
- "max": "xhigh",
63
- }
40
+ from .....tools import FORMAT_TOOL_NAME, BaseToolkit, ToolSchema
41
+ from ....base import Params, _utils as _base_utils
42
+ from ...shared import _utils as _shared_utils
43
+ from ..model_ids import OpenAIResponsesModelId
44
+ from .model_features import NON_REASONING_MODELS
64
45
 
65
46
 
66
47
  class ResponseCreateKwargs(TypedDict, total=False):
@@ -119,15 +100,15 @@ def _encode_user_message(
119
100
  result.append(
120
101
  FunctionCallOutput(
121
102
  call_id=part.id,
122
- output=str(part.result),
103
+ output=str(part.value),
123
104
  type="function_call_output",
124
105
  )
125
106
  )
126
107
  elif part.type == "audio":
127
108
  raise FeatureNotSupportedError(
128
109
  "audio input",
129
- "openai",
130
- message='provider "openai" does not support audio inputs when using :responses api. Try appending :completions to your model instead.',
110
+ "openai:responses",
111
+ message='provider "openai:responses" does not support audio inputs. Try using "openai:completions" instead',
131
112
  )
132
113
  else:
133
114
  raise NotImplementedError(
@@ -182,7 +163,7 @@ def _encode_assistant_message(
182
163
 
183
164
 
184
165
  def _encode_message(
185
- message: Message, model_id: OpenAIModelId, encode_thoughts: bool
166
+ message: Message, model_id: OpenAIResponsesModelId, encode_thoughts: bool
186
167
  ) -> ResponseInputParam:
187
168
  """Convert a Mirascope Message to OpenAI Responses input items.
188
169
 
@@ -198,9 +179,8 @@ def _encode_message(
198
179
 
199
180
  if (
200
181
  message.role == "assistant"
201
- and message.provider_id in ("openai", "openai:responses")
202
- and message.provider_model_name
203
- == model_name(model_id=model_id, api_mode="responses")
182
+ and message.provider == "openai:responses"
183
+ and message.model_id == model_id
204
184
  and message.raw_message
205
185
  and not encode_thoughts
206
186
  ):
@@ -212,21 +192,18 @@ def _encode_message(
212
192
  return _encode_user_message(message)
213
193
 
214
194
 
215
- def _convert_tool_to_function_tool_param(tool: AnyToolSchema) -> FunctionToolParam:
195
+ def _convert_tool_to_function_tool_param(tool: ToolSchema) -> FunctionToolParam:
216
196
  """Convert a Mirascope ToolSchema to OpenAI Responses FunctionToolParam."""
217
197
  schema_dict = tool.parameters.model_dump(by_alias=True, exclude_none=True)
218
198
  schema_dict["type"] = "object"
219
- _base_utils.ensure_additional_properties_false(schema_dict)
220
- strict = True if tool.strict is None else tool.strict
221
- if strict:
222
- _base_utils.ensure_all_properties_required(schema_dict)
199
+ _shared_utils._ensure_additional_properties_false(schema_dict)
223
200
 
224
201
  return FunctionToolParam(
225
202
  type="function",
226
203
  name=tool.name,
227
204
  description=tool.description,
228
205
  parameters=schema_dict,
229
- strict=strict,
206
+ strict=tool.strict,
230
207
  )
231
208
 
232
209
 
@@ -242,7 +219,7 @@ def _create_strict_response_format(
242
219
  ResponseFormatTextJSONSchemaConfigParam for strict structured outputs
243
220
  """
244
221
  schema = format.schema.copy()
245
- _base_utils.ensure_additional_properties_false(schema)
222
+ _shared_utils._ensure_additional_properties_false(schema)
246
223
 
247
224
  response_format: ResponseFormatTextJSONSchemaConfigParam = {
248
225
  "type": "json_schema",
@@ -256,59 +233,33 @@ def _create_strict_response_format(
256
233
  return response_format
257
234
 
258
235
 
259
- def _compute_reasoning(
260
- level: ThinkingLevel,
261
- include_thoughts: bool,
262
- ) -> Reasoning:
263
- """Compute the OpenAI `Reasoning` config based on ThinkingConfig.
264
-
265
- Args:
266
- level: The thinking level
267
- include_thoughts: Whether to include summary (True/False for auto)
268
-
269
- Returns:
270
- OpenAI Reasoning configuration
271
- """
272
- reasoning: Reasoning = {"effort": THINKING_LEVEL_TO_EFFORT.get(level) or "medium"}
273
-
274
- if include_thoughts:
275
- reasoning["summary"] = "auto"
276
-
277
- return reasoning
236
+ def _compute_reasoning(thinking: bool) -> Reasoning:
237
+ """Compute the OpenAI `Reasoning` config based on thinking settings."""
238
+ if thinking:
239
+ return {"effort": "medium", "summary": "auto"}
240
+ else:
241
+ return {"effort": "minimal"}
278
242
 
279
243
 
280
244
  def encode_request(
281
245
  *,
282
- model_id: OpenAIModelId,
246
+ model_id: OpenAIResponsesModelId,
283
247
  messages: Sequence[Message],
284
- tools: Sequence[AnyToolSchema] | BaseToolkit[AnyToolSchema] | None,
285
- format: type[FormattableT]
286
- | Format[FormattableT]
287
- | OutputParser[FormattableT]
288
- | None,
248
+ tools: Sequence[ToolSchema] | BaseToolkit | None,
249
+ format: type[FormattableT] | Format[FormattableT] | None,
289
250
  params: Params,
290
251
  ) -> tuple[Sequence[Message], Format[FormattableT] | None, ResponseCreateKwargs]:
291
252
  """Prepares a request for the `OpenAI.responses.create` method."""
292
- if model_id.endswith(":completions"):
293
- raise FeatureNotSupportedError(
294
- feature="completions API",
295
- provider_id="openai:responses",
296
- model_id=model_id,
297
- message=f"Cannot use completions model with responses client: {model_id}",
298
- )
299
-
300
- base_model_name = model_name(model_id, None)
301
-
302
253
  kwargs: ResponseCreateKwargs = ResponseCreateKwargs(
303
254
  {
304
- "model": base_model_name,
255
+ "model": model_id,
305
256
  }
306
257
  )
307
258
  encode_thoughts = False
308
259
 
309
260
  with _base_utils.ensure_all_params_accessed(
310
261
  params=params,
311
- provider_id="openai",
262
+ provider="openai:responses",
312
263
  unsupported_params=["top_k", "seed", "stop_sequences"],
313
264
  ) as param_accessor:
314
265
  if param_accessor.temperature is not None:
@@ -318,26 +269,23 @@ def encode_request(
318
269
  if param_accessor.top_p is not None:
319
270
  kwargs["top_p"] = param_accessor.top_p
320
271
  if param_accessor.thinking is not None:
321
- thinking_config = param_accessor.thinking
322
- if base_model_name in NON_REASONING_MODELS:
272
+ if model_id in NON_REASONING_MODELS:
323
273
  param_accessor.emit_warning_for_unused_param(
324
- "thinking", thinking_config, "openai", model_id
274
+ "thinking", param_accessor.thinking, "openai:responses", model_id
325
275
  )
326
276
  else:
327
277
  # Assume model supports reasoning unless explicitly listed as non-reasoning
328
278
  # This ensures new reasoning models work immediately without code updates
329
- level = thinking_config.get("level")
330
- include_thoughts = thinking_config.get("include_thoughts", False)
331
- kwargs["reasoning"] = _compute_reasoning(level, include_thoughts)
332
-
333
- # Handle encode_thoughts_as_text from ThinkingConfig
334
- if thinking_config.get("encode_thoughts_as_text"):
335
- encode_thoughts = True
279
+ kwargs["reasoning"] = _compute_reasoning(param_accessor.thinking)
280
+ if param_accessor.encode_thoughts_as_text:
281
+ encode_thoughts = True
336
282
 
337
283
  tools = tools.tools if isinstance(tools, BaseToolkit) else tools or []
338
284
  openai_tools = [_convert_tool_to_function_tool_param(tool) for tool in tools]
339
285
 
340
- model_supports_strict = model_id not in MODELS_WITHOUT_JSON_SCHEMA_SUPPORT
286
+ model_supports_strict = (
287
+ model_id not in _shared_utils.MODELS_WITHOUT_JSON_SCHEMA_SUPPORT
288
+ )
341
289
  default_mode = "strict" if model_supports_strict else "tool"
342
290
 
343
291
  format = resolve_format(format, default_mode=default_mode)
@@ -345,9 +293,9 @@ def encode_request(
345
293
  if format.mode == "strict":
346
294
  kwargs["text"] = {"format": _create_strict_response_format(format)}
347
295
  elif format.mode == "tool":
348
- format_tool_schema = format.create_tool_schema()
296
+ format_tool_shared_utils = _formatting_utils.create_tool_schema(format)
349
297
  openai_tools.append(
350
- _convert_tool_to_function_tool_param(format_tool_schema)
298
+ _convert_tool_to_function_tool_param(format_tool_shared_utils)
351
299
  )
352
300
  if tools:
353
301
  kwargs["tool_choice"] = ToolChoiceAllowedParam(
@@ -364,7 +312,8 @@ def encode_request(
364
312
  name=FORMAT_TOOL_NAME,
365
313
  )
366
314
  elif (
367
- format.mode == "json" and model_id not in MODELS_WITHOUT_JSON_OBJECT_SUPPORT
315
+ format.mode == "json"
316
+ and model_id not in _shared_utils.MODELS_WITHOUT_JSON_OBJECT_SUPPORT
368
317
  ):
369
318
  kwargs["text"] = {"format": ResponseFormatJSONObject(type="json_object")}
370
319
 
@@ -0,0 +1,87 @@
1
+ """OpenAI Responses models categorized by reasoning support.
2
+
3
+ This file is auto-generated by scripts/update_openai_responses_model_features.py
4
+ Run that script to update these sets when OpenAI releases new models.
5
+ """
6
+
7
+ REASONING_MODELS: set[str] = {
8
+ "codex-mini-latest",
9
+ "gpt-5",
10
+ "gpt-5-2025-08-07",
11
+ "gpt-5-mini",
12
+ "gpt-5-mini-2025-08-07",
13
+ "gpt-5-nano",
14
+ "gpt-5-nano-2025-08-07",
15
+ "o1",
16
+ "o1-2024-12-17",
17
+ "o1-pro",
18
+ "o1-pro-2025-03-19",
19
+ "o3",
20
+ "o3-2025-04-16",
21
+ "o3-mini",
22
+ "o3-mini-2025-01-31",
23
+ "o3-pro",
24
+ "o3-pro-2025-06-10",
25
+ "o4-mini",
26
+ "o4-mini-2025-04-16",
27
+ }
28
+ """Models that have been tested and confirmed to support the reasoning parameter."""
29
+
30
+ NON_REASONING_MODELS: set[str] = {
31
+ "chatgpt-4o-latest",
32
+ "gpt-3.5-turbo",
33
+ "gpt-3.5-turbo-0125",
34
+ "gpt-3.5-turbo-1106",
35
+ "gpt-4",
36
+ "gpt-4-0125-preview",
37
+ "gpt-4-0314",
38
+ "gpt-4-0613",
39
+ "gpt-4-1106-preview",
40
+ "gpt-4-turbo",
41
+ "gpt-4-turbo-2024-04-09",
42
+ "gpt-4-turbo-preview",
43
+ "gpt-4.1",
44
+ "gpt-4.1-2025-04-14",
45
+ "gpt-4.1-mini",
46
+ "gpt-4.1-mini-2025-04-14",
47
+ "gpt-4.1-nano",
48
+ "gpt-4.1-nano-2025-04-14",
49
+ "gpt-4o",
50
+ "gpt-4o-2024-05-13",
51
+ "gpt-4o-2024-08-06",
52
+ "gpt-4o-2024-11-20",
53
+ "gpt-4o-mini",
54
+ "gpt-4o-mini-2024-07-18",
55
+ "gpt-5-chat-latest",
56
+ }
57
+ """Models that have been tested and confirmed to NOT support the reasoning parameter."""
58
+
59
+ NON_EXISTENT_MODELS: set[str] = {
60
+ "gpt-3.5-turbo-0301",
61
+ "gpt-3.5-turbo-0613",
62
+ "gpt-3.5-turbo-16k",
63
+ "gpt-3.5-turbo-16k-0613",
64
+ "gpt-4-32k",
65
+ "gpt-4-32k-0314",
66
+ "gpt-4-32k-0613",
67
+ "gpt-4-vision-preview",
68
+ }
69
+ """Models that are listed in OpenAI's types but no longer exist in their API."""
70
+
71
+ NO_RESPONSES_API_SUPPORT_MODELS: set[str] = {
72
+ "gpt-4o-audio-preview",
73
+ "gpt-4o-audio-preview-2024-10-01",
74
+ "gpt-4o-audio-preview-2024-12-17",
75
+ "gpt-4o-audio-preview-2025-06-03",
76
+ "gpt-4o-mini-audio-preview",
77
+ "gpt-4o-mini-audio-preview-2024-12-17",
78
+ "gpt-4o-mini-search-preview",
79
+ "gpt-4o-mini-search-preview-2025-03-11",
80
+ "gpt-4o-search-preview",
81
+ "gpt-4o-search-preview-2025-03-11",
82
+ "o1-mini",
83
+ "o1-mini-2024-09-12",
84
+ "o1-preview",
85
+ "o1-preview-2024-09-12",
86
+ }
87
+ """Models that do not support the Responses API."""