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,184 @@
|
|
|
1
|
+
"""The `llm.tool` decorator for turning functions into tools."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import overload
|
|
5
|
+
|
|
6
|
+
from ..context import DepsT
|
|
7
|
+
from ..types import JsonableCovariantT, P
|
|
8
|
+
from . import _utils as _tool_utils
|
|
9
|
+
from .protocols import AsyncContextToolFn, AsyncToolFn, ContextToolFn, ToolFn
|
|
10
|
+
from .tools import AsyncContextTool, AsyncTool, ContextTool, Tool
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(kw_only=True)
|
|
14
|
+
class ToolDecorator:
|
|
15
|
+
"""Protocol for the tool decorator."""
|
|
16
|
+
|
|
17
|
+
strict: bool | None = None
|
|
18
|
+
"""Whether to use strict tool calling, if supported by the provider.
|
|
19
|
+
|
|
20
|
+
If set to None, then it will use the provider's default setting (usually the
|
|
21
|
+
strictest possible).
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
@overload
|
|
25
|
+
def __call__( # pyright:ignore[reportOverlappingOverload]
|
|
26
|
+
self, fn: ContextToolFn[DepsT, P, JsonableCovariantT]
|
|
27
|
+
) -> ContextTool[DepsT, JsonableCovariantT, P]:
|
|
28
|
+
"""Call the decorator with a context function."""
|
|
29
|
+
...
|
|
30
|
+
|
|
31
|
+
@overload
|
|
32
|
+
def __call__( # pyright:ignore[reportOverlappingOverload]
|
|
33
|
+
self, fn: AsyncContextToolFn[DepsT, P, JsonableCovariantT]
|
|
34
|
+
) -> AsyncContextTool[DepsT, JsonableCovariantT, P]:
|
|
35
|
+
"""Call the decorator with an async context function."""
|
|
36
|
+
...
|
|
37
|
+
|
|
38
|
+
@overload
|
|
39
|
+
def __call__(
|
|
40
|
+
self, fn: ToolFn[P, JsonableCovariantT]
|
|
41
|
+
) -> Tool[P, JsonableCovariantT]:
|
|
42
|
+
"""Call the decorator with a sync function."""
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
@overload
|
|
46
|
+
def __call__(
|
|
47
|
+
self, fn: AsyncToolFn[P, JsonableCovariantT]
|
|
48
|
+
) -> AsyncTool[P, JsonableCovariantT]:
|
|
49
|
+
"""Call the decorator with an async function."""
|
|
50
|
+
...
|
|
51
|
+
|
|
52
|
+
def __call__(
|
|
53
|
+
self,
|
|
54
|
+
fn: ContextToolFn[DepsT, P, JsonableCovariantT]
|
|
55
|
+
| AsyncContextToolFn[DepsT, P, JsonableCovariantT]
|
|
56
|
+
| ToolFn[P, JsonableCovariantT]
|
|
57
|
+
| AsyncToolFn[P, JsonableCovariantT],
|
|
58
|
+
) -> (
|
|
59
|
+
ContextTool[DepsT, JsonableCovariantT, P]
|
|
60
|
+
| AsyncContextTool[DepsT, JsonableCovariantT, P]
|
|
61
|
+
| Tool[P, JsonableCovariantT]
|
|
62
|
+
| AsyncTool[P, JsonableCovariantT]
|
|
63
|
+
):
|
|
64
|
+
"""Call the decorator with a function."""
|
|
65
|
+
is_context = _tool_utils.is_context_tool_fn(fn)
|
|
66
|
+
is_async = _tool_utils.is_async_tool_fn(fn)
|
|
67
|
+
|
|
68
|
+
if is_context and is_async:
|
|
69
|
+
return AsyncContextTool[DepsT, JsonableCovariantT, P].from_function(
|
|
70
|
+
fn, strict=self.strict
|
|
71
|
+
)
|
|
72
|
+
elif is_context:
|
|
73
|
+
return ContextTool[DepsT, JsonableCovariantT, P].from_function(
|
|
74
|
+
fn, strict=self.strict
|
|
75
|
+
)
|
|
76
|
+
elif is_async:
|
|
77
|
+
return AsyncTool[P, JsonableCovariantT].from_function(
|
|
78
|
+
fn, strict=self.strict
|
|
79
|
+
)
|
|
80
|
+
else:
|
|
81
|
+
return Tool[P, JsonableCovariantT].from_function(fn, strict=self.strict)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@overload
|
|
85
|
+
def tool( # pyright:ignore[reportOverlappingOverload]
|
|
86
|
+
__fn: AsyncContextToolFn[DepsT, P, JsonableCovariantT],
|
|
87
|
+
) -> AsyncContextTool[DepsT, JsonableCovariantT, P]:
|
|
88
|
+
"""Overload for async context tool functions."""
|
|
89
|
+
...
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@overload
|
|
93
|
+
def tool( # pyright:ignore[reportOverlappingOverload]
|
|
94
|
+
__fn: ContextToolFn[DepsT, P, JsonableCovariantT],
|
|
95
|
+
) -> ContextTool[DepsT, JsonableCovariantT, P]:
|
|
96
|
+
"""Overload for context tool functions."""
|
|
97
|
+
...
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@overload
|
|
101
|
+
def tool(__fn: AsyncToolFn[P, JsonableCovariantT]) -> AsyncTool[P, JsonableCovariantT]:
|
|
102
|
+
"""Overload for regular async tool functions."""
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@overload
|
|
107
|
+
def tool(__fn: ToolFn[P, JsonableCovariantT]) -> Tool[P, JsonableCovariantT]:
|
|
108
|
+
"""Overload for regular sync tool functions."""
|
|
109
|
+
...
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@overload
|
|
113
|
+
def tool(*, strict: bool | None = None) -> ToolDecorator:
|
|
114
|
+
"""Overload for setting non-default arguments."""
|
|
115
|
+
...
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def tool(
|
|
119
|
+
__fn: ContextToolFn[DepsT, P, JsonableCovariantT]
|
|
120
|
+
| AsyncContextToolFn[DepsT, P, JsonableCovariantT]
|
|
121
|
+
| ToolFn[P, JsonableCovariantT]
|
|
122
|
+
| AsyncToolFn[P, JsonableCovariantT]
|
|
123
|
+
| None = None,
|
|
124
|
+
*,
|
|
125
|
+
strict: bool | None = None,
|
|
126
|
+
) -> (
|
|
127
|
+
ContextTool[DepsT, JsonableCovariantT, P]
|
|
128
|
+
| AsyncContextTool[DepsT, JsonableCovariantT, P]
|
|
129
|
+
| Tool[P, JsonableCovariantT]
|
|
130
|
+
| AsyncTool[P, JsonableCovariantT]
|
|
131
|
+
| ToolDecorator
|
|
132
|
+
):
|
|
133
|
+
'''Decorator that turns a function into a tool definition.
|
|
134
|
+
|
|
135
|
+
This decorator creates a `Tool` or `ContextTool` that can be used with `llm.call`.
|
|
136
|
+
The function's name, docstring, and type hints are used to generate the
|
|
137
|
+
tool's metadata.
|
|
138
|
+
|
|
139
|
+
If the first parameter is named 'ctx' or typed as `llm.Context[T]`, it creates
|
|
140
|
+
a ContextTool. Otherwise, it creates a regular Tool.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
strict: Whether the tool should use strict mode when supported by the model.
|
|
144
|
+
If None, uses provider's default (usually as strict as possible).
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
A decorator function that converts the function into a Tool or ContextTool.
|
|
148
|
+
|
|
149
|
+
Examples:
|
|
150
|
+
|
|
151
|
+
Regular tool:
|
|
152
|
+
```python
|
|
153
|
+
from mirascope import llm
|
|
154
|
+
|
|
155
|
+
@llm.tool
|
|
156
|
+
def available_books() -> list[str]:
|
|
157
|
+
"""Returns the list of available books."""
|
|
158
|
+
return ["The Name of the Wind"]
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Context tool:
|
|
162
|
+
```python
|
|
163
|
+
from dataclasses import dataclass
|
|
164
|
+
|
|
165
|
+
from mirascope import llm
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
@dataclass
|
|
169
|
+
class Library:
|
|
170
|
+
books: list[str]
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
library = Library(books=["Mistborn", "Gödel, Escher, Bach", "Dune"])
|
|
174
|
+
|
|
175
|
+
@llm.tool
|
|
176
|
+
def available_books(ctx: llm.Context[Library]) -> list[str]:
|
|
177
|
+
"""Returns the list of available books."""
|
|
178
|
+
return ctx.deps.books
|
|
179
|
+
```
|
|
180
|
+
'''
|
|
181
|
+
decorator = ToolDecorator(strict=strict)
|
|
182
|
+
if __fn is None:
|
|
183
|
+
return decorator
|
|
184
|
+
return decorator(__fn)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
from typing import Any, Protocol
|
|
2
|
+
|
|
3
|
+
from ..context import Context, DepsT
|
|
4
|
+
from ..types import JsonableCovariantT, P
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ToolFn(Protocol[P, JsonableCovariantT]):
|
|
8
|
+
"""Protocol for the tool function."""
|
|
9
|
+
|
|
10
|
+
__name__: str
|
|
11
|
+
"""The name of the tool."""
|
|
12
|
+
|
|
13
|
+
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> JsonableCovariantT:
|
|
14
|
+
"""Call the function with the given arguments."""
|
|
15
|
+
raise NotImplementedError()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AsyncToolFn(Protocol[P, JsonableCovariantT]):
|
|
19
|
+
"""Protocol for the async tool function."""
|
|
20
|
+
|
|
21
|
+
__name__: str
|
|
22
|
+
"""The name of the tool."""
|
|
23
|
+
|
|
24
|
+
async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> JsonableCovariantT:
|
|
25
|
+
"""Call the function with the given arguments."""
|
|
26
|
+
raise NotImplementedError()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ContextToolFn(Protocol[DepsT, P, JsonableCovariantT]):
|
|
30
|
+
"""Protocol for the context tool function."""
|
|
31
|
+
|
|
32
|
+
__name__: str
|
|
33
|
+
"""The name of the tool."""
|
|
34
|
+
|
|
35
|
+
def __call__(
|
|
36
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
37
|
+
) -> JsonableCovariantT:
|
|
38
|
+
"""Call the function with the given arguments."""
|
|
39
|
+
raise NotImplementedError()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class AsyncContextToolFn(Protocol[DepsT, P, JsonableCovariantT]):
|
|
43
|
+
"""Protocol for the async context tool function."""
|
|
44
|
+
|
|
45
|
+
__name__: str
|
|
46
|
+
"""The name of the tool."""
|
|
47
|
+
|
|
48
|
+
async def __call__(
|
|
49
|
+
self, ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
50
|
+
) -> JsonableCovariantT:
|
|
51
|
+
"""Call the function with the given arguments."""
|
|
52
|
+
raise NotImplementedError()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class KwargsCallable(Protocol[JsonableCovariantT]):
|
|
56
|
+
"""Protocol for functions that can be called with `Any`-typed kwargs.
|
|
57
|
+
|
|
58
|
+
Used internally to type-cast tool functions for compatibility with
|
|
59
|
+
json.loads() output when executing tool calls.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
def __call__(self, **kwargs: dict[str, Any]) -> JsonableCovariantT: ...
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class AsyncKwargsCallable(Protocol[JsonableCovariantT]):
|
|
66
|
+
"""Protocol for async functions that can be called with `Any`-typed kwargs.
|
|
67
|
+
|
|
68
|
+
Used internally to type-cast async tool functions for compatibility with
|
|
69
|
+
json.loads() output when executing tool calls.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
async def __call__(self, **kwargs: dict[str, Any]) -> JsonableCovariantT: ...
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class ContextKwargsCallable(Protocol[DepsT, JsonableCovariantT]):
|
|
76
|
+
"""Protocol for context functions that can be called with `Any`-typed kwargs.
|
|
77
|
+
|
|
78
|
+
Used internally to type-cast context tool functions for compatibility with
|
|
79
|
+
json.loads() output when executing tool calls.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
def __call__(
|
|
83
|
+
self, ctx: Context[DepsT], **kwargs: dict[str, Any]
|
|
84
|
+
) -> JsonableCovariantT: ...
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class AsyncJsonKwargsCallable(Protocol[DepsT, JsonableCovariantT]):
|
|
88
|
+
"""Protocol for async context functions that can be called with `Any`-typed kwargs.
|
|
89
|
+
|
|
90
|
+
Used internally to type-cast async context tool functions for compatibility with
|
|
91
|
+
json.loads() output when executing tool calls.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
async def __call__(
|
|
95
|
+
self, ctx: Context[DepsT], **kwargs: dict[str, Any]
|
|
96
|
+
) -> JsonableCovariantT: ...
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Base class for provider-native tools."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass(frozen=True)
|
|
7
|
+
class ProviderTool:
|
|
8
|
+
"""Base class for tools executed natively by providers.
|
|
9
|
+
|
|
10
|
+
Unlike regular tools which define functions that you execute locally,
|
|
11
|
+
provider tools are capabilities built into the provider's API.
|
|
12
|
+
The provider handles execution entirely server-side.
|
|
13
|
+
|
|
14
|
+
Provider tools have no sync/async distinction since they are not
|
|
15
|
+
executed by your code - they are configuration passed to the provider.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
name: str
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"""The `ToolSchema` class for defining tools that LLMs can request be called."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import (
|
|
8
|
+
Annotated,
|
|
9
|
+
Any,
|
|
10
|
+
Generic,
|
|
11
|
+
NamedTuple,
|
|
12
|
+
TypeAlias,
|
|
13
|
+
TypedDict,
|
|
14
|
+
TypeVar,
|
|
15
|
+
cast,
|
|
16
|
+
get_args,
|
|
17
|
+
get_origin,
|
|
18
|
+
get_type_hints,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
from docstring_parser import parse
|
|
22
|
+
from pydantic import BaseModel, Field, create_model
|
|
23
|
+
from pydantic.fields import FieldInfo
|
|
24
|
+
|
|
25
|
+
from ..._utils import copy_function_metadata
|
|
26
|
+
from ..content import ToolCall
|
|
27
|
+
from ..types import Jsonable
|
|
28
|
+
from .protocols import AsyncContextToolFn, AsyncToolFn, ContextToolFn, ToolFn
|
|
29
|
+
|
|
30
|
+
AnyToolFn: TypeAlias = (
|
|
31
|
+
ToolFn[..., Jsonable]
|
|
32
|
+
| AsyncToolFn[..., Jsonable]
|
|
33
|
+
| ContextToolFn[Any, ..., Jsonable]
|
|
34
|
+
| AsyncContextToolFn[Any, ..., Jsonable]
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
ToolFnT = TypeVar(
|
|
38
|
+
"ToolFnT",
|
|
39
|
+
bound=AnyToolFn,
|
|
40
|
+
covariant=True,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
ToolSchemaT = TypeVar("ToolSchemaT", bound="ToolSchema[AnyToolFn]", covariant=True)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
ModelJsonSchema = TypedDict(
|
|
47
|
+
"ModelJsonSchema",
|
|
48
|
+
{
|
|
49
|
+
"properties": dict[str, dict[str, Any]],
|
|
50
|
+
"required": list[str],
|
|
51
|
+
"$defs": dict[str, dict[str, Any]],
|
|
52
|
+
},
|
|
53
|
+
total=False,
|
|
54
|
+
)
|
|
55
|
+
"""Type for Pydantic's model_json_schema() output.
|
|
56
|
+
|
|
57
|
+
This TypedDict defines the structure of JSON schemas returned by Pydantic models,
|
|
58
|
+
allowing us to avoid type casts when extracting schema components.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class DocstringArg(NamedTuple):
|
|
63
|
+
"""A parameter from a docstring."""
|
|
64
|
+
|
|
65
|
+
name: str
|
|
66
|
+
description: str
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
FORMAT_TOOL_NAME = "__mirascope_formatted_output_tool__"
|
|
70
|
+
"""Reserved name of the formatted output tool.
|
|
71
|
+
|
|
72
|
+
Any call to a tool with this name is NOT considered a regular tool call, but will instead
|
|
73
|
+
be converted into textual output containing the arguments to the tool call.
|
|
74
|
+
"""
|
|
75
|
+
# TODO: Investigate whether using this hardcoded tool name has any adverse impact
|
|
76
|
+
# on model performance, compared to a tool name that references the name of the formatted
|
|
77
|
+
# class.
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dataclass
|
|
81
|
+
class ParsedDocstring:
|
|
82
|
+
args: list[DocstringArg]
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _parse_docstring_params(docstring: str | None) -> ParsedDocstring:
|
|
86
|
+
"""Parse parameter descriptions from a docstring.
|
|
87
|
+
|
|
88
|
+
Uses docstring-parser library which supports ReST, Google, Numpydoc-style and
|
|
89
|
+
Epydoc docstrings
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
docstring: The function's docstring
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
ParsedDocstring containing parameter descriptions
|
|
96
|
+
"""
|
|
97
|
+
if not docstring:
|
|
98
|
+
return ParsedDocstring(args=[])
|
|
99
|
+
|
|
100
|
+
parsed = parse(docstring)
|
|
101
|
+
args: list[DocstringArg] = []
|
|
102
|
+
|
|
103
|
+
for param in parsed.params:
|
|
104
|
+
if param.description:
|
|
105
|
+
args.append(
|
|
106
|
+
DocstringArg(name=param.arg_name, description=param.description)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
return ParsedDocstring(args=args)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class ToolParameterSchema(BaseModel):
|
|
113
|
+
"""JSON Schema for tool parameters (always an object with properties).
|
|
114
|
+
|
|
115
|
+
This contains real JSON Schema as generated by Pydantic, with full support
|
|
116
|
+
for complex schemas like anyOf, nested objects, validation constraints, etc.
|
|
117
|
+
Including $defs for complex type references.
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
properties: dict[str, dict[str, Any]] = Field(default_factory=dict)
|
|
121
|
+
"""Dictionary mapping parameter names to their JSON Schema definitions."""
|
|
122
|
+
|
|
123
|
+
required: list[str] = Field(default_factory=list)
|
|
124
|
+
"""List of required parameter names."""
|
|
125
|
+
|
|
126
|
+
additionalProperties: bool = False
|
|
127
|
+
"""Whether additional properties beyond those defined are allowed."""
|
|
128
|
+
|
|
129
|
+
defs: dict[str, dict[str, Any]] | None = Field(default=None, alias="$defs")
|
|
130
|
+
"""JSON Schema definitions for complex types referenced via $ref."""
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
@dataclass
|
|
134
|
+
class ToolSchema(Generic[ToolFnT]):
|
|
135
|
+
"""Underlying schema defining a tool that can be used by LLMs.
|
|
136
|
+
|
|
137
|
+
A ToolSchema represents a function that can be called by an LLM during a call.
|
|
138
|
+
It includes metadata like name, description, and parameter schema.
|
|
139
|
+
|
|
140
|
+
This class is not instantiated directly but created by the `@tool()` decorator.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
fn: ToolFnT
|
|
144
|
+
"""The function that implements the tool's functionality."""
|
|
145
|
+
|
|
146
|
+
name: str
|
|
147
|
+
"""The name of the tool, used by the LLM to identify which tool to call."""
|
|
148
|
+
|
|
149
|
+
description: str
|
|
150
|
+
"""Description of what the tool does, extracted from the function's docstring."""
|
|
151
|
+
|
|
152
|
+
parameters: ToolParameterSchema
|
|
153
|
+
"""JSON Schema describing the parameters accepted by the tool.
|
|
154
|
+
|
|
155
|
+
The serialized parameters table is cached for efficient hash lookups (e.g. when
|
|
156
|
+
caching provider-encoded tool representations in a LRU cache). Therefore,
|
|
157
|
+
it should **not be modified** after the ToolSchema is created.
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
strict: bool | None
|
|
161
|
+
"""Whether the tool should use strict mode when supported by the model.
|
|
162
|
+
|
|
163
|
+
If set to None, will use the provider's default setting (usually as strict as
|
|
164
|
+
possible).
|
|
165
|
+
"""
|
|
166
|
+
|
|
167
|
+
__name__: str
|
|
168
|
+
"""The name of the underlying function (preserved for decorator stacking)."""
|
|
169
|
+
|
|
170
|
+
def __hash__(self) -> int:
|
|
171
|
+
if not hasattr(self, "_hash"):
|
|
172
|
+
self._hash = hash(
|
|
173
|
+
(
|
|
174
|
+
self.name,
|
|
175
|
+
self.description,
|
|
176
|
+
self.strict,
|
|
177
|
+
self.parameters.model_dump_json(),
|
|
178
|
+
)
|
|
179
|
+
)
|
|
180
|
+
return self._hash
|
|
181
|
+
|
|
182
|
+
def __init__(
|
|
183
|
+
self,
|
|
184
|
+
fn: ToolFnT,
|
|
185
|
+
name: str,
|
|
186
|
+
description: str,
|
|
187
|
+
parameters: ToolParameterSchema,
|
|
188
|
+
*,
|
|
189
|
+
strict: bool | None = None,
|
|
190
|
+
) -> None:
|
|
191
|
+
"""Create a `ToolSchema` with the provided values.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
fn: The function that implements the tool's functionality
|
|
195
|
+
name: The name of the tool
|
|
196
|
+
description: Description of what the tool does
|
|
197
|
+
parameters: JSON Schema describing the parameters accepted by the tool
|
|
198
|
+
strict: Whether the tool should use strict mode when supported.
|
|
199
|
+
If None, uses provider's default (usually as strict as possible).
|
|
200
|
+
"""
|
|
201
|
+
self.fn = fn
|
|
202
|
+
self.name = name
|
|
203
|
+
self.description = description
|
|
204
|
+
self.parameters = parameters
|
|
205
|
+
self.strict = strict
|
|
206
|
+
copy_function_metadata(self, fn)
|
|
207
|
+
|
|
208
|
+
@classmethod
|
|
209
|
+
def from_function(
|
|
210
|
+
cls,
|
|
211
|
+
fn: AnyToolFn,
|
|
212
|
+
*,
|
|
213
|
+
strict: bool | None = None,
|
|
214
|
+
is_context_tool: bool = False,
|
|
215
|
+
) -> ToolSchema[AnyToolFn]:
|
|
216
|
+
"""Create a `ToolSchema` by inspecting a function and its docstring.
|
|
217
|
+
|
|
218
|
+
Uses Pydantic's create_model to dynamically build a model from the function
|
|
219
|
+
signature, then extracts the JSON schema from it. This leverages Pydantic's
|
|
220
|
+
robust type conversion and union handling.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
fn: The function to extract schema from
|
|
224
|
+
strict: Whether the tool should use strict mode when supported.
|
|
225
|
+
If None, uses provider's default (usually as strict as possible).
|
|
226
|
+
is_context_tool: Whether this is a context tool (skips the context parameter)
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
a `ToolSchema` representing the function
|
|
230
|
+
|
|
231
|
+
Raises:
|
|
232
|
+
ValueError: If the tool has a reserved name.
|
|
233
|
+
"""
|
|
234
|
+
name = fn.__name__
|
|
235
|
+
if name.startswith(FORMAT_TOOL_NAME):
|
|
236
|
+
raise ValueError(
|
|
237
|
+
f"Cannot use reserved name {FORMAT_TOOL_NAME} as tool name."
|
|
238
|
+
)
|
|
239
|
+
description = inspect.cleandoc(fn.__doc__) if fn.__doc__ else name
|
|
240
|
+
|
|
241
|
+
param_descriptions = _parse_docstring_params(fn.__doc__)
|
|
242
|
+
|
|
243
|
+
field_definitions: dict[str, tuple[Any, Any]] = {}
|
|
244
|
+
hints = get_type_hints(fn, include_extras=True)
|
|
245
|
+
|
|
246
|
+
context_param_skipped = False
|
|
247
|
+
for param in inspect.signature(fn).parameters.values():
|
|
248
|
+
# Skip args that are provided by Python or Mirascope, not LLM-generated.
|
|
249
|
+
# TODO: Handling of FromCallArgs
|
|
250
|
+
if param.name in ("self", "cls"):
|
|
251
|
+
continue
|
|
252
|
+
|
|
253
|
+
# For context tools, skip the first non-self/cls parameter (the context parameter)
|
|
254
|
+
if is_context_tool and not context_param_skipped:
|
|
255
|
+
context_param_skipped = True
|
|
256
|
+
continue
|
|
257
|
+
|
|
258
|
+
param_type = hints.get(param.name, Any)
|
|
259
|
+
default = ... if param.default is inspect.Parameter.empty else param.default
|
|
260
|
+
field_info = None
|
|
261
|
+
|
|
262
|
+
if get_origin(param_type) is Annotated:
|
|
263
|
+
args = get_args(param_type)
|
|
264
|
+
param_type = args[0]
|
|
265
|
+
for annotation in args[1:]:
|
|
266
|
+
if isinstance(annotation, FieldInfo):
|
|
267
|
+
field_info = annotation
|
|
268
|
+
break
|
|
269
|
+
|
|
270
|
+
if field_info is not None:
|
|
271
|
+
field_value = Field(
|
|
272
|
+
default=default,
|
|
273
|
+
description=field_info.description,
|
|
274
|
+
)
|
|
275
|
+
else:
|
|
276
|
+
docstring_description: str | None = None
|
|
277
|
+
for arg in param_descriptions.args:
|
|
278
|
+
if arg.name == param.name:
|
|
279
|
+
docstring_description = arg.description
|
|
280
|
+
break
|
|
281
|
+
if docstring_description:
|
|
282
|
+
field_value = Field(
|
|
283
|
+
default=default, description=docstring_description
|
|
284
|
+
)
|
|
285
|
+
else:
|
|
286
|
+
field_value = default
|
|
287
|
+
|
|
288
|
+
field_definitions[param.name] = (param_type, field_value)
|
|
289
|
+
|
|
290
|
+
TempModel = create_model("TempModel", **cast(dict[str, Any], field_definitions))
|
|
291
|
+
|
|
292
|
+
schema = cast(ModelJsonSchema, TempModel.model_json_schema())
|
|
293
|
+
|
|
294
|
+
parameters = ToolParameterSchema(
|
|
295
|
+
properties=schema.get("properties", {}),
|
|
296
|
+
required=schema.get("required", []),
|
|
297
|
+
additionalProperties=False,
|
|
298
|
+
)
|
|
299
|
+
if "$defs" in schema:
|
|
300
|
+
parameters.defs = schema["$defs"]
|
|
301
|
+
|
|
302
|
+
return cls(
|
|
303
|
+
fn=cast(ToolFnT, fn),
|
|
304
|
+
name=name,
|
|
305
|
+
description=description,
|
|
306
|
+
parameters=parameters,
|
|
307
|
+
strict=strict,
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
def can_execute(self, tool_call: ToolCall) -> bool:
|
|
311
|
+
"""Check if a `ToolCall` can be executed by tools with this `ToolSchema`.
|
|
312
|
+
|
|
313
|
+
This method is a convenient way to determine if a `ToolCall` is likely intended
|
|
314
|
+
to be executed by a tool with this `ToolSchema`. It does so by checking
|
|
315
|
+
whether the name on the call matches the name on the schema. No other validation
|
|
316
|
+
is performed.
|
|
317
|
+
"""
|
|
318
|
+
return tool_call.name == self.name
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
AnyToolSchema: TypeAlias = ToolSchema[AnyToolFn]
|