mirascope 1.22.4__py3-none-any.whl → 2.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mirascope/__init__.py +5 -50
- mirascope/_stubs.py +384 -0
- mirascope/_utils.py +34 -0
- mirascope/api/__init__.py +14 -0
- mirascope/api/_generated/README.md +207 -0
- mirascope/api/_generated/__init__.py +444 -0
- mirascope/api/_generated/annotations/__init__.py +33 -0
- mirascope/api/_generated/annotations/client.py +506 -0
- mirascope/api/_generated/annotations/raw_client.py +1414 -0
- mirascope/api/_generated/annotations/types/__init__.py +31 -0
- mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
- mirascope/api/_generated/api_keys/__init__.py +17 -0
- mirascope/api/_generated/api_keys/client.py +530 -0
- mirascope/api/_generated/api_keys/raw_client.py +1236 -0
- mirascope/api/_generated/api_keys/types/__init__.py +15 -0
- mirascope/api/_generated/api_keys/types/api_keys_create_response.py +28 -0
- mirascope/api/_generated/api_keys/types/api_keys_get_response.py +27 -0
- mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
- mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +27 -0
- mirascope/api/_generated/client.py +211 -0
- mirascope/api/_generated/core/__init__.py +52 -0
- mirascope/api/_generated/core/api_error.py +23 -0
- mirascope/api/_generated/core/client_wrapper.py +46 -0
- mirascope/api/_generated/core/datetime_utils.py +28 -0
- mirascope/api/_generated/core/file.py +67 -0
- mirascope/api/_generated/core/force_multipart.py +16 -0
- mirascope/api/_generated/core/http_client.py +543 -0
- mirascope/api/_generated/core/http_response.py +55 -0
- mirascope/api/_generated/core/jsonable_encoder.py +100 -0
- mirascope/api/_generated/core/pydantic_utilities.py +255 -0
- mirascope/api/_generated/core/query_encoder.py +58 -0
- mirascope/api/_generated/core/remove_none_from_dict.py +11 -0
- mirascope/api/_generated/core/request_options.py +35 -0
- mirascope/api/_generated/core/serialization.py +276 -0
- mirascope/api/_generated/docs/__init__.py +4 -0
- mirascope/api/_generated/docs/client.py +91 -0
- mirascope/api/_generated/docs/raw_client.py +178 -0
- mirascope/api/_generated/environment.py +9 -0
- mirascope/api/_generated/environments/__init__.py +23 -0
- mirascope/api/_generated/environments/client.py +649 -0
- mirascope/api/_generated/environments/raw_client.py +1567 -0
- mirascope/api/_generated/environments/types/__init__.py +25 -0
- mirascope/api/_generated/environments/types/environments_create_response.py +24 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
- mirascope/api/_generated/environments/types/environments_get_response.py +24 -0
- mirascope/api/_generated/environments/types/environments_list_response_item.py +24 -0
- mirascope/api/_generated/environments/types/environments_update_response.py +24 -0
- mirascope/api/_generated/errors/__init__.py +25 -0
- mirascope/api/_generated/errors/bad_request_error.py +14 -0
- mirascope/api/_generated/errors/conflict_error.py +14 -0
- mirascope/api/_generated/errors/forbidden_error.py +11 -0
- mirascope/api/_generated/errors/internal_server_error.py +10 -0
- mirascope/api/_generated/errors/not_found_error.py +11 -0
- mirascope/api/_generated/errors/payment_required_error.py +15 -0
- mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
- mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
- mirascope/api/_generated/errors/unauthorized_error.py +11 -0
- mirascope/api/_generated/functions/__init__.py +39 -0
- mirascope/api/_generated/functions/client.py +647 -0
- mirascope/api/_generated/functions/raw_client.py +1890 -0
- mirascope/api/_generated/functions/types/__init__.py +53 -0
- mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
- mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
- mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
- mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
- mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
- mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
- mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
- mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
- mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
- mirascope/api/_generated/health/__init__.py +7 -0
- mirascope/api/_generated/health/client.py +92 -0
- mirascope/api/_generated/health/raw_client.py +175 -0
- mirascope/api/_generated/health/types/__init__.py +8 -0
- mirascope/api/_generated/health/types/health_check_response.py +22 -0
- mirascope/api/_generated/health/types/health_check_response_status.py +5 -0
- mirascope/api/_generated/organization_invitations/__init__.py +33 -0
- mirascope/api/_generated/organization_invitations/client.py +546 -0
- mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
- mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
- mirascope/api/_generated/organization_memberships/__init__.py +19 -0
- mirascope/api/_generated/organization_memberships/client.py +302 -0
- mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
- mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
- mirascope/api/_generated/organizations/__init__.py +51 -0
- mirascope/api/_generated/organizations/client.py +869 -0
- mirascope/api/_generated/organizations/raw_client.py +2593 -0
- mirascope/api/_generated/organizations/types/__init__.py +71 -0
- mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
- mirascope/api/_generated/organizations/types/organizations_create_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_create_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_get_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_get_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_list_response_item.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_update_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_update_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
- mirascope/api/_generated/project_memberships/__init__.py +29 -0
- mirascope/api/_generated/project_memberships/client.py +528 -0
- mirascope/api/_generated/project_memberships/raw_client.py +1278 -0
- mirascope/api/_generated/project_memberships/types/__init__.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_get_response.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_get_response_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
- mirascope/api/_generated/projects/__init__.py +7 -0
- mirascope/api/_generated/projects/client.py +428 -0
- mirascope/api/_generated/projects/raw_client.py +1302 -0
- mirascope/api/_generated/projects/types/__init__.py +10 -0
- mirascope/api/_generated/projects/types/projects_create_response.py +25 -0
- mirascope/api/_generated/projects/types/projects_get_response.py +25 -0
- mirascope/api/_generated/projects/types/projects_list_response_item.py +25 -0
- mirascope/api/_generated/projects/types/projects_update_response.py +25 -0
- mirascope/api/_generated/reference.md +4987 -0
- mirascope/api/_generated/tags/__init__.py +19 -0
- mirascope/api/_generated/tags/client.py +504 -0
- mirascope/api/_generated/tags/raw_client.py +1288 -0
- mirascope/api/_generated/tags/types/__init__.py +17 -0
- mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
- mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
- mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
- mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
- mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
- mirascope/api/_generated/token_cost/__init__.py +7 -0
- mirascope/api/_generated/token_cost/client.py +160 -0
- mirascope/api/_generated/token_cost/raw_client.py +264 -0
- mirascope/api/_generated/token_cost/types/__init__.py +8 -0
- mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
- mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
- mirascope/api/_generated/traces/__init__.py +97 -0
- mirascope/api/_generated/traces/client.py +1103 -0
- mirascope/api/_generated/traces/raw_client.py +2322 -0
- mirascope/api/_generated/traces/types/__init__.py +155 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +29 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +27 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +20 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +29 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +31 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +48 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +24 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +20 -0
- mirascope/api/_generated/traces/types/traces_create_response.py +24 -0
- mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +22 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
- mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
- mirascope/api/_generated/types/__init__.py +85 -0
- mirascope/api/_generated/types/already_exists_error.py +22 -0
- mirascope/api/_generated/types/already_exists_error_tag.py +5 -0
- mirascope/api/_generated/types/bad_request_error_body.py +50 -0
- mirascope/api/_generated/types/click_house_error.py +22 -0
- mirascope/api/_generated/types/database_error.py +22 -0
- mirascope/api/_generated/types/database_error_tag.py +5 -0
- mirascope/api/_generated/types/date.py +3 -0
- mirascope/api/_generated/types/http_api_decode_error.py +27 -0
- mirascope/api/_generated/types/http_api_decode_error_tag.py +5 -0
- mirascope/api/_generated/types/immutable_resource_error.py +22 -0
- mirascope/api/_generated/types/internal_server_error_body.py +49 -0
- mirascope/api/_generated/types/issue.py +38 -0
- mirascope/api/_generated/types/issue_tag.py +10 -0
- mirascope/api/_generated/types/not_found_error_body.py +22 -0
- mirascope/api/_generated/types/not_found_error_tag.py +5 -0
- mirascope/api/_generated/types/number_from_string.py +3 -0
- mirascope/api/_generated/types/permission_denied_error.py +22 -0
- mirascope/api/_generated/types/permission_denied_error_tag.py +5 -0
- mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
- mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
- mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
- mirascope/api/_generated/types/property_key.py +7 -0
- mirascope/api/_generated/types/property_key_key.py +25 -0
- mirascope/api/_generated/types/property_key_key_tag.py +5 -0
- mirascope/api/_generated/types/rate_limit_error.py +31 -0
- mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
- mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
- mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
- mirascope/api/_generated/types/stripe_error.py +20 -0
- mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
- mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
- mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
- mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
- mirascope/api/client.py +255 -0
- mirascope/api/settings.py +99 -0
- mirascope/llm/__init__.py +309 -13
- mirascope/llm/calls/__init__.py +17 -0
- mirascope/llm/calls/calls.py +348 -0
- mirascope/llm/calls/decorator.py +268 -0
- mirascope/llm/content/__init__.py +71 -0
- mirascope/llm/content/audio.py +173 -0
- mirascope/llm/content/document.py +94 -0
- mirascope/llm/content/image.py +206 -0
- mirascope/llm/content/text.py +47 -0
- mirascope/llm/content/thought.py +58 -0
- mirascope/llm/content/tool_call.py +69 -0
- mirascope/llm/content/tool_output.py +43 -0
- mirascope/llm/context/__init__.py +6 -0
- mirascope/llm/context/_utils.py +41 -0
- mirascope/llm/context/context.py +24 -0
- mirascope/llm/exceptions.py +360 -0
- mirascope/llm/formatting/__init__.py +39 -0
- mirascope/llm/formatting/format.py +291 -0
- mirascope/llm/formatting/from_call_args.py +30 -0
- mirascope/llm/formatting/output_parser.py +178 -0
- mirascope/llm/formatting/partial.py +131 -0
- mirascope/llm/formatting/primitives.py +192 -0
- mirascope/llm/formatting/types.py +83 -0
- mirascope/llm/mcp/__init__.py +5 -0
- mirascope/llm/mcp/mcp_client.py +130 -0
- mirascope/llm/messages/__init__.py +35 -0
- mirascope/llm/messages/_utils.py +34 -0
- mirascope/llm/messages/message.py +190 -0
- mirascope/llm/models/__init__.py +21 -0
- mirascope/llm/models/models.py +1339 -0
- mirascope/llm/models/params.py +72 -0
- mirascope/llm/models/thinking_config.py +61 -0
- mirascope/llm/prompts/__init__.py +34 -0
- mirascope/llm/prompts/_utils.py +31 -0
- mirascope/llm/prompts/decorator.py +215 -0
- mirascope/llm/prompts/prompts.py +484 -0
- mirascope/llm/prompts/protocols.py +65 -0
- mirascope/llm/providers/__init__.py +65 -0
- mirascope/llm/providers/anthropic/__init__.py +11 -0
- mirascope/llm/providers/anthropic/_utils/__init__.py +27 -0
- mirascope/llm/providers/anthropic/_utils/beta_decode.py +297 -0
- mirascope/llm/providers/anthropic/_utils/beta_encode.py +272 -0
- mirascope/llm/providers/anthropic/_utils/decode.py +326 -0
- mirascope/llm/providers/anthropic/_utils/encode.py +431 -0
- mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
- mirascope/llm/providers/anthropic/beta_provider.py +338 -0
- mirascope/llm/providers/anthropic/model_id.py +23 -0
- mirascope/llm/providers/anthropic/model_info.py +87 -0
- mirascope/llm/providers/anthropic/provider.py +440 -0
- mirascope/llm/providers/base/__init__.py +14 -0
- mirascope/llm/providers/base/_utils.py +248 -0
- mirascope/llm/providers/base/base_provider.py +1463 -0
- mirascope/llm/providers/base/kwargs.py +12 -0
- mirascope/llm/providers/google/__init__.py +6 -0
- mirascope/llm/providers/google/_utils/__init__.py +17 -0
- mirascope/llm/providers/google/_utils/decode.py +357 -0
- mirascope/llm/providers/google/_utils/encode.py +418 -0
- mirascope/llm/providers/google/_utils/errors.py +50 -0
- mirascope/llm/providers/google/message.py +7 -0
- mirascope/llm/providers/google/model_id.py +22 -0
- mirascope/llm/providers/google/model_info.py +63 -0
- mirascope/llm/providers/google/provider.py +456 -0
- mirascope/llm/providers/mirascope/__init__.py +5 -0
- mirascope/llm/providers/mirascope/_utils.py +73 -0
- mirascope/llm/providers/mirascope/provider.py +313 -0
- mirascope/llm/providers/mlx/__init__.py +9 -0
- mirascope/llm/providers/mlx/_utils.py +141 -0
- mirascope/llm/providers/mlx/encoding/__init__.py +8 -0
- mirascope/llm/providers/mlx/encoding/base.py +69 -0
- mirascope/llm/providers/mlx/encoding/transformers.py +146 -0
- mirascope/llm/providers/mlx/mlx.py +242 -0
- mirascope/llm/providers/mlx/model_id.py +17 -0
- mirascope/llm/providers/mlx/provider.py +416 -0
- mirascope/llm/providers/model_id.py +16 -0
- mirascope/llm/providers/ollama/__init__.py +7 -0
- mirascope/llm/providers/ollama/provider.py +71 -0
- mirascope/llm/providers/openai/__init__.py +15 -0
- mirascope/llm/providers/openai/_utils/__init__.py +5 -0
- mirascope/llm/providers/openai/_utils/errors.py +46 -0
- mirascope/llm/providers/openai/completions/__init__.py +7 -0
- mirascope/llm/providers/openai/completions/_utils/__init__.py +18 -0
- mirascope/llm/providers/openai/completions/_utils/decode.py +252 -0
- mirascope/llm/providers/openai/completions/_utils/encode.py +390 -0
- mirascope/llm/providers/openai/completions/_utils/feature_info.py +50 -0
- mirascope/llm/providers/openai/completions/base_provider.py +522 -0
- mirascope/llm/providers/openai/completions/provider.py +28 -0
- mirascope/llm/providers/openai/model_id.py +31 -0
- mirascope/llm/providers/openai/model_info.py +303 -0
- mirascope/llm/providers/openai/provider.py +405 -0
- mirascope/llm/providers/openai/responses/__init__.py +5 -0
- mirascope/llm/providers/openai/responses/_utils/__init__.py +15 -0
- mirascope/llm/providers/openai/responses/_utils/decode.py +289 -0
- mirascope/llm/providers/openai/responses/_utils/encode.py +399 -0
- mirascope/llm/providers/openai/responses/provider.py +472 -0
- mirascope/llm/providers/openrouter/__init__.py +5 -0
- mirascope/llm/providers/openrouter/provider.py +67 -0
- mirascope/llm/providers/provider_id.py +26 -0
- mirascope/llm/providers/provider_registry.py +305 -0
- mirascope/llm/providers/together/__init__.py +7 -0
- mirascope/llm/providers/together/provider.py +40 -0
- mirascope/llm/responses/__init__.py +66 -0
- mirascope/llm/responses/_utils.py +146 -0
- mirascope/llm/responses/base_response.py +103 -0
- mirascope/llm/responses/base_stream_response.py +824 -0
- mirascope/llm/responses/finish_reason.py +28 -0
- mirascope/llm/responses/response.py +362 -0
- mirascope/llm/responses/root_response.py +248 -0
- mirascope/llm/responses/stream_response.py +577 -0
- mirascope/llm/responses/streams.py +363 -0
- mirascope/llm/responses/usage.py +139 -0
- mirascope/llm/tools/__init__.py +71 -0
- mirascope/llm/tools/_utils.py +34 -0
- mirascope/llm/tools/decorator.py +184 -0
- mirascope/llm/tools/protocols.py +96 -0
- mirascope/llm/tools/provider_tools.py +18 -0
- mirascope/llm/tools/tool_schema.py +321 -0
- mirascope/llm/tools/toolkit.py +178 -0
- mirascope/llm/tools/tools.py +263 -0
- mirascope/llm/tools/types.py +112 -0
- mirascope/llm/tools/web_search_tool.py +32 -0
- mirascope/llm/types/__init__.py +22 -0
- mirascope/llm/types/dataclass.py +9 -0
- mirascope/llm/types/jsonable.py +44 -0
- mirascope/llm/types/type_vars.py +19 -0
- mirascope/ops/__init__.py +129 -0
- mirascope/ops/_internal/__init__.py +5 -0
- mirascope/ops/_internal/closure.py +1172 -0
- mirascope/ops/_internal/configuration.py +177 -0
- mirascope/ops/_internal/context.py +76 -0
- mirascope/ops/_internal/exporters/__init__.py +26 -0
- mirascope/ops/_internal/exporters/exporters.py +362 -0
- mirascope/ops/_internal/exporters/processors.py +104 -0
- mirascope/ops/_internal/exporters/types.py +165 -0
- mirascope/ops/_internal/exporters/utils.py +66 -0
- mirascope/ops/_internal/instrumentation/__init__.py +28 -0
- mirascope/ops/_internal/instrumentation/llm/__init__.py +8 -0
- mirascope/ops/_internal/instrumentation/llm/common.py +500 -0
- mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
- mirascope/ops/_internal/instrumentation/llm/encode.py +238 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +38 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +31 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +38 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +18 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +100 -0
- mirascope/ops/_internal/instrumentation/llm/llm.py +161 -0
- mirascope/ops/_internal/instrumentation/llm/model.py +1777 -0
- mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
- mirascope/ops/_internal/instrumentation/llm/serialize.py +324 -0
- mirascope/ops/_internal/instrumentation/providers/__init__.py +29 -0
- mirascope/ops/_internal/instrumentation/providers/anthropic.py +78 -0
- mirascope/ops/_internal/instrumentation/providers/base.py +179 -0
- mirascope/ops/_internal/instrumentation/providers/google_genai.py +85 -0
- mirascope/ops/_internal/instrumentation/providers/openai.py +82 -0
- mirascope/ops/_internal/propagation.py +198 -0
- mirascope/ops/_internal/protocols.py +133 -0
- mirascope/ops/_internal/session.py +139 -0
- mirascope/ops/_internal/spans.py +232 -0
- mirascope/ops/_internal/traced_calls.py +389 -0
- mirascope/ops/_internal/traced_functions.py +528 -0
- mirascope/ops/_internal/tracing.py +353 -0
- mirascope/ops/_internal/types.py +13 -0
- mirascope/ops/_internal/utils.py +131 -0
- mirascope/ops/_internal/versioned_calls.py +512 -0
- mirascope/ops/_internal/versioned_functions.py +357 -0
- mirascope/ops/_internal/versioning.py +303 -0
- mirascope/ops/exceptions.py +21 -0
- mirascope-2.1.1.dist-info/METADATA +231 -0
- mirascope-2.1.1.dist-info/RECORD +437 -0
- mirascope-2.1.1.dist-info/WHEEL +4 -0
- mirascope-2.1.1.dist-info/licenses/LICENSE +21 -0
- mirascope/beta/__init__.py +0 -3
- mirascope/beta/openai/__init__.py +0 -17
- mirascope/beta/openai/realtime/__init__.py +0 -13
- mirascope/beta/openai/realtime/_utils/__init__.py +0 -3
- mirascope/beta/openai/realtime/_utils/_audio.py +0 -74
- mirascope/beta/openai/realtime/_utils/_protocols.py +0 -50
- mirascope/beta/openai/realtime/realtime.py +0 -500
- mirascope/beta/openai/realtime/recording.py +0 -98
- mirascope/beta/openai/realtime/tool.py +0 -113
- mirascope/beta/rag/__init__.py +0 -24
- mirascope/beta/rag/base/__init__.py +0 -22
- mirascope/beta/rag/base/chunkers/__init__.py +0 -2
- mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
- mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
- mirascope/beta/rag/base/config.py +0 -8
- mirascope/beta/rag/base/document.py +0 -11
- mirascope/beta/rag/base/embedders.py +0 -35
- mirascope/beta/rag/base/embedding_params.py +0 -18
- mirascope/beta/rag/base/embedding_response.py +0 -30
- mirascope/beta/rag/base/query_results.py +0 -7
- mirascope/beta/rag/base/vectorstore_params.py +0 -18
- mirascope/beta/rag/base/vectorstores.py +0 -37
- mirascope/beta/rag/chroma/__init__.py +0 -11
- mirascope/beta/rag/chroma/types.py +0 -57
- mirascope/beta/rag/chroma/vectorstores.py +0 -97
- mirascope/beta/rag/cohere/__init__.py +0 -11
- mirascope/beta/rag/cohere/embedders.py +0 -87
- mirascope/beta/rag/cohere/embedding_params.py +0 -29
- mirascope/beta/rag/cohere/embedding_response.py +0 -29
- mirascope/beta/rag/cohere/py.typed +0 -0
- mirascope/beta/rag/openai/__init__.py +0 -11
- mirascope/beta/rag/openai/embedders.py +0 -144
- mirascope/beta/rag/openai/embedding_params.py +0 -18
- mirascope/beta/rag/openai/embedding_response.py +0 -14
- mirascope/beta/rag/openai/py.typed +0 -0
- mirascope/beta/rag/pinecone/__init__.py +0 -19
- mirascope/beta/rag/pinecone/types.py +0 -143
- mirascope/beta/rag/pinecone/vectorstores.py +0 -148
- mirascope/beta/rag/weaviate/__init__.py +0 -6
- mirascope/beta/rag/weaviate/types.py +0 -92
- mirascope/beta/rag/weaviate/vectorstores.py +0 -103
- mirascope/core/__init__.py +0 -107
- mirascope/core/anthropic/__init__.py +0 -31
- mirascope/core/anthropic/_call.py +0 -67
- mirascope/core/anthropic/_call_kwargs.py +0 -13
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_convert_common_call_params.py +0 -25
- mirascope/core/anthropic/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -102
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -31
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -113
- mirascope/core/anthropic/_utils/_message_param_converter.py +0 -142
- mirascope/core/anthropic/_utils/_setup_call.py +0 -134
- mirascope/core/anthropic/call_params.py +0 -41
- mirascope/core/anthropic/call_response.py +0 -206
- mirascope/core/anthropic/call_response_chunk.py +0 -132
- mirascope/core/anthropic/dynamic_config.py +0 -40
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -147
- mirascope/core/anthropic/tool.py +0 -101
- mirascope/core/azure/__init__.py +0 -31
- mirascope/core/azure/_call.py +0 -67
- mirascope/core/azure/_call_kwargs.py +0 -13
- mirascope/core/azure/_utils/__init__.py +0 -14
- mirascope/core/azure/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/azure/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -21
- mirascope/core/azure/_utils/_convert_message_params.py +0 -121
- mirascope/core/azure/_utils/_get_credential.py +0 -33
- mirascope/core/azure/_utils/_get_json_output.py +0 -27
- mirascope/core/azure/_utils/_handle_stream.py +0 -130
- mirascope/core/azure/_utils/_message_param_converter.py +0 -117
- mirascope/core/azure/_utils/_setup_call.py +0 -183
- mirascope/core/azure/call_params.py +0 -59
- mirascope/core/azure/call_response.py +0 -215
- mirascope/core/azure/call_response_chunk.py +0 -105
- mirascope/core/azure/dynamic_config.py +0 -30
- mirascope/core/azure/py.typed +0 -0
- mirascope/core/azure/stream.py +0 -147
- mirascope/core/azure/tool.py +0 -93
- mirascope/core/base/__init__.py +0 -84
- mirascope/core/base/_call_factory.py +0 -256
- mirascope/core/base/_create.py +0 -253
- mirascope/core/base/_extract.py +0 -175
- mirascope/core/base/_extract_with_tools.py +0 -189
- mirascope/core/base/_partial.py +0 -95
- mirascope/core/base/_utils/__init__.py +0 -92
- mirascope/core/base/_utils/_base_message_param_converter.py +0 -22
- mirascope/core/base/_utils/_base_type.py +0 -26
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -48
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -139
- mirascope/core/base/_utils/_convert_messages_to_message_params.py +0 -171
- mirascope/core/base/_utils/_convert_provider_finish_reason_to_finish_reason.py +0 -20
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -42
- mirascope/core/base/_utils/_fn_is_async.py +0 -15
- mirascope/core/base/_utils/_format_template.py +0 -32
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_common_usage.py +0 -20
- mirascope/core/base/_utils/_get_create_fn_or_async_create_fn.py +0 -137
- mirascope/core/base/_utils/_get_document_type.py +0 -7
- mirascope/core/base/_utils/_get_dynamic_configuration.py +0 -69
- mirascope/core/base/_utils/_get_fields_from_call_args.py +0 -34
- mirascope/core/base/_utils/_get_fn_args.py +0 -23
- mirascope/core/base/_utils/_get_image_dimensions.py +0 -39
- mirascope/core/base/_utils/_get_image_type.py +0 -26
- mirascope/core/base/_utils/_get_metadata.py +0 -17
- mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
- mirascope/core/base/_utils/_get_prompt_template.py +0 -28
- mirascope/core/base/_utils/_get_template_values.py +0 -51
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_get_unsupported_tool_config_keys.py +0 -10
- mirascope/core/base/_utils/_is_prompt_template.py +0 -24
- mirascope/core/base/_utils/_json_mode_content.py +0 -17
- mirascope/core/base/_utils/_messages_decorator.py +0 -121
- mirascope/core/base/_utils/_parse_content_template.py +0 -321
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -63
- mirascope/core/base/_utils/_pil_image_to_bytes.py +0 -13
- mirascope/core/base/_utils/_protocols.py +0 -901
- mirascope/core/base/_utils/_setup_call.py +0 -79
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -30
- mirascope/core/base/call_kwargs.py +0 -13
- mirascope/core/base/call_params.py +0 -36
- mirascope/core/base/call_response.py +0 -340
- mirascope/core/base/call_response_chunk.py +0 -130
- mirascope/core/base/dynamic_config.py +0 -82
- mirascope/core/base/from_call_args.py +0 -30
- mirascope/core/base/merge_decorators.py +0 -59
- mirascope/core/base/message_param.py +0 -162
- mirascope/core/base/messages.py +0 -111
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -497
- mirascope/core/base/response_model_config_dict.py +0 -9
- mirascope/core/base/stream.py +0 -479
- mirascope/core/base/stream_config.py +0 -11
- mirascope/core/base/structured_stream.py +0 -296
- mirascope/core/base/tool.py +0 -205
- mirascope/core/base/toolkit.py +0 -176
- mirascope/core/base/types.py +0 -344
- mirascope/core/bedrock/__init__.py +0 -34
- mirascope/core/bedrock/_call.py +0 -68
- mirascope/core/bedrock/_call_kwargs.py +0 -12
- mirascope/core/bedrock/_types.py +0 -104
- mirascope/core/bedrock/_utils/__init__.py +0 -14
- mirascope/core/bedrock/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/bedrock/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/bedrock/_utils/_convert_message_params.py +0 -111
- mirascope/core/bedrock/_utils/_get_json_output.py +0 -30
- mirascope/core/bedrock/_utils/_handle_stream.py +0 -104
- mirascope/core/bedrock/_utils/_message_param_converter.py +0 -171
- mirascope/core/bedrock/_utils/_setup_call.py +0 -258
- mirascope/core/bedrock/call_params.py +0 -38
- mirascope/core/bedrock/call_response.py +0 -249
- mirascope/core/bedrock/call_response_chunk.py +0 -111
- mirascope/core/bedrock/dynamic_config.py +0 -37
- mirascope/core/bedrock/py.typed +0 -0
- mirascope/core/bedrock/stream.py +0 -154
- mirascope/core/bedrock/tool.py +0 -96
- mirascope/core/cohere/__init__.py +0 -30
- mirascope/core/cohere/_call.py +0 -67
- mirascope/core/cohere/_call_kwargs.py +0 -11
- mirascope/core/cohere/_types.py +0 -20
- mirascope/core/cohere/_utils/__init__.py +0 -14
- mirascope/core/cohere/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/cohere/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -24
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -32
- mirascope/core/cohere/_utils/_get_json_output.py +0 -30
- mirascope/core/cohere/_utils/_handle_stream.py +0 -35
- mirascope/core/cohere/_utils/_message_param_converter.py +0 -54
- mirascope/core/cohere/_utils/_setup_call.py +0 -150
- mirascope/core/cohere/call_params.py +0 -62
- mirascope/core/cohere/call_response.py +0 -205
- mirascope/core/cohere/call_response_chunk.py +0 -125
- mirascope/core/cohere/dynamic_config.py +0 -32
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -93
- mirascope/core/costs/__init__.py +0 -5
- mirascope/core/costs/_anthropic_calculate_cost.py +0 -219
- mirascope/core/costs/_azure_calculate_cost.py +0 -11
- mirascope/core/costs/_bedrock_calculate_cost.py +0 -15
- mirascope/core/costs/_cohere_calculate_cost.py +0 -44
- mirascope/core/costs/_gemini_calculate_cost.py +0 -67
- mirascope/core/costs/_google_calculate_cost.py +0 -427
- mirascope/core/costs/_groq_calculate_cost.py +0 -156
- mirascope/core/costs/_litellm_calculate_cost.py +0 -11
- mirascope/core/costs/_mistral_calculate_cost.py +0 -64
- mirascope/core/costs/_openai_calculate_cost.py +0 -416
- mirascope/core/costs/_vertex_calculate_cost.py +0 -67
- mirascope/core/costs/_xai_calculate_cost.py +0 -104
- mirascope/core/costs/calculate_cost.py +0 -86
- mirascope/core/gemini/__init__.py +0 -40
- mirascope/core/gemini/_call.py +0 -67
- mirascope/core/gemini/_call_kwargs.py +0 -12
- mirascope/core/gemini/_utils/__init__.py +0 -14
- mirascope/core/gemini/_utils/_convert_common_call_params.py +0 -39
- mirascope/core/gemini/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -156
- mirascope/core/gemini/_utils/_get_json_output.py +0 -35
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_message_param_converter.py +0 -209
- mirascope/core/gemini/_utils/_setup_call.py +0 -149
- mirascope/core/gemini/call_params.py +0 -52
- mirascope/core/gemini/call_response.py +0 -216
- mirascope/core/gemini/call_response_chunk.py +0 -100
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -120
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/google/__init__.py +0 -29
- mirascope/core/google/_call.py +0 -67
- mirascope/core/google/_call_kwargs.py +0 -13
- mirascope/core/google/_utils/__init__.py +0 -14
- mirascope/core/google/_utils/_convert_common_call_params.py +0 -38
- mirascope/core/google/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -27
- mirascope/core/google/_utils/_convert_message_params.py +0 -206
- mirascope/core/google/_utils/_get_json_output.py +0 -37
- mirascope/core/google/_utils/_handle_stream.py +0 -35
- mirascope/core/google/_utils/_message_param_converter.py +0 -162
- mirascope/core/google/_utils/_setup_call.py +0 -201
- mirascope/core/google/_utils/_validate_media_type.py +0 -34
- mirascope/core/google/call_params.py +0 -22
- mirascope/core/google/call_response.py +0 -232
- mirascope/core/google/call_response_chunk.py +0 -110
- mirascope/core/google/dynamic_config.py +0 -26
- mirascope/core/google/stream.py +0 -143
- mirascope/core/google/tool.py +0 -146
- mirascope/core/groq/__init__.py +0 -30
- mirascope/core/groq/_call.py +0 -67
- mirascope/core/groq/_call_kwargs.py +0 -13
- mirascope/core/groq/_utils/__init__.py +0 -14
- mirascope/core/groq/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/groq/_utils/_convert_message_params.py +0 -112
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -123
- mirascope/core/groq/_utils/_message_param_converter.py +0 -89
- mirascope/core/groq/_utils/_setup_call.py +0 -132
- mirascope/core/groq/call_params.py +0 -52
- mirascope/core/groq/call_response.py +0 -213
- mirascope/core/groq/call_response_chunk.py +0 -104
- mirascope/core/groq/dynamic_config.py +0 -29
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -135
- mirascope/core/groq/tool.py +0 -80
- mirascope/core/litellm/__init__.py +0 -28
- mirascope/core/litellm/_call.py +0 -67
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -109
- mirascope/core/litellm/call_params.py +0 -10
- mirascope/core/litellm/call_response.py +0 -24
- mirascope/core/litellm/call_response_chunk.py +0 -14
- mirascope/core/litellm/dynamic_config.py +0 -8
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/litellm/stream.py +0 -86
- mirascope/core/litellm/tool.py +0 -13
- mirascope/core/mistral/__init__.py +0 -36
- mirascope/core/mistral/_call.py +0 -65
- mirascope/core/mistral/_call_kwargs.py +0 -19
- mirascope/core/mistral/_utils/__init__.py +0 -14
- mirascope/core/mistral/_utils/_convert_common_call_params.py +0 -24
- mirascope/core/mistral/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -22
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -122
- mirascope/core/mistral/_utils/_get_json_output.py +0 -34
- mirascope/core/mistral/_utils/_handle_stream.py +0 -139
- mirascope/core/mistral/_utils/_message_param_converter.py +0 -176
- mirascope/core/mistral/_utils/_setup_call.py +0 -154
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -205
- mirascope/core/mistral/call_response_chunk.py +0 -105
- mirascope/core/mistral/dynamic_config.py +0 -33
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -120
- mirascope/core/mistral/tool.py +0 -80
- mirascope/core/openai/__init__.py +0 -31
- mirascope/core/openai/_call.py +0 -67
- mirascope/core/openai/_call_kwargs.py +0 -13
- mirascope/core/openai/_utils/__init__.py +0 -14
- mirascope/core/openai/_utils/_convert_common_call_params.py +0 -26
- mirascope/core/openai/_utils/_convert_message_params.py +0 -146
- mirascope/core/openai/_utils/_get_json_output.py +0 -31
- mirascope/core/openai/_utils/_handle_stream.py +0 -138
- mirascope/core/openai/_utils/_message_param_converter.py +0 -105
- mirascope/core/openai/_utils/_setup_call.py +0 -155
- mirascope/core/openai/call_params.py +0 -91
- mirascope/core/openai/call_response.py +0 -273
- mirascope/core/openai/call_response_chunk.py +0 -139
- mirascope/core/openai/dynamic_config.py +0 -34
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -185
- mirascope/core/openai/tool.py +0 -101
- mirascope/core/py.typed +0 -0
- mirascope/core/vertex/__init__.py +0 -45
- mirascope/core/vertex/_call.py +0 -62
- mirascope/core/vertex/_call_kwargs.py +0 -12
- mirascope/core/vertex/_utils/__init__.py +0 -14
- mirascope/core/vertex/_utils/_convert_common_call_params.py +0 -37
- mirascope/core/vertex/_utils/_convert_finish_reason_to_common_finish_reasons.py +0 -23
- mirascope/core/vertex/_utils/_convert_message_params.py +0 -171
- mirascope/core/vertex/_utils/_get_json_output.py +0 -36
- mirascope/core/vertex/_utils/_handle_stream.py +0 -33
- mirascope/core/vertex/_utils/_message_param_converter.py +0 -133
- mirascope/core/vertex/_utils/_setup_call.py +0 -160
- mirascope/core/vertex/call_params.py +0 -24
- mirascope/core/vertex/call_response.py +0 -206
- mirascope/core/vertex/call_response_chunk.py +0 -99
- mirascope/core/vertex/dynamic_config.py +0 -28
- mirascope/core/vertex/stream.py +0 -119
- mirascope/core/vertex/tool.py +0 -101
- mirascope/core/xai/__init__.py +0 -28
- mirascope/core/xai/_call.py +0 -67
- mirascope/core/xai/_utils/__init__.py +0 -5
- mirascope/core/xai/_utils/_setup_call.py +0 -113
- mirascope/core/xai/call_params.py +0 -10
- mirascope/core/xai/call_response.py +0 -16
- mirascope/core/xai/call_response_chunk.py +0 -14
- mirascope/core/xai/dynamic_config.py +0 -8
- mirascope/core/xai/py.typed +0 -0
- mirascope/core/xai/stream.py +0 -57
- mirascope/core/xai/tool.py +0 -13
- mirascope/experimental/graphs/__init__.py +0 -5
- mirascope/experimental/graphs/finite_state_machine.py +0 -714
- mirascope/integrations/__init__.py +0 -16
- mirascope/integrations/_middleware_factory.py +0 -403
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -70
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -225
- mirascope/integrations/logfire/_with_logfire.py +0 -63
- mirascope/integrations/otel/__init__.py +0 -10
- mirascope/integrations/otel/_utils.py +0 -270
- mirascope/integrations/otel/_with_hyperdx.py +0 -60
- mirascope/integrations/otel/_with_otel.py +0 -59
- mirascope/integrations/tenacity.py +0 -14
- mirascope/llm/_call.py +0 -401
- mirascope/llm/_context.py +0 -384
- mirascope/llm/_override.py +0 -3639
- mirascope/llm/_protocols.py +0 -500
- mirascope/llm/_response_metaclass.py +0 -31
- mirascope/llm/call_response.py +0 -167
- mirascope/llm/call_response_chunk.py +0 -66
- mirascope/llm/stream.py +0 -162
- mirascope/llm/tool.py +0 -64
- mirascope/mcp/__init__.py +0 -7
- mirascope/mcp/_utils.py +0 -277
- mirascope/mcp/client.py +0 -167
- mirascope/mcp/server.py +0 -356
- mirascope/mcp/tools.py +0 -110
- mirascope/py.typed +0 -0
- mirascope/retries/__init__.py +0 -11
- mirascope/retries/fallback.py +0 -128
- mirascope/retries/tenacity.py +0 -50
- mirascope/tools/__init__.py +0 -37
- mirascope/tools/base.py +0 -98
- mirascope/tools/system/__init__.py +0 -0
- mirascope/tools/system/_docker_operation.py +0 -166
- mirascope/tools/system/_file_system.py +0 -267
- mirascope/tools/web/__init__.py +0 -0
- mirascope/tools/web/_duckduckgo.py +0 -111
- mirascope/tools/web/_httpx.py +0 -125
- mirascope/tools/web/_parse_url_content.py +0 -94
- mirascope/tools/web/_requests.py +0 -54
- mirascope/v0/__init__.py +0 -43
- mirascope/v0/anthropic.py +0 -54
- mirascope/v0/base/__init__.py +0 -12
- mirascope/v0/base/calls.py +0 -118
- mirascope/v0/base/extractors.py +0 -122
- mirascope/v0/base/ops_utils.py +0 -207
- mirascope/v0/base/prompts.py +0 -48
- mirascope/v0/base/types.py +0 -14
- mirascope/v0/base/utils.py +0 -21
- mirascope/v0/openai.py +0 -54
- mirascope-1.22.4.dist-info/METADATA +0 -169
- mirascope-1.22.4.dist-info/RECORD +0 -377
- mirascope-1.22.4.dist-info/WHEEL +0 -4
- mirascope-1.22.4.dist-info/licenses/LICENSE +0 -21
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""The reason the LLM finished generating a response."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Literal
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class FinishReason(str, Enum):
|
|
9
|
+
"""The reason why the LLM finished generating a response.
|
|
10
|
+
|
|
11
|
+
`FinishReason` is only set when the response did not have a normal finish (e.g. it
|
|
12
|
+
ran out of tokens). When a response finishes generating normally, no finish reason
|
|
13
|
+
is set.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
MAX_TOKENS = "max_tokens"
|
|
17
|
+
REFUSAL = "refusal"
|
|
18
|
+
CONTEXT_LENGTH_EXCEEDED = "context_length_exceeded"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(kw_only=True)
|
|
22
|
+
class FinishReasonChunk:
|
|
23
|
+
"""Represents the finish reason for a completed stream."""
|
|
24
|
+
|
|
25
|
+
type: Literal["finish_reason_chunk"] = "finish_reason_chunk"
|
|
26
|
+
|
|
27
|
+
finish_reason: FinishReason
|
|
28
|
+
"""The reason the stream finished."""
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"""Implements Response and AsyncResponse."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from collections.abc import Sequence
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Generic, overload
|
|
6
|
+
|
|
7
|
+
from ..content import ToolOutput
|
|
8
|
+
from ..context import Context, DepsT
|
|
9
|
+
from ..formatting import Format, FormattableT
|
|
10
|
+
from ..messages import AssistantMessage, Message, UserContent
|
|
11
|
+
from ..tools import (
|
|
12
|
+
AsyncContextToolkit,
|
|
13
|
+
AsyncContextTools,
|
|
14
|
+
AsyncToolkit,
|
|
15
|
+
AsyncTools,
|
|
16
|
+
ContextToolkit,
|
|
17
|
+
ContextTools,
|
|
18
|
+
Toolkit,
|
|
19
|
+
Tools,
|
|
20
|
+
)
|
|
21
|
+
from ..types import Jsonable
|
|
22
|
+
from .base_response import BaseResponse
|
|
23
|
+
from .finish_reason import FinishReason
|
|
24
|
+
from .usage import Usage
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from ..models import Params
|
|
28
|
+
from ..providers import ModelId, ProviderId
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Response(BaseResponse[Toolkit, FormattableT]):
|
|
32
|
+
"""The response generated by an LLM."""
|
|
33
|
+
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
*,
|
|
37
|
+
raw: Any, # noqa: ANN401
|
|
38
|
+
provider_id: "ProviderId",
|
|
39
|
+
model_id: "ModelId",
|
|
40
|
+
provider_model_name: str,
|
|
41
|
+
params: "Params",
|
|
42
|
+
tools: Tools | None = None,
|
|
43
|
+
format: Format[FormattableT] | None = None,
|
|
44
|
+
input_messages: Sequence[Message],
|
|
45
|
+
assistant_message: AssistantMessage,
|
|
46
|
+
finish_reason: FinishReason | None,
|
|
47
|
+
usage: Usage | None,
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Initialize a `Response`."""
|
|
50
|
+
toolkit = tools if isinstance(tools, Toolkit) else Toolkit(tools=tools)
|
|
51
|
+
super().__init__(
|
|
52
|
+
raw=raw,
|
|
53
|
+
provider_id=provider_id,
|
|
54
|
+
model_id=model_id,
|
|
55
|
+
provider_model_name=provider_model_name,
|
|
56
|
+
params=params,
|
|
57
|
+
toolkit=toolkit,
|
|
58
|
+
format=format,
|
|
59
|
+
input_messages=input_messages,
|
|
60
|
+
assistant_message=assistant_message,
|
|
61
|
+
finish_reason=finish_reason,
|
|
62
|
+
usage=usage,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
|
|
66
|
+
"""Execute and return all of the tool calls in the response.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
A sequence containing a `ToolOutput` for every tool call in the order they appeared.
|
|
70
|
+
|
|
71
|
+
Raises:
|
|
72
|
+
ToolNotFoundError: If one of the response's tool calls has no matching tool.
|
|
73
|
+
Exception: If one of the tools throws an exception.
|
|
74
|
+
"""
|
|
75
|
+
return [self.toolkit.execute(tool_call) for tool_call in self.tool_calls]
|
|
76
|
+
|
|
77
|
+
@overload
|
|
78
|
+
def resume(self: "Response", content: UserContent) -> "Response": ...
|
|
79
|
+
|
|
80
|
+
@overload
|
|
81
|
+
def resume(
|
|
82
|
+
self: "Response[FormattableT]", content: UserContent
|
|
83
|
+
) -> "Response[FormattableT]": ...
|
|
84
|
+
|
|
85
|
+
def resume(self, content: UserContent) -> "Response | Response[FormattableT]":
|
|
86
|
+
"""Generate a new `Response` using this response's messages with additional user content.
|
|
87
|
+
|
|
88
|
+
Uses this response's tools and format type. Also uses this response's provider,
|
|
89
|
+
model, client, and params, unless the model context manager is being used to
|
|
90
|
+
provide a new LLM as an override.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
content: The new user message content to append to the message history.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
A new `Response` instance generated from the extended message history.
|
|
97
|
+
"""
|
|
98
|
+
return self.model.resume(
|
|
99
|
+
response=self,
|
|
100
|
+
content=content,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class AsyncResponse(BaseResponse[AsyncToolkit, FormattableT]):
|
|
105
|
+
"""The response generated by an LLM in async mode."""
|
|
106
|
+
|
|
107
|
+
def __init__(
|
|
108
|
+
self,
|
|
109
|
+
*,
|
|
110
|
+
raw: Any, # noqa: ANN401
|
|
111
|
+
provider_id: "ProviderId",
|
|
112
|
+
model_id: "ModelId",
|
|
113
|
+
provider_model_name: str,
|
|
114
|
+
params: "Params",
|
|
115
|
+
tools: AsyncTools | None = None,
|
|
116
|
+
format: Format[FormattableT] | None = None,
|
|
117
|
+
input_messages: Sequence[Message],
|
|
118
|
+
assistant_message: AssistantMessage,
|
|
119
|
+
finish_reason: FinishReason | None,
|
|
120
|
+
usage: Usage | None,
|
|
121
|
+
) -> None:
|
|
122
|
+
"""Initialize an `AsyncResponse`."""
|
|
123
|
+
toolkit = (
|
|
124
|
+
tools if isinstance(tools, AsyncToolkit) else AsyncToolkit(tools=tools)
|
|
125
|
+
)
|
|
126
|
+
super().__init__(
|
|
127
|
+
raw=raw,
|
|
128
|
+
provider_id=provider_id,
|
|
129
|
+
model_id=model_id,
|
|
130
|
+
provider_model_name=provider_model_name,
|
|
131
|
+
params=params,
|
|
132
|
+
toolkit=toolkit,
|
|
133
|
+
format=format,
|
|
134
|
+
input_messages=input_messages,
|
|
135
|
+
assistant_message=assistant_message,
|
|
136
|
+
finish_reason=finish_reason,
|
|
137
|
+
usage=usage,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
async def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
|
|
141
|
+
"""Execute and return all of the tool calls in the response.
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
A sequence containing a `ToolOutput` for every tool call in the order they appeared.
|
|
145
|
+
|
|
146
|
+
Raises:
|
|
147
|
+
ToolNotFoundError: If one of the response's tool calls has no matching tool.
|
|
148
|
+
Exception: If one of the tools throws an exception.
|
|
149
|
+
"""
|
|
150
|
+
tasks = [self.toolkit.execute(tool_call) for tool_call in self.tool_calls]
|
|
151
|
+
return await asyncio.gather(*tasks)
|
|
152
|
+
|
|
153
|
+
@overload
|
|
154
|
+
async def resume(
|
|
155
|
+
self: "AsyncResponse", content: UserContent
|
|
156
|
+
) -> "AsyncResponse": ...
|
|
157
|
+
|
|
158
|
+
@overload
|
|
159
|
+
async def resume(
|
|
160
|
+
self: "AsyncResponse[FormattableT]", content: UserContent
|
|
161
|
+
) -> "AsyncResponse[FormattableT]": ...
|
|
162
|
+
|
|
163
|
+
async def resume(
|
|
164
|
+
self, content: UserContent
|
|
165
|
+
) -> "AsyncResponse | AsyncResponse[FormattableT]":
|
|
166
|
+
"""Generate a new `AsyncResponse` using this response's messages with additional user content.
|
|
167
|
+
|
|
168
|
+
Uses this response's tools and format type. Also uses this response's provider,
|
|
169
|
+
model, client, and params, unless the model context manager is being used to
|
|
170
|
+
provide a new LLM as an override.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
content: The new user message content to append to the message history.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
A new `AsyncResponse` instance generated from the extended message history.
|
|
177
|
+
"""
|
|
178
|
+
return await self.model.resume_async(
|
|
179
|
+
response=self,
|
|
180
|
+
content=content,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class ContextResponse(
|
|
185
|
+
BaseResponse[ContextToolkit[DepsT], FormattableT], Generic[DepsT, FormattableT]
|
|
186
|
+
):
|
|
187
|
+
"""The response generated by an LLM from a context call."""
|
|
188
|
+
|
|
189
|
+
def __init__(
|
|
190
|
+
self,
|
|
191
|
+
*,
|
|
192
|
+
raw: Any, # noqa: ANN401
|
|
193
|
+
provider_id: "ProviderId",
|
|
194
|
+
model_id: "ModelId",
|
|
195
|
+
provider_model_name: str,
|
|
196
|
+
params: "Params",
|
|
197
|
+
tools: ContextTools[DepsT] | None = None,
|
|
198
|
+
format: Format[FormattableT] | None = None,
|
|
199
|
+
input_messages: Sequence[Message],
|
|
200
|
+
assistant_message: AssistantMessage,
|
|
201
|
+
finish_reason: FinishReason | None,
|
|
202
|
+
usage: Usage | None,
|
|
203
|
+
) -> None:
|
|
204
|
+
"""Initialize a `ContextResponse`."""
|
|
205
|
+
toolkit = (
|
|
206
|
+
tools if isinstance(tools, ContextToolkit) else ContextToolkit(tools=tools)
|
|
207
|
+
)
|
|
208
|
+
super().__init__(
|
|
209
|
+
raw=raw,
|
|
210
|
+
provider_id=provider_id,
|
|
211
|
+
model_id=model_id,
|
|
212
|
+
provider_model_name=provider_model_name,
|
|
213
|
+
params=params,
|
|
214
|
+
toolkit=toolkit,
|
|
215
|
+
format=format,
|
|
216
|
+
input_messages=input_messages,
|
|
217
|
+
assistant_message=assistant_message,
|
|
218
|
+
finish_reason=finish_reason,
|
|
219
|
+
usage=usage,
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
def execute_tools(self, ctx: Context[DepsT]) -> Sequence[ToolOutput[Jsonable]]:
|
|
223
|
+
"""Execute and return all of the tool calls in the response.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
ctx: A `Context` with the required deps type.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
A sequence containing a `ToolOutput` for every tool call.
|
|
230
|
+
|
|
231
|
+
Raises:
|
|
232
|
+
ToolNotFoundError: If one of the response's tool calls has no matching tool.
|
|
233
|
+
Exception: If one of the tools throws an exception.
|
|
234
|
+
"""
|
|
235
|
+
return [self.toolkit.execute(ctx, tool_call) for tool_call in self.tool_calls]
|
|
236
|
+
|
|
237
|
+
@overload
|
|
238
|
+
def resume(
|
|
239
|
+
self: "ContextResponse[DepsT]", ctx: Context[DepsT], content: UserContent
|
|
240
|
+
) -> "ContextResponse[DepsT]": ...
|
|
241
|
+
|
|
242
|
+
@overload
|
|
243
|
+
def resume(
|
|
244
|
+
self: "ContextResponse[DepsT, FormattableT]",
|
|
245
|
+
ctx: Context[DepsT],
|
|
246
|
+
content: UserContent,
|
|
247
|
+
) -> "ContextResponse[DepsT, FormattableT]": ...
|
|
248
|
+
|
|
249
|
+
def resume(
|
|
250
|
+
self, ctx: Context[DepsT], content: UserContent
|
|
251
|
+
) -> "ContextResponse[DepsT] | ContextResponse[DepsT, FormattableT]":
|
|
252
|
+
"""Generate a new `ContextResponse` using this response's messages with additional user content.
|
|
253
|
+
|
|
254
|
+
Uses this response's tools and format type. Also uses this response's provider,
|
|
255
|
+
model, client, and params, unless the model context manager is being used to
|
|
256
|
+
provide a new LLM as an override.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
ctx: A `Context` with the required deps type.
|
|
260
|
+
content: The new user message content to append to the message history.
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
A new `ContextResponse` instance generated from the extended message history.
|
|
264
|
+
"""
|
|
265
|
+
return self.model.context_resume(
|
|
266
|
+
ctx=ctx,
|
|
267
|
+
response=self,
|
|
268
|
+
content=content,
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
class AsyncContextResponse(
|
|
273
|
+
BaseResponse[AsyncContextToolkit[DepsT], FormattableT], Generic[DepsT, FormattableT]
|
|
274
|
+
):
|
|
275
|
+
"""The response generated by an LLM from an async context call."""
|
|
276
|
+
|
|
277
|
+
def __init__(
|
|
278
|
+
self,
|
|
279
|
+
*,
|
|
280
|
+
raw: Any, # noqa: ANN401
|
|
281
|
+
provider_id: "ProviderId",
|
|
282
|
+
model_id: "ModelId",
|
|
283
|
+
provider_model_name: str,
|
|
284
|
+
params: "Params",
|
|
285
|
+
tools: AsyncContextTools[DepsT] | None = None,
|
|
286
|
+
format: Format[FormattableT] | None = None,
|
|
287
|
+
input_messages: Sequence[Message],
|
|
288
|
+
assistant_message: AssistantMessage,
|
|
289
|
+
finish_reason: FinishReason | None,
|
|
290
|
+
usage: Usage | None,
|
|
291
|
+
) -> None:
|
|
292
|
+
"""Initialize an `AsyncContextResponse`."""
|
|
293
|
+
toolkit = (
|
|
294
|
+
tools
|
|
295
|
+
if isinstance(tools, AsyncContextToolkit)
|
|
296
|
+
else AsyncContextToolkit(tools=tools)
|
|
297
|
+
)
|
|
298
|
+
super().__init__(
|
|
299
|
+
raw=raw,
|
|
300
|
+
provider_id=provider_id,
|
|
301
|
+
model_id=model_id,
|
|
302
|
+
provider_model_name=provider_model_name,
|
|
303
|
+
params=params,
|
|
304
|
+
toolkit=toolkit,
|
|
305
|
+
format=format,
|
|
306
|
+
input_messages=input_messages,
|
|
307
|
+
assistant_message=assistant_message,
|
|
308
|
+
finish_reason=finish_reason,
|
|
309
|
+
usage=usage,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
async def execute_tools(
|
|
313
|
+
self, ctx: Context[DepsT]
|
|
314
|
+
) -> Sequence[ToolOutput[Jsonable]]:
|
|
315
|
+
"""Execute and return all of the tool calls in the response.
|
|
316
|
+
|
|
317
|
+
Args:
|
|
318
|
+
ctx: A `Context` with the required deps type.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
A sequence containing a `ToolOutput` for every tool call in the order they appeared.
|
|
322
|
+
|
|
323
|
+
Raises:
|
|
324
|
+
ToolNotFoundError: If one of the response's tool calls has no matching tool.
|
|
325
|
+
Exception: If one of the tools throws an exception.
|
|
326
|
+
"""
|
|
327
|
+
tasks = [self.toolkit.execute(ctx, tool_call) for tool_call in self.tool_calls]
|
|
328
|
+
return await asyncio.gather(*tasks)
|
|
329
|
+
|
|
330
|
+
@overload
|
|
331
|
+
async def resume(
|
|
332
|
+
self: "AsyncContextResponse[DepsT]", ctx: Context[DepsT], content: UserContent
|
|
333
|
+
) -> "AsyncContextResponse[DepsT]": ...
|
|
334
|
+
|
|
335
|
+
@overload
|
|
336
|
+
async def resume(
|
|
337
|
+
self: "AsyncContextResponse[DepsT, FormattableT]",
|
|
338
|
+
ctx: Context[DepsT],
|
|
339
|
+
content: UserContent,
|
|
340
|
+
) -> "AsyncContextResponse[DepsT, FormattableT]": ...
|
|
341
|
+
|
|
342
|
+
async def resume(
|
|
343
|
+
self, ctx: Context[DepsT], content: UserContent
|
|
344
|
+
) -> "AsyncContextResponse[DepsT] | AsyncContextResponse[DepsT, FormattableT]":
|
|
345
|
+
"""Generate a new `AsyncContextResponse` using this response's messages with additional user content.
|
|
346
|
+
|
|
347
|
+
Uses this response's tools and format type. Also uses this response's provider,
|
|
348
|
+
model, client, and params, unless the model context manager is being used to
|
|
349
|
+
provide a new LLM as an override.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
ctx: A Context with the required deps type.
|
|
353
|
+
content: The new user message content to append to the message history.
|
|
354
|
+
|
|
355
|
+
Returns:
|
|
356
|
+
A new `AsyncContextResponse` instance generated from the extended message history.
|
|
357
|
+
"""
|
|
358
|
+
return await self.model.context_resume_async(
|
|
359
|
+
ctx=ctx,
|
|
360
|
+
response=self,
|
|
361
|
+
content=content,
|
|
362
|
+
)
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"""Base interface for all LLM responses."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC
|
|
4
|
+
from collections.abc import Sequence
|
|
5
|
+
from types import NoneType
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Generic, Literal, TypeAlias, overload
|
|
7
|
+
|
|
8
|
+
from ..content import AssistantContentPart, Text, Thought, ToolCall
|
|
9
|
+
from ..exceptions import ParseError
|
|
10
|
+
from ..formatting import (
|
|
11
|
+
Format,
|
|
12
|
+
FormattableT,
|
|
13
|
+
Partial,
|
|
14
|
+
create_wrapper_model,
|
|
15
|
+
is_output_parser,
|
|
16
|
+
is_primitive_type,
|
|
17
|
+
)
|
|
18
|
+
from ..messages import Message
|
|
19
|
+
from ..tools import ToolkitT
|
|
20
|
+
from . import _utils
|
|
21
|
+
from .finish_reason import FinishReason
|
|
22
|
+
from .usage import Usage
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from ..models import Model, Params
|
|
26
|
+
from ..providers import ModelId, ProviderId
|
|
27
|
+
|
|
28
|
+
AnyResponse: TypeAlias = "RootResponse[Any, Any]"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class RootResponse(Generic[ToolkitT, FormattableT], ABC):
|
|
32
|
+
"""Base class for LLM responses."""
|
|
33
|
+
|
|
34
|
+
raw: Any
|
|
35
|
+
"""The raw response from the LLM."""
|
|
36
|
+
|
|
37
|
+
provider_id: "ProviderId"
|
|
38
|
+
"""The provider that generated this response."""
|
|
39
|
+
|
|
40
|
+
model_id: "ModelId"
|
|
41
|
+
"""The model id that generated this response."""
|
|
42
|
+
|
|
43
|
+
params: "Params"
|
|
44
|
+
"""The params that were used to generate this response (or None)."""
|
|
45
|
+
|
|
46
|
+
toolkit: ToolkitT
|
|
47
|
+
"""The toolkit containing the tools used when generating this response."""
|
|
48
|
+
|
|
49
|
+
messages: list[Message]
|
|
50
|
+
"""The message history, including the most recent assistant message."""
|
|
51
|
+
|
|
52
|
+
content: Sequence[AssistantContentPart]
|
|
53
|
+
"""The content generated by the LLM."""
|
|
54
|
+
|
|
55
|
+
texts: Sequence[Text]
|
|
56
|
+
"""The text content in the generated response, if any."""
|
|
57
|
+
|
|
58
|
+
tool_calls: Sequence[ToolCall]
|
|
59
|
+
"""The tools the LLM wants called on its behalf, if any."""
|
|
60
|
+
|
|
61
|
+
thoughts: Sequence[Thought]
|
|
62
|
+
"""The readable thoughts from the model's thinking process, if any.
|
|
63
|
+
|
|
64
|
+
The thoughts may be direct output from the model thinking process, or may be a
|
|
65
|
+
generated summary. (This depends on the provider; newer models tend to summarize.)
|
|
66
|
+
"""
|
|
67
|
+
finish_reason: FinishReason | None
|
|
68
|
+
"""The reason why the LLM finished generating a response, if set.
|
|
69
|
+
|
|
70
|
+
`finish_reason` is only set if the response did not finish generating normally,
|
|
71
|
+
e.g. `FinishReason.MAX_TOKENS` if the model ran out of tokens before completing.
|
|
72
|
+
When the response generates normally, `response.finish_reason` will be `None`.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
usage: Usage | None
|
|
76
|
+
"""Token usage statistics for this response, if available."""
|
|
77
|
+
|
|
78
|
+
format: Format[FormattableT] | None
|
|
79
|
+
"""The `Format` describing the structured response format, if available."""
|
|
80
|
+
|
|
81
|
+
@overload
|
|
82
|
+
def parse(self: "RootResponse[ToolkitT, None]", partial: Literal[True]) -> None:
|
|
83
|
+
"""Format the response into a `Partial[BaseModel]` (with optional fields).
|
|
84
|
+
|
|
85
|
+
This is useful for when the stream is only partially consumed, in which case the
|
|
86
|
+
structured output may only be partially available.
|
|
87
|
+
"""
|
|
88
|
+
...
|
|
89
|
+
|
|
90
|
+
@overload
|
|
91
|
+
def parse(
|
|
92
|
+
self: "RootResponse[ToolkitT, FormattableT]", partial: Literal[True]
|
|
93
|
+
) -> Partial[FormattableT]:
|
|
94
|
+
"""Format the response into a `Partial[BaseModel]` (with optional fields).
|
|
95
|
+
|
|
96
|
+
This is useful for when the stream is only partially consumed, in which case the
|
|
97
|
+
structured output may only be partially available.
|
|
98
|
+
"""
|
|
99
|
+
...
|
|
100
|
+
|
|
101
|
+
@overload
|
|
102
|
+
def parse(
|
|
103
|
+
self: "RootResponse[ToolkitT, None]", partial: Literal[False] = False
|
|
104
|
+
) -> None:
|
|
105
|
+
"""Overload when the format type is `None`."""
|
|
106
|
+
...
|
|
107
|
+
|
|
108
|
+
@overload
|
|
109
|
+
def parse(
|
|
110
|
+
self: "RootResponse[ToolkitT, FormattableT]", partial: Literal[False] = False
|
|
111
|
+
) -> FormattableT:
|
|
112
|
+
"""Overload when the format type is not `None`."""
|
|
113
|
+
...
|
|
114
|
+
|
|
115
|
+
def parse(
|
|
116
|
+
self, partial: bool = False
|
|
117
|
+
) -> FormattableT | Partial[FormattableT] | None:
|
|
118
|
+
"""Format the response according to the response format parser.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
partial: If True, parse incomplete JSON as Partial model. Only works with
|
|
122
|
+
streaming responses that have accumulated JSON. Returns None if JSON
|
|
123
|
+
is not yet available or cannot be parsed.
|
|
124
|
+
|
|
125
|
+
Supports:
|
|
126
|
+
- Pydantic BaseModel types (JSON schema validation)
|
|
127
|
+
- Primitive types (automatically unwrapped from wrapper model)
|
|
128
|
+
- Custom OutputParsers (custom parsing logic)
|
|
129
|
+
- Partial parsing during streaming (when partial=True)
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
The formatted response object of type FormatT. For BaseModel types, returns
|
|
133
|
+
the model instance. For primitive types, returns the unwrapped value (e.g.,
|
|
134
|
+
a string, list, dict, etc.). For OutputParsers, returns whatever the parser
|
|
135
|
+
returns. When partial=True, returns None if JSON is incomplete or unparsable.
|
|
136
|
+
|
|
137
|
+
Raises:
|
|
138
|
+
NotImplementedError: If partial=True with OutputParser.
|
|
139
|
+
ParseError: If parsing fails. The `original_exception` attribute contains the
|
|
140
|
+
underlying error (ValueError for JSON extraction, json.JSONDecodeError
|
|
141
|
+
for invalid JSON, pydantic.ValidationError for schema validation, or
|
|
142
|
+
any exception from a custom OutputParser).
|
|
143
|
+
"""
|
|
144
|
+
if self.format is None:
|
|
145
|
+
return None
|
|
146
|
+
|
|
147
|
+
formattable = self.format.formattable
|
|
148
|
+
|
|
149
|
+
if is_output_parser(formattable):
|
|
150
|
+
if partial:
|
|
151
|
+
raise NotImplementedError(
|
|
152
|
+
"parse(partial=True) not supported with OutputParser. "
|
|
153
|
+
"Use BaseModel or primitive types."
|
|
154
|
+
)
|
|
155
|
+
try:
|
|
156
|
+
return formattable(self)
|
|
157
|
+
except Exception as e:
|
|
158
|
+
raise ParseError(
|
|
159
|
+
f"OutputParser failed: {e}",
|
|
160
|
+
original_exception=e,
|
|
161
|
+
) from e
|
|
162
|
+
|
|
163
|
+
if formattable is None or formattable is NoneType: # pyright: ignore[reportUnnecessaryComparison]
|
|
164
|
+
# note: pyright claims the None comparison is unnecessary, but removing it
|
|
165
|
+
# introduces type errors.
|
|
166
|
+
return None # pragma: no cover
|
|
167
|
+
|
|
168
|
+
text = self.text("")
|
|
169
|
+
|
|
170
|
+
if partial:
|
|
171
|
+
return _utils.parse_partial_json(text, formattable)
|
|
172
|
+
else:
|
|
173
|
+
try:
|
|
174
|
+
json_text = _utils.extract_serialized_json(text)
|
|
175
|
+
if is_primitive_type(formattable):
|
|
176
|
+
wrapper_model = create_wrapper_model(formattable)
|
|
177
|
+
wrapper_instance = wrapper_model.model_validate_json(json_text)
|
|
178
|
+
return wrapper_instance.output
|
|
179
|
+
|
|
180
|
+
return formattable.model_validate_json(json_text)
|
|
181
|
+
except Exception as e:
|
|
182
|
+
raise ParseError(
|
|
183
|
+
f"Failed to parse response: {e}",
|
|
184
|
+
original_exception=e,
|
|
185
|
+
) from e
|
|
186
|
+
|
|
187
|
+
def text(self, sep: str = "\n") -> str:
|
|
188
|
+
"""Return all text content from this response as a single string.
|
|
189
|
+
|
|
190
|
+
Joins the text from all `Text` parts in the response content using the
|
|
191
|
+
specified separator.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
sep: The separator to use when joining multiple text parts.
|
|
195
|
+
Defaults to newline ("\\n").
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
A string containing all text content joined by the separator.
|
|
199
|
+
Returns an empty string if the response contains no text parts.
|
|
200
|
+
|
|
201
|
+
Example:
|
|
202
|
+
>>> response.text() # Join with newlines (default)
|
|
203
|
+
'Hello\\nWorld'
|
|
204
|
+
>>> response.text(sep=" ") # Join with spaces
|
|
205
|
+
'Hello World'
|
|
206
|
+
>>> response.text(sep="") # Concatenate directly
|
|
207
|
+
'HelloWorld'
|
|
208
|
+
"""
|
|
209
|
+
return sep.join(text.text for text in self.texts)
|
|
210
|
+
|
|
211
|
+
def pretty(self) -> str:
|
|
212
|
+
"""Return a string representation of all response content.
|
|
213
|
+
|
|
214
|
+
The response content will be represented in a way that emphasies clarity and
|
|
215
|
+
readability, but may not include all metadata (like thinking signatures or tool
|
|
216
|
+
call ids), and thus cannot be used to reconstruct the response. For example:
|
|
217
|
+
|
|
218
|
+
**Thinking:**
|
|
219
|
+
The user is asking a math problem. I should use the calculator tool.
|
|
220
|
+
|
|
221
|
+
**Tool Call (calculator)** {'operation': 'mult', 'a': 1337, 'b': 4242}
|
|
222
|
+
|
|
223
|
+
I am going to use the calculator and answer your question for you!
|
|
224
|
+
"""
|
|
225
|
+
pretty_parts: list[str] = []
|
|
226
|
+
for part in self.content:
|
|
227
|
+
if isinstance(part, Text):
|
|
228
|
+
pretty_parts.append(part.text)
|
|
229
|
+
elif isinstance(part, ToolCall):
|
|
230
|
+
pretty_parts.append(f"**ToolCall ({part.name}):** {part.args}")
|
|
231
|
+
elif isinstance(part, Thought):
|
|
232
|
+
indented_thinking = "\n".join(
|
|
233
|
+
f" {line}" for line in part.thought.split("\n")
|
|
234
|
+
)
|
|
235
|
+
pretty_parts.append(f"**Thinking:**\n{indented_thinking}")
|
|
236
|
+
else:
|
|
237
|
+
pretty_parts.append(
|
|
238
|
+
f"[{type(part).__name__}: {str(part)}]"
|
|
239
|
+
) # pragma: no cover
|
|
240
|
+
|
|
241
|
+
return "\n\n".join(pretty_parts)
|
|
242
|
+
|
|
243
|
+
@property
|
|
244
|
+
def model(self) -> "Model":
|
|
245
|
+
"""A `Model` with parameters matching this response."""
|
|
246
|
+
from ..models import use_model # Dynamic import to avoid circular dependency
|
|
247
|
+
|
|
248
|
+
return use_model(self.model_id, **self.params)
|