mirascope 1.0.5__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 +6 -6
- 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 +316 -0
- 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-1.0.5.dist-info → mirascope-2.1.1.dist-info}/WHEEL +1 -1
- {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/licenses/LICENSE +1 -1
- mirascope/beta/__init__.py +0 -0
- mirascope/beta/openai/__init__.py +0 -5
- mirascope/beta/openai/parse.py +0 -129
- 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 -55
- mirascope/core/anthropic/__init__.py +0 -21
- mirascope/core/anthropic/_call.py +0 -71
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_calculate_cost.py +0 -63
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -54
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -34
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -89
- mirascope/core/anthropic/_utils/_setup_call.py +0 -76
- mirascope/core/anthropic/call_params.py +0 -36
- mirascope/core/anthropic/call_response.py +0 -158
- mirascope/core/anthropic/call_response_chunk.py +0 -104
- mirascope/core/anthropic/dynamic_config.py +0 -26
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -140
- mirascope/core/anthropic/tool.py +0 -77
- mirascope/core/base/__init__.py +0 -40
- mirascope/core/base/_call_factory.py +0 -323
- mirascope/core/base/_create.py +0 -167
- mirascope/core/base/_extract.py +0 -139
- mirascope/core/base/_partial.py +0 -63
- mirascope/core/base/_utils/__init__.py +0 -64
- mirascope/core/base/_utils/_base_type.py +0 -17
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -45
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -126
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -36
- mirascope/core/base/_utils/_format_template.py +0 -29
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_fn_args.py +0 -14
- 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 -25
- mirascope/core/base/_utils/_get_template_values.py +0 -52
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_json_mode_content.py +0 -15
- mirascope/core/base/_utils/_parse_content_template.py +0 -157
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -51
- mirascope/core/base/_utils/_protocols.py +0 -215
- mirascope/core/base/_utils/_setup_call.py +0 -64
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -24
- mirascope/core/base/call_params.py +0 -6
- mirascope/core/base/call_response.py +0 -189
- mirascope/core/base/call_response_chunk.py +0 -91
- mirascope/core/base/dynamic_config.py +0 -55
- mirascope/core/base/message_param.py +0 -61
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -415
- mirascope/core/base/stream.py +0 -365
- mirascope/core/base/structured_stream.py +0 -251
- mirascope/core/base/tool.py +0 -126
- mirascope/core/base/toolkit.py +0 -146
- mirascope/core/cohere/__init__.py +0 -21
- mirascope/core/cohere/_call.py +0 -71
- mirascope/core/cohere/_utils/__init__.py +0 -16
- mirascope/core/cohere/_utils/_calculate_cost.py +0 -39
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -31
- mirascope/core/cohere/_utils/_get_json_output.py +0 -31
- mirascope/core/cohere/_utils/_handle_stream.py +0 -33
- mirascope/core/cohere/_utils/_setup_call.py +0 -89
- mirascope/core/cohere/call_params.py +0 -57
- mirascope/core/cohere/call_response.py +0 -167
- mirascope/core/cohere/call_response_chunk.py +0 -101
- mirascope/core/cohere/dynamic_config.py +0 -24
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -92
- mirascope/core/gemini/__init__.py +0 -21
- mirascope/core/gemini/_call.py +0 -71
- mirascope/core/gemini/_utils/__init__.py +0 -16
- mirascope/core/gemini/_utils/_calculate_cost.py +0 -8
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -74
- mirascope/core/gemini/_utils/_get_json_output.py +0 -33
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_setup_call.py +0 -68
- mirascope/core/gemini/call_params.py +0 -28
- mirascope/core/gemini/call_response.py +0 -173
- mirascope/core/gemini/call_response_chunk.py +0 -85
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -121
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/groq/__init__.py +0 -21
- mirascope/core/groq/_call.py +0 -71
- mirascope/core/groq/_utils/__init__.py +0 -16
- mirascope/core/groq/_utils/_calculate_cost.py +0 -68
- mirascope/core/groq/_utils/_convert_message_params.py +0 -23
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -121
- mirascope/core/groq/_utils/_setup_call.py +0 -67
- mirascope/core/groq/call_params.py +0 -51
- mirascope/core/groq/call_response.py +0 -160
- mirascope/core/groq/call_response_chunk.py +0 -89
- mirascope/core/groq/dynamic_config.py +0 -26
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -136
- mirascope/core/groq/tool.py +0 -79
- mirascope/core/litellm/__init__.py +0 -6
- mirascope/core/litellm/_call.py +0 -73
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -46
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/mistral/__init__.py +0 -21
- mirascope/core/mistral/_call.py +0 -69
- mirascope/core/mistral/_utils/__init__.py +0 -16
- mirascope/core/mistral/_utils/_calculate_cost.py +0 -47
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -23
- mirascope/core/mistral/_utils/_get_json_output.py +0 -28
- mirascope/core/mistral/_utils/_handle_stream.py +0 -121
- mirascope/core/mistral/_utils/_setup_call.py +0 -86
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -156
- mirascope/core/mistral/call_response_chunk.py +0 -84
- mirascope/core/mistral/dynamic_config.py +0 -24
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -117
- mirascope/core/mistral/tool.py +0 -77
- mirascope/core/openai/__init__.py +0 -21
- mirascope/core/openai/_call.py +0 -71
- mirascope/core/openai/_utils/__init__.py +0 -16
- mirascope/core/openai/_utils/_calculate_cost.py +0 -110
- mirascope/core/openai/_utils/_convert_message_params.py +0 -53
- mirascope/core/openai/_utils/_get_json_output.py +0 -27
- mirascope/core/openai/_utils/_handle_stream.py +0 -125
- mirascope/core/openai/_utils/_setup_call.py +0 -62
- mirascope/core/openai/call_params.py +0 -54
- mirascope/core/openai/call_response.py +0 -162
- mirascope/core/openai/call_response_chunk.py +0 -90
- mirascope/core/openai/dynamic_config.py +0 -26
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -148
- mirascope/core/openai/tool.py +0 -79
- mirascope/core/py.typed +0 -0
- mirascope/integrations/__init__.py +0 -20
- mirascope/integrations/_middleware_factory.py +0 -277
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -71
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -188
- mirascope/integrations/logfire/_with_logfire.py +0 -60
- mirascope/integrations/otel/__init__.py +0 -5
- mirascope/integrations/otel/_utils.py +0 -268
- mirascope/integrations/otel/_with_hyperdx.py +0 -61
- mirascope/integrations/otel/_with_otel.py +0 -60
- mirascope/integrations/tenacity.py +0 -50
- mirascope/py.typed +0 -0
- 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.0.5.dist-info/METADATA +0 -519
- mirascope-1.0.5.dist-info/RECORD +0 -198
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
from collections.abc import Sequence
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Generic, TypeVar
|
|
4
|
+
|
|
5
|
+
from ..content import ToolCall, ToolOutput
|
|
6
|
+
from ..context import Context, DepsT
|
|
7
|
+
from ..exceptions import ToolNotFoundError
|
|
8
|
+
from ..types import Jsonable
|
|
9
|
+
from .provider_tools import ProviderTool
|
|
10
|
+
from .tool_schema import ToolSchemaT
|
|
11
|
+
from .tools import AsyncContextTool, AsyncTool, ContextTool, Tool
|
|
12
|
+
|
|
13
|
+
ToolkitT = TypeVar(
|
|
14
|
+
"ToolkitT",
|
|
15
|
+
bound="Toolkit | AsyncToolkit | ContextToolkit[Any] | AsyncContextToolkit[Any]",
|
|
16
|
+
covariant=True,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class BaseToolkit(Generic[ToolSchemaT]):
|
|
22
|
+
"""Base class for tool collections.
|
|
23
|
+
|
|
24
|
+
Provides common functionality for managing collections of tools,
|
|
25
|
+
including name validation and tool lookup.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
tools: Sequence[ToolSchemaT | ProviderTool]
|
|
29
|
+
"""The tools included in the toolkit."""
|
|
30
|
+
|
|
31
|
+
tools_dict: dict[str, ToolSchemaT]
|
|
32
|
+
"""A mapping from tool names to tools in the toolkit.
|
|
33
|
+
|
|
34
|
+
This dict does not include any `ProviderTool`s, since they do not correspond
|
|
35
|
+
to tool calls that your code executes.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
provider_tools_dict: dict[str, ProviderTool]
|
|
39
|
+
"""A mapping from provider tool names to provider tools in the toolkit.
|
|
40
|
+
|
|
41
|
+
Provider tools are capabilities built into the provider's API (like web search)
|
|
42
|
+
that are executed server-side, not by your code.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self, tools: Sequence[ToolSchemaT | ProviderTool] | None) -> None:
|
|
46
|
+
"""Initialize the toolkit with a collection of tools.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
tools: Sequence of tools to include in the toolkit.
|
|
50
|
+
|
|
51
|
+
Raises:
|
|
52
|
+
ValueError: If multiple tools have the same name.
|
|
53
|
+
"""
|
|
54
|
+
self.tools = tools or []
|
|
55
|
+
self.tools_dict = {}
|
|
56
|
+
self.provider_tools_dict = {}
|
|
57
|
+
for tool in self.tools:
|
|
58
|
+
if isinstance(tool, ProviderTool):
|
|
59
|
+
if tool.name in self.provider_tools_dict:
|
|
60
|
+
raise ValueError(f"Multiple provider tools with name: {tool.name}")
|
|
61
|
+
self.provider_tools_dict[tool.name] = tool
|
|
62
|
+
else:
|
|
63
|
+
if tool.name in self.tools_dict:
|
|
64
|
+
raise ValueError(f"Multiple tools with name: {tool.name}")
|
|
65
|
+
self.tools_dict[tool.name] = tool
|
|
66
|
+
|
|
67
|
+
def get(self, tool_call: ToolCall) -> ToolSchemaT:
|
|
68
|
+
"""Get a tool that can execute a specific tool call.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
tool_call: The tool call containing the tool name to lookup.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
The tool whose name matches the tool call.
|
|
75
|
+
|
|
76
|
+
Raises:
|
|
77
|
+
ToolNotFoundError: If no tool with the given name exists.
|
|
78
|
+
"""
|
|
79
|
+
tool = self.tools_dict.get(tool_call.name, None)
|
|
80
|
+
if not tool:
|
|
81
|
+
raise ToolNotFoundError(tool_call.name)
|
|
82
|
+
return tool
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class Toolkit(BaseToolkit[Tool]):
|
|
86
|
+
"""A collection of `Tool`s, with helpers for getting and executing specific tools."""
|
|
87
|
+
|
|
88
|
+
def execute(self, tool_call: ToolCall) -> ToolOutput[Jsonable]:
|
|
89
|
+
"""Execute a `Tool` using the provided tool call.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
tool_call: The tool call to execute.
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
The output from executing the `Tool`.
|
|
96
|
+
"""
|
|
97
|
+
try:
|
|
98
|
+
tool = self.get(tool_call)
|
|
99
|
+
return tool.execute(tool_call)
|
|
100
|
+
except ToolNotFoundError as e:
|
|
101
|
+
return ToolOutput(
|
|
102
|
+
id=tool_call.id, result=str(e), error=e, name=tool_call.name
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class AsyncToolkit(BaseToolkit[AsyncTool]):
|
|
107
|
+
"""A collection of `AsyncTool`s, with helpers for getting and executing specific tools."""
|
|
108
|
+
|
|
109
|
+
async def execute(self, tool_call: ToolCall) -> ToolOutput[Jsonable]:
|
|
110
|
+
"""Execute an `AsyncTool` using the provided tool call.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
tool_call: The tool call to execute.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
The output from executing the `AsyncTool`.
|
|
117
|
+
"""
|
|
118
|
+
try:
|
|
119
|
+
tool = self.get(tool_call)
|
|
120
|
+
return await tool.execute(tool_call)
|
|
121
|
+
except ToolNotFoundError as e:
|
|
122
|
+
return ToolOutput(
|
|
123
|
+
id=tool_call.id, result=str(e), error=e, name=tool_call.name
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class ContextToolkit(BaseToolkit[Tool | ContextTool[DepsT]], Generic[DepsT]):
|
|
128
|
+
"""A collection of `ContextTool`s, with helpers for getting and executing specific tools."""
|
|
129
|
+
|
|
130
|
+
def execute(self, ctx: Context[DepsT], tool_call: ToolCall) -> ToolOutput[Jsonable]:
|
|
131
|
+
"""Execute a `ContextTool` using the provided tool call.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
ctx: The context containing dependencies that match the tool.
|
|
135
|
+
tool_call: The tool call to execute.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
The output from executing the `ContextTool`.
|
|
139
|
+
"""
|
|
140
|
+
try:
|
|
141
|
+
tool = self.get(tool_call)
|
|
142
|
+
if isinstance(tool, ContextTool):
|
|
143
|
+
return tool.execute(ctx, tool_call)
|
|
144
|
+
else:
|
|
145
|
+
return tool.execute(tool_call)
|
|
146
|
+
except ToolNotFoundError as e:
|
|
147
|
+
return ToolOutput(
|
|
148
|
+
id=tool_call.id, result=str(e), error=e, name=tool_call.name
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class AsyncContextToolkit(
|
|
153
|
+
BaseToolkit[AsyncTool | AsyncContextTool[DepsT]], Generic[DepsT]
|
|
154
|
+
):
|
|
155
|
+
"""A collection of `AsyncContextTool`s, with helpers for getting and executing specific tools."""
|
|
156
|
+
|
|
157
|
+
async def execute(
|
|
158
|
+
self, ctx: Context[DepsT], tool_call: ToolCall
|
|
159
|
+
) -> ToolOutput[Jsonable]:
|
|
160
|
+
"""Execute an `AsyncContextTool` using the provided tool call.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
ctx: The context containing dependencies that match the tool.
|
|
164
|
+
tool_call: The tool call to execute.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
The output from executing the `AsyncContextTool`.
|
|
168
|
+
"""
|
|
169
|
+
try:
|
|
170
|
+
tool = self.get(tool_call)
|
|
171
|
+
if isinstance(tool, AsyncContextTool):
|
|
172
|
+
return await tool.execute(ctx, tool_call)
|
|
173
|
+
else:
|
|
174
|
+
return await tool.execute(tool_call)
|
|
175
|
+
except ToolNotFoundError as e:
|
|
176
|
+
return ToolOutput(
|
|
177
|
+
id=tool_call.id, result=str(e), error=e, name=tool_call.name
|
|
178
|
+
)
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"""The `Tool` class for defining tools that LLMs can request be called."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from collections.abc import Awaitable
|
|
7
|
+
from typing import Any, Generic, cast
|
|
8
|
+
from typing_extensions import TypeVar
|
|
9
|
+
|
|
10
|
+
from ..content import ToolCall, ToolOutput
|
|
11
|
+
from ..context import Context, DepsT
|
|
12
|
+
from ..exceptions import ToolError, ToolExecutionError
|
|
13
|
+
from ..types import AnyP, JsonableCovariantT
|
|
14
|
+
from .protocols import (
|
|
15
|
+
AsyncContextToolFn,
|
|
16
|
+
AsyncJsonKwargsCallable,
|
|
17
|
+
AsyncKwargsCallable,
|
|
18
|
+
AsyncToolFn,
|
|
19
|
+
ContextKwargsCallable,
|
|
20
|
+
ContextToolFn,
|
|
21
|
+
KwargsCallable,
|
|
22
|
+
ToolFn,
|
|
23
|
+
)
|
|
24
|
+
from .tool_schema import ToolSchema
|
|
25
|
+
|
|
26
|
+
ToolT = TypeVar(
|
|
27
|
+
"ToolT",
|
|
28
|
+
bound="Tool | AsyncTool | ContextTool[Any] | AsyncContextTool[Any]",
|
|
29
|
+
covariant=True,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class Tool(
|
|
34
|
+
ToolSchema[ToolFn[AnyP, JsonableCovariantT]], Generic[AnyP, JsonableCovariantT]
|
|
35
|
+
):
|
|
36
|
+
"""A tool that can be used by LLMs.
|
|
37
|
+
|
|
38
|
+
A `Tool` represents a function that can be called by an LLM during a call.
|
|
39
|
+
It includes metadata like name, description, and parameter schema.
|
|
40
|
+
|
|
41
|
+
This class is not instantiated directly but created by the `@tool()` decorator.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def from_function( # pyright: ignore[reportIncompatibleMethodOverride]
|
|
46
|
+
cls, fn: ToolFn[AnyP, JsonableCovariantT], *, strict: bool | None = None
|
|
47
|
+
) -> Tool[AnyP, JsonableCovariantT]:
|
|
48
|
+
"""Create a `Tool` by inspecting a function and its docstring.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
fn: The function to extract schema from
|
|
52
|
+
strict: Whether the tool should use strict mode when supported.
|
|
53
|
+
If None, uses provider's default (usually as strict as possible).
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
a `Tool` representing the function
|
|
57
|
+
"""
|
|
58
|
+
schema = ToolSchema.from_function(fn, strict=strict, is_context_tool=False)
|
|
59
|
+
return cls(
|
|
60
|
+
fn=cast(ToolFn[AnyP, JsonableCovariantT], schema.fn),
|
|
61
|
+
name=schema.name,
|
|
62
|
+
description=schema.description,
|
|
63
|
+
parameters=schema.parameters,
|
|
64
|
+
strict=schema.strict,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def __call__(self, *args: AnyP.args, **kwargs: AnyP.kwargs) -> JsonableCovariantT:
|
|
68
|
+
"""Call the underlying function directly."""
|
|
69
|
+
return self.fn(*args, **kwargs)
|
|
70
|
+
|
|
71
|
+
def execute(self, tool_call: ToolCall) -> ToolOutput[JsonableCovariantT]:
|
|
72
|
+
"""Execute the tool using an LLM-provided `ToolCall`."""
|
|
73
|
+
kwargs_callable = cast(KwargsCallable[JsonableCovariantT], self.fn)
|
|
74
|
+
error: ToolError | None = None
|
|
75
|
+
try:
|
|
76
|
+
kwargs_from_json = json.loads(tool_call.args)
|
|
77
|
+
result = kwargs_callable(**kwargs_from_json)
|
|
78
|
+
except Exception as e:
|
|
79
|
+
result = str(e)
|
|
80
|
+
error = ToolExecutionError(e)
|
|
81
|
+
return ToolOutput(id=tool_call.id, result=result, error=error, name=self.name)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class AsyncTool(
|
|
85
|
+
ToolSchema[AsyncToolFn[AnyP, JsonableCovariantT]],
|
|
86
|
+
Generic[AnyP, JsonableCovariantT],
|
|
87
|
+
):
|
|
88
|
+
"""An async tool that can be used by LLMs.
|
|
89
|
+
|
|
90
|
+
An `AsyncTool` represents an async function that can be called by an LLM during a call.
|
|
91
|
+
It includes metadata like name, description, and parameter schema.
|
|
92
|
+
|
|
93
|
+
This class is not instantiated directly but created by the `@tool()` decorator.
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
@classmethod
|
|
97
|
+
def from_function( # pyright: ignore[reportIncompatibleMethodOverride]
|
|
98
|
+
cls, fn: AsyncToolFn[AnyP, JsonableCovariantT], *, strict: bool | None = None
|
|
99
|
+
) -> AsyncTool[AnyP, JsonableCovariantT]:
|
|
100
|
+
"""Create an `AsyncTool` by inspecting a function and its docstring.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
fn: The function to extract schema from
|
|
104
|
+
strict: Whether the tool should use strict mode when supported.
|
|
105
|
+
If None, uses provider's default (usually as strict as possible).
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
an `AsyncTool` representing the function
|
|
109
|
+
"""
|
|
110
|
+
schema = ToolSchema.from_function(fn, strict=strict, is_context_tool=False)
|
|
111
|
+
return cls(
|
|
112
|
+
fn=cast(AsyncToolFn[AnyP, JsonableCovariantT], schema.fn),
|
|
113
|
+
name=schema.name,
|
|
114
|
+
description=schema.description,
|
|
115
|
+
parameters=schema.parameters,
|
|
116
|
+
strict=schema.strict,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def __call__(
|
|
120
|
+
self, *args: AnyP.args, **kwargs: AnyP.kwargs
|
|
121
|
+
) -> Awaitable[JsonableCovariantT]:
|
|
122
|
+
"""Call the underlying async function directly."""
|
|
123
|
+
return self.fn(*args, **kwargs)
|
|
124
|
+
|
|
125
|
+
async def execute(self, tool_call: ToolCall) -> ToolOutput[JsonableCovariantT]:
|
|
126
|
+
"""Execute the async tool using an LLM-provided `ToolCall`."""
|
|
127
|
+
kwargs_callable = cast(AsyncKwargsCallable[JsonableCovariantT], self.fn)
|
|
128
|
+
error: ToolError | None = None
|
|
129
|
+
try:
|
|
130
|
+
kwargs_from_json = json.loads(tool_call.args)
|
|
131
|
+
result = await kwargs_callable(**kwargs_from_json)
|
|
132
|
+
except Exception as e:
|
|
133
|
+
result = str(e)
|
|
134
|
+
error = ToolExecutionError(e)
|
|
135
|
+
return ToolOutput(id=tool_call.id, result=result, error=error, name=self.name)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class ContextTool(
|
|
139
|
+
ToolSchema[ContextToolFn[DepsT, AnyP, JsonableCovariantT]],
|
|
140
|
+
Generic[DepsT, JsonableCovariantT, AnyP],
|
|
141
|
+
):
|
|
142
|
+
"""Protocol defining a tool that can be used by LLMs.
|
|
143
|
+
|
|
144
|
+
A `ContextTool` represents a function that can be called by an LLM during a call.
|
|
145
|
+
It includes metadata like name, description, and parameter schema.
|
|
146
|
+
|
|
147
|
+
This class is not instantiated directly but created by the `@tool()` decorator.
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
@classmethod
|
|
151
|
+
def from_function( # pyright: ignore[reportIncompatibleMethodOverride]
|
|
152
|
+
cls,
|
|
153
|
+
fn: ContextToolFn[DepsT, AnyP, JsonableCovariantT],
|
|
154
|
+
*,
|
|
155
|
+
strict: bool | None = None,
|
|
156
|
+
) -> ContextTool[DepsT, JsonableCovariantT, AnyP]:
|
|
157
|
+
"""Create a `ContextTool` by inspecting a function and its docstring.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
fn: The function to extract schema from
|
|
161
|
+
strict: Whether the tool should use strict mode when supported.
|
|
162
|
+
If None, uses provider's default (usually as strict as possible).
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
a `ContextTool` representing the function
|
|
166
|
+
"""
|
|
167
|
+
schema = ToolSchema.from_function(fn, strict=strict, is_context_tool=True)
|
|
168
|
+
return cls(
|
|
169
|
+
fn=cast(ContextToolFn[DepsT, AnyP, JsonableCovariantT], schema.fn),
|
|
170
|
+
name=schema.name,
|
|
171
|
+
description=schema.description,
|
|
172
|
+
parameters=schema.parameters,
|
|
173
|
+
strict=schema.strict,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
def __call__(
|
|
177
|
+
self,
|
|
178
|
+
ctx: Context[DepsT],
|
|
179
|
+
*args: AnyP.args,
|
|
180
|
+
**kwargs: AnyP.kwargs,
|
|
181
|
+
) -> JsonableCovariantT:
|
|
182
|
+
"""Call the underlying function directly with context."""
|
|
183
|
+
return self.fn(ctx, *args, **kwargs)
|
|
184
|
+
|
|
185
|
+
def execute(
|
|
186
|
+
self, ctx: Context[DepsT], tool_call: ToolCall
|
|
187
|
+
) -> ToolOutput[JsonableCovariantT]:
|
|
188
|
+
"""Execute the context tool using an LLM-provided `ToolCall`."""
|
|
189
|
+
kwargs_callable = cast(
|
|
190
|
+
ContextKwargsCallable[DepsT, JsonableCovariantT], self.fn
|
|
191
|
+
)
|
|
192
|
+
error: ToolError | None = None
|
|
193
|
+
try:
|
|
194
|
+
kwargs_from_json = json.loads(tool_call.args)
|
|
195
|
+
result = kwargs_callable(ctx, **kwargs_from_json)
|
|
196
|
+
except Exception as e:
|
|
197
|
+
result = str(e)
|
|
198
|
+
error = ToolExecutionError(e)
|
|
199
|
+
return ToolOutput(id=tool_call.id, result=result, error=error, name=self.name)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class AsyncContextTool(
|
|
203
|
+
ToolSchema[AsyncContextToolFn[DepsT, AnyP, JsonableCovariantT]],
|
|
204
|
+
Generic[DepsT, JsonableCovariantT, AnyP],
|
|
205
|
+
):
|
|
206
|
+
"""Protocol defining an async tool that can be used by LLMs with context.
|
|
207
|
+
|
|
208
|
+
An `AsyncContextTool` represents an async function that can be called by an LLM during a call.
|
|
209
|
+
It includes metadata like name, description, and parameter schema.
|
|
210
|
+
|
|
211
|
+
This class is not instantiated directly but created by the `@tool()` decorator.
|
|
212
|
+
"""
|
|
213
|
+
|
|
214
|
+
@classmethod
|
|
215
|
+
def from_function( # pyright: ignore[reportIncompatibleMethodOverride]
|
|
216
|
+
cls,
|
|
217
|
+
fn: AsyncContextToolFn[DepsT, AnyP, JsonableCovariantT],
|
|
218
|
+
*,
|
|
219
|
+
strict: bool | None = None,
|
|
220
|
+
) -> AsyncContextTool[DepsT, JsonableCovariantT, AnyP]:
|
|
221
|
+
"""Create an `AsyncContextTool` by inspecting a function and its docstring.
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
fn: The function to extract schema from
|
|
225
|
+
strict: Whether the tool should use strict mode when supported.
|
|
226
|
+
If None, uses provider's default (usually as strict as possible).
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
an `AsyncContextTool` representing the function
|
|
230
|
+
"""
|
|
231
|
+
schema = ToolSchema.from_function(fn, strict=strict, is_context_tool=True)
|
|
232
|
+
return cls(
|
|
233
|
+
fn=cast(AsyncContextToolFn[DepsT, AnyP, JsonableCovariantT], schema.fn),
|
|
234
|
+
name=schema.name,
|
|
235
|
+
description=schema.description,
|
|
236
|
+
parameters=schema.parameters,
|
|
237
|
+
strict=schema.strict,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
def __call__(
|
|
241
|
+
self,
|
|
242
|
+
ctx: Context[DepsT],
|
|
243
|
+
*args: AnyP.args,
|
|
244
|
+
**kwargs: AnyP.kwargs,
|
|
245
|
+
) -> Awaitable[JsonableCovariantT]:
|
|
246
|
+
"""Call the underlying async function directly with context."""
|
|
247
|
+
return self.fn(ctx, *args, **kwargs)
|
|
248
|
+
|
|
249
|
+
async def execute(
|
|
250
|
+
self, ctx: Context[DepsT], tool_call: ToolCall
|
|
251
|
+
) -> ToolOutput[JsonableCovariantT]:
|
|
252
|
+
"""Execute the async context tool using an LLM-provided `ToolCall`."""
|
|
253
|
+
kwargs_callable = cast(
|
|
254
|
+
AsyncJsonKwargsCallable[DepsT, JsonableCovariantT], self.fn
|
|
255
|
+
)
|
|
256
|
+
error: ToolError | None = None
|
|
257
|
+
try:
|
|
258
|
+
kwargs_from_json = json.loads(tool_call.args)
|
|
259
|
+
result = await kwargs_callable(ctx, **kwargs_from_json)
|
|
260
|
+
except Exception as e:
|
|
261
|
+
result = str(e)
|
|
262
|
+
error = ToolExecutionError(e)
|
|
263
|
+
return ToolOutput(id=tool_call.id, result=result, error=error, name=self.name)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""Type aliases for tool parameter types used in provider signatures."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
from typing import TypeAlias
|
|
7
|
+
from typing_extensions import TypeAliasType
|
|
8
|
+
|
|
9
|
+
from ..context import DepsT
|
|
10
|
+
from .provider_tools import ProviderTool
|
|
11
|
+
from .tool_schema import AnyToolSchema
|
|
12
|
+
from .toolkit import (
|
|
13
|
+
AsyncContextToolkit,
|
|
14
|
+
AsyncToolkit,
|
|
15
|
+
BaseToolkit,
|
|
16
|
+
ContextToolkit,
|
|
17
|
+
Toolkit,
|
|
18
|
+
)
|
|
19
|
+
from .tools import AsyncContextTool, AsyncTool, ContextTool, Tool
|
|
20
|
+
|
|
21
|
+
AnyTools: TypeAlias = (
|
|
22
|
+
Sequence[AnyToolSchema | ProviderTool] | BaseToolkit[AnyToolSchema]
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
Tools: TypeAlias = Sequence[Tool | ProviderTool] | Toolkit
|
|
26
|
+
"""Type alias for sync tool parameters: a sequence of Tools or a Toolkit."""
|
|
27
|
+
|
|
28
|
+
AsyncTools: TypeAlias = Sequence[AsyncTool | ProviderTool] | AsyncToolkit
|
|
29
|
+
"""Type alias for async tool parameters: a sequence of AsyncTools or an AsyncToolkit."""
|
|
30
|
+
|
|
31
|
+
ContextTools = TypeAliasType(
|
|
32
|
+
"ContextTools",
|
|
33
|
+
Sequence[Tool | ContextTool[DepsT] | ProviderTool] | ContextToolkit[DepsT],
|
|
34
|
+
type_params=(DepsT,),
|
|
35
|
+
)
|
|
36
|
+
"""Type alias for sync context tool parameters: a sequence of Tools/ContextTools or a ContextToolkit."""
|
|
37
|
+
|
|
38
|
+
AsyncContextTools = TypeAliasType(
|
|
39
|
+
"AsyncContextTools",
|
|
40
|
+
Sequence[AsyncTool | AsyncContextTool[DepsT] | ProviderTool]
|
|
41
|
+
| AsyncContextToolkit[DepsT],
|
|
42
|
+
type_params=(DepsT,),
|
|
43
|
+
)
|
|
44
|
+
"""Type alias for async context tool parameters: a sequence of AsyncTools/AsyncContextTools or an AsyncContextToolkit."""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def normalize_tools(tools: Tools | None) -> Toolkit:
|
|
48
|
+
"""Normalize tools input to a Toolkit.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
tools: A sequence of Tools, a Toolkit, or None.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
A Toolkit containing the tools (or an empty Toolkit if None).
|
|
55
|
+
"""
|
|
56
|
+
if tools is None:
|
|
57
|
+
return Toolkit(None)
|
|
58
|
+
if isinstance(tools, Toolkit):
|
|
59
|
+
return tools
|
|
60
|
+
return Toolkit(tools)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def normalize_async_tools(tools: AsyncTools | None) -> AsyncToolkit:
|
|
64
|
+
"""Normalize async tools input to an AsyncToolkit.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
tools: A sequence of AsyncTools, an AsyncToolkit, or None.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
An AsyncToolkit containing the tools (or an empty AsyncToolkit if None).
|
|
71
|
+
"""
|
|
72
|
+
if tools is None:
|
|
73
|
+
return AsyncToolkit(None)
|
|
74
|
+
if isinstance(tools, AsyncToolkit):
|
|
75
|
+
return tools
|
|
76
|
+
return AsyncToolkit(tools)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def normalize_context_tools(
|
|
80
|
+
tools: ContextTools[DepsT] | None,
|
|
81
|
+
) -> ContextToolkit[DepsT]:
|
|
82
|
+
"""Normalize context tools input to a ContextToolkit.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
tools: A sequence of Tools/ContextTools, a ContextToolkit, or None.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
A ContextToolkit containing the tools (or an empty ContextToolkit if None).
|
|
89
|
+
"""
|
|
90
|
+
if tools is None:
|
|
91
|
+
return ContextToolkit(None)
|
|
92
|
+
if isinstance(tools, ContextToolkit):
|
|
93
|
+
return tools
|
|
94
|
+
return ContextToolkit(tools)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def normalize_async_context_tools(
|
|
98
|
+
tools: AsyncContextTools[DepsT] | None,
|
|
99
|
+
) -> AsyncContextToolkit[DepsT]:
|
|
100
|
+
"""Normalize async context tools input to an AsyncContextToolkit.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
tools: A sequence of AsyncTools/AsyncContextTools, an AsyncContextToolkit, or None.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
An AsyncContextToolkit containing the tools (or an empty AsyncContextToolkit if None).
|
|
107
|
+
"""
|
|
108
|
+
if tools is None:
|
|
109
|
+
return AsyncContextToolkit(None)
|
|
110
|
+
if isinstance(tools, AsyncContextToolkit):
|
|
111
|
+
return tools
|
|
112
|
+
return AsyncContextToolkit(tools)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Web search tool for provider-native web search capabilities."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
|
|
5
|
+
from .provider_tools import ProviderTool
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(frozen=True)
|
|
9
|
+
class WebSearchTool(ProviderTool):
|
|
10
|
+
"""Web search tool that allows the model to search the internet.
|
|
11
|
+
|
|
12
|
+
This is a provider tool - the search is executed server-side by the provider,
|
|
13
|
+
not by your code. The model decides when to search based on the prompt,
|
|
14
|
+
and the provider returns search results with citations.
|
|
15
|
+
|
|
16
|
+
Supported providers include Anthropic, Google, and OpenAI (when using the Responses API).
|
|
17
|
+
|
|
18
|
+
Example:
|
|
19
|
+
```python
|
|
20
|
+
from mirascope import llm
|
|
21
|
+
|
|
22
|
+
@llm.call("anthropic/claude-sonnet-4-5", tools=[llm.WebSearchTool()])
|
|
23
|
+
def search_web(query: str) -> str:
|
|
24
|
+
return f"Search the web for: {query}"
|
|
25
|
+
|
|
26
|
+
response = search_web("Who won the 2024 Super Bowl?")
|
|
27
|
+
print(response.text()) # Response includes citations from web search
|
|
28
|
+
```
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
name: str = field(default="web_search", init=False)
|
|
32
|
+
"""The tool name. Always "web_search" for this tool type."""
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Types for the LLM module."""
|
|
2
|
+
|
|
3
|
+
from .dataclass import Dataclass
|
|
4
|
+
from .jsonable import (
|
|
5
|
+
Jsonable,
|
|
6
|
+
JsonableCovariantT,
|
|
7
|
+
JsonableT,
|
|
8
|
+
)
|
|
9
|
+
from .type_vars import AnyP, CovariantT, P
|
|
10
|
+
|
|
11
|
+
NoneType = type(None)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"AnyP",
|
|
15
|
+
"CovariantT",
|
|
16
|
+
"Dataclass",
|
|
17
|
+
"Jsonable",
|
|
18
|
+
"JsonableCovariantT",
|
|
19
|
+
"JsonableT",
|
|
20
|
+
"NoneType",
|
|
21
|
+
"P",
|
|
22
|
+
]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Typing for JSON serializable objects."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping, Sequence
|
|
4
|
+
from typing import Protocol, TypeAlias
|
|
5
|
+
from typing_extensions import TypeVar
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class JsonableObject(Protocol):
|
|
9
|
+
"""Protocol for JSON-serializable objects.
|
|
10
|
+
|
|
11
|
+
This protocol defines the interface for objects that can be serialized to
|
|
12
|
+
JSON. It is used to annotate the `JsonableType` type alias.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def json(self) -> str:
|
|
16
|
+
"""Serialize the object as a JSON string."""
|
|
17
|
+
...
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
Jsonable: TypeAlias = (
|
|
21
|
+
None
|
|
22
|
+
| str
|
|
23
|
+
| int
|
|
24
|
+
| float
|
|
25
|
+
| bool
|
|
26
|
+
| Sequence["Jsonable"]
|
|
27
|
+
| Mapping[str, "Jsonable"]
|
|
28
|
+
| JsonableObject
|
|
29
|
+
)
|
|
30
|
+
"""Simple type alias for JSON-serializable types."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
JsonableT = TypeVar("JsonableT", bound=Jsonable)
|
|
34
|
+
"""Type variable for tool output types.
|
|
35
|
+
|
|
36
|
+
This TypeVar represents the return type of tool functions, which must be
|
|
37
|
+
serializable to JSON (bound to Jsonable) for LLM consumption.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
JsonableCovariantT = TypeVar(
|
|
42
|
+
"JsonableCovariantT", covariant=True, bound=Jsonable, default=Jsonable
|
|
43
|
+
)
|
|
44
|
+
"""Type variable for covariant types that are Jsonable."""
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Common TypeVar definitions for the LLM module."""
|
|
2
|
+
|
|
3
|
+
from typing import TypeVar
|
|
4
|
+
from typing_extensions import ParamSpec
|
|
5
|
+
|
|
6
|
+
P = ParamSpec("P")
|
|
7
|
+
"""Parameter specification for function signatures.
|
|
8
|
+
|
|
9
|
+
This ParamSpec is used to preserve function parameter types and signatures
|
|
10
|
+
when wrapping functions with decorators or creating generic callable types.
|
|
11
|
+
It captures both positional and keyword arguments (*args, **kwargs) while
|
|
12
|
+
maintaining their original types.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
AnyP = ParamSpec("AnyP", default=...)
|
|
16
|
+
"""A parameter specification that defaults to ..."""
|
|
17
|
+
|
|
18
|
+
CovariantT = TypeVar("CovariantT", covariant=True)
|
|
19
|
+
"""Type variable for covariant types."""
|