mirascope 1.25.7__py3-none-any.whl → 2.0.0__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 -52
- mirascope/_stubs.py +363 -0
- mirascope/api/__init__.py +14 -0
- mirascope/api/_generated/README.md +207 -0
- mirascope/api/_generated/__init__.py +440 -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 +25 -0
- mirascope/api/_generated/project_memberships/client.py +437 -0
- mirascope/api/_generated/project_memberships/raw_client.py +1039 -0
- mirascope/api/_generated/project_memberships/types/__init__.py +29 -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_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 +4915 -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 +290 -15
- mirascope/llm/calls/__init__.py +17 -0
- mirascope/llm/calls/calls.py +341 -0
- mirascope/llm/calls/decorator.py +275 -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 +293 -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 +66 -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 +1419 -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 +226 -0
- mirascope/llm/prompts/prompts.py +487 -0
- mirascope/llm/prompts/protocols.py +65 -0
- mirascope/llm/providers/__init__.py +62 -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 +282 -0
- mirascope/llm/providers/anthropic/_utils/beta_encode.py +266 -0
- mirascope/llm/providers/anthropic/_utils/decode.py +288 -0
- mirascope/llm/providers/anthropic/_utils/encode.py +418 -0
- mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
- mirascope/llm/providers/anthropic/beta_provider.py +374 -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 +479 -0
- mirascope/llm/providers/base/__init__.py +14 -0
- mirascope/llm/providers/base/_utils.py +253 -0
- mirascope/llm/providers/base/base_provider.py +1579 -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 +307 -0
- mirascope/llm/providers/google/_utils/encode.py +401 -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 +492 -0
- mirascope/llm/providers/mirascope/__init__.py +5 -0
- mirascope/llm/providers/mirascope/_utils.py +73 -0
- mirascope/llm/providers/mirascope/provider.py +349 -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 +72 -0
- mirascope/llm/providers/mlx/encoding/transformers.py +150 -0
- mirascope/llm/providers/mlx/mlx.py +254 -0
- mirascope/llm/providers/mlx/model_id.py +17 -0
- mirascope/llm/providers/mlx/provider.py +452 -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 +15 -0
- mirascope/llm/providers/openai/completions/_utils/decode.py +252 -0
- mirascope/llm/providers/openai/completions/_utils/encode.py +376 -0
- mirascope/llm/providers/openai/completions/base_provider.py +542 -0
- mirascope/llm/providers/openai/completions/provider.py +22 -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 +441 -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 +260 -0
- mirascope/llm/providers/openai/responses/_utils/encode.py +384 -0
- mirascope/llm/providers/openai/responses/provider.py +513 -0
- mirascope/llm/providers/provider_id.py +24 -0
- mirascope/llm/providers/provider_registry.py +299 -0
- mirascope/llm/providers/together/__init__.py +7 -0
- mirascope/llm/providers/together/provider.py +40 -0
- mirascope/llm/responses/__init__.py +65 -0
- mirascope/llm/responses/_utils.py +146 -0
- mirascope/llm/responses/base_response.py +103 -0
- mirascope/llm/responses/base_stream_response.py +820 -0
- mirascope/llm/responses/finish_reason.py +28 -0
- mirascope/llm/responses/response.py +366 -0
- mirascope/llm/responses/root_response.py +248 -0
- mirascope/llm/responses/stream_response.py +581 -0
- mirascope/llm/responses/streams.py +363 -0
- mirascope/llm/responses/usage.py +95 -0
- mirascope/llm/tools/__init__.py +47 -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/tool_schema.py +314 -0
- mirascope/llm/tools/toolkit.py +160 -0
- mirascope/llm/tools/tools.py +263 -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 +111 -0
- mirascope/ops/_internal/__init__.py +5 -0
- mirascope/ops/_internal/closure.py +1169 -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 +395 -0
- mirascope/ops/_internal/exporters/processors.py +104 -0
- mirascope/ops/_internal/exporters/types.py +165 -0
- mirascope/ops/_internal/exporters/utils.py +29 -0
- mirascope/ops/_internal/instrumentation/__init__.py +8 -0
- mirascope/ops/_internal/instrumentation/llm/__init__.py +8 -0
- mirascope/ops/_internal/instrumentation/llm/common.py +530 -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 +1798 -0
- mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
- mirascope/ops/_internal/instrumentation/llm/serialize.py +300 -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 +375 -0
- mirascope/ops/_internal/traced_functions.py +523 -0
- mirascope/ops/_internal/tracing.py +353 -0
- mirascope/ops/_internal/types.py +13 -0
- mirascope/ops/_internal/utils.py +123 -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.0.0.dist-info/METADATA +203 -0
- mirascope-2.0.0.dist-info/RECORD +423 -0
- {mirascope-1.25.7.dist-info → mirascope-2.0.0.dist-info}/WHEEL +1 -1
- {mirascope-1.25.7.dist-info → mirascope-2.0.0.dist-info}/licenses/LICENSE +1 -1
- 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 -62
- mirascope/beta/rag/chroma/vectorstores.py +0 -121
- 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 -109
- 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/_thinking.py +0 -70
- 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 -154
- mirascope/core/anthropic/_utils/_setup_call.py +0 -146
- mirascope/core/anthropic/call_params.py +0 -44
- mirascope/core/anthropic/call_response.py +0 -226
- mirascope/core/anthropic/call_response_chunk.py +0 -152
- mirascope/core/anthropic/dynamic_config.py +0 -40
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -204
- 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 -86
- 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 -178
- 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 -24
- 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 -323
- 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 -338
- 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 -175
- mirascope/core/base/messages.py +0 -116
- 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 -214
- 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 -172
- mirascope/core/bedrock/_utils/_setup_call.py +0 -258
- mirascope/core/bedrock/call_params.py +0 -38
- mirascope/core/bedrock/call_response.py +0 -248
- 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 -100
- 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 -297
- mirascope/core/google/_utils/_get_json_output.py +0 -37
- mirascope/core/google/_utils/_handle_stream.py +0 -58
- mirascope/core/google/_utils/_message_param_converter.py +0 -200
- mirascope/core/google/_utils/_setup_call.py +0 -201
- mirascope/core/google/_utils/_validate_media_type.py +0 -58
- mirascope/core/google/call_params.py +0 -22
- mirascope/core/google/call_response.py +0 -255
- mirascope/core/google/call_response_chunk.py +0 -135
- mirascope/core/google/dynamic_config.py +0 -26
- mirascope/core/google/stream.py +0 -199
- 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 -164
- 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 -81
- 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 -148
- 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 -92
- 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 -158
- 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 -288
- 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 -131
- 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.25.7.dist-info/METADATA +0 -169
- mirascope-1.25.7.dist-info/RECORD +0 -378
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"""Provider registry for managing provider instances and scopes."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from collections.abc import Sequence
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from functools import lru_cache
|
|
7
|
+
from typing import overload
|
|
8
|
+
|
|
9
|
+
from ..exceptions import MissingAPIKeyError, NoRegisteredProviderError
|
|
10
|
+
from .anthropic import AnthropicProvider
|
|
11
|
+
from .base import Provider
|
|
12
|
+
from .google import GoogleProvider
|
|
13
|
+
from .mirascope import MirascopeProvider
|
|
14
|
+
from .mlx import MLXProvider
|
|
15
|
+
from .ollama import OllamaProvider
|
|
16
|
+
from .openai import OpenAIProvider
|
|
17
|
+
from .openai.completions.provider import OpenAICompletionsProvider
|
|
18
|
+
from .openai.responses.provider import OpenAIResponsesProvider
|
|
19
|
+
from .provider_id import ProviderId
|
|
20
|
+
from .together import TogetherProvider
|
|
21
|
+
|
|
22
|
+
# Global registry mapping scopes to providers
|
|
23
|
+
# Scopes are matched by prefix (longest match wins)
|
|
24
|
+
PROVIDER_REGISTRY: dict[str, Provider] = {}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def reset_provider_registry() -> None:
|
|
28
|
+
"""Resets the provider registry, clearing all registered providers."""
|
|
29
|
+
PROVIDER_REGISTRY.clear()
|
|
30
|
+
provider_singleton.cache_clear()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass(frozen=True)
|
|
34
|
+
class ProviderDefault:
|
|
35
|
+
"""Configuration for a provider in the auto-registration fallback chain.
|
|
36
|
+
|
|
37
|
+
When auto-registering a provider for a scope, the fallback chain is tried
|
|
38
|
+
in order. The first provider whose API key is available will be used.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
provider_id: ProviderId
|
|
42
|
+
"""The provider identifier."""
|
|
43
|
+
|
|
44
|
+
api_key_env_var: str | None
|
|
45
|
+
"""Environment variable for the API key, or None if no key is required."""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# Fallback chain for auto-registration: try providers in order until one has
|
|
49
|
+
# its API key available. This enables automatic fallback to Mirascope Router
|
|
50
|
+
# when direct provider keys are not set.
|
|
51
|
+
DEFAULT_AUTO_REGISTER_SCOPES: dict[str, Sequence[ProviderDefault]] = {
|
|
52
|
+
"anthropic/": [
|
|
53
|
+
ProviderDefault("anthropic", "ANTHROPIC_API_KEY"),
|
|
54
|
+
ProviderDefault("mirascope", "MIRASCOPE_API_KEY"),
|
|
55
|
+
],
|
|
56
|
+
"google/": [
|
|
57
|
+
ProviderDefault("google", "GOOGLE_API_KEY"),
|
|
58
|
+
ProviderDefault("mirascope", "MIRASCOPE_API_KEY"),
|
|
59
|
+
],
|
|
60
|
+
"openai/": [
|
|
61
|
+
ProviderDefault("openai", "OPENAI_API_KEY"),
|
|
62
|
+
ProviderDefault("mirascope", "MIRASCOPE_API_KEY"),
|
|
63
|
+
],
|
|
64
|
+
"together/": [
|
|
65
|
+
ProviderDefault("together", "TOGETHER_API_KEY"),
|
|
66
|
+
# No Mirascope fallback for together
|
|
67
|
+
],
|
|
68
|
+
"ollama/": [
|
|
69
|
+
ProviderDefault("ollama", None), # No API key required
|
|
70
|
+
],
|
|
71
|
+
"mlx-community/": [
|
|
72
|
+
ProviderDefault("mlx", None), # No API key required
|
|
73
|
+
],
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _has_api_key(default: ProviderDefault) -> bool:
|
|
78
|
+
"""Check if the API key for a provider default is available.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
default: The provider default configuration to check.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
True if the API key is available or not required, False otherwise.
|
|
85
|
+
"""
|
|
86
|
+
if default.api_key_env_var is None:
|
|
87
|
+
return True # Provider doesn't require API key
|
|
88
|
+
return os.environ.get(default.api_key_env_var) is not None
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@lru_cache(maxsize=256)
|
|
92
|
+
def provider_singleton(
|
|
93
|
+
provider_id: ProviderId, *, api_key: str | None = None, base_url: str | None = None
|
|
94
|
+
) -> Provider:
|
|
95
|
+
"""Create a cached provider instance for the specified provider id.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
provider_id: The provider name ("openai", "anthropic", or "google").
|
|
99
|
+
api_key: API key for authentication. If None, uses provider-specific env var.
|
|
100
|
+
base_url: Base URL for the API. If None, uses provider-specific env var.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
A cached provider instance for the specified provider with the given parameters.
|
|
104
|
+
|
|
105
|
+
Raises:
|
|
106
|
+
ValueError: If the provider_id is not supported.
|
|
107
|
+
"""
|
|
108
|
+
match provider_id:
|
|
109
|
+
case "anthropic":
|
|
110
|
+
return AnthropicProvider(api_key=api_key, base_url=base_url)
|
|
111
|
+
case "google":
|
|
112
|
+
return GoogleProvider(api_key=api_key, base_url=base_url)
|
|
113
|
+
case "mirascope":
|
|
114
|
+
return MirascopeProvider(api_key=api_key, base_url=base_url)
|
|
115
|
+
case "mlx": # pragma: no cover (MLX is only available on macOS)
|
|
116
|
+
return MLXProvider()
|
|
117
|
+
case "ollama":
|
|
118
|
+
return OllamaProvider(api_key=api_key, base_url=base_url)
|
|
119
|
+
case "openai":
|
|
120
|
+
return OpenAIProvider(api_key=api_key, base_url=base_url)
|
|
121
|
+
case "openai:completions":
|
|
122
|
+
return OpenAICompletionsProvider(api_key=api_key, base_url=base_url)
|
|
123
|
+
case "openai:responses":
|
|
124
|
+
return OpenAIResponsesProvider(api_key=api_key, base_url=base_url)
|
|
125
|
+
case "together":
|
|
126
|
+
return TogetherProvider(api_key=api_key, base_url=base_url)
|
|
127
|
+
case _: # pragma: no cover
|
|
128
|
+
raise ValueError(f"Unknown provider: '{provider_id}'")
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
@overload
|
|
132
|
+
def register_provider(
|
|
133
|
+
provider: Provider,
|
|
134
|
+
scope: str | list[str] | None = None,
|
|
135
|
+
) -> Provider:
|
|
136
|
+
"""Register a provider instance with scope(s).
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
provider: Provider instance to register.
|
|
140
|
+
scope: Scope string or list of scopes (e.g., "anthropic/", ["anthropic/", "openai/"]).
|
|
141
|
+
If None, uses the provider's default_scope.
|
|
142
|
+
"""
|
|
143
|
+
...
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
@overload
|
|
147
|
+
def register_provider(
|
|
148
|
+
provider: ProviderId,
|
|
149
|
+
scope: str | list[str] | None = None,
|
|
150
|
+
*,
|
|
151
|
+
api_key: str | None = None,
|
|
152
|
+
base_url: str | None = None,
|
|
153
|
+
) -> Provider:
|
|
154
|
+
"""Register a provider by ID with scope(s).
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
provider: Provider ID string (e.g., "anthropic", "openai").
|
|
158
|
+
scope: Scope string or list of scopes (e.g., "anthropic/", ["anthropic/", "openai/"]).
|
|
159
|
+
If None, uses the provider's default_scope.
|
|
160
|
+
api_key: API key for authentication.
|
|
161
|
+
base_url: Base URL for the API.
|
|
162
|
+
"""
|
|
163
|
+
...
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def register_provider(
|
|
167
|
+
provider: ProviderId | Provider,
|
|
168
|
+
scope: str | list[str] | None = None,
|
|
169
|
+
*,
|
|
170
|
+
api_key: str | None = None,
|
|
171
|
+
base_url: str | None = None,
|
|
172
|
+
) -> Provider:
|
|
173
|
+
"""Register a provider with scope(s) in the global registry.
|
|
174
|
+
|
|
175
|
+
Scopes use prefix matching on model IDs:
|
|
176
|
+
- "anthropic/" matches "anthropic/*"
|
|
177
|
+
- "anthropic/claude-4-5" matches "anthropic/claude-4-5*"
|
|
178
|
+
- "anthropic/claude-4-5-sonnet" matches exactly "anthropic/claude-4-5-sonnet"
|
|
179
|
+
|
|
180
|
+
When multiple scopes match a model_id, the longest match wins.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
provider: Either a provider ID string or a provider instance.
|
|
184
|
+
scope: Scope string or list of scopes for prefix matching on model IDs.
|
|
185
|
+
If None, uses the provider's default_scope attribute.
|
|
186
|
+
Can be a single string or a list of strings.
|
|
187
|
+
api_key: API key for authentication (only used if provider is a string).
|
|
188
|
+
base_url: Base URL for the API (only used if provider is a string).
|
|
189
|
+
|
|
190
|
+
Example:
|
|
191
|
+
```python
|
|
192
|
+
# Register with default scope
|
|
193
|
+
llm.register_provider("anthropic", api_key="key")
|
|
194
|
+
|
|
195
|
+
# Register for specific models
|
|
196
|
+
llm.register_provider("openai", scope="openai/gpt-4")
|
|
197
|
+
|
|
198
|
+
# Register for multiple scopes
|
|
199
|
+
llm.register_provider("aws-bedrock", scope=["anthropic/", "openai/"])
|
|
200
|
+
|
|
201
|
+
# Register a custom instance
|
|
202
|
+
custom = llm.providers.AnthropicProvider(api_key="team-key")
|
|
203
|
+
llm.register_provider(custom, scope="anthropic/claude-4-5-sonnet")
|
|
204
|
+
```
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
if isinstance(provider, str):
|
|
208
|
+
provider = provider_singleton(provider, api_key=api_key, base_url=base_url)
|
|
209
|
+
|
|
210
|
+
if scope is None:
|
|
211
|
+
scope = provider.default_scope
|
|
212
|
+
|
|
213
|
+
scopes = [scope] if isinstance(scope, str) else scope
|
|
214
|
+
for s in scopes:
|
|
215
|
+
PROVIDER_REGISTRY[s] = provider
|
|
216
|
+
|
|
217
|
+
return provider
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def get_provider_for_model(model_id: str) -> Provider:
|
|
221
|
+
"""Get the provider for a model_id based on the registry.
|
|
222
|
+
|
|
223
|
+
Uses longest prefix matching to find the most specific provider for the model.
|
|
224
|
+
If no explicit registration is found, checks for auto-registration defaults
|
|
225
|
+
and automatically registers the provider on first use.
|
|
226
|
+
|
|
227
|
+
When auto-registering, providers are tried in fallback order. For example,
|
|
228
|
+
if ANTHROPIC_API_KEY is not set but MIRASCOPE_API_KEY is, the Mirascope
|
|
229
|
+
Router will be used as a fallback for anthropic/ models.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
model_id: The full model ID (e.g., "anthropic/claude-4-5-sonnet").
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
The provider instance registered for this model.
|
|
236
|
+
|
|
237
|
+
Raises:
|
|
238
|
+
NoRegisteredProviderError: If no provider scope matches the model_id.
|
|
239
|
+
MissingAPIKeyError: If no provider in the fallback chain has its API key set.
|
|
240
|
+
|
|
241
|
+
Example:
|
|
242
|
+
```python
|
|
243
|
+
# Assuming providers are registered:
|
|
244
|
+
# - "anthropic/" -> AnthropicProvider()
|
|
245
|
+
# - "anthropic/claude-4-5-sonnet" -> CustomProvider()
|
|
246
|
+
|
|
247
|
+
provider = get_provider_for_model("anthropic/claude-4-5-sonnet")
|
|
248
|
+
# Returns CustomProvider (longest match)
|
|
249
|
+
|
|
250
|
+
provider = get_provider_for_model("anthropic/claude-3-opus")
|
|
251
|
+
# Returns AnthropicProvider (matches "anthropic/" prefix)
|
|
252
|
+
|
|
253
|
+
# Auto-registration on first use:
|
|
254
|
+
provider = get_provider_for_model("openai/gpt-4")
|
|
255
|
+
# Automatically loads and registers OpenAIProvider() for "openai/"
|
|
256
|
+
|
|
257
|
+
# Fallback to Mirascope Router if direct key missing:
|
|
258
|
+
# (with MIRASCOPE_API_KEY set but not ANTHROPIC_API_KEY)
|
|
259
|
+
provider = get_provider_for_model("anthropic/claude-4-5-sonnet")
|
|
260
|
+
# Returns MirascopeProvider registered for "anthropic/" scope
|
|
261
|
+
```
|
|
262
|
+
"""
|
|
263
|
+
# Try explicit registry first (longest match wins)
|
|
264
|
+
matching_scopes = [
|
|
265
|
+
scope for scope in PROVIDER_REGISTRY if model_id.startswith(scope)
|
|
266
|
+
]
|
|
267
|
+
if matching_scopes:
|
|
268
|
+
best_scope = max(matching_scopes, key=len)
|
|
269
|
+
return PROVIDER_REGISTRY[best_scope]
|
|
270
|
+
|
|
271
|
+
# Fall back to auto-registration with fallback chain
|
|
272
|
+
matching_defaults = [
|
|
273
|
+
scope for scope in DEFAULT_AUTO_REGISTER_SCOPES if model_id.startswith(scope)
|
|
274
|
+
]
|
|
275
|
+
if matching_defaults:
|
|
276
|
+
best_scope = max(matching_defaults, key=len)
|
|
277
|
+
fallback_chain = DEFAULT_AUTO_REGISTER_SCOPES[best_scope]
|
|
278
|
+
|
|
279
|
+
# Try each provider in the fallback chain
|
|
280
|
+
for default in fallback_chain:
|
|
281
|
+
if _has_api_key(default):
|
|
282
|
+
provider = provider_singleton(default.provider_id)
|
|
283
|
+
# Register for just this scope (not all provider's default scopes)
|
|
284
|
+
PROVIDER_REGISTRY[best_scope] = provider
|
|
285
|
+
return provider
|
|
286
|
+
|
|
287
|
+
# No provider in chain has API key - raise helpful error
|
|
288
|
+
primary = fallback_chain[0]
|
|
289
|
+
has_mirascope_fallback = any(
|
|
290
|
+
d.provider_id == "mirascope" for d in fallback_chain
|
|
291
|
+
)
|
|
292
|
+
raise MissingAPIKeyError(
|
|
293
|
+
provider_id=primary.provider_id,
|
|
294
|
+
env_var=primary.api_key_env_var or "",
|
|
295
|
+
has_mirascope_fallback=has_mirascope_fallback,
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
# No matching scope at all
|
|
299
|
+
raise NoRegisteredProviderError(model_id)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Together AI provider implementation."""
|
|
2
|
+
|
|
3
|
+
from typing import ClassVar
|
|
4
|
+
|
|
5
|
+
from ..openai.completions.base_provider import BaseOpenAICompletionsProvider
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TogetherProvider(BaseOpenAICompletionsProvider):
|
|
9
|
+
"""Provider for Together AI's OpenAI-compatible API.
|
|
10
|
+
|
|
11
|
+
Inherits from BaseOpenAICompletionsProvider with Together-specific configuration:
|
|
12
|
+
- Uses Together AI's API endpoint
|
|
13
|
+
- Requires TOGETHER_API_KEY
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
Register the provider with model ID prefixes you want to use:
|
|
17
|
+
|
|
18
|
+
```python
|
|
19
|
+
import llm
|
|
20
|
+
|
|
21
|
+
# Register for meta-llama models
|
|
22
|
+
llm.register_provider("together", "meta-llama/")
|
|
23
|
+
|
|
24
|
+
# Now you can use meta-llama models directly
|
|
25
|
+
@llm.call("meta-llama/Llama-3.3-70B-Instruct-Turbo")
|
|
26
|
+
def my_prompt():
|
|
27
|
+
return [llm.messages.user("Hello!")]
|
|
28
|
+
```
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
id: ClassVar[str] = "together"
|
|
32
|
+
default_scope: ClassVar[str | list[str]] = []
|
|
33
|
+
default_base_url: ClassVar[str | None] = "https://api.together.xyz/v1"
|
|
34
|
+
api_key_env_var: ClassVar[str] = "TOGETHER_API_KEY"
|
|
35
|
+
api_key_required: ClassVar[bool] = True
|
|
36
|
+
provider_name: ClassVar[str | None] = "Together"
|
|
37
|
+
|
|
38
|
+
def _model_name(self, model_id: str) -> str:
|
|
39
|
+
"""Return the model ID as-is for Together API."""
|
|
40
|
+
return model_id
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""The Responses module for LLM responses."""
|
|
2
|
+
|
|
3
|
+
from . import _utils
|
|
4
|
+
from .base_response import ResponseT
|
|
5
|
+
from .base_stream_response import (
|
|
6
|
+
AsyncChunkIterator,
|
|
7
|
+
ChunkIterator,
|
|
8
|
+
RawMessageChunk,
|
|
9
|
+
RawStreamEventChunk,
|
|
10
|
+
StreamResponseChunk,
|
|
11
|
+
StreamResponseT,
|
|
12
|
+
)
|
|
13
|
+
from .finish_reason import FinishReason, FinishReasonChunk
|
|
14
|
+
from .response import AsyncContextResponse, AsyncResponse, ContextResponse, Response
|
|
15
|
+
from .root_response import AnyResponse, RootResponse
|
|
16
|
+
from .stream_response import (
|
|
17
|
+
AsyncContextStreamResponse,
|
|
18
|
+
AsyncStreamResponse,
|
|
19
|
+
ContextStreamResponse,
|
|
20
|
+
StreamResponse,
|
|
21
|
+
)
|
|
22
|
+
from .streams import (
|
|
23
|
+
AsyncStream,
|
|
24
|
+
AsyncTextStream,
|
|
25
|
+
AsyncThoughtStream,
|
|
26
|
+
AsyncToolCallStream,
|
|
27
|
+
Stream,
|
|
28
|
+
TextStream,
|
|
29
|
+
ThoughtStream,
|
|
30
|
+
ToolCallStream,
|
|
31
|
+
)
|
|
32
|
+
from .usage import Usage, UsageDeltaChunk
|
|
33
|
+
|
|
34
|
+
__all__ = [
|
|
35
|
+
"AnyResponse",
|
|
36
|
+
"AsyncChunkIterator",
|
|
37
|
+
"AsyncContextResponse",
|
|
38
|
+
"AsyncContextStreamResponse",
|
|
39
|
+
"AsyncResponse",
|
|
40
|
+
"AsyncStream",
|
|
41
|
+
"AsyncStreamResponse",
|
|
42
|
+
"AsyncTextStream",
|
|
43
|
+
"AsyncThoughtStream",
|
|
44
|
+
"AsyncToolCallStream",
|
|
45
|
+
"ChunkIterator",
|
|
46
|
+
"ContextResponse",
|
|
47
|
+
"ContextStreamResponse",
|
|
48
|
+
"FinishReason",
|
|
49
|
+
"FinishReasonChunk",
|
|
50
|
+
"RawMessageChunk",
|
|
51
|
+
"RawStreamEventChunk",
|
|
52
|
+
"Response",
|
|
53
|
+
"ResponseT",
|
|
54
|
+
"RootResponse",
|
|
55
|
+
"Stream",
|
|
56
|
+
"StreamResponse",
|
|
57
|
+
"StreamResponseChunk",
|
|
58
|
+
"StreamResponseT",
|
|
59
|
+
"TextStream",
|
|
60
|
+
"ThoughtStream",
|
|
61
|
+
"ToolCallStream",
|
|
62
|
+
"Usage",
|
|
63
|
+
"UsageDeltaChunk",
|
|
64
|
+
"_utils",
|
|
65
|
+
]
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"""Utilities for response classes."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from typing import cast
|
|
5
|
+
|
|
6
|
+
import jiter
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from ..formatting import (
|
|
10
|
+
FormattableT,
|
|
11
|
+
Partial,
|
|
12
|
+
PrimitiveWrapperModel,
|
|
13
|
+
create_wrapper_model,
|
|
14
|
+
is_primitive_type,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _strip_json_preamble(text: str) -> str | None:
|
|
19
|
+
"""Strip preamble text before JSON content.
|
|
20
|
+
|
|
21
|
+
Handles cases where models output text before JSON like:
|
|
22
|
+
"Sure thing! Here's the JSON:\n{..."
|
|
23
|
+
|
|
24
|
+
Or cases where the model wraps the JSON in code blocks like:
|
|
25
|
+
"```json\n{..."
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
text: The raw text that may contain a JSON object
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
Text starting from the opening `{`, or None if no `{` found.
|
|
32
|
+
"""
|
|
33
|
+
code_block_start_marker = "```json"
|
|
34
|
+
code_block_start = text.find(code_block_start_marker)
|
|
35
|
+
if code_block_start > -1:
|
|
36
|
+
# Discard text prior to code block; it takes precedence over brackets that
|
|
37
|
+
# may be found before it.
|
|
38
|
+
text = text[code_block_start:]
|
|
39
|
+
|
|
40
|
+
json_start = text.find("{")
|
|
41
|
+
if json_start == -1:
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
return text[json_start:]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def extract_serialized_json(text: str) -> str:
|
|
48
|
+
"""Extract the serialized JSON string from text that may contain extra content.
|
|
49
|
+
|
|
50
|
+
Handles cases where models output text before JSON like:
|
|
51
|
+
"Sure thing! Here's the JSON:\n{...}"
|
|
52
|
+
|
|
53
|
+
Or cases where the model wraps the JSON in code blocks like:
|
|
54
|
+
"```json\n{...}\n```"
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
text: The raw text that may contain a JSON object
|
|
58
|
+
|
|
59
|
+
Raises:
|
|
60
|
+
json.JSONDecodeError: If no valid JSON object could be extracted.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
The extracted serialized JSON string
|
|
64
|
+
"""
|
|
65
|
+
stripped = _strip_json_preamble(text)
|
|
66
|
+
if stripped is None:
|
|
67
|
+
raise json.JSONDecodeError("No JSON object found: missing '{'", text, 0)
|
|
68
|
+
|
|
69
|
+
# Find the matching closing brace
|
|
70
|
+
brace_count = 0
|
|
71
|
+
in_string = False
|
|
72
|
+
escaped = False
|
|
73
|
+
|
|
74
|
+
for i, char in enumerate(stripped):
|
|
75
|
+
if escaped:
|
|
76
|
+
escaped = False
|
|
77
|
+
continue
|
|
78
|
+
|
|
79
|
+
if char == "\\":
|
|
80
|
+
escaped = True
|
|
81
|
+
continue
|
|
82
|
+
|
|
83
|
+
if char == '"' and not escaped:
|
|
84
|
+
in_string = not in_string
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
if not in_string:
|
|
88
|
+
if char == "{":
|
|
89
|
+
brace_count += 1
|
|
90
|
+
elif char == "}":
|
|
91
|
+
brace_count -= 1
|
|
92
|
+
if brace_count == 0:
|
|
93
|
+
return stripped[: i + 1]
|
|
94
|
+
|
|
95
|
+
raise json.JSONDecodeError("No JSON object found: missing '}'", text, len(text))
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def parse_partial_json(
|
|
99
|
+
json_text: str, formattable: type[FormattableT]
|
|
100
|
+
) -> FormattableT | Partial[FormattableT] | None:
|
|
101
|
+
"""Parse incomplete JSON into a Partial model for structured streaming.
|
|
102
|
+
|
|
103
|
+
Uses jiter's partial mode to handle incomplete JSON gracefully.
|
|
104
|
+
Returns None if JSON cannot be parsed yet.
|
|
105
|
+
|
|
106
|
+
Handles cases where models output text before JSON like:
|
|
107
|
+
"Sure thing! Here's the JSON:\n{..."
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
json_text: The incomplete JSON string to parse
|
|
111
|
+
formattable: The target format type (BaseModel or PrimitiveType)
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Parsed partial object, or None if unparsable
|
|
115
|
+
|
|
116
|
+
Example:
|
|
117
|
+
>>> from pydantic import BaseModel
|
|
118
|
+
>>> class Book(BaseModel):
|
|
119
|
+
... title: str
|
|
120
|
+
... author: str
|
|
121
|
+
>>> parse_partial_json('{"title": "The Name"', Book)
|
|
122
|
+
PartialBook(title='The Name', author=None)
|
|
123
|
+
"""
|
|
124
|
+
# Strip preamble text before JSON
|
|
125
|
+
stripped = _strip_json_preamble(json_text)
|
|
126
|
+
if stripped is None:
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
parsed = jiter.from_json(stripped.encode(), partial_mode="trailing-strings")
|
|
131
|
+
except Exception:
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
target_model = formattable
|
|
135
|
+
if is_primitive_type(target_model):
|
|
136
|
+
target_model = cast(BaseModel, create_wrapper_model(target_model))
|
|
137
|
+
|
|
138
|
+
try:
|
|
139
|
+
instance = cast(BaseModel, Partial[target_model]).model_validate(parsed)
|
|
140
|
+
except Exception:
|
|
141
|
+
return None
|
|
142
|
+
|
|
143
|
+
if is_primitive_type(formattable):
|
|
144
|
+
return cast(PrimitiveWrapperModel, instance).output
|
|
145
|
+
|
|
146
|
+
return cast(Partial[FormattableT], instance)
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Shared base of Response and AsyncResponse."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Sequence
|
|
4
|
+
from typing import TYPE_CHECKING, Any, TypeVar
|
|
5
|
+
|
|
6
|
+
from ..content import Text, Thought, ToolCall
|
|
7
|
+
from ..formatting import Format, FormattableT
|
|
8
|
+
from ..messages import AssistantMessage, Message
|
|
9
|
+
from ..tools import FORMAT_TOOL_NAME, ToolkitT
|
|
10
|
+
from .finish_reason import FinishReason
|
|
11
|
+
from .root_response import RootResponse
|
|
12
|
+
from .usage import Usage
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from ..models import Params
|
|
16
|
+
from ..providers import ModelId, ProviderId
|
|
17
|
+
|
|
18
|
+
ResponseT = TypeVar("ResponseT", bound="BaseResponse[Any, Any]")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class BaseResponse(RootResponse[ToolkitT, FormattableT]):
|
|
22
|
+
"""The response generated by an LLM."""
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
*,
|
|
27
|
+
raw: Any, # noqa: ANN401
|
|
28
|
+
provider_id: "ProviderId",
|
|
29
|
+
model_id: "ModelId",
|
|
30
|
+
provider_model_name: str,
|
|
31
|
+
params: "Params",
|
|
32
|
+
toolkit: ToolkitT,
|
|
33
|
+
format: Format[FormattableT] | None = None,
|
|
34
|
+
input_messages: Sequence[Message],
|
|
35
|
+
assistant_message: AssistantMessage,
|
|
36
|
+
finish_reason: FinishReason | None,
|
|
37
|
+
usage: Usage | None,
|
|
38
|
+
) -> None:
|
|
39
|
+
"""Initialize a Response.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
raw: The raw response from the LLM.
|
|
43
|
+
provider: The provider name (e.g. "anthropic", "openai").
|
|
44
|
+
model_id: The model identifier that generated the response.
|
|
45
|
+
provider_model_name: Optional provider-specific model name. May include
|
|
46
|
+
provider-specific additional info (like api mode in "gpt-5:responses").
|
|
47
|
+
params: The params used to generate the response (or None).
|
|
48
|
+
toolkit: Toolkit containing all the tools used to generate the response.
|
|
49
|
+
format: The `Format` for the expected structured output format (or None).
|
|
50
|
+
input_messages: The message history before the final assistant message.
|
|
51
|
+
assistant_message: The final assistant message containing the response content.
|
|
52
|
+
finish_reason: The reason why the LLM finished generating a response.
|
|
53
|
+
usage: Token usage statistics for the response.
|
|
54
|
+
"""
|
|
55
|
+
self.raw = raw
|
|
56
|
+
self.provider_id = provider_id
|
|
57
|
+
self.model_id = model_id
|
|
58
|
+
self.provider_model_name = provider_model_name
|
|
59
|
+
self.params = params
|
|
60
|
+
self.toolkit = toolkit
|
|
61
|
+
self.finish_reason = finish_reason
|
|
62
|
+
self.usage = usage
|
|
63
|
+
self.format = format
|
|
64
|
+
|
|
65
|
+
# Process content in the assistant message, organizing it by type and
|
|
66
|
+
# transforming ToolCalls to the special format tool into text (as calls to the
|
|
67
|
+
# formatting tool are not "real" tool calls, and response.parse() expects to
|
|
68
|
+
# operate on text content).
|
|
69
|
+
self.texts = []
|
|
70
|
+
self.tool_calls = []
|
|
71
|
+
self.thoughts = []
|
|
72
|
+
self.content = []
|
|
73
|
+
found_format_tool = False
|
|
74
|
+
|
|
75
|
+
for part in assistant_message.content:
|
|
76
|
+
if isinstance(part, ToolCall) and part.name.startswith(FORMAT_TOOL_NAME):
|
|
77
|
+
part = Text(text=part.args)
|
|
78
|
+
found_format_tool = True
|
|
79
|
+
|
|
80
|
+
self.content.append(part)
|
|
81
|
+
if isinstance(part, Text):
|
|
82
|
+
self.texts.append(part)
|
|
83
|
+
elif isinstance(part, ToolCall):
|
|
84
|
+
self.tool_calls.append(part)
|
|
85
|
+
elif isinstance(part, Thought):
|
|
86
|
+
self.thoughts.append(part)
|
|
87
|
+
else:
|
|
88
|
+
raise NotImplementedError
|
|
89
|
+
|
|
90
|
+
if found_format_tool:
|
|
91
|
+
# We create a new assistant message if we found a formatting ToolCall
|
|
92
|
+
# since this indicates we've transformed the content from the original
|
|
93
|
+
# NOTE: we copy over the assistant message `name` field, although in
|
|
94
|
+
# practice we don't know of any providers that set the name themselves.
|
|
95
|
+
assistant_message = AssistantMessage(
|
|
96
|
+
content=self.content,
|
|
97
|
+
name=assistant_message.name,
|
|
98
|
+
provider_id=assistant_message.provider_id,
|
|
99
|
+
model_id=assistant_message.model_id,
|
|
100
|
+
provider_model_name=assistant_message.provider_model_name,
|
|
101
|
+
raw_message=assistant_message.raw_message,
|
|
102
|
+
)
|
|
103
|
+
self.messages = list(input_messages) + [assistant_message]
|