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,577 @@
|
|
|
1
|
+
"""StreamResponse and AsyncStreamResponse to stream content from LLMs."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from collections.abc import Sequence
|
|
5
|
+
from typing import TYPE_CHECKING, Generic, overload
|
|
6
|
+
|
|
7
|
+
from ..content import ToolOutput
|
|
8
|
+
from ..context import Context, DepsT
|
|
9
|
+
from ..formatting import Format, FormattableT
|
|
10
|
+
from ..messages import 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_stream_response import (
|
|
23
|
+
AsyncChunkIterator,
|
|
24
|
+
BaseAsyncStreamResponse,
|
|
25
|
+
BaseSyncStreamResponse,
|
|
26
|
+
ChunkIterator,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
from ..models import Params
|
|
31
|
+
from ..providers import ModelId, ProviderId
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class StreamResponse(BaseSyncStreamResponse[Toolkit, FormattableT]):
|
|
35
|
+
"""A `StreamResponse` wraps response content from the LLM with a streaming interface.
|
|
36
|
+
|
|
37
|
+
This class supports iteration to process chunks as they arrive from the model.
|
|
38
|
+
|
|
39
|
+
Content can be streamed in one of three ways:
|
|
40
|
+
- Via `.streams()`, which provides an iterator of streams, where each
|
|
41
|
+
stream contains chunks of streamed data. The chunks contain `delta`s (new content
|
|
42
|
+
in that particular chunk), and the stream itself accumulates the collected state
|
|
43
|
+
of all the chunks processed thus far.
|
|
44
|
+
- Via `.chunk_stream()` which allows iterating over Mirascope's provider-
|
|
45
|
+
agnostic chunk representation.
|
|
46
|
+
- Via `.pretty_stream()` a helper method which provides all response content
|
|
47
|
+
as `str` deltas. Iterating through `pretty_stream` will yield text content and
|
|
48
|
+
optionally placeholder representations for other content types, but it will still
|
|
49
|
+
consume the full stream.
|
|
50
|
+
- Via `.structured_stream()`, a helper method which provides partial
|
|
51
|
+
structured outputs from a response (useful when FormatT is set). Iterating through
|
|
52
|
+
`structured_stream` will only yield structured partials, but it will still consume
|
|
53
|
+
the full stream.
|
|
54
|
+
|
|
55
|
+
As chunks are consumed, they are collected in-memory on the `StreamResponse`, and they
|
|
56
|
+
become available in `.content`, `.messages`, `.tool_calls`, etc. All of the stream
|
|
57
|
+
iterators can be restarted after the stream has been consumed, in which case they
|
|
58
|
+
will yield chunks from memory in the original sequence that came from the LLM. If
|
|
59
|
+
the stream is only partially consumed, a fresh iterator will first iterate through
|
|
60
|
+
in-memory content, and then will continue consuming fresh chunks from the LLM.
|
|
61
|
+
|
|
62
|
+
In the specific case of text chunks, they are included in the response content as soon
|
|
63
|
+
as they become available, via an `llm.Text` part that updates as more deltas come in.
|
|
64
|
+
This enables the behavior where resuming a partially-streamed response will include
|
|
65
|
+
as much text as the model generated.
|
|
66
|
+
|
|
67
|
+
For other chunks, like `Thinking` or `ToolCall`, they are only added to response
|
|
68
|
+
content once the corresponding part has fully streamed. This avoids issues like
|
|
69
|
+
adding incomplete tool calls, or thinking blocks missing signatures, to the response.
|
|
70
|
+
|
|
71
|
+
For each iterator, fully iterating through the iterator will consume the whole
|
|
72
|
+
LLM stream. You can pause stream execution midway by breaking out of the iterator,
|
|
73
|
+
and you can safely resume execution from the same iterator if desired.
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
Example:
|
|
77
|
+
```python
|
|
78
|
+
from mirascope import llm
|
|
79
|
+
|
|
80
|
+
@llm.call(
|
|
81
|
+
provider_id="openai",
|
|
82
|
+
model_id="openai/gpt-5-mini",
|
|
83
|
+
)
|
|
84
|
+
def answer_question(question: str) -> str:
|
|
85
|
+
return f"Answer this question: {question}"
|
|
86
|
+
|
|
87
|
+
stream_response = answer_question.stream("What is the capital of France?")
|
|
88
|
+
|
|
89
|
+
for chunk in stream_response.text_stream():
|
|
90
|
+
print(chunk, end="", flush=True)
|
|
91
|
+
```
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def __init__(
|
|
95
|
+
self,
|
|
96
|
+
*,
|
|
97
|
+
provider_id: "ProviderId",
|
|
98
|
+
model_id: "ModelId",
|
|
99
|
+
provider_model_name: str,
|
|
100
|
+
params: "Params",
|
|
101
|
+
tools: Tools | None = None,
|
|
102
|
+
format: Format[FormattableT] | None = None,
|
|
103
|
+
input_messages: Sequence[Message],
|
|
104
|
+
chunk_iterator: ChunkIterator,
|
|
105
|
+
) -> None:
|
|
106
|
+
"""Initialize a `StreamResponse`."""
|
|
107
|
+
toolkit = tools if isinstance(tools, Toolkit) else Toolkit(tools=tools)
|
|
108
|
+
super().__init__(
|
|
109
|
+
provider_id=provider_id,
|
|
110
|
+
model_id=model_id,
|
|
111
|
+
provider_model_name=provider_model_name,
|
|
112
|
+
params=params,
|
|
113
|
+
toolkit=toolkit,
|
|
114
|
+
format=format,
|
|
115
|
+
input_messages=input_messages,
|
|
116
|
+
chunk_iterator=chunk_iterator,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
|
|
120
|
+
"""Execute and return all of the tool calls in the response.
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
A sequence containing a `ToolOutput` for every tool call in the order they appeared.
|
|
124
|
+
|
|
125
|
+
Raises:
|
|
126
|
+
ToolNotFoundError: If one of the response's tool calls has no matching tool.
|
|
127
|
+
Exception: If one of the tools throws an exception.
|
|
128
|
+
"""
|
|
129
|
+
return [self.toolkit.execute(tool_call) for tool_call in self.tool_calls]
|
|
130
|
+
|
|
131
|
+
@overload
|
|
132
|
+
def resume(self: "StreamResponse", content: UserContent) -> "StreamResponse": ...
|
|
133
|
+
|
|
134
|
+
@overload
|
|
135
|
+
def resume(
|
|
136
|
+
self: "StreamResponse[FormattableT]", content: UserContent
|
|
137
|
+
) -> "StreamResponse[FormattableT]": ...
|
|
138
|
+
|
|
139
|
+
def resume(
|
|
140
|
+
self, content: UserContent
|
|
141
|
+
) -> "StreamResponse | StreamResponse[FormattableT]":
|
|
142
|
+
"""Generate a new `StreamResponse` using this response's messages with additional user content.
|
|
143
|
+
|
|
144
|
+
Uses this response's tools and format type. Also uses this response's provider,
|
|
145
|
+
model, client, and params, unless the model context manager is being used to
|
|
146
|
+
provide a new LLM as an override.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
content: The new user message content to append to the message history.
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
A new `StreamResponse` instance generated from the extended message history.
|
|
153
|
+
"""
|
|
154
|
+
return self.model.resume_stream(
|
|
155
|
+
response=self,
|
|
156
|
+
content=content,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class AsyncStreamResponse(BaseAsyncStreamResponse[AsyncToolkit, FormattableT]):
|
|
161
|
+
"""An `AsyncStreamResponse` wraps response content from the LLM with a streaming interface.
|
|
162
|
+
|
|
163
|
+
This class supports iteration to process chunks as they arrive from the model.
|
|
164
|
+
|
|
165
|
+
Content can be streamed in one of three ways:
|
|
166
|
+
- Via `.streams()`, which provides an iterator of streams, where each
|
|
167
|
+
stream contains chunks of streamed data. The chunks contain `delta`s (new content
|
|
168
|
+
in that particular chunk), and the stream itself accumulates the collected state
|
|
169
|
+
of all the chunks processed thus far.
|
|
170
|
+
- Via `.chunk_stream()` which allows iterating over Mirascope's provider-
|
|
171
|
+
agnostic chunk representation.
|
|
172
|
+
- Via `.pretty_stream()` a helper method which provides all response content
|
|
173
|
+
as `str` deltas. Iterating through `pretty_stream` will yield text content and
|
|
174
|
+
optionally placeholder representations for other content types, but it will still
|
|
175
|
+
consume the full stream.
|
|
176
|
+
- Via `.structured_stream()`, a helper method which provides partial
|
|
177
|
+
structured outputs from a response (useful when FormatT is set). Iterating through
|
|
178
|
+
`structured_stream` will only yield structured partials, but it will still consume
|
|
179
|
+
the full stream.
|
|
180
|
+
|
|
181
|
+
As chunks are consumed, they are collected in-memory on the `AsyncContextStreamResponse`, and they
|
|
182
|
+
become available in `.content`, `.messages`, `.tool_calls`, etc. All of the stream
|
|
183
|
+
iterators can be restarted after the stream has been consumed, in which case they
|
|
184
|
+
will yield chunks from memory in the original sequence that came from the LLM. If
|
|
185
|
+
the stream is only partially consumed, a fresh iterator will first iterate through
|
|
186
|
+
in-memory content, and then will continue consuming fresh chunks from the LLM.
|
|
187
|
+
|
|
188
|
+
In the specific case of text chunks, they are included in the response content as soon
|
|
189
|
+
as they become available, via an `llm.Text` part that updates as more deltas come in.
|
|
190
|
+
This enables the behavior where resuming a partially-streamed response will include
|
|
191
|
+
as much text as the model generated.
|
|
192
|
+
|
|
193
|
+
For other chunks, like `Thinking` or `ToolCall`, they are only added to response
|
|
194
|
+
content once the corresponding part has fully streamed. This avoids issues like
|
|
195
|
+
adding incomplete tool calls, or thinking blocks missing signatures, to the response.
|
|
196
|
+
|
|
197
|
+
For each iterator, fully iterating through the iterator will consume the whole
|
|
198
|
+
LLM stream. You can pause stream execution midway by breaking out of the iterator,
|
|
199
|
+
and you can safely resume execution from the same iterator if desired.
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
Example:
|
|
203
|
+
```python
|
|
204
|
+
from mirascope import llm
|
|
205
|
+
|
|
206
|
+
@llm.call(
|
|
207
|
+
provider_id="openai",
|
|
208
|
+
model_id="openai/gpt-5-mini",
|
|
209
|
+
)
|
|
210
|
+
async def answer_question(question: str) -> str:
|
|
211
|
+
return f"Answer this question: {question}"
|
|
212
|
+
|
|
213
|
+
stream_response = await answer_question.stream("What is the capital of France?")
|
|
214
|
+
|
|
215
|
+
async for chunk in stream_response.text_stream():
|
|
216
|
+
print(chunk, end="", flush=True)
|
|
217
|
+
```
|
|
218
|
+
"""
|
|
219
|
+
|
|
220
|
+
def __init__(
|
|
221
|
+
self,
|
|
222
|
+
*,
|
|
223
|
+
provider_id: "ProviderId",
|
|
224
|
+
model_id: "ModelId",
|
|
225
|
+
provider_model_name: str,
|
|
226
|
+
params: "Params",
|
|
227
|
+
tools: AsyncTools | None = None,
|
|
228
|
+
format: Format[FormattableT] | None = None,
|
|
229
|
+
input_messages: Sequence[Message],
|
|
230
|
+
chunk_iterator: AsyncChunkIterator,
|
|
231
|
+
) -> None:
|
|
232
|
+
"""Initialize an `AsyncStreamResponse`."""
|
|
233
|
+
toolkit = (
|
|
234
|
+
tools if isinstance(tools, AsyncToolkit) else AsyncToolkit(tools=tools)
|
|
235
|
+
)
|
|
236
|
+
super().__init__(
|
|
237
|
+
provider_id=provider_id,
|
|
238
|
+
model_id=model_id,
|
|
239
|
+
provider_model_name=provider_model_name,
|
|
240
|
+
params=params,
|
|
241
|
+
toolkit=toolkit,
|
|
242
|
+
format=format,
|
|
243
|
+
input_messages=input_messages,
|
|
244
|
+
chunk_iterator=chunk_iterator,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
async def execute_tools(self) -> Sequence[ToolOutput[Jsonable]]:
|
|
248
|
+
"""Execute and return all of the tool calls in the response.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
A sequence containing a `ToolOutput` for every tool call in the order they appeared.
|
|
252
|
+
|
|
253
|
+
Raises:
|
|
254
|
+
ToolNotFoundError: If one of the response's tool calls has no matching tool.
|
|
255
|
+
Exception: If one of the tools throws an exception.
|
|
256
|
+
"""
|
|
257
|
+
tasks = [self.toolkit.execute(tool_call) for tool_call in self.tool_calls]
|
|
258
|
+
return await asyncio.gather(*tasks)
|
|
259
|
+
|
|
260
|
+
@overload
|
|
261
|
+
async def resume(
|
|
262
|
+
self: "AsyncStreamResponse", content: UserContent
|
|
263
|
+
) -> "AsyncStreamResponse": ...
|
|
264
|
+
|
|
265
|
+
@overload
|
|
266
|
+
async def resume(
|
|
267
|
+
self: "AsyncStreamResponse[FormattableT]", content: UserContent
|
|
268
|
+
) -> "AsyncStreamResponse[FormattableT]": ...
|
|
269
|
+
|
|
270
|
+
async def resume(
|
|
271
|
+
self, content: UserContent
|
|
272
|
+
) -> "AsyncStreamResponse | AsyncStreamResponse[FormattableT]":
|
|
273
|
+
"""Generate a new `AsyncStreamResponse` using this response's messages with additional user content.
|
|
274
|
+
|
|
275
|
+
Uses this response's tools and format type. Also uses this response's provider,
|
|
276
|
+
model, client, and params, unless the model context manager is being used to
|
|
277
|
+
provide a new LLM as an override.
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
content: The new user message content to append to the message history.
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
A new `AsyncStreamResponse` instance generated from the extended message history.
|
|
284
|
+
"""
|
|
285
|
+
return await self.model.resume_stream_async(
|
|
286
|
+
response=self,
|
|
287
|
+
content=content,
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
class ContextStreamResponse(
|
|
292
|
+
BaseSyncStreamResponse[ContextToolkit[DepsT], FormattableT],
|
|
293
|
+
Generic[DepsT, FormattableT],
|
|
294
|
+
):
|
|
295
|
+
"""A `ContextStreamResponse` wraps response content from the LLM with a streaming interface.
|
|
296
|
+
|
|
297
|
+
This class supports iteration to process chunks as they arrive from the model.
|
|
298
|
+
|
|
299
|
+
Content can be streamed in one of three ways:
|
|
300
|
+
- Via `.streams()`, which provides an iterator of streams, where each
|
|
301
|
+
stream contains chunks of streamed data. The chunks contain `delta`s (new content
|
|
302
|
+
in that particular chunk), and the stream itself accumulates the collected state
|
|
303
|
+
of all the chunks processed thus far.
|
|
304
|
+
- Via `.chunk_stream()` which allows iterating over Mirascope's provider-
|
|
305
|
+
agnostic chunk representation.
|
|
306
|
+
- Via `.pretty_stream()` a helper method which provides all response content
|
|
307
|
+
as `str` deltas. Iterating through `pretty_stream` will yield text content and
|
|
308
|
+
optionally placeholder representations for other content types, but it will still
|
|
309
|
+
consume the full stream.
|
|
310
|
+
- Via `.structured_stream()`, a helper method which provides partial
|
|
311
|
+
structured outputs from a response (useful when FormatT is set). Iterating through
|
|
312
|
+
`structured_stream` will only yield structured partials, but it will still consume
|
|
313
|
+
the full stream.
|
|
314
|
+
|
|
315
|
+
As chunks are consumed, they are collected in-memory on the `ContextStreamResponse`, and they
|
|
316
|
+
become available in `.content`, `.messages`, `.tool_calls`, etc. All of the stream
|
|
317
|
+
iterators can be restarted after the stream has been consumed, in which case they
|
|
318
|
+
will yield chunks from memory in the original sequence that came from the LLM. If
|
|
319
|
+
the stream is only partially consumed, a fresh iterator will first iterate through
|
|
320
|
+
in-memory content, and then will continue consuming fresh chunks from the LLM.
|
|
321
|
+
|
|
322
|
+
In the specific case of text chunks, they are included in the response content as soon
|
|
323
|
+
as they become available, via an `llm.Text` part that updates as more deltas come in.
|
|
324
|
+
This enables the behavior where resuming a partially-streamed response will include
|
|
325
|
+
as much text as the model generated.
|
|
326
|
+
|
|
327
|
+
For other chunks, like `Thinking` or `ToolCall`, they are only added to response
|
|
328
|
+
content once the corresponding part has fully streamed. This avoids issues like
|
|
329
|
+
adding incomplete tool calls, or thinking blocks missing signatures, to the response.
|
|
330
|
+
|
|
331
|
+
For each iterator, fully iterating through the iterator will consume the whole
|
|
332
|
+
LLM stream. You can pause stream execution midway by breaking out of the iterator,
|
|
333
|
+
and you can safely resume execution from the same iterator if desired.
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
Example:
|
|
337
|
+
```python
|
|
338
|
+
from mirascope import llm
|
|
339
|
+
|
|
340
|
+
@llm.call(
|
|
341
|
+
provider_id="openai",
|
|
342
|
+
model_id="openai/gpt-5-mini",
|
|
343
|
+
)
|
|
344
|
+
def answer_question(ctx: llm.Context, question: str) -> str:
|
|
345
|
+
return f"Answer this question: {question}"
|
|
346
|
+
|
|
347
|
+
ctx = llm.Context()
|
|
348
|
+
stream_response = answer_question.stream(ctx, "What is the capital of France?")
|
|
349
|
+
|
|
350
|
+
for chunk in stream_response.text_stream():
|
|
351
|
+
print(chunk, end="", flush=True)
|
|
352
|
+
```
|
|
353
|
+
"""
|
|
354
|
+
|
|
355
|
+
def __init__(
|
|
356
|
+
self,
|
|
357
|
+
*,
|
|
358
|
+
provider_id: "ProviderId",
|
|
359
|
+
model_id: "ModelId",
|
|
360
|
+
provider_model_name: str,
|
|
361
|
+
params: "Params",
|
|
362
|
+
tools: ContextTools[DepsT] | None = None,
|
|
363
|
+
format: Format[FormattableT] | None = None,
|
|
364
|
+
input_messages: Sequence[Message],
|
|
365
|
+
chunk_iterator: ChunkIterator,
|
|
366
|
+
) -> None:
|
|
367
|
+
"""Initialize a `ContextStreamResponse`."""
|
|
368
|
+
toolkit = (
|
|
369
|
+
tools if isinstance(tools, ContextToolkit) else ContextToolkit(tools=tools)
|
|
370
|
+
)
|
|
371
|
+
super().__init__(
|
|
372
|
+
provider_id=provider_id,
|
|
373
|
+
model_id=model_id,
|
|
374
|
+
provider_model_name=provider_model_name,
|
|
375
|
+
params=params,
|
|
376
|
+
toolkit=toolkit,
|
|
377
|
+
format=format,
|
|
378
|
+
input_messages=input_messages,
|
|
379
|
+
chunk_iterator=chunk_iterator,
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
def execute_tools(self, ctx: Context[DepsT]) -> Sequence[ToolOutput[Jsonable]]:
|
|
383
|
+
"""Execute and return all of the tool calls in the response.
|
|
384
|
+
|
|
385
|
+
Args:
|
|
386
|
+
ctx: A `Context` with the required deps type.
|
|
387
|
+
|
|
388
|
+
Returns:
|
|
389
|
+
A sequence containing a `ToolOutput` for every tool call.
|
|
390
|
+
|
|
391
|
+
Raises:
|
|
392
|
+
ToolNotFoundError: If one of the response's tool calls has no matching tool.
|
|
393
|
+
Exception: If one of the tools throws an exception.
|
|
394
|
+
"""
|
|
395
|
+
return [self.toolkit.execute(ctx, tool_call) for tool_call in self.tool_calls]
|
|
396
|
+
|
|
397
|
+
@overload
|
|
398
|
+
def resume(
|
|
399
|
+
self: "ContextStreamResponse[DepsT]", ctx: Context[DepsT], content: UserContent
|
|
400
|
+
) -> "ContextStreamResponse[DepsT]": ...
|
|
401
|
+
|
|
402
|
+
@overload
|
|
403
|
+
def resume(
|
|
404
|
+
self: "ContextStreamResponse[DepsT, FormattableT]",
|
|
405
|
+
ctx: Context[DepsT],
|
|
406
|
+
content: UserContent,
|
|
407
|
+
) -> "ContextStreamResponse[DepsT, FormattableT]": ...
|
|
408
|
+
|
|
409
|
+
def resume(
|
|
410
|
+
self, ctx: Context[DepsT], content: UserContent
|
|
411
|
+
) -> "ContextStreamResponse[DepsT] | ContextStreamResponse[DepsT, FormattableT]":
|
|
412
|
+
"""Generate a new `ContextStreamResponse` using this response's messages with additional user content.
|
|
413
|
+
|
|
414
|
+
Uses this response's tools and format type. Also uses this response's provider,
|
|
415
|
+
model, client, and params, unless the model context manager is being used to
|
|
416
|
+
provide a new LLM as an override.
|
|
417
|
+
|
|
418
|
+
Args:
|
|
419
|
+
ctx: A Context with the required deps type.
|
|
420
|
+
content: The new user message content to append to the message history.
|
|
421
|
+
|
|
422
|
+
Returns:
|
|
423
|
+
A new `ContextStreamResponse` instance generated from the extended message history.
|
|
424
|
+
"""
|
|
425
|
+
return self.model.context_resume_stream(
|
|
426
|
+
ctx=ctx,
|
|
427
|
+
response=self,
|
|
428
|
+
content=content,
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
class AsyncContextStreamResponse(
|
|
433
|
+
BaseAsyncStreamResponse[AsyncContextToolkit[DepsT], FormattableT],
|
|
434
|
+
Generic[DepsT, FormattableT],
|
|
435
|
+
):
|
|
436
|
+
"""An `AsyncContextStreamResponse` wraps response content from the LLM with a streaming interface.
|
|
437
|
+
|
|
438
|
+
This class supports iteration to process chunks as they arrive from the model.
|
|
439
|
+
|
|
440
|
+
Content can be streamed in one of three ways:
|
|
441
|
+
- Via `.streams()`, which provides an iterator of streams, where each
|
|
442
|
+
stream contains chunks of streamed data. The chunks contain `delta`s (new content
|
|
443
|
+
in that particular chunk), and the stream itself accumulates the collected state
|
|
444
|
+
of all the chunks processed thus far.
|
|
445
|
+
- Via `.chunk_stream()` which allows iterating over Mirascope's provider-
|
|
446
|
+
agnostic chunk representation.
|
|
447
|
+
- Via `.pretty_stream()` a helper method which provides all response content
|
|
448
|
+
as `str` deltas. Iterating through `pretty_stream` will yield text content and
|
|
449
|
+
optionally placeholder representations for other content types, but it will still
|
|
450
|
+
consume the full stream.
|
|
451
|
+
- Via `.structured_stream()`, a helper method which provides partial
|
|
452
|
+
structured outputs from a response (useful when FormatT is set). Iterating through
|
|
453
|
+
`structured_stream` will only yield structured partials, but it will still consume
|
|
454
|
+
the full stream.
|
|
455
|
+
|
|
456
|
+
As chunks are consumed, they are collected in-memory on the `AsyncContextStreamResponse`, and they
|
|
457
|
+
become available in `.content`, `.messages`, `.tool_calls`, etc. All of the stream
|
|
458
|
+
iterators can be restarted after the stream has been consumed, in which case they
|
|
459
|
+
will yield chunks from memory in the original sequence that came from the LLM. If
|
|
460
|
+
the stream is only partially consumed, a fresh iterator will first iterate through
|
|
461
|
+
in-memory content, and then will continue consuming fresh chunks from the LLM.
|
|
462
|
+
|
|
463
|
+
In the specific case of text chunks, they are included in the response content as soon
|
|
464
|
+
as they become available, via an `llm.Text` part that updates as more deltas come in.
|
|
465
|
+
This enables the behavior where resuming a partially-streamed response will include
|
|
466
|
+
as much text as the model generated.
|
|
467
|
+
|
|
468
|
+
For other chunks, like `Thinking` or `ToolCall`, they are only added to response
|
|
469
|
+
content once the corresponding part has fully streamed. This avoids issues like
|
|
470
|
+
adding incomplete tool calls, or thinking blocks missing signatures, to the response.
|
|
471
|
+
|
|
472
|
+
For each iterator, fully iterating through the iterator will consume the whole
|
|
473
|
+
LLM stream. You can pause stream execution midway by breaking out of the iterator,
|
|
474
|
+
and you can safely resume execution from the same iterator if desired.
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
Example:
|
|
478
|
+
```python
|
|
479
|
+
from mirascope import llm
|
|
480
|
+
|
|
481
|
+
@llm.call(
|
|
482
|
+
provider_id="openai",
|
|
483
|
+
model_id="openai/gpt-5-mini",
|
|
484
|
+
)
|
|
485
|
+
async def answer_question(ctx: llm.Context, question: str) -> str:
|
|
486
|
+
return f"Answer this question: {question}"
|
|
487
|
+
|
|
488
|
+
ctx = llm.Context()
|
|
489
|
+
stream_response = await answer_question.stream(ctx, "What is the capital of France?")
|
|
490
|
+
|
|
491
|
+
async for chunk in stream_response.text_stream():
|
|
492
|
+
print(chunk, end="", flush=True)
|
|
493
|
+
```
|
|
494
|
+
"""
|
|
495
|
+
|
|
496
|
+
def __init__(
|
|
497
|
+
self,
|
|
498
|
+
*,
|
|
499
|
+
provider_id: "ProviderId",
|
|
500
|
+
model_id: "ModelId",
|
|
501
|
+
provider_model_name: str,
|
|
502
|
+
params: "Params",
|
|
503
|
+
tools: AsyncContextTools[DepsT] | None = None,
|
|
504
|
+
format: Format[FormattableT] | None = None,
|
|
505
|
+
input_messages: Sequence[Message],
|
|
506
|
+
chunk_iterator: AsyncChunkIterator,
|
|
507
|
+
) -> None:
|
|
508
|
+
"""Initialize an `AsyncContextStreamResponse`."""
|
|
509
|
+
toolkit = (
|
|
510
|
+
tools
|
|
511
|
+
if isinstance(tools, AsyncContextToolkit)
|
|
512
|
+
else AsyncContextToolkit(tools=tools)
|
|
513
|
+
)
|
|
514
|
+
super().__init__(
|
|
515
|
+
provider_id=provider_id,
|
|
516
|
+
model_id=model_id,
|
|
517
|
+
provider_model_name=provider_model_name,
|
|
518
|
+
params=params,
|
|
519
|
+
toolkit=toolkit,
|
|
520
|
+
format=format,
|
|
521
|
+
input_messages=input_messages,
|
|
522
|
+
chunk_iterator=chunk_iterator,
|
|
523
|
+
)
|
|
524
|
+
|
|
525
|
+
async def execute_tools(
|
|
526
|
+
self, ctx: Context[DepsT]
|
|
527
|
+
) -> Sequence[ToolOutput[Jsonable]]:
|
|
528
|
+
"""Execute and return all of the tool calls in the response.
|
|
529
|
+
|
|
530
|
+
Args:
|
|
531
|
+
ctx: A `Context` with the required deps type.
|
|
532
|
+
|
|
533
|
+
Returns:
|
|
534
|
+
A sequence containing a `ToolOutput` for every tool call in the order they appeared.
|
|
535
|
+
|
|
536
|
+
Raises:
|
|
537
|
+
ToolNotFoundError: If one of the response's tool calls has no matching tool.
|
|
538
|
+
Exception: If one of the tools throws an exception.
|
|
539
|
+
"""
|
|
540
|
+
tasks = [self.toolkit.execute(ctx, tool_call) for tool_call in self.tool_calls]
|
|
541
|
+
return await asyncio.gather(*tasks)
|
|
542
|
+
|
|
543
|
+
@overload
|
|
544
|
+
async def resume(
|
|
545
|
+
self: "AsyncContextStreamResponse[DepsT]",
|
|
546
|
+
ctx: Context[DepsT],
|
|
547
|
+
content: UserContent,
|
|
548
|
+
) -> "AsyncContextStreamResponse[DepsT]": ...
|
|
549
|
+
|
|
550
|
+
@overload
|
|
551
|
+
async def resume(
|
|
552
|
+
self: "AsyncContextStreamResponse[DepsT, FormattableT]",
|
|
553
|
+
ctx: Context[DepsT],
|
|
554
|
+
content: UserContent,
|
|
555
|
+
) -> "AsyncContextStreamResponse[DepsT, FormattableT]": ...
|
|
556
|
+
|
|
557
|
+
async def resume(
|
|
558
|
+
self, ctx: Context[DepsT], content: UserContent
|
|
559
|
+
) -> "AsyncContextStreamResponse[DepsT] | AsyncContextStreamResponse[DepsT, FormattableT]":
|
|
560
|
+
"""Generate a new `AsyncContextStreamResponse` using this response's messages with additional user content.
|
|
561
|
+
|
|
562
|
+
Uses this response's tools and format type. Also uses this response's provider,
|
|
563
|
+
model, client, and params, unless the model context manager is being used to
|
|
564
|
+
provide a new LLM as an override.
|
|
565
|
+
|
|
566
|
+
Args:
|
|
567
|
+
ctx: A Context with the required deps type.
|
|
568
|
+
content: The new user message content to append to the message history.
|
|
569
|
+
|
|
570
|
+
Returns:
|
|
571
|
+
A new `AsyncContextStreamResponse` instance generated from the extended message history.
|
|
572
|
+
"""
|
|
573
|
+
return await self.model.context_resume_stream_async(
|
|
574
|
+
ctx=ctx,
|
|
575
|
+
response=self,
|
|
576
|
+
content=content,
|
|
577
|
+
)
|