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
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from abc import ABC
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
from typing import TYPE_CHECKING, ClassVar
|
|
6
|
-
|
|
7
|
-
from pydantic import Field, field_validator
|
|
8
|
-
|
|
9
|
-
from mirascope.core.base import toolkit_tool
|
|
10
|
-
from mirascope.tools.base import (
|
|
11
|
-
ConfigurableTool,
|
|
12
|
-
ConfigurableToolKit,
|
|
13
|
-
_ConfigurableToolConfig,
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class FileSystemToolKitConfig(_ConfigurableToolConfig):
|
|
18
|
-
"""Configuration for file_system toolkit"""
|
|
19
|
-
|
|
20
|
-
max_file_size: int = Field(
|
|
21
|
-
default=10 * 1024 * 1024, # 10MB
|
|
22
|
-
description="Maximum file size in bytes",
|
|
23
|
-
)
|
|
24
|
-
allowed_extensions: list[str] = Field(
|
|
25
|
-
default=["txt", "md", "csv", "json", "yml", "yaml", "html"],
|
|
26
|
-
description="List of allowed file extensions",
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class FileOperation(ConfigurableTool[FileSystemToolKitConfig], ABC):
|
|
31
|
-
"""Base class for file system operations."""
|
|
32
|
-
|
|
33
|
-
__configurable_tool_config__ = FileSystemToolKitConfig()
|
|
34
|
-
|
|
35
|
-
if TYPE_CHECKING:
|
|
36
|
-
# In create_tools method, the base_directory is set to ToolKit base_directory
|
|
37
|
-
base_directory: Path = Field(
|
|
38
|
-
default=Path.cwd(), description="Base directory for file operations"
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
def _validate_path(self, path: str) -> str | None:
|
|
42
|
-
"""Validates file path for security and correctness.
|
|
43
|
-
|
|
44
|
-
Args:
|
|
45
|
-
path: The path to validate
|
|
46
|
-
|
|
47
|
-
Returns:
|
|
48
|
-
Optional[str]: Error message if validation fails, None if successful
|
|
49
|
-
"""
|
|
50
|
-
file_path = self.base_directory / path
|
|
51
|
-
|
|
52
|
-
try:
|
|
53
|
-
file_path.resolve().relative_to(self.base_directory.resolve())
|
|
54
|
-
except ValueError:
|
|
55
|
-
return "Error: Invalid path (attempted path traversal)"
|
|
56
|
-
|
|
57
|
-
return None
|
|
58
|
-
|
|
59
|
-
def _validate_extension(self, path: str) -> str | None:
|
|
60
|
-
"""Validates file extension against allowed extensions.
|
|
61
|
-
|
|
62
|
-
Args:
|
|
63
|
-
path: The path to validate
|
|
64
|
-
|
|
65
|
-
Returns:
|
|
66
|
-
str | None: Error message if validation fails, None if successful
|
|
67
|
-
"""
|
|
68
|
-
extension = Path(path).suffix.lstrip(".")
|
|
69
|
-
if extension not in self._get_config().allowed_extensions:
|
|
70
|
-
return f"Error: Invalid file extension. Allowed: {self._get_config().allowed_extensions}"
|
|
71
|
-
return None
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
class FileSystemToolKit(ConfigurableToolKit[FileSystemToolKitConfig]):
|
|
75
|
-
"""ToolKit for file system operations.
|
|
76
|
-
Read, write, list, create, and delete files and directories.
|
|
77
|
-
"""
|
|
78
|
-
|
|
79
|
-
config: FileSystemToolKitConfig = FileSystemToolKitConfig()
|
|
80
|
-
|
|
81
|
-
@toolkit_tool
|
|
82
|
-
class ReadFile(FileOperation):
|
|
83
|
-
"""Tool for reading file contents."""
|
|
84
|
-
|
|
85
|
-
path: str
|
|
86
|
-
|
|
87
|
-
def call(self) -> str:
|
|
88
|
-
"""Read and return file contents.
|
|
89
|
-
|
|
90
|
-
Returns:
|
|
91
|
-
str: File contents or error message if operation fails
|
|
92
|
-
"""
|
|
93
|
-
if error := self._validate_path(self.path):
|
|
94
|
-
return error
|
|
95
|
-
|
|
96
|
-
if error := self._validate_extension(self.path):
|
|
97
|
-
return error
|
|
98
|
-
|
|
99
|
-
file_path = self.base_directory / self.path
|
|
100
|
-
if not file_path.is_file():
|
|
101
|
-
return f"Error: File {self.path} not found"
|
|
102
|
-
|
|
103
|
-
try:
|
|
104
|
-
if file_path.stat().st_size > self._get_config().max_file_size:
|
|
105
|
-
return f"Error: File exceeds maximum size of {self._get_config().max_file_size} bytes"
|
|
106
|
-
|
|
107
|
-
return file_path.read_text()
|
|
108
|
-
except Exception as e: # pragma: no cover
|
|
109
|
-
return f"Error reading file: {str(e)}"
|
|
110
|
-
|
|
111
|
-
@toolkit_tool
|
|
112
|
-
class WriteFile(FileOperation):
|
|
113
|
-
"""Tool for writing content to a file."""
|
|
114
|
-
|
|
115
|
-
path: str
|
|
116
|
-
content: str
|
|
117
|
-
|
|
118
|
-
def call(self) -> str:
|
|
119
|
-
"""Write content to file and return status.
|
|
120
|
-
|
|
121
|
-
Returns:
|
|
122
|
-
str: Success message or error message if operation fails
|
|
123
|
-
"""
|
|
124
|
-
if error := self._validate_path(self.path):
|
|
125
|
-
return error
|
|
126
|
-
|
|
127
|
-
if error := self._validate_extension(self.path):
|
|
128
|
-
return error
|
|
129
|
-
|
|
130
|
-
file_path = self.base_directory / self.path
|
|
131
|
-
try:
|
|
132
|
-
content_size = len(self.content.encode("utf-8"))
|
|
133
|
-
if content_size > self._get_config().max_file_size:
|
|
134
|
-
return f"Error: Content exceeds maximum size of {self._get_config().max_file_size} bytes"
|
|
135
|
-
|
|
136
|
-
file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
137
|
-
file_path.write_text(self.content)
|
|
138
|
-
return f"Successfully wrote to {self.path}"
|
|
139
|
-
except Exception as e: # pragma: no cover
|
|
140
|
-
return f"Error writing file: {str(e)}"
|
|
141
|
-
|
|
142
|
-
@toolkit_tool
|
|
143
|
-
class ListDirectory(FileOperation):
|
|
144
|
-
"""Tool for listing directory contents."""
|
|
145
|
-
|
|
146
|
-
path: str = Field(default="")
|
|
147
|
-
|
|
148
|
-
def call(self) -> str:
|
|
149
|
-
"""List directory contents and return formatted string.
|
|
150
|
-
|
|
151
|
-
Returns:
|
|
152
|
-
str: Formatted directory listing or error message if operation fails
|
|
153
|
-
"""
|
|
154
|
-
|
|
155
|
-
if error := self._validate_path(self.path):
|
|
156
|
-
return error
|
|
157
|
-
|
|
158
|
-
dir_path = self.base_directory / self.path
|
|
159
|
-
if not dir_path.is_dir():
|
|
160
|
-
return f"Error: Directory {self.path} not found"
|
|
161
|
-
|
|
162
|
-
try:
|
|
163
|
-
contents: list[dict[str, str | int | None]] = []
|
|
164
|
-
for item in dir_path.iterdir():
|
|
165
|
-
item_type = "file" if item.is_file() else "directory"
|
|
166
|
-
size = item.stat().st_size if item.is_file() else None
|
|
167
|
-
contents.append(
|
|
168
|
-
{"name": item.name, "type": item_type, "size": size}
|
|
169
|
-
)
|
|
170
|
-
|
|
171
|
-
output = f"Contents of {self.path or '.'} :\n"
|
|
172
|
-
for item in contents:
|
|
173
|
-
size_info = (
|
|
174
|
-
f" ({item['size']} bytes)" if item["size"] is not None else ""
|
|
175
|
-
)
|
|
176
|
-
output += f"- {item['name']} [{item['type']}]{size_info}\n"
|
|
177
|
-
|
|
178
|
-
return output
|
|
179
|
-
except Exception as e: # pragma: no cover
|
|
180
|
-
return f"Error listing directory: {str(e)}"
|
|
181
|
-
|
|
182
|
-
@toolkit_tool
|
|
183
|
-
class CreateDirectory(FileOperation):
|
|
184
|
-
"""Tool for creating directories."""
|
|
185
|
-
|
|
186
|
-
path: str
|
|
187
|
-
|
|
188
|
-
def call(self) -> str:
|
|
189
|
-
"""Create directory and return status.
|
|
190
|
-
|
|
191
|
-
Returns:
|
|
192
|
-
str: Success message or error message if operation fails
|
|
193
|
-
"""
|
|
194
|
-
if error := self._validate_path(self.path):
|
|
195
|
-
return error
|
|
196
|
-
|
|
197
|
-
dir_path = self.base_directory / self.path
|
|
198
|
-
try:
|
|
199
|
-
dir_path.mkdir(parents=True, exist_ok=True)
|
|
200
|
-
return f"Successfully created directory {self.path}"
|
|
201
|
-
except Exception as e:
|
|
202
|
-
return f"Error creating directory: {str(e)}"
|
|
203
|
-
|
|
204
|
-
@toolkit_tool
|
|
205
|
-
class DeleteFile(FileOperation):
|
|
206
|
-
"""Tool for deleting files."""
|
|
207
|
-
|
|
208
|
-
path: str
|
|
209
|
-
|
|
210
|
-
def call(self) -> str:
|
|
211
|
-
"""Delete file and return status.
|
|
212
|
-
|
|
213
|
-
Returns:
|
|
214
|
-
str: Success message or error message if operation fails
|
|
215
|
-
"""
|
|
216
|
-
if error := self._validate_path(self.path):
|
|
217
|
-
return error
|
|
218
|
-
|
|
219
|
-
if error := self._validate_extension(self.path):
|
|
220
|
-
return error
|
|
221
|
-
|
|
222
|
-
file_path = self.base_directory / self.path
|
|
223
|
-
try:
|
|
224
|
-
if not file_path.exists():
|
|
225
|
-
return f"Error: File {self.path} not found"
|
|
226
|
-
|
|
227
|
-
if not file_path.is_file():
|
|
228
|
-
return f"Error: {self.path} is not a file"
|
|
229
|
-
|
|
230
|
-
file_path.unlink()
|
|
231
|
-
return f"Successfully deleted {self.path}"
|
|
232
|
-
except Exception as e: # pragma: no cover
|
|
233
|
-
return f"Error deleting file: {str(e)}"
|
|
234
|
-
|
|
235
|
-
__configurable_tool_config__ = FileSystemToolKitConfig()
|
|
236
|
-
__namespace__ = "file_system"
|
|
237
|
-
__prompt_usage_description__: ClassVar[str] = """
|
|
238
|
-
- Tools for file system operations:
|
|
239
|
-
- ReadFile: Reads content from a file
|
|
240
|
-
- WriteFile: Writes content to a file
|
|
241
|
-
- ListDirectory: Lists directory contents
|
|
242
|
-
- CreateDirectory: Creates a new directory
|
|
243
|
-
- DeleteFile: Deletes a file
|
|
244
|
-
"""
|
|
245
|
-
|
|
246
|
-
base_directory: Path = Field(
|
|
247
|
-
default=Path.cwd(), description="Base directory for file operations"
|
|
248
|
-
)
|
|
249
|
-
|
|
250
|
-
@field_validator("base_directory")
|
|
251
|
-
def validate_base_directory(cls, v: Path) -> Path:
|
|
252
|
-
"""Validates that the base directory exists and is a directory.
|
|
253
|
-
|
|
254
|
-
Args:
|
|
255
|
-
v: The path to validate
|
|
256
|
-
|
|
257
|
-
Returns:
|
|
258
|
-
Path: The validated path
|
|
259
|
-
|
|
260
|
-
Raises:
|
|
261
|
-
ValueError: If the path doesn't exist or isn't a directory
|
|
262
|
-
"""
|
|
263
|
-
if not v.exists():
|
|
264
|
-
raise ValueError(f"Base directory {v} does not exist")
|
|
265
|
-
if not v.is_dir():
|
|
266
|
-
raise ValueError(f"{v} is not a directory")
|
|
267
|
-
return v
|
mirascope/tools/web/__init__.py
DELETED
|
File without changes
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import ClassVar
|
|
4
|
-
|
|
5
|
-
from duckduckgo_search import DDGS, AsyncDDGS
|
|
6
|
-
from pydantic import Field
|
|
7
|
-
|
|
8
|
-
from ..base import ConfigurableTool, _ConfigurableToolConfig
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class DuckDuckGoSearchConfig(_ConfigurableToolConfig):
|
|
12
|
-
"""Configuration for DuckDuckGo search"""
|
|
13
|
-
|
|
14
|
-
max_results_per_query: int = Field(
|
|
15
|
-
default=2, description="Maximum number of results per query"
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class _BaseDuckDuckGoSearch(ConfigurableTool[DuckDuckGoSearchConfig]):
|
|
20
|
-
"""Tool for performing web searches using DuckDuckGo.
|
|
21
|
-
|
|
22
|
-
Takes search queries and returns relevant search results(Title, URL, Snippet).
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
__prompt_usage_description__: ClassVar[str] = """
|
|
26
|
-
- `DuckDuckGoSearch`: Performs web searches and returns formatted results
|
|
27
|
-
- Returns:
|
|
28
|
-
- Title: The title of the search result
|
|
29
|
-
- Link: The URL of the result page
|
|
30
|
-
- Snippet: A brief excerpt from the page content
|
|
31
|
-
- Results are automatically filtered and ranked by relevance
|
|
32
|
-
- Multiple results returned per query based on configuration
|
|
33
|
-
"""
|
|
34
|
-
|
|
35
|
-
__configurable_tool_config__ = DuckDuckGoSearchConfig()
|
|
36
|
-
|
|
37
|
-
queries: list[str] = Field(..., description="List of search queries")
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class DuckDuckGoSearch(_BaseDuckDuckGoSearch):
|
|
41
|
-
"""Tool for performing web searches using DuckDuckGo.
|
|
42
|
-
|
|
43
|
-
Takes search queries and returns relevant search results(Title, URL, Snippet).
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
def call(self) -> str:
|
|
47
|
-
"""Perform a web search using DuckDuckGo and return formatted results.
|
|
48
|
-
|
|
49
|
-
Returns:
|
|
50
|
-
str: Formatted search results if successful, error message if search fails
|
|
51
|
-
"""
|
|
52
|
-
|
|
53
|
-
try:
|
|
54
|
-
all_results = []
|
|
55
|
-
for query in self.queries:
|
|
56
|
-
results = DDGS(proxies=None).text(
|
|
57
|
-
query, max_results=self._get_config().max_results_per_query
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
all_results.extend(
|
|
61
|
-
{
|
|
62
|
-
"title": result["title"],
|
|
63
|
-
"link": result["href"],
|
|
64
|
-
"snippet": result["body"],
|
|
65
|
-
}
|
|
66
|
-
for result in results
|
|
67
|
-
)
|
|
68
|
-
return "\n\n".join(
|
|
69
|
-
f"Title: {r['title']}\nURL: {r['link']}\nSnippet: {r['snippet']}"
|
|
70
|
-
for r in all_results
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
except Exception as e:
|
|
74
|
-
return f"{type(e)}: Failed to search the web for text"
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class AsyncDuckDuckGoSearch(_BaseDuckDuckGoSearch):
|
|
78
|
-
"""Tool for performing web searches using DuckDuckGo.
|
|
79
|
-
|
|
80
|
-
Takes search queries and returns relevant search results(Title, URL, Snippet).
|
|
81
|
-
"""
|
|
82
|
-
|
|
83
|
-
async def call(self) -> str:
|
|
84
|
-
"""Perform an asynchronous web search using DuckDuckGo and return formatted results.
|
|
85
|
-
|
|
86
|
-
Returns:
|
|
87
|
-
str: Formatted search results if successful, error message if search fails
|
|
88
|
-
"""
|
|
89
|
-
|
|
90
|
-
try:
|
|
91
|
-
all_results = []
|
|
92
|
-
for query in self.queries:
|
|
93
|
-
results = await AsyncDDGS(proxies=None).atext(
|
|
94
|
-
query, max_results=self._get_config().max_results_per_query
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
all_results.extend(
|
|
98
|
-
{
|
|
99
|
-
"title": result["title"],
|
|
100
|
-
"link": result["href"],
|
|
101
|
-
"snippet": result["body"],
|
|
102
|
-
}
|
|
103
|
-
for result in results
|
|
104
|
-
)
|
|
105
|
-
return "\n\n".join(
|
|
106
|
-
f"Title: {r['title']}\nURL: {r['link']}\nSnippet: {r['snippet']}"
|
|
107
|
-
for r in all_results
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
except Exception as e:
|
|
111
|
-
return f"{type(e)}: Failed to search the web for text"
|
mirascope/tools/web/_httpx.py
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
from typing import ClassVar, Literal
|
|
2
|
-
|
|
3
|
-
import httpx
|
|
4
|
-
from pydantic import Field
|
|
5
|
-
|
|
6
|
-
from mirascope.tools.base import ConfigurableTool, _ConfigurableToolConfig
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class HTTPXConfig(_ConfigurableToolConfig):
|
|
10
|
-
"""Configuration for HTTPX requests"""
|
|
11
|
-
|
|
12
|
-
timeout: int = Field(
|
|
13
|
-
default=5,
|
|
14
|
-
description="Request timeout in seconds. When None, no timeout will be applied",
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class _BaseHTTPX(ConfigurableTool):
|
|
19
|
-
"""Tool for making HTTP requests using HTTPX with configurable timeout and error handling."""
|
|
20
|
-
|
|
21
|
-
__configurable_tool_config__ = HTTPXConfig()
|
|
22
|
-
|
|
23
|
-
__prompt_usage_description__: ClassVar[str] = """
|
|
24
|
-
- `HTTPX`: Makes HTTP requests to web URLs with HTTPX client
|
|
25
|
-
- Supports standard HTTP methods (GET, POST, PUT, DELETE, etc.)
|
|
26
|
-
- Allows configuration of request data, headers, and parameters
|
|
27
|
-
- Automatically handles encoding/decoding of request/response content
|
|
28
|
-
- Handles redirects automatically (configurable)
|
|
29
|
-
- Returns response text or error message on failure
|
|
30
|
-
- Configurable timeout for requests
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
url: str = Field(..., description="URL to request")
|
|
34
|
-
method: Literal["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS"] = Field(
|
|
35
|
-
"GET", description="HTTP method to use"
|
|
36
|
-
)
|
|
37
|
-
data: dict | None = Field(
|
|
38
|
-
None, description="Form data to send with POST/PUT requests"
|
|
39
|
-
)
|
|
40
|
-
json_: dict | None = Field(
|
|
41
|
-
None, description="JSON data to send with POST/PUT requests", alias="json"
|
|
42
|
-
)
|
|
43
|
-
params: dict | None = Field(
|
|
44
|
-
None, description="URL parameters to include in the request"
|
|
45
|
-
)
|
|
46
|
-
headers: dict | None = Field(None, description="Request headers")
|
|
47
|
-
follow_redirects: bool = Field(
|
|
48
|
-
True, description="Whether to follow redirects automatically"
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class HTTPX(_BaseHTTPX):
|
|
53
|
-
def call(self) -> str:
|
|
54
|
-
"""
|
|
55
|
-
Make an HTTP request to the given URL using HTTPX.
|
|
56
|
-
|
|
57
|
-
Returns:
|
|
58
|
-
str: Response text if successful, error message if request fails
|
|
59
|
-
"""
|
|
60
|
-
try:
|
|
61
|
-
# Configure timeout - None means no timeout
|
|
62
|
-
timeout = (
|
|
63
|
-
httpx.Timeout(self._get_config().timeout)
|
|
64
|
-
if self._get_config().timeout is not None
|
|
65
|
-
else None
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
# Make request using context manager for proper resource cleanup
|
|
69
|
-
with httpx.Client(timeout=timeout) as client:
|
|
70
|
-
response = client.request(
|
|
71
|
-
method=self.method,
|
|
72
|
-
url=self.url,
|
|
73
|
-
params=self.params,
|
|
74
|
-
json=self.json_,
|
|
75
|
-
data=self.data,
|
|
76
|
-
headers=self.headers,
|
|
77
|
-
follow_redirects=self.follow_redirects,
|
|
78
|
-
)
|
|
79
|
-
response.raise_for_status()
|
|
80
|
-
return response.text
|
|
81
|
-
|
|
82
|
-
except httpx.RequestError as e:
|
|
83
|
-
return f"Request error occurred: {str(e)}"
|
|
84
|
-
except httpx.HTTPStatusError as e:
|
|
85
|
-
return f"HTTP error occurred: {e.response.status_code} - {str(e)}"
|
|
86
|
-
except Exception as e:
|
|
87
|
-
return f"{type(e).__name__}: Failed to make request to {self.url}"
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
class AsyncHTTPX(_BaseHTTPX):
|
|
91
|
-
async def call(self) -> str:
|
|
92
|
-
"""
|
|
93
|
-
Make an asynchronous HTTP request to the given URL using HTTPX.
|
|
94
|
-
|
|
95
|
-
Returns:
|
|
96
|
-
str: Response text if successful, error message if request fails
|
|
97
|
-
"""
|
|
98
|
-
try:
|
|
99
|
-
# Configure timeout - None means no timeout
|
|
100
|
-
timeout = (
|
|
101
|
-
httpx.Timeout(self._get_config().timeout)
|
|
102
|
-
if self._get_config().timeout is not None
|
|
103
|
-
else None
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
# Make async request using async context manager
|
|
107
|
-
async with httpx.AsyncClient(timeout=timeout) as client:
|
|
108
|
-
response = await client.request(
|
|
109
|
-
method=self.method,
|
|
110
|
-
url=self.url,
|
|
111
|
-
params=self.params,
|
|
112
|
-
json=self.json_,
|
|
113
|
-
data=self.data,
|
|
114
|
-
headers=self.headers,
|
|
115
|
-
follow_redirects=self.follow_redirects,
|
|
116
|
-
)
|
|
117
|
-
response.raise_for_status()
|
|
118
|
-
return response.text
|
|
119
|
-
|
|
120
|
-
except httpx.RequestError as e:
|
|
121
|
-
return f"Request error occurred: {str(e)}"
|
|
122
|
-
except httpx.HTTPStatusError as e:
|
|
123
|
-
return f"HTTP error occurred: {e.response.status_code} - {str(e)}"
|
|
124
|
-
except Exception as e:
|
|
125
|
-
return f"{type(e).__name__}: Failed to make request to {self.url}"
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import re
|
|
4
|
-
from typing import ClassVar
|
|
5
|
-
|
|
6
|
-
import requests
|
|
7
|
-
from bs4 import BeautifulSoup
|
|
8
|
-
from pydantic import Field
|
|
9
|
-
|
|
10
|
-
from mirascope.tools.base import ConfigurableTool, _ConfigurableToolConfig
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class ParseURLConfig(_ConfigurableToolConfig):
|
|
14
|
-
"""Configuration for URL content parsing"""
|
|
15
|
-
|
|
16
|
-
parser: str = Field(
|
|
17
|
-
"html.parser",
|
|
18
|
-
description="parser to use for parsing HTML content in BeautifulSoup",
|
|
19
|
-
examples=["html.parser", "lxml", "lxml-xml", "html5lib"],
|
|
20
|
-
)
|
|
21
|
-
timeout: int = Field(
|
|
22
|
-
default=5,
|
|
23
|
-
description="Timeout in seconds for URL request",
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class ParseURLContent(ConfigurableTool[ParseURLConfig]):
|
|
28
|
-
"""Tool for parsing and extracting main content from URLs.
|
|
29
|
-
|
|
30
|
-
Fetches content from URL, removes unnecessary elements like scripts, styles, navigation, etc.,
|
|
31
|
-
and returns clean text content from the webpage's main body.
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
__configurable_tool_config__ = ParseURLConfig() # pyright: ignore [reportCallIssue]
|
|
35
|
-
__prompt_usage_description__: ClassVar[str] = """
|
|
36
|
-
- `ParseURLContent`: Returns the given URL's main content as clean text
|
|
37
|
-
- Fetches the raw HTML content for the given URL
|
|
38
|
-
- Removes all unwanted elements (scripts, styles, navigation, etc.)
|
|
39
|
-
- Attempts to find the main content section
|
|
40
|
-
- If no main content section is found, extracts all text content
|
|
41
|
-
- Returns cleaned and formatted text content
|
|
42
|
-
- If any errors occur during fetching or parsing, and error message is returned.
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
url: str = Field(..., description="URL to fetch and parse")
|
|
46
|
-
|
|
47
|
-
def call(self) -> str:
|
|
48
|
-
"""Fetch and parse content from the URL.
|
|
49
|
-
|
|
50
|
-
Returns:
|
|
51
|
-
str: Cleaned text content from the URL if successful, error message if parsing fails
|
|
52
|
-
"""
|
|
53
|
-
try:
|
|
54
|
-
# Fetch content from URL
|
|
55
|
-
response = requests.get(
|
|
56
|
-
self.url,
|
|
57
|
-
timeout=self._get_config().timeout,
|
|
58
|
-
)
|
|
59
|
-
response.raise_for_status()
|
|
60
|
-
|
|
61
|
-
# Parse HTML content
|
|
62
|
-
soup = BeautifulSoup(response.text, self._get_config().parser)
|
|
63
|
-
|
|
64
|
-
# Remove unwanted tags
|
|
65
|
-
unwanted_tags = ["script", "style", "nav", "header", "footer", "aside"]
|
|
66
|
-
for tag in unwanted_tags:
|
|
67
|
-
for element in soup.find_all(tag):
|
|
68
|
-
element.decompose()
|
|
69
|
-
|
|
70
|
-
# Find main content section
|
|
71
|
-
main_content = (
|
|
72
|
-
soup.find("main")
|
|
73
|
-
or soup.find("article")
|
|
74
|
-
or soup.find("div", class_=re.compile("content|main"))
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
# Extract and clean text
|
|
78
|
-
if main_content:
|
|
79
|
-
text = main_content.get_text(separator="\n", strip=True)
|
|
80
|
-
else:
|
|
81
|
-
text = soup.get_text(separator="\n", strip=True)
|
|
82
|
-
|
|
83
|
-
# Remove empty lines and format
|
|
84
|
-
lines = (line.strip() for line in text.splitlines())
|
|
85
|
-
content = "\n".join(line for line in lines if line)
|
|
86
|
-
|
|
87
|
-
if not content:
|
|
88
|
-
return "No content found on the page"
|
|
89
|
-
return content
|
|
90
|
-
|
|
91
|
-
except requests.RequestException as e:
|
|
92
|
-
return f"Failed to fetch content from URL: {str(e)}"
|
|
93
|
-
except Exception as e: # pragma: no cover
|
|
94
|
-
return f"{type(e).__name__}: Failed to parse content from URL"
|
mirascope/tools/web/_requests.py
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
from typing import ClassVar, Literal
|
|
2
|
-
|
|
3
|
-
import requests
|
|
4
|
-
from pydantic import Field
|
|
5
|
-
|
|
6
|
-
from mirascope.tools.base import ConfigurableTool, _ConfigurableToolConfig
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class RequestsConfig(_ConfigurableToolConfig):
|
|
10
|
-
"""Configuration for HTTP requests"""
|
|
11
|
-
|
|
12
|
-
timeout: int = Field(default=5, description="Request timeout in seconds")
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class Requests(ConfigurableTool):
|
|
16
|
-
"""Tool for making HTTP requests with built-in requests library."""
|
|
17
|
-
|
|
18
|
-
__configurable_tool_config__ = RequestsConfig()
|
|
19
|
-
|
|
20
|
-
__prompt_usage_description__: ClassVar[str] = """
|
|
21
|
-
- `Requests`: Makes HTTP requests to web URLs using requests library
|
|
22
|
-
- Supports common HTTP methods (GET, POST, PUT, DELETE)
|
|
23
|
-
- Accepts custom headers and request data
|
|
24
|
-
- Returns response text content
|
|
25
|
-
- Automatically raises for HTTP errors (4xx, 5xx)
|
|
26
|
-
- Returns error message if request fails
|
|
27
|
-
- Configurable timeout for all requests
|
|
28
|
-
"""
|
|
29
|
-
url: str = Field(..., description="URL to request")
|
|
30
|
-
method: Literal["GET", "POST", "PUT", "DELETE"] = Field(
|
|
31
|
-
"GET", description="HTTP method"
|
|
32
|
-
)
|
|
33
|
-
data: dict | None = Field(None, description="Data to send with POST/PUT requests")
|
|
34
|
-
headers: dict | None = Field(None, description="Request headers")
|
|
35
|
-
|
|
36
|
-
def call(self) -> str:
|
|
37
|
-
"""Make an HTTP request to the given URL.
|
|
38
|
-
|
|
39
|
-
Returns:
|
|
40
|
-
str: Response text content if successful, error message if request fails
|
|
41
|
-
"""
|
|
42
|
-
try:
|
|
43
|
-
response = requests.request(
|
|
44
|
-
method=self.method,
|
|
45
|
-
url=self.url,
|
|
46
|
-
json=self.data,
|
|
47
|
-
headers=self.headers,
|
|
48
|
-
timeout=self._get_config().timeout,
|
|
49
|
-
)
|
|
50
|
-
response.raise_for_status()
|
|
51
|
-
return response.text
|
|
52
|
-
|
|
53
|
-
except Exception as e:
|
|
54
|
-
return f"{type(e)}: Failed to extract content from URL {self.url}"
|