mirascope 1.0.5__py3-none-any.whl → 2.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mirascope/__init__.py +6 -6
- mirascope/_stubs.py +384 -0
- mirascope/_utils.py +34 -0
- mirascope/api/__init__.py +14 -0
- mirascope/api/_generated/README.md +207 -0
- mirascope/api/_generated/__init__.py +444 -0
- mirascope/api/_generated/annotations/__init__.py +33 -0
- mirascope/api/_generated/annotations/client.py +506 -0
- mirascope/api/_generated/annotations/raw_client.py +1414 -0
- mirascope/api/_generated/annotations/types/__init__.py +31 -0
- mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
- mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
- mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
- mirascope/api/_generated/api_keys/__init__.py +17 -0
- mirascope/api/_generated/api_keys/client.py +530 -0
- mirascope/api/_generated/api_keys/raw_client.py +1236 -0
- mirascope/api/_generated/api_keys/types/__init__.py +15 -0
- mirascope/api/_generated/api_keys/types/api_keys_create_response.py +28 -0
- mirascope/api/_generated/api_keys/types/api_keys_get_response.py +27 -0
- mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
- mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +27 -0
- mirascope/api/_generated/client.py +211 -0
- mirascope/api/_generated/core/__init__.py +52 -0
- mirascope/api/_generated/core/api_error.py +23 -0
- mirascope/api/_generated/core/client_wrapper.py +46 -0
- mirascope/api/_generated/core/datetime_utils.py +28 -0
- mirascope/api/_generated/core/file.py +67 -0
- mirascope/api/_generated/core/force_multipart.py +16 -0
- mirascope/api/_generated/core/http_client.py +543 -0
- mirascope/api/_generated/core/http_response.py +55 -0
- mirascope/api/_generated/core/jsonable_encoder.py +100 -0
- mirascope/api/_generated/core/pydantic_utilities.py +255 -0
- mirascope/api/_generated/core/query_encoder.py +58 -0
- mirascope/api/_generated/core/remove_none_from_dict.py +11 -0
- mirascope/api/_generated/core/request_options.py +35 -0
- mirascope/api/_generated/core/serialization.py +276 -0
- mirascope/api/_generated/docs/__init__.py +4 -0
- mirascope/api/_generated/docs/client.py +91 -0
- mirascope/api/_generated/docs/raw_client.py +178 -0
- mirascope/api/_generated/environment.py +9 -0
- mirascope/api/_generated/environments/__init__.py +23 -0
- mirascope/api/_generated/environments/client.py +649 -0
- mirascope/api/_generated/environments/raw_client.py +1567 -0
- mirascope/api/_generated/environments/types/__init__.py +25 -0
- mirascope/api/_generated/environments/types/environments_create_response.py +24 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
- mirascope/api/_generated/environments/types/environments_get_response.py +24 -0
- mirascope/api/_generated/environments/types/environments_list_response_item.py +24 -0
- mirascope/api/_generated/environments/types/environments_update_response.py +24 -0
- mirascope/api/_generated/errors/__init__.py +25 -0
- mirascope/api/_generated/errors/bad_request_error.py +14 -0
- mirascope/api/_generated/errors/conflict_error.py +14 -0
- mirascope/api/_generated/errors/forbidden_error.py +11 -0
- mirascope/api/_generated/errors/internal_server_error.py +10 -0
- mirascope/api/_generated/errors/not_found_error.py +11 -0
- mirascope/api/_generated/errors/payment_required_error.py +15 -0
- mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
- mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
- mirascope/api/_generated/errors/unauthorized_error.py +11 -0
- mirascope/api/_generated/functions/__init__.py +39 -0
- mirascope/api/_generated/functions/client.py +647 -0
- mirascope/api/_generated/functions/raw_client.py +1890 -0
- mirascope/api/_generated/functions/types/__init__.py +53 -0
- mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
- mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
- mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
- mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
- mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
- mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
- mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
- mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
- mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
- mirascope/api/_generated/health/__init__.py +7 -0
- mirascope/api/_generated/health/client.py +92 -0
- mirascope/api/_generated/health/raw_client.py +175 -0
- mirascope/api/_generated/health/types/__init__.py +8 -0
- mirascope/api/_generated/health/types/health_check_response.py +22 -0
- mirascope/api/_generated/health/types/health_check_response_status.py +5 -0
- mirascope/api/_generated/organization_invitations/__init__.py +33 -0
- mirascope/api/_generated/organization_invitations/client.py +546 -0
- mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
- mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
- mirascope/api/_generated/organization_memberships/__init__.py +19 -0
- mirascope/api/_generated/organization_memberships/client.py +302 -0
- mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
- mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
- mirascope/api/_generated/organizations/__init__.py +51 -0
- mirascope/api/_generated/organizations/client.py +869 -0
- mirascope/api/_generated/organizations/raw_client.py +2593 -0
- mirascope/api/_generated/organizations/types/__init__.py +71 -0
- mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
- mirascope/api/_generated/organizations/types/organizations_create_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_create_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_get_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_get_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_list_response_item.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_update_response.py +26 -0
- mirascope/api/_generated/organizations/types/organizations_update_response_role.py +5 -0
- mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
- mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
- mirascope/api/_generated/project_memberships/__init__.py +29 -0
- mirascope/api/_generated/project_memberships/client.py +528 -0
- mirascope/api/_generated/project_memberships/raw_client.py +1278 -0
- mirascope/api/_generated/project_memberships/types/__init__.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_get_response.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_get_response_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
- mirascope/api/_generated/projects/__init__.py +7 -0
- mirascope/api/_generated/projects/client.py +428 -0
- mirascope/api/_generated/projects/raw_client.py +1302 -0
- mirascope/api/_generated/projects/types/__init__.py +10 -0
- mirascope/api/_generated/projects/types/projects_create_response.py +25 -0
- mirascope/api/_generated/projects/types/projects_get_response.py +25 -0
- mirascope/api/_generated/projects/types/projects_list_response_item.py +25 -0
- mirascope/api/_generated/projects/types/projects_update_response.py +25 -0
- mirascope/api/_generated/reference.md +4987 -0
- mirascope/api/_generated/tags/__init__.py +19 -0
- mirascope/api/_generated/tags/client.py +504 -0
- mirascope/api/_generated/tags/raw_client.py +1288 -0
- mirascope/api/_generated/tags/types/__init__.py +17 -0
- mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
- mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
- mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
- mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
- mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
- mirascope/api/_generated/token_cost/__init__.py +7 -0
- mirascope/api/_generated/token_cost/client.py +160 -0
- mirascope/api/_generated/token_cost/raw_client.py +264 -0
- mirascope/api/_generated/token_cost/types/__init__.py +8 -0
- mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
- mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
- mirascope/api/_generated/traces/__init__.py +97 -0
- mirascope/api/_generated/traces/client.py +1103 -0
- mirascope/api/_generated/traces/raw_client.py +2322 -0
- mirascope/api/_generated/traces/types/__init__.py +155 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +29 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +27 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +20 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +29 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +31 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +48 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +23 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +38 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +19 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +24 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +20 -0
- mirascope/api/_generated/traces/types/traces_create_response.py +24 -0
- mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +22 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
- mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
- mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
- mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
- mirascope/api/_generated/types/__init__.py +85 -0
- mirascope/api/_generated/types/already_exists_error.py +22 -0
- mirascope/api/_generated/types/already_exists_error_tag.py +5 -0
- mirascope/api/_generated/types/bad_request_error_body.py +50 -0
- mirascope/api/_generated/types/click_house_error.py +22 -0
- mirascope/api/_generated/types/database_error.py +22 -0
- mirascope/api/_generated/types/database_error_tag.py +5 -0
- mirascope/api/_generated/types/date.py +3 -0
- mirascope/api/_generated/types/http_api_decode_error.py +27 -0
- mirascope/api/_generated/types/http_api_decode_error_tag.py +5 -0
- mirascope/api/_generated/types/immutable_resource_error.py +22 -0
- mirascope/api/_generated/types/internal_server_error_body.py +49 -0
- mirascope/api/_generated/types/issue.py +38 -0
- mirascope/api/_generated/types/issue_tag.py +10 -0
- mirascope/api/_generated/types/not_found_error_body.py +22 -0
- mirascope/api/_generated/types/not_found_error_tag.py +5 -0
- mirascope/api/_generated/types/number_from_string.py +3 -0
- mirascope/api/_generated/types/permission_denied_error.py +22 -0
- mirascope/api/_generated/types/permission_denied_error_tag.py +5 -0
- mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
- mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
- mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
- mirascope/api/_generated/types/property_key.py +7 -0
- mirascope/api/_generated/types/property_key_key.py +25 -0
- mirascope/api/_generated/types/property_key_key_tag.py +5 -0
- mirascope/api/_generated/types/rate_limit_error.py +31 -0
- mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
- mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
- mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
- mirascope/api/_generated/types/stripe_error.py +20 -0
- mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
- mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
- mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
- mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
- mirascope/api/client.py +255 -0
- mirascope/api/settings.py +99 -0
- mirascope/llm/__init__.py +316 -0
- mirascope/llm/calls/__init__.py +17 -0
- mirascope/llm/calls/calls.py +348 -0
- mirascope/llm/calls/decorator.py +268 -0
- mirascope/llm/content/__init__.py +71 -0
- mirascope/llm/content/audio.py +173 -0
- mirascope/llm/content/document.py +94 -0
- mirascope/llm/content/image.py +206 -0
- mirascope/llm/content/text.py +47 -0
- mirascope/llm/content/thought.py +58 -0
- mirascope/llm/content/tool_call.py +69 -0
- mirascope/llm/content/tool_output.py +43 -0
- mirascope/llm/context/__init__.py +6 -0
- mirascope/llm/context/_utils.py +41 -0
- mirascope/llm/context/context.py +24 -0
- mirascope/llm/exceptions.py +360 -0
- mirascope/llm/formatting/__init__.py +39 -0
- mirascope/llm/formatting/format.py +291 -0
- mirascope/llm/formatting/from_call_args.py +30 -0
- mirascope/llm/formatting/output_parser.py +178 -0
- mirascope/llm/formatting/partial.py +131 -0
- mirascope/llm/formatting/primitives.py +192 -0
- mirascope/llm/formatting/types.py +83 -0
- mirascope/llm/mcp/__init__.py +5 -0
- mirascope/llm/mcp/mcp_client.py +130 -0
- mirascope/llm/messages/__init__.py +35 -0
- mirascope/llm/messages/_utils.py +34 -0
- mirascope/llm/messages/message.py +190 -0
- mirascope/llm/models/__init__.py +21 -0
- mirascope/llm/models/models.py +1339 -0
- mirascope/llm/models/params.py +72 -0
- mirascope/llm/models/thinking_config.py +61 -0
- mirascope/llm/prompts/__init__.py +34 -0
- mirascope/llm/prompts/_utils.py +31 -0
- mirascope/llm/prompts/decorator.py +215 -0
- mirascope/llm/prompts/prompts.py +484 -0
- mirascope/llm/prompts/protocols.py +65 -0
- mirascope/llm/providers/__init__.py +65 -0
- mirascope/llm/providers/anthropic/__init__.py +11 -0
- mirascope/llm/providers/anthropic/_utils/__init__.py +27 -0
- mirascope/llm/providers/anthropic/_utils/beta_decode.py +297 -0
- mirascope/llm/providers/anthropic/_utils/beta_encode.py +272 -0
- mirascope/llm/providers/anthropic/_utils/decode.py +326 -0
- mirascope/llm/providers/anthropic/_utils/encode.py +431 -0
- mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
- mirascope/llm/providers/anthropic/beta_provider.py +338 -0
- mirascope/llm/providers/anthropic/model_id.py +23 -0
- mirascope/llm/providers/anthropic/model_info.py +87 -0
- mirascope/llm/providers/anthropic/provider.py +440 -0
- mirascope/llm/providers/base/__init__.py +14 -0
- mirascope/llm/providers/base/_utils.py +248 -0
- mirascope/llm/providers/base/base_provider.py +1463 -0
- mirascope/llm/providers/base/kwargs.py +12 -0
- mirascope/llm/providers/google/__init__.py +6 -0
- mirascope/llm/providers/google/_utils/__init__.py +17 -0
- mirascope/llm/providers/google/_utils/decode.py +357 -0
- mirascope/llm/providers/google/_utils/encode.py +418 -0
- mirascope/llm/providers/google/_utils/errors.py +50 -0
- mirascope/llm/providers/google/message.py +7 -0
- mirascope/llm/providers/google/model_id.py +22 -0
- mirascope/llm/providers/google/model_info.py +63 -0
- mirascope/llm/providers/google/provider.py +456 -0
- mirascope/llm/providers/mirascope/__init__.py +5 -0
- mirascope/llm/providers/mirascope/_utils.py +73 -0
- mirascope/llm/providers/mirascope/provider.py +313 -0
- mirascope/llm/providers/mlx/__init__.py +9 -0
- mirascope/llm/providers/mlx/_utils.py +141 -0
- mirascope/llm/providers/mlx/encoding/__init__.py +8 -0
- mirascope/llm/providers/mlx/encoding/base.py +69 -0
- mirascope/llm/providers/mlx/encoding/transformers.py +146 -0
- mirascope/llm/providers/mlx/mlx.py +242 -0
- mirascope/llm/providers/mlx/model_id.py +17 -0
- mirascope/llm/providers/mlx/provider.py +416 -0
- mirascope/llm/providers/model_id.py +16 -0
- mirascope/llm/providers/ollama/__init__.py +7 -0
- mirascope/llm/providers/ollama/provider.py +71 -0
- mirascope/llm/providers/openai/__init__.py +15 -0
- mirascope/llm/providers/openai/_utils/__init__.py +5 -0
- mirascope/llm/providers/openai/_utils/errors.py +46 -0
- mirascope/llm/providers/openai/completions/__init__.py +7 -0
- mirascope/llm/providers/openai/completions/_utils/__init__.py +18 -0
- mirascope/llm/providers/openai/completions/_utils/decode.py +252 -0
- mirascope/llm/providers/openai/completions/_utils/encode.py +390 -0
- mirascope/llm/providers/openai/completions/_utils/feature_info.py +50 -0
- mirascope/llm/providers/openai/completions/base_provider.py +522 -0
- mirascope/llm/providers/openai/completions/provider.py +28 -0
- mirascope/llm/providers/openai/model_id.py +31 -0
- mirascope/llm/providers/openai/model_info.py +303 -0
- mirascope/llm/providers/openai/provider.py +405 -0
- mirascope/llm/providers/openai/responses/__init__.py +5 -0
- mirascope/llm/providers/openai/responses/_utils/__init__.py +15 -0
- mirascope/llm/providers/openai/responses/_utils/decode.py +289 -0
- mirascope/llm/providers/openai/responses/_utils/encode.py +399 -0
- mirascope/llm/providers/openai/responses/provider.py +472 -0
- mirascope/llm/providers/openrouter/__init__.py +5 -0
- mirascope/llm/providers/openrouter/provider.py +67 -0
- mirascope/llm/providers/provider_id.py +26 -0
- mirascope/llm/providers/provider_registry.py +305 -0
- mirascope/llm/providers/together/__init__.py +7 -0
- mirascope/llm/providers/together/provider.py +40 -0
- mirascope/llm/responses/__init__.py +66 -0
- mirascope/llm/responses/_utils.py +146 -0
- mirascope/llm/responses/base_response.py +103 -0
- mirascope/llm/responses/base_stream_response.py +824 -0
- mirascope/llm/responses/finish_reason.py +28 -0
- mirascope/llm/responses/response.py +362 -0
- mirascope/llm/responses/root_response.py +248 -0
- mirascope/llm/responses/stream_response.py +577 -0
- mirascope/llm/responses/streams.py +363 -0
- mirascope/llm/responses/usage.py +139 -0
- mirascope/llm/tools/__init__.py +71 -0
- mirascope/llm/tools/_utils.py +34 -0
- mirascope/llm/tools/decorator.py +184 -0
- mirascope/llm/tools/protocols.py +96 -0
- mirascope/llm/tools/provider_tools.py +18 -0
- mirascope/llm/tools/tool_schema.py +321 -0
- mirascope/llm/tools/toolkit.py +178 -0
- mirascope/llm/tools/tools.py +263 -0
- mirascope/llm/tools/types.py +112 -0
- mirascope/llm/tools/web_search_tool.py +32 -0
- mirascope/llm/types/__init__.py +22 -0
- mirascope/llm/types/dataclass.py +9 -0
- mirascope/llm/types/jsonable.py +44 -0
- mirascope/llm/types/type_vars.py +19 -0
- mirascope/ops/__init__.py +129 -0
- mirascope/ops/_internal/__init__.py +5 -0
- mirascope/ops/_internal/closure.py +1172 -0
- mirascope/ops/_internal/configuration.py +177 -0
- mirascope/ops/_internal/context.py +76 -0
- mirascope/ops/_internal/exporters/__init__.py +26 -0
- mirascope/ops/_internal/exporters/exporters.py +362 -0
- mirascope/ops/_internal/exporters/processors.py +104 -0
- mirascope/ops/_internal/exporters/types.py +165 -0
- mirascope/ops/_internal/exporters/utils.py +66 -0
- mirascope/ops/_internal/instrumentation/__init__.py +28 -0
- mirascope/ops/_internal/instrumentation/llm/__init__.py +8 -0
- mirascope/ops/_internal/instrumentation/llm/common.py +500 -0
- mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
- mirascope/ops/_internal/instrumentation/llm/encode.py +238 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +38 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +31 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +38 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +18 -0
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +100 -0
- mirascope/ops/_internal/instrumentation/llm/llm.py +161 -0
- mirascope/ops/_internal/instrumentation/llm/model.py +1777 -0
- mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
- mirascope/ops/_internal/instrumentation/llm/serialize.py +324 -0
- mirascope/ops/_internal/instrumentation/providers/__init__.py +29 -0
- mirascope/ops/_internal/instrumentation/providers/anthropic.py +78 -0
- mirascope/ops/_internal/instrumentation/providers/base.py +179 -0
- mirascope/ops/_internal/instrumentation/providers/google_genai.py +85 -0
- mirascope/ops/_internal/instrumentation/providers/openai.py +82 -0
- mirascope/ops/_internal/propagation.py +198 -0
- mirascope/ops/_internal/protocols.py +133 -0
- mirascope/ops/_internal/session.py +139 -0
- mirascope/ops/_internal/spans.py +232 -0
- mirascope/ops/_internal/traced_calls.py +389 -0
- mirascope/ops/_internal/traced_functions.py +528 -0
- mirascope/ops/_internal/tracing.py +353 -0
- mirascope/ops/_internal/types.py +13 -0
- mirascope/ops/_internal/utils.py +131 -0
- mirascope/ops/_internal/versioned_calls.py +512 -0
- mirascope/ops/_internal/versioned_functions.py +357 -0
- mirascope/ops/_internal/versioning.py +303 -0
- mirascope/ops/exceptions.py +21 -0
- mirascope-2.1.1.dist-info/METADATA +231 -0
- mirascope-2.1.1.dist-info/RECORD +437 -0
- {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/WHEEL +1 -1
- {mirascope-1.0.5.dist-info → mirascope-2.1.1.dist-info}/licenses/LICENSE +1 -1
- mirascope/beta/__init__.py +0 -0
- mirascope/beta/openai/__init__.py +0 -5
- mirascope/beta/openai/parse.py +0 -129
- mirascope/beta/rag/__init__.py +0 -24
- mirascope/beta/rag/base/__init__.py +0 -22
- mirascope/beta/rag/base/chunkers/__init__.py +0 -2
- mirascope/beta/rag/base/chunkers/base_chunker.py +0 -37
- mirascope/beta/rag/base/chunkers/text_chunker.py +0 -33
- mirascope/beta/rag/base/config.py +0 -8
- mirascope/beta/rag/base/document.py +0 -11
- mirascope/beta/rag/base/embedders.py +0 -35
- mirascope/beta/rag/base/embedding_params.py +0 -18
- mirascope/beta/rag/base/embedding_response.py +0 -30
- mirascope/beta/rag/base/query_results.py +0 -7
- mirascope/beta/rag/base/vectorstore_params.py +0 -18
- mirascope/beta/rag/base/vectorstores.py +0 -37
- mirascope/beta/rag/chroma/__init__.py +0 -11
- mirascope/beta/rag/chroma/types.py +0 -57
- mirascope/beta/rag/chroma/vectorstores.py +0 -97
- mirascope/beta/rag/cohere/__init__.py +0 -11
- mirascope/beta/rag/cohere/embedders.py +0 -87
- mirascope/beta/rag/cohere/embedding_params.py +0 -29
- mirascope/beta/rag/cohere/embedding_response.py +0 -29
- mirascope/beta/rag/cohere/py.typed +0 -0
- mirascope/beta/rag/openai/__init__.py +0 -11
- mirascope/beta/rag/openai/embedders.py +0 -144
- mirascope/beta/rag/openai/embedding_params.py +0 -18
- mirascope/beta/rag/openai/embedding_response.py +0 -14
- mirascope/beta/rag/openai/py.typed +0 -0
- mirascope/beta/rag/pinecone/__init__.py +0 -19
- mirascope/beta/rag/pinecone/types.py +0 -143
- mirascope/beta/rag/pinecone/vectorstores.py +0 -148
- mirascope/beta/rag/weaviate/__init__.py +0 -6
- mirascope/beta/rag/weaviate/types.py +0 -92
- mirascope/beta/rag/weaviate/vectorstores.py +0 -103
- mirascope/core/__init__.py +0 -55
- mirascope/core/anthropic/__init__.py +0 -21
- mirascope/core/anthropic/_call.py +0 -71
- mirascope/core/anthropic/_utils/__init__.py +0 -16
- mirascope/core/anthropic/_utils/_calculate_cost.py +0 -63
- mirascope/core/anthropic/_utils/_convert_message_params.py +0 -54
- mirascope/core/anthropic/_utils/_get_json_output.py +0 -34
- mirascope/core/anthropic/_utils/_handle_stream.py +0 -89
- mirascope/core/anthropic/_utils/_setup_call.py +0 -76
- mirascope/core/anthropic/call_params.py +0 -36
- mirascope/core/anthropic/call_response.py +0 -158
- mirascope/core/anthropic/call_response_chunk.py +0 -104
- mirascope/core/anthropic/dynamic_config.py +0 -26
- mirascope/core/anthropic/py.typed +0 -0
- mirascope/core/anthropic/stream.py +0 -140
- mirascope/core/anthropic/tool.py +0 -77
- mirascope/core/base/__init__.py +0 -40
- mirascope/core/base/_call_factory.py +0 -323
- mirascope/core/base/_create.py +0 -167
- mirascope/core/base/_extract.py +0 -139
- mirascope/core/base/_partial.py +0 -63
- mirascope/core/base/_utils/__init__.py +0 -64
- mirascope/core/base/_utils/_base_type.py +0 -17
- mirascope/core/base/_utils/_convert_base_model_to_base_tool.py +0 -45
- mirascope/core/base/_utils/_convert_base_type_to_base_tool.py +0 -24
- mirascope/core/base/_utils/_convert_function_to_base_tool.py +0 -126
- mirascope/core/base/_utils/_default_tool_docstring.py +0 -6
- mirascope/core/base/_utils/_extract_tool_return.py +0 -36
- mirascope/core/base/_utils/_format_template.py +0 -29
- mirascope/core/base/_utils/_get_audio_type.py +0 -18
- mirascope/core/base/_utils/_get_fn_args.py +0 -14
- mirascope/core/base/_utils/_get_image_type.py +0 -26
- mirascope/core/base/_utils/_get_metadata.py +0 -17
- mirascope/core/base/_utils/_get_possible_user_message_param.py +0 -21
- mirascope/core/base/_utils/_get_prompt_template.py +0 -25
- mirascope/core/base/_utils/_get_template_values.py +0 -52
- mirascope/core/base/_utils/_get_template_variables.py +0 -38
- mirascope/core/base/_utils/_json_mode_content.py +0 -15
- mirascope/core/base/_utils/_parse_content_template.py +0 -157
- mirascope/core/base/_utils/_parse_prompt_messages.py +0 -51
- mirascope/core/base/_utils/_protocols.py +0 -215
- mirascope/core/base/_utils/_setup_call.py +0 -64
- mirascope/core/base/_utils/_setup_extract_tool.py +0 -24
- mirascope/core/base/call_params.py +0 -6
- mirascope/core/base/call_response.py +0 -189
- mirascope/core/base/call_response_chunk.py +0 -91
- mirascope/core/base/dynamic_config.py +0 -55
- mirascope/core/base/message_param.py +0 -61
- mirascope/core/base/metadata.py +0 -13
- mirascope/core/base/prompt.py +0 -415
- mirascope/core/base/stream.py +0 -365
- mirascope/core/base/structured_stream.py +0 -251
- mirascope/core/base/tool.py +0 -126
- mirascope/core/base/toolkit.py +0 -146
- mirascope/core/cohere/__init__.py +0 -21
- mirascope/core/cohere/_call.py +0 -71
- mirascope/core/cohere/_utils/__init__.py +0 -16
- mirascope/core/cohere/_utils/_calculate_cost.py +0 -39
- mirascope/core/cohere/_utils/_convert_message_params.py +0 -31
- mirascope/core/cohere/_utils/_get_json_output.py +0 -31
- mirascope/core/cohere/_utils/_handle_stream.py +0 -33
- mirascope/core/cohere/_utils/_setup_call.py +0 -89
- mirascope/core/cohere/call_params.py +0 -57
- mirascope/core/cohere/call_response.py +0 -167
- mirascope/core/cohere/call_response_chunk.py +0 -101
- mirascope/core/cohere/dynamic_config.py +0 -24
- mirascope/core/cohere/py.typed +0 -0
- mirascope/core/cohere/stream.py +0 -113
- mirascope/core/cohere/tool.py +0 -92
- mirascope/core/gemini/__init__.py +0 -21
- mirascope/core/gemini/_call.py +0 -71
- mirascope/core/gemini/_utils/__init__.py +0 -16
- mirascope/core/gemini/_utils/_calculate_cost.py +0 -8
- mirascope/core/gemini/_utils/_convert_message_params.py +0 -74
- mirascope/core/gemini/_utils/_get_json_output.py +0 -33
- mirascope/core/gemini/_utils/_handle_stream.py +0 -33
- mirascope/core/gemini/_utils/_setup_call.py +0 -68
- mirascope/core/gemini/call_params.py +0 -28
- mirascope/core/gemini/call_response.py +0 -173
- mirascope/core/gemini/call_response_chunk.py +0 -85
- mirascope/core/gemini/dynamic_config.py +0 -26
- mirascope/core/gemini/stream.py +0 -121
- mirascope/core/gemini/tool.py +0 -104
- mirascope/core/groq/__init__.py +0 -21
- mirascope/core/groq/_call.py +0 -71
- mirascope/core/groq/_utils/__init__.py +0 -16
- mirascope/core/groq/_utils/_calculate_cost.py +0 -68
- mirascope/core/groq/_utils/_convert_message_params.py +0 -23
- mirascope/core/groq/_utils/_get_json_output.py +0 -27
- mirascope/core/groq/_utils/_handle_stream.py +0 -121
- mirascope/core/groq/_utils/_setup_call.py +0 -67
- mirascope/core/groq/call_params.py +0 -51
- mirascope/core/groq/call_response.py +0 -160
- mirascope/core/groq/call_response_chunk.py +0 -89
- mirascope/core/groq/dynamic_config.py +0 -26
- mirascope/core/groq/py.typed +0 -0
- mirascope/core/groq/stream.py +0 -136
- mirascope/core/groq/tool.py +0 -79
- mirascope/core/litellm/__init__.py +0 -6
- mirascope/core/litellm/_call.py +0 -73
- mirascope/core/litellm/_utils/__init__.py +0 -5
- mirascope/core/litellm/_utils/_setup_call.py +0 -46
- mirascope/core/litellm/py.typed +0 -0
- mirascope/core/mistral/__init__.py +0 -21
- mirascope/core/mistral/_call.py +0 -69
- mirascope/core/mistral/_utils/__init__.py +0 -16
- mirascope/core/mistral/_utils/_calculate_cost.py +0 -47
- mirascope/core/mistral/_utils/_convert_message_params.py +0 -23
- mirascope/core/mistral/_utils/_get_json_output.py +0 -28
- mirascope/core/mistral/_utils/_handle_stream.py +0 -121
- mirascope/core/mistral/_utils/_setup_call.py +0 -86
- mirascope/core/mistral/call_params.py +0 -36
- mirascope/core/mistral/call_response.py +0 -156
- mirascope/core/mistral/call_response_chunk.py +0 -84
- mirascope/core/mistral/dynamic_config.py +0 -24
- mirascope/core/mistral/py.typed +0 -0
- mirascope/core/mistral/stream.py +0 -117
- mirascope/core/mistral/tool.py +0 -77
- mirascope/core/openai/__init__.py +0 -21
- mirascope/core/openai/_call.py +0 -71
- mirascope/core/openai/_utils/__init__.py +0 -16
- mirascope/core/openai/_utils/_calculate_cost.py +0 -110
- mirascope/core/openai/_utils/_convert_message_params.py +0 -53
- mirascope/core/openai/_utils/_get_json_output.py +0 -27
- mirascope/core/openai/_utils/_handle_stream.py +0 -125
- mirascope/core/openai/_utils/_setup_call.py +0 -62
- mirascope/core/openai/call_params.py +0 -54
- mirascope/core/openai/call_response.py +0 -162
- mirascope/core/openai/call_response_chunk.py +0 -90
- mirascope/core/openai/dynamic_config.py +0 -26
- mirascope/core/openai/py.typed +0 -0
- mirascope/core/openai/stream.py +0 -148
- mirascope/core/openai/tool.py +0 -79
- mirascope/core/py.typed +0 -0
- mirascope/integrations/__init__.py +0 -20
- mirascope/integrations/_middleware_factory.py +0 -277
- mirascope/integrations/langfuse/__init__.py +0 -3
- mirascope/integrations/langfuse/_utils.py +0 -114
- mirascope/integrations/langfuse/_with_langfuse.py +0 -71
- mirascope/integrations/logfire/__init__.py +0 -3
- mirascope/integrations/logfire/_utils.py +0 -188
- mirascope/integrations/logfire/_with_logfire.py +0 -60
- mirascope/integrations/otel/__init__.py +0 -5
- mirascope/integrations/otel/_utils.py +0 -268
- mirascope/integrations/otel/_with_hyperdx.py +0 -61
- mirascope/integrations/otel/_with_otel.py +0 -60
- mirascope/integrations/tenacity.py +0 -50
- mirascope/py.typed +0 -0
- mirascope/v0/__init__.py +0 -43
- mirascope/v0/anthropic.py +0 -54
- mirascope/v0/base/__init__.py +0 -12
- mirascope/v0/base/calls.py +0 -118
- mirascope/v0/base/extractors.py +0 -122
- mirascope/v0/base/ops_utils.py +0 -207
- mirascope/v0/base/prompts.py +0 -48
- mirascope/v0/base/types.py +0 -14
- mirascope/v0/base/utils.py +0 -21
- mirascope/v0/openai.py +0 -54
- mirascope-1.0.5.dist-info/METADATA +0 -519
- mirascope-1.0.5.dist-info/RECORD +0 -198
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
"""Handles the stream of completion chunks."""
|
|
2
|
-
|
|
3
|
-
from collections.abc import AsyncGenerator, Generator
|
|
4
|
-
|
|
5
|
-
from mistralai.models.chat_completion import (
|
|
6
|
-
ChatCompletionStreamResponse,
|
|
7
|
-
FunctionCall,
|
|
8
|
-
ToolCall,
|
|
9
|
-
ToolType,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
from ..call_response_chunk import MistralCallResponseChunk
|
|
13
|
-
from ..tool import MistralTool
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def _handle_chunk(
|
|
17
|
-
chunk: ChatCompletionStreamResponse,
|
|
18
|
-
current_tool_call: ToolCall,
|
|
19
|
-
current_tool_type: type[MistralTool] | None,
|
|
20
|
-
tool_types: list[type[MistralTool]] | None,
|
|
21
|
-
) -> tuple[
|
|
22
|
-
MistralTool | None,
|
|
23
|
-
ToolCall,
|
|
24
|
-
type[MistralTool] | None,
|
|
25
|
-
]:
|
|
26
|
-
"""Handles a chunk of the stream."""
|
|
27
|
-
if not tool_types or not (tool_calls := chunk.choices[0].delta.tool_calls):
|
|
28
|
-
return None, current_tool_call, current_tool_type
|
|
29
|
-
|
|
30
|
-
tool_call = tool_calls[0]
|
|
31
|
-
# Reset on new tool
|
|
32
|
-
if tool_call.id != "null" and tool_call.function is not None:
|
|
33
|
-
previous_tool_call = current_tool_call.model_copy()
|
|
34
|
-
previous_tool_type = current_tool_type
|
|
35
|
-
current_tool_call = ToolCall(
|
|
36
|
-
id=tool_call.id,
|
|
37
|
-
function=FunctionCall(
|
|
38
|
-
arguments="",
|
|
39
|
-
name=tool_call.function.name if tool_call.function.name else "",
|
|
40
|
-
),
|
|
41
|
-
type=ToolType.function,
|
|
42
|
-
)
|
|
43
|
-
current_tool_type = None
|
|
44
|
-
for tool_type in tool_types:
|
|
45
|
-
if tool_type._name() == tool_call.function.name:
|
|
46
|
-
current_tool_type = tool_type
|
|
47
|
-
break
|
|
48
|
-
if current_tool_type is None:
|
|
49
|
-
raise RuntimeError(
|
|
50
|
-
f"Unknown tool type in stream: {tool_call.function.name}"
|
|
51
|
-
) # pragma: no cover
|
|
52
|
-
if previous_tool_call.id and previous_tool_type is not None:
|
|
53
|
-
return (
|
|
54
|
-
previous_tool_type.from_tool_call(previous_tool_call),
|
|
55
|
-
current_tool_call,
|
|
56
|
-
current_tool_type,
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
# Update arguments with each chunk
|
|
60
|
-
if tool_call.function and tool_call.function.arguments:
|
|
61
|
-
current_tool_call.function.arguments += tool_call.function.arguments
|
|
62
|
-
|
|
63
|
-
return None, current_tool_call, current_tool_type
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def handle_stream(
|
|
67
|
-
stream: Generator[ChatCompletionStreamResponse, None, None],
|
|
68
|
-
tool_types: list[type[MistralTool]] | None,
|
|
69
|
-
) -> Generator[tuple[MistralCallResponseChunk, MistralTool | None], None, None]:
|
|
70
|
-
"""Iterator over the stream and constructs tools as they are streamed."""
|
|
71
|
-
current_tool_call = ToolCall(
|
|
72
|
-
id="", function=FunctionCall(arguments="", name=""), type=ToolType.function
|
|
73
|
-
)
|
|
74
|
-
current_tool_type = None
|
|
75
|
-
for chunk in stream:
|
|
76
|
-
if not tool_types or not chunk.choices[0].delta.tool_calls:
|
|
77
|
-
if current_tool_type:
|
|
78
|
-
yield (
|
|
79
|
-
MistralCallResponseChunk(chunk=chunk),
|
|
80
|
-
current_tool_type.from_tool_call(current_tool_call),
|
|
81
|
-
)
|
|
82
|
-
current_tool_type = None
|
|
83
|
-
else:
|
|
84
|
-
yield MistralCallResponseChunk(chunk=chunk), None
|
|
85
|
-
tool, current_tool_call, current_tool_type = _handle_chunk(
|
|
86
|
-
chunk,
|
|
87
|
-
current_tool_call,
|
|
88
|
-
current_tool_type,
|
|
89
|
-
tool_types,
|
|
90
|
-
)
|
|
91
|
-
if tool is not None:
|
|
92
|
-
yield MistralCallResponseChunk(chunk=chunk), tool
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
async def handle_stream_async(
|
|
96
|
-
stream: AsyncGenerator[ChatCompletionStreamResponse, None],
|
|
97
|
-
tool_types: list[type[MistralTool]] | None,
|
|
98
|
-
) -> AsyncGenerator[tuple[MistralCallResponseChunk, MistralTool | None], None]:
|
|
99
|
-
"""Async iterator over the stream and constructs tools as they are streamed."""
|
|
100
|
-
current_tool_call = ToolCall(
|
|
101
|
-
id="", function=FunctionCall(arguments="", name=""), type=ToolType.function
|
|
102
|
-
)
|
|
103
|
-
current_tool_type = None
|
|
104
|
-
async for chunk in stream:
|
|
105
|
-
if not tool_types or not chunk.choices[0].delta.tool_calls:
|
|
106
|
-
if current_tool_type:
|
|
107
|
-
yield (
|
|
108
|
-
MistralCallResponseChunk(chunk=chunk),
|
|
109
|
-
current_tool_type.from_tool_call(current_tool_call),
|
|
110
|
-
)
|
|
111
|
-
current_tool_type = None
|
|
112
|
-
else:
|
|
113
|
-
yield MistralCallResponseChunk(chunk=chunk), None
|
|
114
|
-
tool, current_tool_call, current_tool_type = _handle_chunk(
|
|
115
|
-
chunk,
|
|
116
|
-
current_tool_call,
|
|
117
|
-
current_tool_type,
|
|
118
|
-
tool_types,
|
|
119
|
-
)
|
|
120
|
-
if tool is not None:
|
|
121
|
-
yield MistralCallResponseChunk(chunk=chunk), tool
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"""This module contains the setup_call function for Mistral tools."""
|
|
2
|
-
|
|
3
|
-
import inspect
|
|
4
|
-
from collections.abc import AsyncGenerator, Awaitable, Callable, Coroutine, Iterable
|
|
5
|
-
from typing import Any, cast
|
|
6
|
-
|
|
7
|
-
from mistralai.async_client import MistralAsyncClient
|
|
8
|
-
from mistralai.client import MistralClient
|
|
9
|
-
from mistralai.models.chat_completion import (
|
|
10
|
-
ChatCompletionResponse,
|
|
11
|
-
ChatCompletionStreamResponse,
|
|
12
|
-
ChatMessage,
|
|
13
|
-
ResponseFormat,
|
|
14
|
-
ResponseFormats,
|
|
15
|
-
ToolChoice,
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
from ...base import BaseMessageParam, BaseTool, _utils
|
|
19
|
-
from ..call_params import MistralCallParams
|
|
20
|
-
from ..dynamic_config import MistralDynamicConfig
|
|
21
|
-
from ..tool import MistralTool
|
|
22
|
-
from ._convert_message_params import convert_message_params
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def setup_call(
|
|
26
|
-
*,
|
|
27
|
-
model: str,
|
|
28
|
-
client: MistralClient | MistralAsyncClient | None,
|
|
29
|
-
fn: Callable[..., MistralDynamicConfig | Awaitable[MistralDynamicConfig]],
|
|
30
|
-
fn_args: dict[str, Any],
|
|
31
|
-
dynamic_config: MistralDynamicConfig,
|
|
32
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
33
|
-
json_mode: bool,
|
|
34
|
-
call_params: MistralCallParams,
|
|
35
|
-
extract: bool,
|
|
36
|
-
) -> tuple[
|
|
37
|
-
Callable[..., ChatCompletionResponse]
|
|
38
|
-
| Callable[..., Awaitable[ChatCompletionResponse]],
|
|
39
|
-
str,
|
|
40
|
-
list[ChatMessage],
|
|
41
|
-
list[type[MistralTool]] | None,
|
|
42
|
-
dict[str, Any],
|
|
43
|
-
]:
|
|
44
|
-
prompt_template, messages, tool_types, call_kwargs = _utils.setup_call(
|
|
45
|
-
fn, fn_args, dynamic_config, tools, MistralTool, call_params
|
|
46
|
-
)
|
|
47
|
-
messages = cast(list[BaseMessageParam | ChatMessage], messages)
|
|
48
|
-
messages = convert_message_params(messages)
|
|
49
|
-
if json_mode:
|
|
50
|
-
call_kwargs["response_format"] = ResponseFormat(
|
|
51
|
-
type=ResponseFormats("json_object")
|
|
52
|
-
)
|
|
53
|
-
json_mode_content = _utils.json_mode_content(
|
|
54
|
-
tool_types[0] if tool_types else None
|
|
55
|
-
)
|
|
56
|
-
if messages[-1].role == "user":
|
|
57
|
-
messages[-1].content += json_mode_content
|
|
58
|
-
else:
|
|
59
|
-
messages.append(ChatMessage(role="user", content=json_mode_content.strip()))
|
|
60
|
-
call_kwargs.pop("tools", None)
|
|
61
|
-
elif extract:
|
|
62
|
-
assert tool_types, "At least one tool must be provided for extraction."
|
|
63
|
-
call_kwargs["tool_choice"] = ToolChoice.any
|
|
64
|
-
call_kwargs |= {"model": model, "messages": messages}
|
|
65
|
-
|
|
66
|
-
if client is None:
|
|
67
|
-
client = (
|
|
68
|
-
MistralAsyncClient() if inspect.iscoroutinefunction(fn) else MistralClient()
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
def create_or_stream(
|
|
72
|
-
stream: bool,
|
|
73
|
-
**kwargs: Any, # noqa: ANN401
|
|
74
|
-
) -> (
|
|
75
|
-
Iterable[ChatCompletionStreamResponse]
|
|
76
|
-
| AsyncGenerator[ # noqa: ANN401
|
|
77
|
-
ChatCompletionStreamResponse, None
|
|
78
|
-
]
|
|
79
|
-
| ChatCompletionResponse
|
|
80
|
-
| Coroutine[Any, Any, ChatCompletionResponse]
|
|
81
|
-
):
|
|
82
|
-
if stream:
|
|
83
|
-
return client.chat_stream(**kwargs)
|
|
84
|
-
return client.chat(**kwargs)
|
|
85
|
-
|
|
86
|
-
return create_or_stream, prompt_template, messages, tool_types, call_kwargs # type: ignore
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"""usage docs: learn/calls.md#provider-specific-parameters"""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from mistralai.models.chat_completion import ResponseFormat, ToolChoice
|
|
6
|
-
from typing_extensions import NotRequired
|
|
7
|
-
|
|
8
|
-
from ..base import BaseCallParams
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class MistralCallParams(BaseCallParams):
|
|
12
|
-
"""The parameters to use when calling the Mistral API.
|
|
13
|
-
|
|
14
|
-
[Mistral API Reference](https://docs.mistral.ai/api/)
|
|
15
|
-
|
|
16
|
-
Attributes:
|
|
17
|
-
endpoint: ...
|
|
18
|
-
max_tokens: ...
|
|
19
|
-
random_seed: ...
|
|
20
|
-
response_format: ...
|
|
21
|
-
safe_mode: ...
|
|
22
|
-
safe_prompt: ...
|
|
23
|
-
temperature: ...
|
|
24
|
-
tool_choice: ...
|
|
25
|
-
top_p: ...
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
endpoint: NotRequired[str | None]
|
|
29
|
-
max_tokens: NotRequired[int | None]
|
|
30
|
-
random_seed: NotRequired[int | None]
|
|
31
|
-
response_format: NotRequired[ResponseFormat | None]
|
|
32
|
-
safe_mode: NotRequired[bool | None]
|
|
33
|
-
safe_prompt: NotRequired[bool | None]
|
|
34
|
-
temperature: NotRequired[float | None]
|
|
35
|
-
tool_choice: NotRequired[ToolChoice | None]
|
|
36
|
-
top_p: NotRequired[float | None]
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
"""This module contains the `MistralCallResponse` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/calls.md#handling-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from mistralai.models.chat_completion import ChatCompletionResponse, ChatMessage
|
|
7
|
-
from mistralai.models.common import UsageInfo
|
|
8
|
-
from pydantic import computed_field
|
|
9
|
-
|
|
10
|
-
from ..base import BaseCallResponse
|
|
11
|
-
from ._utils import calculate_cost
|
|
12
|
-
from .call_params import MistralCallParams
|
|
13
|
-
from .dynamic_config import MistralDynamicConfig
|
|
14
|
-
from .tool import MistralTool
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class MistralCallResponse(
|
|
18
|
-
BaseCallResponse[
|
|
19
|
-
ChatCompletionResponse,
|
|
20
|
-
MistralTool,
|
|
21
|
-
MistralDynamicConfig,
|
|
22
|
-
ChatMessage,
|
|
23
|
-
MistralCallParams,
|
|
24
|
-
ChatMessage,
|
|
25
|
-
]
|
|
26
|
-
):
|
|
27
|
-
"""A convenience wrapper around the Mistral `ChatCompletion` response.
|
|
28
|
-
|
|
29
|
-
When calling the Mistral API using a function decorated with `mistral_call`, the
|
|
30
|
-
response will be an `MistralCallResponse` instance with properties that allow for
|
|
31
|
-
more convenience access to commonly used attributes.
|
|
32
|
-
|
|
33
|
-
Example:
|
|
34
|
-
|
|
35
|
-
```python
|
|
36
|
-
from mirascope.core import prompt_template
|
|
37
|
-
from mirascope.core.mistral import mistral_call
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@mistral_call("mistral-largel-latest")
|
|
41
|
-
@prompt_template("Recommend a {genre} book")
|
|
42
|
-
def recommend_book(genre: str):
|
|
43
|
-
...
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
response = recommend_book("fantasy") # response is an `MistralCallResponse` instance
|
|
47
|
-
print(response.content)
|
|
48
|
-
```
|
|
49
|
-
"""
|
|
50
|
-
|
|
51
|
-
_provider = "mistral"
|
|
52
|
-
|
|
53
|
-
@property
|
|
54
|
-
def content(self) -> str:
|
|
55
|
-
"""The content of the chat completion for the 0th choice."""
|
|
56
|
-
return self.response.choices[0].message.content
|
|
57
|
-
|
|
58
|
-
@property
|
|
59
|
-
def finish_reasons(self) -> list[str]:
|
|
60
|
-
"""Returns the finish reasons of the response."""
|
|
61
|
-
return [
|
|
62
|
-
choice.finish_reason if choice.finish_reason else ""
|
|
63
|
-
for choice in self.response.choices
|
|
64
|
-
]
|
|
65
|
-
|
|
66
|
-
@property
|
|
67
|
-
def model(self) -> str:
|
|
68
|
-
"""Returns the name of the response model."""
|
|
69
|
-
return self.response.model
|
|
70
|
-
|
|
71
|
-
@property
|
|
72
|
-
def id(self) -> str:
|
|
73
|
-
"""Returns the id of the response."""
|
|
74
|
-
return self.response.id
|
|
75
|
-
|
|
76
|
-
@property
|
|
77
|
-
def usage(self) -> UsageInfo:
|
|
78
|
-
"""Returns the usage of the chat completion."""
|
|
79
|
-
return self.response.usage
|
|
80
|
-
|
|
81
|
-
@property
|
|
82
|
-
def input_tokens(self) -> int:
|
|
83
|
-
"""Returns the number of input tokens."""
|
|
84
|
-
return self.usage.prompt_tokens
|
|
85
|
-
|
|
86
|
-
@property
|
|
87
|
-
def output_tokens(self) -> int | None:
|
|
88
|
-
"""Returns the number of output tokens."""
|
|
89
|
-
return self.usage.completion_tokens
|
|
90
|
-
|
|
91
|
-
@property
|
|
92
|
-
def cost(self) -> float | None:
|
|
93
|
-
"""Returns the cost of the call."""
|
|
94
|
-
return calculate_cost(self.input_tokens, self.output_tokens, self.model)
|
|
95
|
-
|
|
96
|
-
@computed_field
|
|
97
|
-
@property
|
|
98
|
-
def message_param(self) -> ChatMessage:
|
|
99
|
-
"""Returns the assistants's response as a message parameter."""
|
|
100
|
-
return self.response.choices[0].message
|
|
101
|
-
|
|
102
|
-
@computed_field
|
|
103
|
-
@property
|
|
104
|
-
def tools(self) -> list[MistralTool] | None:
|
|
105
|
-
"""Returns the tools for the 0th choice message.
|
|
106
|
-
|
|
107
|
-
Raises:
|
|
108
|
-
ValidationError: if the tool call doesn't match the tool's schema.
|
|
109
|
-
"""
|
|
110
|
-
tool_calls = self.response.choices[0].message.tool_calls
|
|
111
|
-
if not self.tool_types or not tool_calls:
|
|
112
|
-
return None
|
|
113
|
-
|
|
114
|
-
extracted_tools = []
|
|
115
|
-
for tool_call in tool_calls:
|
|
116
|
-
for tool_type in self.tool_types:
|
|
117
|
-
if tool_call.function.name == tool_type._name():
|
|
118
|
-
extracted_tools.append(tool_type.from_tool_call(tool_call))
|
|
119
|
-
break
|
|
120
|
-
|
|
121
|
-
return extracted_tools
|
|
122
|
-
|
|
123
|
-
@computed_field
|
|
124
|
-
@property
|
|
125
|
-
def tool(self) -> MistralTool | None:
|
|
126
|
-
"""Returns the 0th tool for the 0th choice message.
|
|
127
|
-
|
|
128
|
-
Raises:
|
|
129
|
-
ValidationError: if the tool call doesn't match the tool's schema.
|
|
130
|
-
"""
|
|
131
|
-
if tools := self.tools:
|
|
132
|
-
return tools[0]
|
|
133
|
-
return None
|
|
134
|
-
|
|
135
|
-
@classmethod
|
|
136
|
-
def tool_message_params(
|
|
137
|
-
cls, tools_and_outputs: list[tuple[MistralTool, str]]
|
|
138
|
-
) -> list[ChatMessage]:
|
|
139
|
-
"""Returns the tool message parameters for tool call results.
|
|
140
|
-
|
|
141
|
-
Args:
|
|
142
|
-
tools_and_outputs: The list of tools and their outputs from which the tool
|
|
143
|
-
message parameters should be constructed.
|
|
144
|
-
|
|
145
|
-
Returns:
|
|
146
|
-
The list of constructed `ChatMessage` parameters.
|
|
147
|
-
"""
|
|
148
|
-
return [
|
|
149
|
-
ChatMessage(
|
|
150
|
-
role="tool",
|
|
151
|
-
content=output,
|
|
152
|
-
tool_call_id=tool.tool_call.id,
|
|
153
|
-
name=tool._name(),
|
|
154
|
-
)
|
|
155
|
-
for tool, output in tools_and_outputs
|
|
156
|
-
]
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"""This module contains the `MistralCallResponseChunk` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md#handling-streamed-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from mistralai.models.chat_completion import ChatCompletionStreamResponse, FinishReason
|
|
7
|
-
from mistralai.models.common import UsageInfo
|
|
8
|
-
|
|
9
|
-
from ..base import BaseCallResponseChunk
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class MistralCallResponseChunk(
|
|
13
|
-
BaseCallResponseChunk[ChatCompletionStreamResponse, FinishReason]
|
|
14
|
-
):
|
|
15
|
-
"""A convenience wrapper around the Mistral `ChatCompletionChunk` streamed chunks.
|
|
16
|
-
|
|
17
|
-
When calling the Mistral API using a function decorated with `mistral_call` and
|
|
18
|
-
`stream` set to `True`, the stream will contain `MistralResponseChunk` instances with
|
|
19
|
-
properties that allow for more convenient access to commonly used attributes.
|
|
20
|
-
|
|
21
|
-
Example:
|
|
22
|
-
|
|
23
|
-
```python
|
|
24
|
-
from mirascope.core import prompt_template
|
|
25
|
-
from mirascope.core.mistral import mistral_call
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@mistral_call("mistral-large-latest", stream=True)
|
|
29
|
-
@prompt_template("Recommend a {genre} book")
|
|
30
|
-
def recommend_book(genre: str):
|
|
31
|
-
...
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
stream = recommend_book("fantasy") # response is an `MistralStream`
|
|
35
|
-
for chunk, _ in stream:
|
|
36
|
-
print(chunk.content, end="", flush=True)
|
|
37
|
-
```
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
@property
|
|
41
|
-
def content(self) -> str:
|
|
42
|
-
"""Returns the content of the delta."""
|
|
43
|
-
delta = None
|
|
44
|
-
if self.chunk.choices:
|
|
45
|
-
delta = self.chunk.choices[0].delta
|
|
46
|
-
return delta.content if delta is not None and delta.content is not None else ""
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def finish_reasons(self) -> list[FinishReason]:
|
|
50
|
-
"""Returns the finish reasons of the response."""
|
|
51
|
-
return [
|
|
52
|
-
choice.finish_reason
|
|
53
|
-
for choice in self.chunk.choices
|
|
54
|
-
if choice.finish_reason
|
|
55
|
-
]
|
|
56
|
-
|
|
57
|
-
@property
|
|
58
|
-
def model(self) -> str:
|
|
59
|
-
"""Returns the name of the response model."""
|
|
60
|
-
return self.chunk.model
|
|
61
|
-
|
|
62
|
-
@property
|
|
63
|
-
def id(self) -> str:
|
|
64
|
-
"""Returns the id of the response."""
|
|
65
|
-
return self.chunk.id
|
|
66
|
-
|
|
67
|
-
@property
|
|
68
|
-
def usage(self) -> UsageInfo | None:
|
|
69
|
-
"""Returns the usage of the chat completion."""
|
|
70
|
-
return self.chunk.usage
|
|
71
|
-
|
|
72
|
-
@property
|
|
73
|
-
def input_tokens(self) -> int | None:
|
|
74
|
-
"""Returns the number of input tokens."""
|
|
75
|
-
if self.usage:
|
|
76
|
-
return self.usage.prompt_tokens
|
|
77
|
-
return None
|
|
78
|
-
|
|
79
|
-
@property
|
|
80
|
-
def output_tokens(self) -> int | None:
|
|
81
|
-
"""Returns the number of output tokens."""
|
|
82
|
-
if self.usage:
|
|
83
|
-
return self.usage.completion_tokens
|
|
84
|
-
return None
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"""This module defines the function return type for functions as LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/dynamic_configuration.md#dynamic-configuration-options
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from ..base import BaseDynamicConfig, BaseMessageParam
|
|
7
|
-
from .call_params import MistralCallParams
|
|
8
|
-
|
|
9
|
-
MistralDynamicConfig = BaseDynamicConfig[BaseMessageParam, MistralCallParams]
|
|
10
|
-
"""The function return type for functions wrapped with the `mistral_call` decorator.
|
|
11
|
-
|
|
12
|
-
Example:
|
|
13
|
-
|
|
14
|
-
```python
|
|
15
|
-
from mirascope.core import prompt_template
|
|
16
|
-
from mirascope.core.mistral import MistralDynamicConfig, mistral_call
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
@mistral_call("mistral-large-latest")
|
|
20
|
-
@prompt_template("Recommend a {capitalized_genre} book")
|
|
21
|
-
def recommend_book(genre: str) -> MistralDynamicConfig:
|
|
22
|
-
return {"computed_fields": {"capitalized_genre": genre.capitalize()}}
|
|
23
|
-
```
|
|
24
|
-
"""
|
mirascope/core/mistral/py.typed
DELETED
|
File without changes
|
mirascope/core/mistral/stream.py
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"""The `MistralStream` class for convenience around streaming LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from mistralai.models.chat_completion import (
|
|
7
|
-
ChatCompletionResponse,
|
|
8
|
-
ChatCompletionResponseChoice,
|
|
9
|
-
ChatMessage,
|
|
10
|
-
FinishReason,
|
|
11
|
-
)
|
|
12
|
-
from mistralai.models.common import UsageInfo
|
|
13
|
-
|
|
14
|
-
from ..base.stream import BaseStream
|
|
15
|
-
from ._utils import calculate_cost
|
|
16
|
-
from .call_params import MistralCallParams
|
|
17
|
-
from .call_response import MistralCallResponse
|
|
18
|
-
from .call_response_chunk import MistralCallResponseChunk
|
|
19
|
-
from .dynamic_config import MistralDynamicConfig
|
|
20
|
-
from .tool import MistralTool
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class MistralStream(
|
|
24
|
-
BaseStream[
|
|
25
|
-
MistralCallResponse,
|
|
26
|
-
MistralCallResponseChunk,
|
|
27
|
-
ChatMessage,
|
|
28
|
-
ChatMessage,
|
|
29
|
-
ChatMessage,
|
|
30
|
-
ChatMessage,
|
|
31
|
-
MistralTool,
|
|
32
|
-
MistralDynamicConfig,
|
|
33
|
-
MistralCallParams,
|
|
34
|
-
FinishReason,
|
|
35
|
-
]
|
|
36
|
-
):
|
|
37
|
-
"""A class for convenience around streaming Mistral LLM calls.
|
|
38
|
-
|
|
39
|
-
Example:
|
|
40
|
-
|
|
41
|
-
```python
|
|
42
|
-
from mirascope.core import prompt_template
|
|
43
|
-
from mirascope.core.mistral import mistral_call
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@mistral_call("mistral-large-latest", stream=True)
|
|
47
|
-
@prompt_template("Recommend a {genre} book")
|
|
48
|
-
def recommend_book(genre: str):
|
|
49
|
-
...
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
stream = recommend_book("fantasy") # returns `MistralStream` instance
|
|
53
|
-
for chunk, _ in stream:
|
|
54
|
-
print(chunk.content, end="", flush=True)
|
|
55
|
-
```
|
|
56
|
-
"""
|
|
57
|
-
|
|
58
|
-
_provider = "mistral"
|
|
59
|
-
|
|
60
|
-
@property
|
|
61
|
-
def cost(self) -> float | None:
|
|
62
|
-
"""Returns the cost of the call."""
|
|
63
|
-
return calculate_cost(self.input_tokens, self.output_tokens, self.model)
|
|
64
|
-
|
|
65
|
-
def _construct_message_param(
|
|
66
|
-
self, tool_calls: list | None = None, content: str | None = None
|
|
67
|
-
) -> ChatMessage:
|
|
68
|
-
message_param = ChatMessage(
|
|
69
|
-
role="assistant", content=content if content else "", tool_calls=tool_calls
|
|
70
|
-
)
|
|
71
|
-
return message_param
|
|
72
|
-
|
|
73
|
-
def construct_call_response(self) -> MistralCallResponse:
|
|
74
|
-
"""Constructs the call response from a consumed MistralStream.
|
|
75
|
-
|
|
76
|
-
Raises:
|
|
77
|
-
ValueError: if the stream has not yet been consumed.
|
|
78
|
-
"""
|
|
79
|
-
if not hasattr(self, "message_param"):
|
|
80
|
-
raise ValueError(
|
|
81
|
-
"No stream response, check if the stream has been consumed."
|
|
82
|
-
)
|
|
83
|
-
usage = UsageInfo(
|
|
84
|
-
prompt_tokens=int(self.input_tokens or 0),
|
|
85
|
-
completion_tokens=int(self.output_tokens or 0),
|
|
86
|
-
total_tokens=int(self.input_tokens or 0) + int(self.output_tokens or 0),
|
|
87
|
-
)
|
|
88
|
-
completion = ChatCompletionResponse(
|
|
89
|
-
id=self.id if self.id else "",
|
|
90
|
-
choices=[
|
|
91
|
-
ChatCompletionResponseChoice(
|
|
92
|
-
finish_reason=self.finish_reasons[0]
|
|
93
|
-
if self.finish_reasons
|
|
94
|
-
else None,
|
|
95
|
-
index=0,
|
|
96
|
-
message=self.message_param,
|
|
97
|
-
)
|
|
98
|
-
],
|
|
99
|
-
created=0,
|
|
100
|
-
model=self.model,
|
|
101
|
-
object="",
|
|
102
|
-
usage=usage,
|
|
103
|
-
)
|
|
104
|
-
return MistralCallResponse(
|
|
105
|
-
metadata=self.metadata,
|
|
106
|
-
response=completion,
|
|
107
|
-
tool_types=self.tool_types,
|
|
108
|
-
prompt_template=self.prompt_template,
|
|
109
|
-
fn_args=self.fn_args if self.fn_args else {},
|
|
110
|
-
dynamic_config=self.dynamic_config,
|
|
111
|
-
messages=self.messages,
|
|
112
|
-
call_params=self.call_params,
|
|
113
|
-
call_kwargs=self.call_kwargs,
|
|
114
|
-
user_message_param=self.user_message_param,
|
|
115
|
-
start_time=self.start_time,
|
|
116
|
-
end_time=self.end_time,
|
|
117
|
-
)
|