mirascope 1.22.4__py3-none-any.whl → 2.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mirascope/__init__.py +5 -50
- mirascope/_stubs.py +384 -0
- mirascope/_utils.py +34 -0
- mirascope/api/__init__.py +14 -0
- mirascope/api/_generated/README.md +207 -0
- mirascope/api/_generated/__init__.py +444 -0
- mirascope/api/_generated/annotations/__init__.py +33 -0
- mirascope/api/_generated/annotations/client.py +506 -0
- mirascope/api/_generated/annotations/raw_client.py +1414 -0
- mirascope/api/_generated/annotations/types/__init__.py +31 -0
- mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
- mirascope/api/_generated/api_keys/__init__.py +17 -0
- mirascope/api/_generated/api_keys/client.py +530 -0
- mirascope/api/_generated/api_keys/raw_client.py +1236 -0
- mirascope/api/_generated/api_keys/types/__init__.py +15 -0
- mirascope/api/_generated/api_keys/types/api_keys_create_response.py +28 -0
- mirascope/api/_generated/api_keys/types/api_keys_get_response.py +27 -0
- mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
- mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +27 -0
- mirascope/api/_generated/client.py +211 -0
- mirascope/api/_generated/core/__init__.py +52 -0
- mirascope/api/_generated/core/api_error.py +23 -0
- mirascope/api/_generated/core/client_wrapper.py +46 -0
- mirascope/api/_generated/core/datetime_utils.py +28 -0
- mirascope/api/_generated/core/file.py +67 -0
- mirascope/api/_generated/core/force_multipart.py +16 -0
- mirascope/api/_generated/core/http_client.py +543 -0
- mirascope/api/_generated/core/http_response.py +55 -0
- mirascope/api/_generated/core/jsonable_encoder.py +100 -0
- mirascope/api/_generated/core/pydantic_utilities.py +255 -0
- mirascope/api/_generated/core/query_encoder.py +58 -0
- mirascope/api/_generated/core/remove_none_from_dict.py +11 -0
- mirascope/api/_generated/core/request_options.py +35 -0
- mirascope/api/_generated/core/serialization.py +276 -0
- mirascope/api/_generated/docs/__init__.py +4 -0
- mirascope/api/_generated/docs/client.py +91 -0
- mirascope/api/_generated/docs/raw_client.py +178 -0
- mirascope/api/_generated/environment.py +9 -0
- mirascope/api/_generated/environments/__init__.py +23 -0
- mirascope/api/_generated/environments/client.py +649 -0
- mirascope/api/_generated/environments/raw_client.py +1567 -0
- mirascope/api/_generated/environments/types/__init__.py +25 -0
- mirascope/api/_generated/environments/types/environments_create_response.py +24 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
- mirascope/api/_generated/environments/types/environments_get_response.py +24 -0
- mirascope/api/_generated/environments/types/environments_list_response_item.py +24 -0
- mirascope/api/_generated/environments/types/environments_update_response.py +24 -0
- mirascope/api/_generated/errors/__init__.py +25 -0
- mirascope/api/_generated/errors/bad_request_error.py +14 -0
- mirascope/api/_generated/errors/conflict_error.py +14 -0
- mirascope/api/_generated/errors/forbidden_error.py +11 -0
- mirascope/api/_generated/errors/internal_server_error.py +10 -0
- mirascope/api/_generated/errors/not_found_error.py +11 -0
- mirascope/api/_generated/errors/payment_required_error.py +15 -0
- mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
- mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
- mirascope/api/_generated/errors/unauthorized_error.py +11 -0
- mirascope/api/_generated/functions/__init__.py +39 -0
- mirascope/api/_generated/functions/client.py +647 -0
- mirascope/api/_generated/functions/raw_client.py +1890 -0
- mirascope/api/_generated/functions/types/__init__.py +53 -0
- mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
- mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
- mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
- mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
- mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
- mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
- mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
- mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
- mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
- mirascope/api/_generated/health/__init__.py +7 -0
- mirascope/api/_generated/health/client.py +92 -0
- mirascope/api/_generated/health/raw_client.py +175 -0
- mirascope/api/_generated/health/types/__init__.py +8 -0
- mirascope/api/_generated/health/types/health_check_response.py +22 -0
- mirascope/api/_generated/health/types/health_check_response_status.py +5 -0
- mirascope/api/_generated/organization_invitations/__init__.py +33 -0
- mirascope/api/_generated/organization_invitations/client.py +546 -0
- mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
- mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
- mirascope/api/_generated/organization_memberships/__init__.py +19 -0
- mirascope/api/_generated/organization_memberships/client.py +302 -0
- mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
- mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
- mirascope/api/_generated/organizations/__init__.py +51 -0
- mirascope/api/_generated/organizations/client.py +869 -0
- mirascope/api/_generated/organizations/raw_client.py +2593 -0
- mirascope/api/_generated/organizations/types/__init__.py +71 -0
- mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
- mirascope/api/_generated/organizations/types/organizations_create_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_create_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_get_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_get_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_list_response_item.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_update_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_update_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
- mirascope/api/_generated/project_memberships/__init__.py +29 -0
- mirascope/api/_generated/project_memberships/client.py +528 -0
- mirascope/api/_generated/project_memberships/raw_client.py +1278 -0
- mirascope/api/_generated/project_memberships/types/__init__.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_get_response.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_get_response_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
- mirascope/api/_generated/projects/__init__.py +7 -0
- mirascope/api/_generated/projects/client.py +428 -0
- mirascope/api/_generated/projects/raw_client.py +1302 -0
- mirascope/api/_generated/projects/types/__init__.py +10 -0
- mirascope/api/_generated/projects/types/projects_create_response.py +25 -0
- mirascope/api/_generated/projects/types/projects_get_response.py +25 -0
- mirascope/api/_generated/projects/types/projects_list_response_item.py +25 -0
- mirascope/api/_generated/projects/types/projects_update_response.py +25 -0
- mirascope/api/_generated/reference.md +4987 -0
- mirascope/api/_generated/tags/__init__.py +19 -0
- mirascope/api/_generated/tags/client.py +504 -0
- mirascope/api/_generated/tags/raw_client.py +1288 -0
- mirascope/api/_generated/tags/types/__init__.py +17 -0
- mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
- mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
- mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
- mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
- mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
- mirascope/api/_generated/token_cost/__init__.py +7 -0
- mirascope/api/_generated/token_cost/client.py +160 -0
- mirascope/api/_generated/token_cost/raw_client.py +264 -0
- mirascope/api/_generated/token_cost/types/__init__.py +8 -0
- mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
- mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
- mirascope/api/_generated/traces/__init__.py +97 -0
- mirascope/api/_generated/traces/client.py +1103 -0
- mirascope/api/_generated/traces/raw_client.py +2322 -0
- mirascope/api/_generated/traces/types/__init__.py +155 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +29 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +27 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +20 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +29 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +31 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +48 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +24 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +20 -0
- mirascope/api/_generated/traces/types/traces_create_response.py +24 -0
- mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +22 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
- mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
- mirascope/api/_generated/types/__init__.py +85 -0
- mirascope/api/_generated/types/already_exists_error.py +22 -0
- mirascope/api/_generated/types/already_exists_error_tag.py +5 -0
- mirascope/api/_generated/types/bad_request_error_body.py +50 -0
- mirascope/api/_generated/types/click_house_error.py +22 -0
- mirascope/api/_generated/types/database_error.py +22 -0
- mirascope/api/_generated/types/database_error_tag.py +5 -0
- mirascope/api/_generated/types/date.py +3 -0
- mirascope/api/_generated/types/http_api_decode_error.py +27 -0
- mirascope/api/_generated/types/http_api_decode_error_tag.py +5 -0
- mirascope/api/_generated/types/immutable_resource_error.py +22 -0
- mirascope/api/_generated/types/internal_server_error_body.py +49 -0
- mirascope/api/_generated/types/issue.py +38 -0
- mirascope/api/_generated/types/issue_tag.py +10 -0
- mirascope/api/_generated/types/not_found_error_body.py +22 -0
- mirascope/api/_generated/types/not_found_error_tag.py +5 -0
- mirascope/api/_generated/types/number_from_string.py +3 -0
- mirascope/api/_generated/types/permission_denied_error.py +22 -0
- mirascope/api/_generated/types/permission_denied_error_tag.py +5 -0
- mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
- mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
- mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
- mirascope/api/_generated/types/property_key.py +7 -0
- mirascope/api/_generated/types/property_key_key.py +25 -0
- mirascope/api/_generated/types/property_key_key_tag.py +5 -0
- mirascope/api/_generated/types/rate_limit_error.py +31 -0
- mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
- mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
- mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
- mirascope/api/_generated/types/stripe_error.py +20 -0
- mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
- mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
- mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
- mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
- mirascope/api/client.py +255 -0
- mirascope/api/settings.py +99 -0
- mirascope/llm/__init__.py +309 -13
- mirascope/llm/calls/__init__.py +17 -0
- mirascope/llm/calls/calls.py +348 -0
- mirascope/llm/calls/decorator.py +268 -0
- mirascope/llm/content/__init__.py +71 -0
- mirascope/llm/content/audio.py +173 -0
- mirascope/llm/content/document.py +94 -0
- mirascope/llm/content/image.py +206 -0
- mirascope/llm/content/text.py +47 -0
- mirascope/llm/content/thought.py +58 -0
- mirascope/llm/content/tool_call.py +69 -0
- mirascope/llm/content/tool_output.py +43 -0
- mirascope/llm/context/__init__.py +6 -0
- mirascope/llm/context/_utils.py +41 -0
- mirascope/llm/context/context.py +24 -0
- mirascope/llm/exceptions.py +360 -0
- mirascope/llm/formatting/__init__.py +39 -0
- mirascope/llm/formatting/format.py +291 -0
- mirascope/llm/formatting/from_call_args.py +30 -0
- mirascope/llm/formatting/output_parser.py +178 -0
- mirascope/llm/formatting/partial.py +131 -0
- mirascope/llm/formatting/primitives.py +192 -0
- mirascope/llm/formatting/types.py +83 -0
- mirascope/llm/mcp/__init__.py +5 -0
- mirascope/llm/mcp/mcp_client.py +130 -0
- mirascope/llm/messages/__init__.py +35 -0
- mirascope/llm/messages/_utils.py +34 -0
- mirascope/llm/messages/message.py +190 -0
- mirascope/llm/models/__init__.py +21 -0
- mirascope/llm/models/models.py +1339 -0
- mirascope/llm/models/params.py +72 -0
- mirascope/llm/models/thinking_config.py +61 -0
- mirascope/llm/prompts/__init__.py +34 -0
- mirascope/llm/prompts/_utils.py +31 -0
- mirascope/llm/prompts/decorator.py +215 -0
- mirascope/llm/prompts/prompts.py +484 -0
- mirascope/llm/prompts/protocols.py +65 -0
- mirascope/llm/providers/__init__.py +65 -0
- mirascope/llm/providers/anthropic/__init__.py +11 -0
- mirascope/llm/providers/anthropic/_utils/__init__.py +27 -0
- mirascope/llm/providers/anthropic/_utils/beta_decode.py +297 -0
- mirascope/llm/providers/anthropic/_utils/beta_encode.py +272 -0
- mirascope/llm/providers/anthropic/_utils/decode.py +326 -0
- mirascope/llm/providers/anthropic/_utils/encode.py +431 -0
- mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
- mirascope/llm/providers/anthropic/beta_provider.py +338 -0
- mirascope/llm/providers/anthropic/model_id.py +23 -0
- mirascope/llm/providers/anthropic/model_info.py +87 -0
- mirascope/llm/providers/anthropic/provider.py +440 -0
- mirascope/llm/providers/base/__init__.py +14 -0
- mirascope/llm/providers/base/_utils.py +248 -0
- mirascope/llm/providers/base/base_provider.py +1463 -0
- mirascope/llm/providers/base/kwargs.py +12 -0
- mirascope/llm/providers/google/__init__.py +6 -0
- mirascope/llm/providers/google/_utils/__init__.py +17 -0
- mirascope/llm/providers/google/_utils/decode.py +357 -0
- mirascope/llm/providers/google/_utils/encode.py +418 -0
- mirascope/llm/providers/google/_utils/errors.py +50 -0
- mirascope/llm/providers/google/message.py +7 -0
- mirascope/llm/providers/google/model_id.py +22 -0
- mirascope/llm/providers/google/model_info.py +63 -0
- mirascope/llm/providers/google/provider.py +456 -0
- mirascope/llm/providers/mirascope/__init__.py +5 -0
- mirascope/llm/providers/mirascope/_utils.py +73 -0
- mirascope/llm/providers/mirascope/provider.py +313 -0
- mirascope/llm/providers/mlx/__init__.py +9 -0
- mirascope/llm/providers/mlx/_utils.py +141 -0
- mirascope/llm/providers/mlx/encoding/__init__.py +8 -0
- mirascope/llm/providers/mlx/encoding/base.py +69 -0
- mirascope/llm/providers/mlx/encoding/transformers.py +146 -0
- mirascope/llm/providers/mlx/mlx.py +242 -0
- mirascope/llm/providers/mlx/model_id.py +17 -0
- mirascope/llm/providers/mlx/provider.py +416 -0
- mirascope/llm/providers/model_id.py +16 -0
- mirascope/llm/providers/ollama/__init__.py +7 -0
- mirascope/llm/providers/ollama/provider.py +71 -0
- mirascope/llm/providers/openai/__init__.py +15 -0
- mirascope/llm/providers/openai/_utils/__init__.py +5 -0
- mirascope/llm/providers/openai/_utils/errors.py +46 -0
- mirascope/llm/providers/openai/completions/__init__.py +7 -0
- mirascope/llm/providers/openai/completions/_utils/__init__.py +18 -0
- mirascope/llm/providers/openai/completions/_utils/decode.py +252 -0
- mirascope/llm/providers/openai/completions/_utils/encode.py +390 -0
- mirascope/llm/providers/openai/completions/_utils/feature_info.py +50 -0
- mirascope/llm/providers/openai/completions/base_provider.py +522 -0
- mirascope/llm/providers/openai/completions/provider.py +28 -0
- mirascope/llm/providers/openai/model_id.py +31 -0
- mirascope/llm/providers/openai/model_info.py +303 -0
- mirascope/llm/providers/openai/provider.py +405 -0
- mirascope/llm/providers/openai/responses/__init__.py +5 -0
- mirascope/llm/providers/openai/responses/_utils/__init__.py +15 -0
- mirascope/llm/providers/openai/responses/_utils/decode.py +289 -0
- mirascope/llm/providers/openai/responses/_utils/encode.py +399 -0
- mirascope/llm/providers/openai/responses/provider.py +472 -0
- mirascope/llm/providers/openrouter/__init__.py +5 -0
- mirascope/llm/providers/openrouter/provider.py +67 -0
- mirascope/llm/providers/provider_id.py +26 -0
- mirascope/llm/providers/provider_registry.py +305 -0
- mirascope/llm/providers/together/__init__.py +7 -0
- mirascope/llm/providers/together/provider.py +40 -0
- mirascope/llm/responses/__init__.py +66 -0
- mirascope/llm/responses/_utils.py +146 -0
- mirascope/llm/responses/base_response.py +103 -0
- mirascope/llm/responses/base_stream_response.py +824 -0
- mirascope/llm/responses/finish_reason.py +28 -0
- mirascope/llm/responses/response.py +362 -0
- mirascope/llm/responses/root_response.py +248 -0
- mirascope/llm/responses/stream_response.py +577 -0
- mirascope/llm/responses/streams.py +363 -0
- mirascope/llm/responses/usage.py +139 -0
- mirascope/llm/tools/__init__.py +71 -0
- mirascope/llm/tools/_utils.py +34 -0
- mirascope/llm/tools/decorator.py +184 -0
- mirascope/llm/tools/protocols.py +96 -0
- mirascope/llm/tools/provider_tools.py +18 -0
- mirascope/llm/tools/tool_schema.py +321 -0
- mirascope/llm/tools/toolkit.py +178 -0
- mirascope/llm/tools/tools.py +263 -0
- mirascope/llm/tools/types.py +112 -0
- mirascope/llm/tools/web_search_tool.py +32 -0
- mirascope/llm/types/__init__.py +22 -0
- mirascope/llm/types/dataclass.py +9 -0
- mirascope/llm/types/jsonable.py +44 -0
- mirascope/llm/types/type_vars.py +19 -0
- mirascope/ops/__init__.py +129 -0
- mirascope/ops/_internal/__init__.py +5 -0
- mirascope/ops/_internal/closure.py +1172 -0
- mirascope/ops/_internal/configuration.py +177 -0
- mirascope/ops/_internal/context.py +76 -0
- mirascope/ops/_internal/exporters/__init__.py +26 -0
- mirascope/ops/_internal/exporters/exporters.py +362 -0
- mirascope/ops/_internal/exporters/processors.py +104 -0
- mirascope/ops/_internal/exporters/types.py +165 -0
- mirascope/ops/_internal/exporters/utils.py +66 -0
- mirascope/ops/_internal/instrumentation/__init__.py +28 -0
- mirascope/ops/_internal/instrumentation/llm/__init__.py +8 -0
- mirascope/ops/_internal/instrumentation/llm/common.py +500 -0
- mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
- mirascope/ops/_internal/instrumentation/llm/encode.py +238 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +38 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +31 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +38 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +18 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +100 -0
- mirascope/ops/_internal/instrumentation/llm/llm.py +161 -0
- mirascope/ops/_internal/instrumentation/llm/model.py +1777 -0
- mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
- mirascope/ops/_internal/instrumentation/llm/serialize.py +324 -0
- mirascope/ops/_internal/instrumentation/providers/__init__.py +29 -0
- mirascope/ops/_internal/instrumentation/providers/anthropic.py +78 -0
- mirascope/ops/_internal/instrumentation/providers/base.py +179 -0
- mirascope/ops/_internal/instrumentation/providers/google_genai.py +85 -0
- mirascope/ops/_internal/instrumentation/providers/openai.py +82 -0
- mirascope/ops/_internal/propagation.py +198 -0
- mirascope/ops/_internal/protocols.py +133 -0
- mirascope/ops/_internal/session.py +139 -0
- mirascope/ops/_internal/spans.py +232 -0
- mirascope/ops/_internal/traced_calls.py +389 -0
- mirascope/ops/_internal/traced_functions.py +528 -0
- mirascope/ops/_internal/tracing.py +353 -0
- mirascope/ops/_internal/types.py +13 -0
- mirascope/ops/_internal/utils.py +131 -0
- mirascope/ops/_internal/versioned_calls.py +512 -0
- mirascope/ops/_internal/versioned_functions.py +357 -0
- mirascope/ops/_internal/versioning.py +303 -0
- mirascope/ops/exceptions.py +21 -0
- mirascope-2.1.1.dist-info/METADATA +231 -0
- mirascope-2.1.1.dist-info/RECORD +437 -0
- mirascope-2.1.1.dist-info/WHEEL +4 -0
- mirascope-2.1.1.dist-info/licenses/LICENSE +21 -0
- mirascope/beta/__init__.py +0 -3
- mirascope/beta/openai/__init__.py +0 -17
- mirascope/beta/openai/realtime/__init__.py +0 -13
- mirascope/beta/openai/realtime/_utils/__init__.py +0 -3
- mirascope/beta/openai/realtime/_utils/_audio.py +0 -74
- mirascope/beta/openai/realtime/_utils/_protocols.py +0 -50
- mirascope/beta/openai/realtime/realtime.py +0 -500
- mirascope/beta/openai/realtime/recording.py +0 -98
- mirascope/beta/openai/realtime/tool.py +0 -113
- mirascope/beta/rag/__init__.py +0 -24
- mirascope/beta/rag/base/__init__.py +0 -22
- mirascope/beta/rag/base/chunkers/__init__.py +0 -2
- mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
- mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
- mirascope/beta/rag/base/config.py +0 -8
- mirascope/beta/rag/base/document.py +0 -11
- mirascope/beta/rag/base/embedders.py +0 -35
- mirascope/beta/rag/base/embedding_params.py +0 -18
- mirascope/beta/rag/base/embedding_response.py +0 -30
- mirascope/beta/rag/base/query_results.py +0 -7
- mirascope/beta/rag/base/vectorstore_params.py +0 -18
- mirascope/beta/rag/base/vectorstores.py +0 -37
- mirascope/beta/rag/chroma/__init__.py +0 -11
- mirascope/beta/rag/chroma/types.py +0 -57
- mirascope/beta/rag/chroma/vectorstores.py +0 -97
- mirascope/beta/rag/cohere/__init__.py +0 -11
- mirascope/beta/rag/cohere/embedders.py +0 -87
- mirascope/beta/rag/cohere/embedding_params.py +0 -29
- mirascope/beta/rag/cohere/embedding_response.py +0 -29
- mirascope/beta/rag/cohere/py.typed +0 -0
- mirascope/beta/rag/openai/__init__.py +0 -11
- mirascope/beta/rag/openai/embedders.py +0 -144
- mirascope/beta/rag/openai/embedding_params.py +0 -18
- mirascope/beta/rag/openai/embedding_response.py +0 -14
- mirascope/beta/rag/openai/py.typed +0 -0
- mirascope/beta/rag/pinecone/__init__.py +0 -19
- mirascope/beta/rag/pinecone/types.py +0 -143
- mirascope/beta/rag/pinecone/vectorstores.py +0 -148
- mirascope/beta/rag/weaviate/__init__.py +0 -6
- mirascope/beta/rag/weaviate/types.py +0 -92
- mirascope/beta/rag/weaviate/vectorstores.py +0 -103
- mirascope/core/__init__.py +0 -107
- mirascope/core/anthropic/__init__.py +0 -31
- mirascope/core/anthropic/_call.py +0 -67
- mirascope/core/anthropic/_call_kwargs.py +0 -13
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_convert_common_call_params.py +0 -25
- mirascope/core/anthropic/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -102
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -31
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -113
- mirascope/core/anthropic/_utils/_message_param_converter.py +0 -142
- mirascope/core/anthropic/_utils/_setup_call.py +0 -134
- mirascope/core/anthropic/call_params.py +0 -41
- mirascope/core/anthropic/call_response.py +0 -206
- mirascope/core/anthropic/call_response_chunk.py +0 -132
- mirascope/core/anthropic/dynamic_config.py +0 -40
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -147
- mirascope/core/anthropic/tool.py +0 -101
- mirascope/core/azure/__init__.py +0 -31
- mirascope/core/azure/_call.py +0 -67
- mirascope/core/azure/_call_kwargs.py +0 -13
- mirascope/core/azure/_utils/__init__.py +0 -14
- mirascope/core/azure/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/azure/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/azure/_utils/_convert_message_params.py +0 -121
- mirascope/core/azure/_utils/_get_credential.py +0 -33
- mirascope/core/azure/_utils/_get_json_output.py +0 -27
- mirascope/core/azure/_utils/_handle_stream.py +0 -130
- mirascope/core/azure/_utils/_message_param_converter.py +0 -117
- mirascope/core/azure/_utils/_setup_call.py +0 -183
- mirascope/core/azure/call_params.py +0 -59
- mirascope/core/azure/call_response.py +0 -215
- mirascope/core/azure/call_response_chunk.py +0 -105
- mirascope/core/azure/dynamic_config.py +0 -30
- mirascope/core/azure/py.typed +0 -0
- mirascope/core/azure/stream.py +0 -147
- mirascope/core/azure/tool.py +0 -93
- mirascope/core/base/__init__.py +0 -84
- mirascope/core/base/_call_factory.py +0 -256
- mirascope/core/base/_create.py +0 -253
- mirascope/core/base/_extract.py +0 -175
- mirascope/core/base/_extract_with_tools.py +0 -189
- mirascope/core/base/_partial.py +0 -95
- mirascope/core/base/_utils/__init__.py +0 -92
- mirascope/core/base/_utils/_base_message_param_converter.py +0 -22
- mirascope/core/base/_utils/_base_type.py +0 -26
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -48
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -139
- mirascope/core/base/_utils/_convert_messages_to_message_params.py +0 -171
- mirascope/core/base/_utils/_convert_provider_finish_reason_to_finish_reason.py +0 -20
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -42
- mirascope/core/base/_utils/_fn_is_async.py +0 -15
- mirascope/core/base/_utils/_format_template.py +0 -32
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_common_usage.py +0 -20
- mirascope/core/base/_utils/_get_create_fn_or_async_create_fn.py +0 -137
- mirascope/core/base/_utils/_get_document_type.py +0 -7
- mirascope/core/base/_utils/_get_dynamic_configuration.py +0 -69
- mirascope/core/base/_utils/_get_fields_from_call_args.py +0 -34
- mirascope/core/base/_utils/_get_fn_args.py +0 -23
- mirascope/core/base/_utils/_get_image_dimensions.py +0 -39
- mirascope/core/base/_utils/_get_image_type.py +0 -26
- mirascope/core/base/_utils/_get_metadata.py +0 -17
- mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
- mirascope/core/base/_utils/_get_prompt_template.py +0 -28
- mirascope/core/base/_utils/_get_template_values.py +0 -51
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_get_unsupported_tool_config_keys.py +0 -10
- mirascope/core/base/_utils/_is_prompt_template.py +0 -24
- mirascope/core/base/_utils/_json_mode_content.py +0 -17
- mirascope/core/base/_utils/_messages_decorator.py +0 -121
- mirascope/core/base/_utils/_parse_content_template.py +0 -321
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -63
- mirascope/core/base/_utils/_pil_image_to_bytes.py +0 -13
- mirascope/core/base/_utils/_protocols.py +0 -901
- mirascope/core/base/_utils/_setup_call.py +0 -79
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -30
- mirascope/core/base/call_kwargs.py +0 -13
- mirascope/core/base/call_params.py +0 -36
- mirascope/core/base/call_response.py +0 -340
- mirascope/core/base/call_response_chunk.py +0 -130
- mirascope/core/base/dynamic_config.py +0 -82
- mirascope/core/base/from_call_args.py +0 -30
- mirascope/core/base/merge_decorators.py +0 -59
- mirascope/core/base/message_param.py +0 -162
- mirascope/core/base/messages.py +0 -111
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -497
- mirascope/core/base/response_model_config_dict.py +0 -9
- mirascope/core/base/stream.py +0 -479
- mirascope/core/base/stream_config.py +0 -11
- mirascope/core/base/structured_stream.py +0 -296
- mirascope/core/base/tool.py +0 -205
- mirascope/core/base/toolkit.py +0 -176
- mirascope/core/base/types.py +0 -344
- mirascope/core/bedrock/__init__.py +0 -34
- mirascope/core/bedrock/_call.py +0 -68
- mirascope/core/bedrock/_call_kwargs.py +0 -12
- mirascope/core/bedrock/_types.py +0 -104
- mirascope/core/bedrock/_utils/__init__.py +0 -14
- mirascope/core/bedrock/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/bedrock/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/bedrock/_utils/_convert_message_params.py +0 -111
- mirascope/core/bedrock/_utils/_get_json_output.py +0 -30
- mirascope/core/bedrock/_utils/_handle_stream.py +0 -104
- mirascope/core/bedrock/_utils/_message_param_converter.py +0 -171
- mirascope/core/bedrock/_utils/_setup_call.py +0 -258
- mirascope/core/bedrock/call_params.py +0 -38
- mirascope/core/bedrock/call_response.py +0 -249
- mirascope/core/bedrock/call_response_chunk.py +0 -111
- mirascope/core/bedrock/dynamic_config.py +0 -37
- mirascope/core/bedrock/py.typed +0 -0
- mirascope/core/bedrock/stream.py +0 -154
- mirascope/core/bedrock/tool.py +0 -96
- mirascope/core/cohere/__init__.py +0 -30
- mirascope/core/cohere/_call.py +0 -67
- mirascope/core/cohere/_call_kwargs.py +0 -11
- mirascope/core/cohere/_types.py +0 -20
- mirascope/core/cohere/_utils/__init__.py +0 -14
- mirascope/core/cohere/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/cohere/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -24
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -32
- mirascope/core/cohere/_utils/_get_json_output.py +0 -30
- mirascope/core/cohere/_utils/_handle_stream.py +0 -35
- mirascope/core/cohere/_utils/_message_param_converter.py +0 -54
- mirascope/core/cohere/_utils/_setup_call.py +0 -150
- mirascope/core/cohere/call_params.py +0 -62
- mirascope/core/cohere/call_response.py +0 -205
- mirascope/core/cohere/call_response_chunk.py +0 -125
- mirascope/core/cohere/dynamic_config.py +0 -32
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -93
- mirascope/core/costs/__init__.py +0 -5
- mirascope/core/costs/_anthropic_calculate_cost.py +0 -219
- mirascope/core/costs/_azure_calculate_cost.py +0 -11
- mirascope/core/costs/_bedrock_calculate_cost.py +0 -15
- mirascope/core/costs/_cohere_calculate_cost.py +0 -44
- mirascope/core/costs/_gemini_calculate_cost.py +0 -67
- mirascope/core/costs/_google_calculate_cost.py +0 -427
- mirascope/core/costs/_groq_calculate_cost.py +0 -156
- mirascope/core/costs/_litellm_calculate_cost.py +0 -11
- mirascope/core/costs/_mistral_calculate_cost.py +0 -64
- mirascope/core/costs/_openai_calculate_cost.py +0 -416
- mirascope/core/costs/_vertex_calculate_cost.py +0 -67
- mirascope/core/costs/_xai_calculate_cost.py +0 -104
- mirascope/core/costs/calculate_cost.py +0 -86
- mirascope/core/gemini/__init__.py +0 -40
- mirascope/core/gemini/_call.py +0 -67
- mirascope/core/gemini/_call_kwargs.py +0 -12
- mirascope/core/gemini/_utils/__init__.py +0 -14
- mirascope/core/gemini/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/gemini/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -156
- mirascope/core/gemini/_utils/_get_json_output.py +0 -35
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_message_param_converter.py +0 -209
- mirascope/core/gemini/_utils/_setup_call.py +0 -149
- mirascope/core/gemini/call_params.py +0 -52
- mirascope/core/gemini/call_response.py +0 -216
- mirascope/core/gemini/call_response_chunk.py +0 -100
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -120
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/google/__init__.py +0 -29
- mirascope/core/google/_call.py +0 -67
- mirascope/core/google/_call_kwargs.py +0 -13
- mirascope/core/google/_utils/__init__.py +0 -14
- mirascope/core/google/_utils/_convert_common_call_params.py +0 -38
- mirascope/core/google/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -27
- mirascope/core/google/_utils/_convert_message_params.py +0 -206
- mirascope/core/google/_utils/_get_json_output.py +0 -37
- mirascope/core/google/_utils/_handle_stream.py +0 -35
- mirascope/core/google/_utils/_message_param_converter.py +0 -162
- mirascope/core/google/_utils/_setup_call.py +0 -201
- mirascope/core/google/_utils/_validate_media_type.py +0 -34
- mirascope/core/google/call_params.py +0 -22
- mirascope/core/google/call_response.py +0 -232
- mirascope/core/google/call_response_chunk.py +0 -110
- mirascope/core/google/dynamic_config.py +0 -26
- mirascope/core/google/stream.py +0 -143
- mirascope/core/google/tool.py +0 -146
- mirascope/core/groq/__init__.py +0 -30
- mirascope/core/groq/_call.py +0 -67
- mirascope/core/groq/_call_kwargs.py +0 -13
- mirascope/core/groq/_utils/__init__.py +0 -14
- mirascope/core/groq/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/groq/_utils/_convert_message_params.py +0 -112
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -123
- mirascope/core/groq/_utils/_message_param_converter.py +0 -89
- mirascope/core/groq/_utils/_setup_call.py +0 -132
- mirascope/core/groq/call_params.py +0 -52
- mirascope/core/groq/call_response.py +0 -213
- mirascope/core/groq/call_response_chunk.py +0 -104
- mirascope/core/groq/dynamic_config.py +0 -29
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -135
- mirascope/core/groq/tool.py +0 -80
- mirascope/core/litellm/__init__.py +0 -28
- mirascope/core/litellm/_call.py +0 -67
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -109
- mirascope/core/litellm/call_params.py +0 -10
- mirascope/core/litellm/call_response.py +0 -24
- mirascope/core/litellm/call_response_chunk.py +0 -14
- mirascope/core/litellm/dynamic_config.py +0 -8
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/litellm/stream.py +0 -86
- mirascope/core/litellm/tool.py +0 -13
- mirascope/core/mistral/__init__.py +0 -36
- mirascope/core/mistral/_call.py +0 -65
- mirascope/core/mistral/_call_kwargs.py +0 -19
- mirascope/core/mistral/_utils/__init__.py +0 -14
- mirascope/core/mistral/_utils/_convert_common_call_params.py +0 -24
- mirascope/core/mistral/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -22
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -122
- mirascope/core/mistral/_utils/_get_json_output.py +0 -34
- mirascope/core/mistral/_utils/_handle_stream.py +0 -139
- mirascope/core/mistral/_utils/_message_param_converter.py +0 -176
- mirascope/core/mistral/_utils/_setup_call.py +0 -154
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -205
- mirascope/core/mistral/call_response_chunk.py +0 -105
- mirascope/core/mistral/dynamic_config.py +0 -33
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -120
- mirascope/core/mistral/tool.py +0 -80
- mirascope/core/openai/__init__.py +0 -31
- mirascope/core/openai/_call.py +0 -67
- mirascope/core/openai/_call_kwargs.py +0 -13
- mirascope/core/openai/_utils/__init__.py +0 -14
- mirascope/core/openai/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/openai/_utils/_convert_message_params.py +0 -146
- mirascope/core/openai/_utils/_get_json_output.py +0 -31
- mirascope/core/openai/_utils/_handle_stream.py +0 -138
- mirascope/core/openai/_utils/_message_param_converter.py +0 -105
- mirascope/core/openai/_utils/_setup_call.py +0 -155
- mirascope/core/openai/call_params.py +0 -91
- mirascope/core/openai/call_response.py +0 -273
- mirascope/core/openai/call_response_chunk.py +0 -139
- mirascope/core/openai/dynamic_config.py +0 -34
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -185
- mirascope/core/openai/tool.py +0 -101
- mirascope/core/py.typed +0 -0
- mirascope/core/vertex/__init__.py +0 -45
- mirascope/core/vertex/_call.py +0 -62
- mirascope/core/vertex/_call_kwargs.py +0 -12
- mirascope/core/vertex/_utils/__init__.py +0 -14
- mirascope/core/vertex/_utils/_convert_common_call_params.py +0 -37
- mirascope/core/vertex/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/vertex/_utils/_convert_message_params.py +0 -171
- mirascope/core/vertex/_utils/_get_json_output.py +0 -36
- mirascope/core/vertex/_utils/_handle_stream.py +0 -33
- mirascope/core/vertex/_utils/_message_param_converter.py +0 -133
- mirascope/core/vertex/_utils/_setup_call.py +0 -160
- mirascope/core/vertex/call_params.py +0 -24
- mirascope/core/vertex/call_response.py +0 -206
- mirascope/core/vertex/call_response_chunk.py +0 -99
- mirascope/core/vertex/dynamic_config.py +0 -28
- mirascope/core/vertex/stream.py +0 -119
- mirascope/core/vertex/tool.py +0 -101
- mirascope/core/xai/__init__.py +0 -28
- mirascope/core/xai/_call.py +0 -67
- mirascope/core/xai/_utils/__init__.py +0 -5
- mirascope/core/xai/_utils/_setup_call.py +0 -113
- mirascope/core/xai/call_params.py +0 -10
- mirascope/core/xai/call_response.py +0 -16
- mirascope/core/xai/call_response_chunk.py +0 -14
- mirascope/core/xai/dynamic_config.py +0 -8
- mirascope/core/xai/py.typed +0 -0
- mirascope/core/xai/stream.py +0 -57
- mirascope/core/xai/tool.py +0 -13
- mirascope/experimental/graphs/__init__.py +0 -5
- mirascope/experimental/graphs/finite_state_machine.py +0 -714
- mirascope/integrations/__init__.py +0 -16
- mirascope/integrations/_middleware_factory.py +0 -403
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -70
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -225
- mirascope/integrations/logfire/_with_logfire.py +0 -63
- mirascope/integrations/otel/__init__.py +0 -10
- mirascope/integrations/otel/_utils.py +0 -270
- mirascope/integrations/otel/_with_hyperdx.py +0 -60
- mirascope/integrations/otel/_with_otel.py +0 -59
- mirascope/integrations/tenacity.py +0 -14
- mirascope/llm/_call.py +0 -401
- mirascope/llm/_context.py +0 -384
- mirascope/llm/_override.py +0 -3639
- mirascope/llm/_protocols.py +0 -500
- mirascope/llm/_response_metaclass.py +0 -31
- mirascope/llm/call_response.py +0 -167
- mirascope/llm/call_response_chunk.py +0 -66
- mirascope/llm/stream.py +0 -162
- mirascope/llm/tool.py +0 -64
- mirascope/mcp/__init__.py +0 -7
- mirascope/mcp/_utils.py +0 -277
- mirascope/mcp/client.py +0 -167
- mirascope/mcp/server.py +0 -356
- mirascope/mcp/tools.py +0 -110
- mirascope/py.typed +0 -0
- mirascope/retries/__init__.py +0 -11
- mirascope/retries/fallback.py +0 -128
- mirascope/retries/tenacity.py +0 -50
- mirascope/tools/__init__.py +0 -37
- mirascope/tools/base.py +0 -98
- mirascope/tools/system/__init__.py +0 -0
- mirascope/tools/system/_docker_operation.py +0 -166
- mirascope/tools/system/_file_system.py +0 -267
- mirascope/tools/web/__init__.py +0 -0
- mirascope/tools/web/_duckduckgo.py +0 -111
- mirascope/tools/web/_httpx.py +0 -125
- mirascope/tools/web/_parse_url_content.py +0 -94
- mirascope/tools/web/_requests.py +0 -54
- mirascope/v0/__init__.py +0 -43
- mirascope/v0/anthropic.py +0 -54
- mirascope/v0/base/__init__.py +0 -12
- mirascope/v0/base/calls.py +0 -118
- mirascope/v0/base/extractors.py +0 -122
- mirascope/v0/base/ops_utils.py +0 -207
- mirascope/v0/base/prompts.py +0 -48
- mirascope/v0/base/types.py +0 -14
- mirascope/v0/base/utils.py +0 -21
- mirascope/v0/openai.py +0 -54
- mirascope-1.22.4.dist-info/METADATA +0 -169
- mirascope-1.22.4.dist-info/RECORD +0 -377
- mirascope-1.22.4.dist-info/WHEEL +0 -4
- mirascope-1.22.4.dist-info/licenses/LICENSE +0 -21
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""The `FromCallArgs` class annotation for marking a field as a call argument."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class FromCallArgs:
|
|
5
|
+
"""A marker class for indicating that a field is a call argument.
|
|
6
|
+
|
|
7
|
+
This ensures that the LLM call does not attempt to generate this field. Instead, it
|
|
8
|
+
will populate this field with the call argument with a matching name.
|
|
9
|
+
|
|
10
|
+
This is useful for colocating e.g. validation of a generated output against and
|
|
11
|
+
input argument (such as the length of an output given a number input).
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
class Book(BaseModel):
|
|
17
|
+
title: Annotated[str, llm.formatting.FromCallArgs()]
|
|
18
|
+
author: Annotated[str, llm.formatting.FromCallArgs()]
|
|
19
|
+
summary: str
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@llm.call(
|
|
23
|
+
provider_id="openai",
|
|
24
|
+
model_id="openai/gpt-5-mini",
|
|
25
|
+
format=Book,
|
|
26
|
+
)
|
|
27
|
+
def summarize_book(title: str, author: str):
|
|
28
|
+
return f"Summarize {title} by {author}."
|
|
29
|
+
```
|
|
30
|
+
"""
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"""The `llm.output_parser` decorator for creating custom output parsers."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Generic, TypeVar
|
|
5
|
+
from typing_extensions import TypeIs
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from ..responses import AnyResponse
|
|
9
|
+
|
|
10
|
+
OutputT = TypeVar("OutputT")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class OutputParser(Generic[OutputT]):
|
|
14
|
+
"""Represents a custom output parser created with @llm.output_parser.
|
|
15
|
+
|
|
16
|
+
This class wraps a parsing function and stores formatting instructions.
|
|
17
|
+
It is created by the @llm.output_parser decorator and used as a format
|
|
18
|
+
argument in LLM calls.
|
|
19
|
+
|
|
20
|
+
Unlike BaseModel and primitive type formats that use structured outputs
|
|
21
|
+
(JSON schema, tools, strict mode), OutputParser works with raw text responses
|
|
22
|
+
and custom parsing logic.
|
|
23
|
+
|
|
24
|
+
Example:
|
|
25
|
+
```python
|
|
26
|
+
@llm.output_parser(
|
|
27
|
+
formatting_instructions="Return XML: <book><title>...</title></book>"
|
|
28
|
+
)
|
|
29
|
+
def parse_book_xml(response: llm.AnyResponse) -> Book:
|
|
30
|
+
text = "".join(part.text for part in response.texts)
|
|
31
|
+
root = ET.fromstring(text)
|
|
32
|
+
return Book(title=root.find("title").text, ...)
|
|
33
|
+
|
|
34
|
+
@llm.call("openai/gpt-4o", format=parse_book_xml)
|
|
35
|
+
def recommend_book(genre: str):
|
|
36
|
+
return f"Recommend a {genre} book."
|
|
37
|
+
|
|
38
|
+
response = recommend_book("fantasy")
|
|
39
|
+
book = response.parse() # Returns Book instance
|
|
40
|
+
```
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
func: Callable[["AnyResponse"], OutputT],
|
|
46
|
+
formatting_instructions: str,
|
|
47
|
+
) -> None:
|
|
48
|
+
"""Initialize the OutputParser.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
func: The parsing function that takes a Response and returns parsed output.
|
|
52
|
+
formatting_instructions: Instructions for the LLM on how to format output.
|
|
53
|
+
"""
|
|
54
|
+
self.func = func
|
|
55
|
+
self._formatting_instructions = formatting_instructions
|
|
56
|
+
self.__name__ = func.__name__
|
|
57
|
+
self.__doc__ = func.__doc__
|
|
58
|
+
|
|
59
|
+
def formatting_instructions(self) -> str:
|
|
60
|
+
"""Return the formatting instructions for the LLM.
|
|
61
|
+
|
|
62
|
+
These instructions are added to the system prompt to guide the LLM
|
|
63
|
+
on how to format its output for parsing.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
The formatting instructions string.
|
|
67
|
+
"""
|
|
68
|
+
return self._formatting_instructions
|
|
69
|
+
|
|
70
|
+
def __call__(self, response: "AnyResponse") -> OutputT:
|
|
71
|
+
"""Parse the response using the wrapped function.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
response: The response object from the LLM call.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
The parsed output of type OutputT.
|
|
78
|
+
|
|
79
|
+
Raises:
|
|
80
|
+
Any exception raised by the wrapped parsing function.
|
|
81
|
+
"""
|
|
82
|
+
return self.func(response)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def output_parser(
|
|
86
|
+
*,
|
|
87
|
+
formatting_instructions: str,
|
|
88
|
+
) -> Callable[[Callable[["AnyResponse"], OutputT]], OutputParser[OutputT]]:
|
|
89
|
+
"""Decorator to create an output parser for custom format parsing.
|
|
90
|
+
|
|
91
|
+
Use this decorator to create custom parsers for non-JSON formats like
|
|
92
|
+
XML, YAML, CSV, or any custom text structure. The decorated function
|
|
93
|
+
receives the full Response object and returns the parsed output.
|
|
94
|
+
|
|
95
|
+
This is the recommended way to handle custom output formats that don't
|
|
96
|
+
fit the JSON/BaseModel paradigm. The formatting instructions guide the
|
|
97
|
+
LLM on how to structure its output, and the parsing function extracts
|
|
98
|
+
the data you need.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
formatting_instructions: Instructions for the LLM on how to format
|
|
102
|
+
the output. These will be added to the system prompt.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Decorator that converts a function into an OutputParser.
|
|
106
|
+
|
|
107
|
+
Example:
|
|
108
|
+
|
|
109
|
+
XML parsing:
|
|
110
|
+
```python
|
|
111
|
+
@llm.output_parser(
|
|
112
|
+
formatting_instructions='''
|
|
113
|
+
Return the book information in this XML structure:
|
|
114
|
+
<book>
|
|
115
|
+
<title>Book Title</title>
|
|
116
|
+
<author>Author Name</author>
|
|
117
|
+
<rating>5</rating>
|
|
118
|
+
</book>
|
|
119
|
+
'''
|
|
120
|
+
)
|
|
121
|
+
def parse_book_xml(response: llm.AnyResponse) -> Book:
|
|
122
|
+
import xml.etree.ElementTree as ET
|
|
123
|
+
text = "".join(part.text for part in response.texts)
|
|
124
|
+
root = ET.fromstring(text)
|
|
125
|
+
return Book(
|
|
126
|
+
title=root.find("title").text,
|
|
127
|
+
author=root.find("author").text,
|
|
128
|
+
rating=int(root.find("rating").text),
|
|
129
|
+
)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Example:
|
|
133
|
+
|
|
134
|
+
CSV parsing:
|
|
135
|
+
```python
|
|
136
|
+
@llm.output_parser(
|
|
137
|
+
formatting_instructions='''
|
|
138
|
+
Return book information as CSV format with header:
|
|
139
|
+
title,author,rating
|
|
140
|
+
Book 1,Author 1,5
|
|
141
|
+
Book 2,Author 2,4
|
|
142
|
+
'''
|
|
143
|
+
)
|
|
144
|
+
def parse_books_csv(response: llm.AnyResponse) -> list[Book]:
|
|
145
|
+
text = "".join(part.text for part in response.texts)
|
|
146
|
+
lines = text.strip().split('\\n')[1:] # Skip header
|
|
147
|
+
return [
|
|
148
|
+
Book(
|
|
149
|
+
title=line.split(',')[0].strip(),
|
|
150
|
+
author=line.split(',')[1].strip(),
|
|
151
|
+
rating=int(line.split(',')[2]),
|
|
152
|
+
)
|
|
153
|
+
for line in lines
|
|
154
|
+
]
|
|
155
|
+
```
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
def decorator(
|
|
159
|
+
func: Callable[["AnyResponse"], OutputT],
|
|
160
|
+
) -> OutputParser[OutputT]:
|
|
161
|
+
return OutputParser(func, formatting_instructions)
|
|
162
|
+
|
|
163
|
+
return decorator
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def is_output_parser(obj: Any) -> TypeIs[OutputParser[Any]]: # noqa: ANN401
|
|
167
|
+
"""Check if an object is an OutputParser.
|
|
168
|
+
|
|
169
|
+
This is a type guard function that narrows the type of `obj` to
|
|
170
|
+
`OutputParser[Any, Any]` when it returns True.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
obj: The object to check.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
True if the object is an OutputParser instance, False otherwise.
|
|
177
|
+
"""
|
|
178
|
+
return isinstance(obj, OutputParser)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""
|
|
2
|
+
--------------------------------------------------------------------------------
|
|
3
|
+
Source: https://github.com/pydantic/pydantic/issues/6381#issuecomment-1831607091
|
|
4
|
+
By: silviumarcu
|
|
5
|
+
|
|
6
|
+
This code is used in accordance with the repository's license, and this reference
|
|
7
|
+
serves as an acknowledgment of the original author's contribution to this project.
|
|
8
|
+
--------------------------------------------------------------------------------
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import inspect
|
|
12
|
+
from typing import Any, Generic, NoReturn, Union, cast, get_args, get_origin
|
|
13
|
+
|
|
14
|
+
from pydantic import BaseModel, create_model
|
|
15
|
+
|
|
16
|
+
from .format import FormattableT
|
|
17
|
+
|
|
18
|
+
# Cache for generated partial models to avoid recreation
|
|
19
|
+
_partial_model_cache: dict[type[Any], type[Any]] = {}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Partial(Generic[FormattableT]):
|
|
23
|
+
"""Generate a new class with all attributes optionals.
|
|
24
|
+
|
|
25
|
+
Notes:
|
|
26
|
+
This will wrap a class inheriting form BaseModel and will recursively
|
|
27
|
+
convert all its attributes and its children's attributes to optionals.
|
|
28
|
+
|
|
29
|
+
Example:
|
|
30
|
+
Partial[SomeModel]
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __new__(
|
|
34
|
+
cls,
|
|
35
|
+
*args: object, # noqa :ARG003
|
|
36
|
+
**kwargs: object, # noqa :ARG003
|
|
37
|
+
) -> "Partial[FormattableT]":
|
|
38
|
+
"""Cannot instantiate.
|
|
39
|
+
|
|
40
|
+
Raises:
|
|
41
|
+
TypeError: Direct instantiation not allowed.
|
|
42
|
+
"""
|
|
43
|
+
raise TypeError(
|
|
44
|
+
"Cannot instantiate abstract Partial class."
|
|
45
|
+
) # pragma: no cover
|
|
46
|
+
|
|
47
|
+
def __init_subclass__(
|
|
48
|
+
cls,
|
|
49
|
+
*args: object,
|
|
50
|
+
**kwargs: object,
|
|
51
|
+
) -> NoReturn:
|
|
52
|
+
"""Cannot subclass.
|
|
53
|
+
|
|
54
|
+
Raises:
|
|
55
|
+
TypeError: Subclassing not allowed.
|
|
56
|
+
"""
|
|
57
|
+
raise TypeError(f"Cannot subclass {cls.__module__}.Partial") # pragma: no cover
|
|
58
|
+
|
|
59
|
+
def __class_getitem__(
|
|
60
|
+
cls,
|
|
61
|
+
wrapped_class: type[FormattableT],
|
|
62
|
+
) -> type[FormattableT]:
|
|
63
|
+
"""Convert model to a partial model with all fields being optionals.
|
|
64
|
+
|
|
65
|
+
Recursively converts all fields in a Pydantic BaseModel to optional,
|
|
66
|
+
handling nested models and generic types like list[Book].
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
wrapped_class: The BaseModel class to make partial
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
A new BaseModel class with all fields optional (or original if not BaseModel)
|
|
73
|
+
|
|
74
|
+
Example:
|
|
75
|
+
>>> class Author(BaseModel):
|
|
76
|
+
... first_name: str
|
|
77
|
+
... last_name: str
|
|
78
|
+
>>> class Book(BaseModel):
|
|
79
|
+
... title: str
|
|
80
|
+
... author: Author
|
|
81
|
+
>>> PartialBook = Partial[Book]
|
|
82
|
+
>>> partial = PartialBook(title="The Name")
|
|
83
|
+
>>> partial.author # None
|
|
84
|
+
"""
|
|
85
|
+
# Return non-BaseModel types unchanged
|
|
86
|
+
if not (
|
|
87
|
+
inspect.isclass(wrapped_class) and issubclass(wrapped_class, BaseModel)
|
|
88
|
+
):
|
|
89
|
+
return wrapped_class
|
|
90
|
+
|
|
91
|
+
# Check cache to avoid regenerating
|
|
92
|
+
if wrapped_class in _partial_model_cache:
|
|
93
|
+
return cast(type[FormattableT], _partial_model_cache[wrapped_class])
|
|
94
|
+
|
|
95
|
+
# Recursively make all fields optional
|
|
96
|
+
partial_fields: dict[str, Any] = {}
|
|
97
|
+
for field_name, field_info in wrapped_class.model_fields.items():
|
|
98
|
+
field_type = field_info.annotation
|
|
99
|
+
|
|
100
|
+
# Recursively handle nested BaseModel fields
|
|
101
|
+
if inspect.isclass(field_type) and issubclass(field_type, BaseModel):
|
|
102
|
+
field_type = Partial[field_type]
|
|
103
|
+
|
|
104
|
+
# Handle generic types with BaseModel args (e.g., list[Book], dict[str, Book])
|
|
105
|
+
origin = get_origin(field_type)
|
|
106
|
+
if origin is not None:
|
|
107
|
+
args = get_args(field_type)
|
|
108
|
+
# Recursively convert BaseModel args to partial
|
|
109
|
+
new_args = tuple(
|
|
110
|
+
Partial[arg]
|
|
111
|
+
if inspect.isclass(arg) and issubclass(arg, BaseModel)
|
|
112
|
+
else arg
|
|
113
|
+
for arg in args
|
|
114
|
+
)
|
|
115
|
+
# Reconstruct generic type with new args
|
|
116
|
+
if new_args != args:
|
|
117
|
+
field_type = origin[new_args]
|
|
118
|
+
|
|
119
|
+
# Make field optional with None default
|
|
120
|
+
optional_type = Union[field_type, None] # noqa: UP007
|
|
121
|
+
partial_fields[field_name] = (optional_type, None)
|
|
122
|
+
|
|
123
|
+
# Create new model with "Partial" prefix
|
|
124
|
+
partial_model = create_model(
|
|
125
|
+
f"Partial{wrapped_class.__name__}", __base__=BaseModel, **partial_fields
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# Cache the generated model
|
|
129
|
+
_partial_model_cache[wrapped_class] = partial_model
|
|
130
|
+
|
|
131
|
+
return cast(type[FormattableT], partial_model)
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"""Utilities for handling primitive types in formatting."""
|
|
2
|
+
|
|
3
|
+
import inspect
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from types import UnionType
|
|
6
|
+
from typing import (
|
|
7
|
+
Annotated,
|
|
8
|
+
Any,
|
|
9
|
+
Literal,
|
|
10
|
+
Protocol,
|
|
11
|
+
TypeAlias,
|
|
12
|
+
Union,
|
|
13
|
+
cast,
|
|
14
|
+
get_args,
|
|
15
|
+
get_origin,
|
|
16
|
+
)
|
|
17
|
+
from typing_extensions import TypeIs
|
|
18
|
+
|
|
19
|
+
from pydantic import create_model
|
|
20
|
+
|
|
21
|
+
PrimitiveType: TypeAlias = (
|
|
22
|
+
str
|
|
23
|
+
| int
|
|
24
|
+
| float
|
|
25
|
+
| bool
|
|
26
|
+
| bytes
|
|
27
|
+
| list[Any]
|
|
28
|
+
| set[Any]
|
|
29
|
+
| tuple[Any, ...]
|
|
30
|
+
| dict[Any, Any]
|
|
31
|
+
)
|
|
32
|
+
"""Primitive types that can be used with format parameter.
|
|
33
|
+
|
|
34
|
+
These types are automatically wrapped in a BaseModel for schema generation,
|
|
35
|
+
then unwrapped after validation to return the primitive value.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class PrimitiveWrapperModel(Protocol):
|
|
40
|
+
"""Protocol for wrapper models with an output field."""
|
|
41
|
+
|
|
42
|
+
output: Any
|
|
43
|
+
model_fields: Any
|
|
44
|
+
|
|
45
|
+
def __init__(self, *, output: Any) -> None: ... # noqa: ANN401
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def model_json_schema(cls) -> dict[str, Any]: ...
|
|
49
|
+
|
|
50
|
+
@classmethod
|
|
51
|
+
def model_validate_json(cls, json_data: str) -> "PrimitiveWrapperModel": ...
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def is_primitive_type(
|
|
55
|
+
type_: Any, # noqa: ANN401
|
|
56
|
+
) -> TypeIs[type[PrimitiveType]]:
|
|
57
|
+
"""Check if a type is a primitive type that needs wrapping.
|
|
58
|
+
|
|
59
|
+
Returns True for:
|
|
60
|
+
- Basic primitives: str, int, float, bool, bytes, list, set, tuple, dict
|
|
61
|
+
- Enum types
|
|
62
|
+
- Generic types with primitive origins: list[Book], dict[str, int]
|
|
63
|
+
- Literal types
|
|
64
|
+
- Union types (including Optional)
|
|
65
|
+
- Annotated types
|
|
66
|
+
|
|
67
|
+
Returns False for:
|
|
68
|
+
- BaseModel subclasses (already have model_json_schema)
|
|
69
|
+
- None/NoneType
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
type_: The type to check
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
True if the type is a primitive that needs wrapping
|
|
76
|
+
|
|
77
|
+
Example:
|
|
78
|
+
>>> is_primitive_type(str)
|
|
79
|
+
True
|
|
80
|
+
>>> is_primitive_type(list[int])
|
|
81
|
+
True
|
|
82
|
+
>>> from pydantic import BaseModel
|
|
83
|
+
>>> class Book(BaseModel):
|
|
84
|
+
... title: str
|
|
85
|
+
>>> is_primitive_type(Book)
|
|
86
|
+
False
|
|
87
|
+
"""
|
|
88
|
+
primitive_types: set[type[PrimitiveType]] = {
|
|
89
|
+
str,
|
|
90
|
+
int,
|
|
91
|
+
float,
|
|
92
|
+
bool,
|
|
93
|
+
bytes,
|
|
94
|
+
list,
|
|
95
|
+
set,
|
|
96
|
+
tuple,
|
|
97
|
+
dict,
|
|
98
|
+
}
|
|
99
|
+
special_types: set[Any] = {Annotated, Literal, Union, UnionType}
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
(inspect.isclass(type_) and issubclass(type_, Enum))
|
|
103
|
+
or type_ in primitive_types
|
|
104
|
+
or get_origin(type_) in primitive_types.union(special_types)
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _get_type_name(type_: Any) -> str: # noqa: ANN401
|
|
109
|
+
"""Extract a clean name from a type for use in model naming.
|
|
110
|
+
|
|
111
|
+
Handles Annotated types by extracting the underlying type,
|
|
112
|
+
and generates clean names for generic types.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
type_: The type to extract a name from
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
A clean string suitable for use in a Python class name
|
|
119
|
+
|
|
120
|
+
Example:
|
|
121
|
+
>>> _get_type_name(str)
|
|
122
|
+
'str'
|
|
123
|
+
>>> _get_type_name(list[int])
|
|
124
|
+
'list_int_'
|
|
125
|
+
"""
|
|
126
|
+
# Import Annotated locally
|
|
127
|
+
# Check if this is an Annotated type
|
|
128
|
+
if get_origin(type_) in {Annotated}:
|
|
129
|
+
# For Annotated types, use the first arg (the actual type)
|
|
130
|
+
return _get_type_name(get_args(type_)[0])
|
|
131
|
+
|
|
132
|
+
# If the type has a __name__ attribute, use it
|
|
133
|
+
if hasattr(type_, "__name__"):
|
|
134
|
+
return type_.__name__
|
|
135
|
+
|
|
136
|
+
# For complex generics like list[Book], use string representation
|
|
137
|
+
type_str = str(type_)
|
|
138
|
+
|
|
139
|
+
# Clean up the string to make it a valid Python identifier
|
|
140
|
+
# Replace brackets and commas with underscores
|
|
141
|
+
clean = (
|
|
142
|
+
type_str.replace("[", "_")
|
|
143
|
+
.replace("]", "_")
|
|
144
|
+
.replace(", ", "_")
|
|
145
|
+
.replace(" ", "")
|
|
146
|
+
.replace("'", "")
|
|
147
|
+
.replace('"', "")
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return clean
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def create_wrapper_model(
|
|
154
|
+
primitive_type: Any, # noqa: ANN401
|
|
155
|
+
) -> type[PrimitiveWrapperModel]:
|
|
156
|
+
"""Create a wrapper BaseModel for a primitive type.
|
|
157
|
+
|
|
158
|
+
The wrapper has a single field called "output" containing the primitive value.
|
|
159
|
+
Uses Pydantic's create_model() to generate the wrapper dynamically.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
primitive_type: The primitive type to wrap
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
A dynamically created BaseModel with an "output" field
|
|
166
|
+
|
|
167
|
+
Example:
|
|
168
|
+
>>> wrapper = create_wrapper_model(str)
|
|
169
|
+
>>> instance = wrapper(output="hello")
|
|
170
|
+
>>> instance.output
|
|
171
|
+
'hello'
|
|
172
|
+
|
|
173
|
+
>>> from pydantic import BaseModel
|
|
174
|
+
>>> class Book(BaseModel):
|
|
175
|
+
... title: str
|
|
176
|
+
>>> wrapper = create_wrapper_model(list[Book])
|
|
177
|
+
>>> books = [Book(title="Test")]
|
|
178
|
+
>>> instance = wrapper(output=books)
|
|
179
|
+
>>> len(instance.output)
|
|
180
|
+
1
|
|
181
|
+
"""
|
|
182
|
+
# Get a clean name for the wrapper class
|
|
183
|
+
type_name = _get_type_name(primitive_type)
|
|
184
|
+
|
|
185
|
+
# Create wrapper model with "output" field (required)
|
|
186
|
+
wrapper = create_model(
|
|
187
|
+
f"{type_name}Output",
|
|
188
|
+
__doc__=f"Wrapper for primitive type {type_name}",
|
|
189
|
+
output=(primitive_type, ...), # ... means required
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
return cast(type[PrimitiveWrapperModel], wrapper)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Type for the formatting module."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Literal, Protocol, runtime_checkable
|
|
4
|
+
from typing_extensions import TypeAliasType, TypeVar
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
|
|
8
|
+
from .primitives import PrimitiveType
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from .format import Format
|
|
12
|
+
from .output_parser import OutputParser
|
|
13
|
+
|
|
14
|
+
FormattableT = TypeVar(
|
|
15
|
+
"FormattableT", bound=BaseModel | PrimitiveType | None, default=None
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
FormatSpec = TypeAliasType(
|
|
19
|
+
"FormatSpec",
|
|
20
|
+
"type[FormattableT] | Format[FormattableT] | OutputParser[FormattableT]",
|
|
21
|
+
type_params=(FormattableT,),
|
|
22
|
+
)
|
|
23
|
+
"""Type alias for format parameter types.
|
|
24
|
+
|
|
25
|
+
A FormatSpec can be:
|
|
26
|
+
- A type (class) that represents the format schema (e.g., a Pydantic BaseModel)
|
|
27
|
+
- A Format wrapper that includes mode and other metadata
|
|
28
|
+
- An OutputParser for custom parsing logic
|
|
29
|
+
"""
|
|
30
|
+
"""Type variable for structured response format types.
|
|
31
|
+
|
|
32
|
+
This TypeVar represents the type of structured output format that LLM responses
|
|
33
|
+
can be parsed into, or None if no format is specified.
|
|
34
|
+
|
|
35
|
+
Supported format types:
|
|
36
|
+
- Pydantic BaseModel subclasses
|
|
37
|
+
- Primitive types: str, int, float, bool, bytes, list, set, tuple, dict
|
|
38
|
+
- Generic collections: list[Book], dict[str, int], etc.
|
|
39
|
+
- Union, Literal, and Annotated types
|
|
40
|
+
- Enum types
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
FormattingMode = Literal[
|
|
45
|
+
"strict",
|
|
46
|
+
"json",
|
|
47
|
+
"tool",
|
|
48
|
+
"parser",
|
|
49
|
+
]
|
|
50
|
+
"""Available modes for response format generation.
|
|
51
|
+
|
|
52
|
+
- "strict": Use strict mode for structured outputs, asking the LLM to strictly adhere
|
|
53
|
+
to a given JSON schema. Not all providers or models support it, and may not be
|
|
54
|
+
compatible with tool calling. When making a call using this mode, an
|
|
55
|
+
`llm.FeatureNotSupportedError` error may be raised if the mode is unsupported.
|
|
56
|
+
|
|
57
|
+
- "json": Use JSON mode for structured outputs. In contrast to strict mode, we ask the
|
|
58
|
+
LLM to output JSON as text, though without guarantees that the model will output
|
|
59
|
+
the expected format schema. If the provider has explicit JSON mode, it will be used;
|
|
60
|
+
otherwise, Mirascope will modify the system prompt to request JSON output. May
|
|
61
|
+
raise an `llm.FeatureNotSupportedError` if tools are present and the
|
|
62
|
+
model does not support tool calling when using JSON mode.
|
|
63
|
+
|
|
64
|
+
- "tool": Use forced tool calling to structure outputs. Mirascope will construct an
|
|
65
|
+
ad-hoc tool with the required json schema as tool args. When the LLM chooses that
|
|
66
|
+
tool, it will automatically be converted from a `ToolCall` into regular response
|
|
67
|
+
content (abstracting over the tool call). If other tools are present, they will
|
|
68
|
+
be handled as regular tool calls.
|
|
69
|
+
|
|
70
|
+
- "parser": Use custom parsing with formatting instructions. No schema generation or
|
|
71
|
+
structured output features. The LLM receives only formatting instructions and the
|
|
72
|
+
response is parsed using a custom parser function created with `@llm.output_parser`.
|
|
73
|
+
|
|
74
|
+
Note: When `llm.format` is not used, the provider will automatically choose a mode at call time.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@runtime_checkable
|
|
79
|
+
class HasFormattingInstructions(Protocol):
|
|
80
|
+
"""Protocol for classes that have been decorated with `@format()`."""
|
|
81
|
+
|
|
82
|
+
@classmethod
|
|
83
|
+
def formatting_instructions(cls) -> str | None: ...
|