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,33 +0,0 @@
|
|
|
1
|
-
"""Get JSON output from a Gemini response."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
|
|
5
|
-
from proto.marshal.collections import RepeatedComposite
|
|
6
|
-
|
|
7
|
-
from ..call_response import GeminiCallResponse
|
|
8
|
-
from ..call_response_chunk import GeminiCallResponseChunk
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def get_json_output(
|
|
12
|
-
response: GeminiCallResponse | GeminiCallResponseChunk, json_mode: bool
|
|
13
|
-
) -> str:
|
|
14
|
-
"""Extracts the JSON output from a Gemini response."""
|
|
15
|
-
if isinstance(response, GeminiCallResponse):
|
|
16
|
-
if json_mode and response.content:
|
|
17
|
-
return response.content
|
|
18
|
-
elif tool_calls := [
|
|
19
|
-
part.function_call
|
|
20
|
-
for part in response.response.parts
|
|
21
|
-
if part.function_call.args
|
|
22
|
-
]:
|
|
23
|
-
return json.dumps(
|
|
24
|
-
{
|
|
25
|
-
k: v if not isinstance(v, RepeatedComposite) else list(v)
|
|
26
|
-
for k, v in tool_calls[0].args.items()
|
|
27
|
-
}
|
|
28
|
-
)
|
|
29
|
-
else:
|
|
30
|
-
raise ValueError("No tool call or JSON object found in response.")
|
|
31
|
-
elif not json_mode:
|
|
32
|
-
raise ValueError("Gemini only supports structured streaming in json mode.")
|
|
33
|
-
return response.content
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"""Handles streaming content and tools from the Gemini API."""
|
|
2
|
-
|
|
3
|
-
from collections.abc import AsyncGenerator, Generator
|
|
4
|
-
|
|
5
|
-
from google.generativeai.types import GenerateContentResponse # type: ignore
|
|
6
|
-
|
|
7
|
-
from ..call_response_chunk import GeminiCallResponseChunk
|
|
8
|
-
from ..tool import GeminiTool
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def handle_stream(
|
|
12
|
-
stream: Generator[GenerateContentResponse, None, None],
|
|
13
|
-
tool_types: list[type[GeminiTool]] | None = None,
|
|
14
|
-
) -> Generator[tuple[GeminiCallResponseChunk, None], None, None]:
|
|
15
|
-
"""Iterator over the stream and constructs tools as they are streamed.
|
|
16
|
-
|
|
17
|
-
Note: gemini does not currently support streaming tools.
|
|
18
|
-
"""
|
|
19
|
-
for chunk in stream:
|
|
20
|
-
yield GeminiCallResponseChunk(chunk=chunk), None
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
async def handle_stream_async(
|
|
24
|
-
stream: AsyncGenerator[GenerateContentResponse, None],
|
|
25
|
-
tool_types: list[type[GeminiTool]] | None = None,
|
|
26
|
-
) -> AsyncGenerator[tuple[GeminiCallResponseChunk, None], None]:
|
|
27
|
-
"""
|
|
28
|
-
Async iterator over the stream and constructs tools as they are streamed.
|
|
29
|
-
|
|
30
|
-
Note: gemini does not currently support streaming tools.
|
|
31
|
-
"""
|
|
32
|
-
async for chunk in stream:
|
|
33
|
-
yield GeminiCallResponseChunk(chunk=chunk), None
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"""This module contains the setup_call function, which is used to set up the"""
|
|
2
|
-
|
|
3
|
-
import inspect
|
|
4
|
-
from collections.abc import Awaitable, Callable
|
|
5
|
-
from typing import Any, cast
|
|
6
|
-
|
|
7
|
-
from google.generativeai import GenerativeModel # type: ignore
|
|
8
|
-
from google.generativeai.types import ( # type: ignore
|
|
9
|
-
AsyncGenerateContentResponse,
|
|
10
|
-
ContentDict,
|
|
11
|
-
GenerateContentResponse,
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
from ...base import BaseMessageParam, BaseTool, _utils
|
|
15
|
-
from ..call_params import GeminiCallParams
|
|
16
|
-
from ..dynamic_config import GeminiDynamicConfig
|
|
17
|
-
from ..tool import GeminiTool
|
|
18
|
-
from ._convert_message_params import convert_message_params
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def setup_call(
|
|
22
|
-
*,
|
|
23
|
-
model: str,
|
|
24
|
-
client: GenerativeModel | None,
|
|
25
|
-
fn: Callable[..., GeminiDynamicConfig | Awaitable[GeminiDynamicConfig]],
|
|
26
|
-
fn_args: dict[str, Any],
|
|
27
|
-
dynamic_config: GeminiDynamicConfig,
|
|
28
|
-
tools: list[type[BaseTool] | Callable] | None,
|
|
29
|
-
json_mode: bool,
|
|
30
|
-
call_params: GeminiCallParams,
|
|
31
|
-
extract: bool = False,
|
|
32
|
-
) -> tuple[
|
|
33
|
-
Callable[..., GenerateContentResponse]
|
|
34
|
-
| Callable[..., Awaitable[AsyncGenerateContentResponse]],
|
|
35
|
-
str,
|
|
36
|
-
list[ContentDict],
|
|
37
|
-
list[type[GeminiTool]] | None,
|
|
38
|
-
dict[str, Any],
|
|
39
|
-
]:
|
|
40
|
-
prompt_template, messages, tool_types, call_kwargs = _utils.setup_call(
|
|
41
|
-
fn, fn_args, dynamic_config, tools, GeminiTool, call_params
|
|
42
|
-
)
|
|
43
|
-
messages = cast(list[BaseMessageParam | ContentDict], messages)
|
|
44
|
-
messages = convert_message_params(messages)
|
|
45
|
-
if json_mode:
|
|
46
|
-
generation_config = call_kwargs.get("generation_config", {})
|
|
47
|
-
generation_config["response_mime_type"] = "application/json"
|
|
48
|
-
call_kwargs["generation_config"] = generation_config
|
|
49
|
-
messages[-1]["parts"].append(
|
|
50
|
-
_utils.json_mode_content(tool_types[0] if tool_types else None)
|
|
51
|
-
)
|
|
52
|
-
call_kwargs.pop("tools", None)
|
|
53
|
-
elif extract:
|
|
54
|
-
assert tool_types, "At least one tool must be provided for extraction."
|
|
55
|
-
tool_config = call_kwargs.get("tool_config", {})
|
|
56
|
-
tool_config["function_calling_config"] = {"mode": "auto"}
|
|
57
|
-
call_kwargs["tool_config"] = tool_config
|
|
58
|
-
call_kwargs |= {"contents": messages}
|
|
59
|
-
|
|
60
|
-
if client is None:
|
|
61
|
-
client = GenerativeModel(model_name=model)
|
|
62
|
-
create = (
|
|
63
|
-
client.generate_content_async
|
|
64
|
-
if inspect.iscoroutinefunction(fn)
|
|
65
|
-
else client.generate_content
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
return create, prompt_template, messages, tool_types, call_kwargs
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"""usage docs: learn/calls.md#provider-specific-parameters"""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from google.generativeai.types import GenerationConfig, RequestOptions
|
|
6
|
-
from google.generativeai.types.content_types import ToolConfigType
|
|
7
|
-
from google.generativeai.types.safety_types import SafetySettingOptions
|
|
8
|
-
from typing_extensions import NotRequired
|
|
9
|
-
|
|
10
|
-
from ..base import BaseCallParams
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class GeminiCallParams(BaseCallParams):
|
|
14
|
-
"""The parameters to use when calling the Gemini API.
|
|
15
|
-
|
|
16
|
-
[Gemini API Reference](https://ai.google.dev/gemini-api/docs/text-generation?lang=python)
|
|
17
|
-
|
|
18
|
-
Attributes:
|
|
19
|
-
generation_config: ...
|
|
20
|
-
safety_settings: ...
|
|
21
|
-
request_options: ...
|
|
22
|
-
tool_config: ...
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
generation_config: NotRequired[GenerationConfig]
|
|
26
|
-
safety_settings: NotRequired[SafetySettingOptions]
|
|
27
|
-
request_options: NotRequired[RequestOptions]
|
|
28
|
-
tool_config: NotRequired[ToolConfigType]
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
"""This module contains the `GeminiCallResponse` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/calls.md#handling-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from google.generativeai.protos import FunctionResponse # type: ignore
|
|
7
|
-
from google.generativeai.types import ( # type: ignore
|
|
8
|
-
AsyncGenerateContentResponse,
|
|
9
|
-
ContentDict,
|
|
10
|
-
ContentsType, # type: ignore
|
|
11
|
-
GenerateContentResponse,
|
|
12
|
-
)
|
|
13
|
-
from pydantic import computed_field
|
|
14
|
-
|
|
15
|
-
from ..base import BaseCallResponse
|
|
16
|
-
from ._utils import calculate_cost
|
|
17
|
-
from .call_params import GeminiCallParams
|
|
18
|
-
from .dynamic_config import GeminiDynamicConfig
|
|
19
|
-
from .tool import GeminiTool
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class GeminiCallResponse(
|
|
23
|
-
BaseCallResponse[
|
|
24
|
-
GenerateContentResponse | AsyncGenerateContentResponse,
|
|
25
|
-
GeminiTool,
|
|
26
|
-
GeminiDynamicConfig,
|
|
27
|
-
ContentsType,
|
|
28
|
-
GeminiCallParams,
|
|
29
|
-
ContentDict,
|
|
30
|
-
]
|
|
31
|
-
):
|
|
32
|
-
"""Convenience wrapper around Gemini's `GenerateContentResponse`.
|
|
33
|
-
|
|
34
|
-
When using Mirascope's convenience wrappers to interact with Gemini models via
|
|
35
|
-
`GeminiCall`, responses using `GeminiCall.call()` will return a
|
|
36
|
-
`GeminiCallResponse`, whereby the implemented properties allow for simpler syntax
|
|
37
|
-
and a convenient developer experience.
|
|
38
|
-
|
|
39
|
-
Example:
|
|
40
|
-
|
|
41
|
-
```python
|
|
42
|
-
from mirascope.core import prompt_template
|
|
43
|
-
from mirascope.core.gemini import gemini_call
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@gemini_call("gemini-1.5-flash")
|
|
47
|
-
@prompt_template("Recommend a {genre} book")
|
|
48
|
-
def recommend_book(genre: str):
|
|
49
|
-
...
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
response = recommend_book("fantasy") # response is an `GeminiCallResponse` instance
|
|
53
|
-
print(response.content)
|
|
54
|
-
```
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
_provider = "gemini"
|
|
58
|
-
|
|
59
|
-
@property
|
|
60
|
-
def content(self) -> str:
|
|
61
|
-
"""Returns the contained string content for the 0th choice."""
|
|
62
|
-
return self.response.candidates[0].content.parts[0].text
|
|
63
|
-
|
|
64
|
-
@property
|
|
65
|
-
def finish_reasons(self) -> list[str]:
|
|
66
|
-
"""Returns the finish reasons of the response."""
|
|
67
|
-
finish_reasons = [
|
|
68
|
-
"FINISH_REASON_UNSPECIFIED",
|
|
69
|
-
"STOP",
|
|
70
|
-
"MAX_TOKENS",
|
|
71
|
-
"SAFETY",
|
|
72
|
-
"RECITATION",
|
|
73
|
-
"OTHER",
|
|
74
|
-
]
|
|
75
|
-
|
|
76
|
-
return [
|
|
77
|
-
finish_reasons[candidate.finish_reason]
|
|
78
|
-
for candidate in self.response.candidates
|
|
79
|
-
]
|
|
80
|
-
|
|
81
|
-
@property
|
|
82
|
-
def model(self) -> str:
|
|
83
|
-
"""Returns the model name.
|
|
84
|
-
|
|
85
|
-
google.generativeai does not return model, so we return the model provided by
|
|
86
|
-
the user.
|
|
87
|
-
"""
|
|
88
|
-
return self._model
|
|
89
|
-
|
|
90
|
-
@property
|
|
91
|
-
def id(self) -> str | None:
|
|
92
|
-
"""Returns the id of the response.
|
|
93
|
-
|
|
94
|
-
google.generativeai does not return an id
|
|
95
|
-
"""
|
|
96
|
-
return None
|
|
97
|
-
|
|
98
|
-
@property
|
|
99
|
-
def usage(self) -> None:
|
|
100
|
-
"""Returns the usage of the chat completion.
|
|
101
|
-
|
|
102
|
-
google.generativeai does not have Usage, so we return None
|
|
103
|
-
"""
|
|
104
|
-
return None
|
|
105
|
-
|
|
106
|
-
@property
|
|
107
|
-
def input_tokens(self) -> None:
|
|
108
|
-
"""Returns the number of input tokens."""
|
|
109
|
-
return None
|
|
110
|
-
|
|
111
|
-
@property
|
|
112
|
-
def output_tokens(self) -> None:
|
|
113
|
-
"""Returns the number of output tokens."""
|
|
114
|
-
return None
|
|
115
|
-
|
|
116
|
-
@property
|
|
117
|
-
def cost(self) -> float | None:
|
|
118
|
-
"""Returns the cost of the call."""
|
|
119
|
-
return calculate_cost(self.input_tokens, self.output_tokens, self.model)
|
|
120
|
-
|
|
121
|
-
@computed_field
|
|
122
|
-
@property
|
|
123
|
-
def message_param(self) -> ContentDict:
|
|
124
|
-
"""Returns the models's response as a message parameter."""
|
|
125
|
-
return {"role": "model", "parts": self.response.parts} # type: ignore
|
|
126
|
-
|
|
127
|
-
@computed_field
|
|
128
|
-
@property
|
|
129
|
-
def tools(self) -> list[GeminiTool] | None:
|
|
130
|
-
"""Returns the list of tools for the 0th candidate's 0th content part."""
|
|
131
|
-
if self.tool_types is None:
|
|
132
|
-
return None
|
|
133
|
-
|
|
134
|
-
extracted_tools = []
|
|
135
|
-
for part in self.response.candidates[0].content.parts:
|
|
136
|
-
tool_call = part.function_call
|
|
137
|
-
for tool_type in self.tool_types:
|
|
138
|
-
if tool_call.name == tool_type._name():
|
|
139
|
-
extracted_tools.append(tool_type.from_tool_call(tool_call))
|
|
140
|
-
break
|
|
141
|
-
|
|
142
|
-
return extracted_tools
|
|
143
|
-
|
|
144
|
-
@computed_field
|
|
145
|
-
@property
|
|
146
|
-
def tool(self) -> GeminiTool | None:
|
|
147
|
-
"""Returns the 0th tool for the 0th candidate's 0th content part.
|
|
148
|
-
|
|
149
|
-
Raises:
|
|
150
|
-
ValidationError: if the tool call doesn't match the tool's schema.
|
|
151
|
-
"""
|
|
152
|
-
tools = self.tools
|
|
153
|
-
if tools:
|
|
154
|
-
return tools[0]
|
|
155
|
-
return None
|
|
156
|
-
|
|
157
|
-
@classmethod
|
|
158
|
-
def tool_message_params(
|
|
159
|
-
cls, tools_and_outputs: list[tuple[GeminiTool, object]]
|
|
160
|
-
) -> list[FunctionResponse]:
|
|
161
|
-
"""Returns the tool message parameters for tool call results.
|
|
162
|
-
|
|
163
|
-
Args:
|
|
164
|
-
tools_and_outputs: The list of tools and their outputs from which the tool
|
|
165
|
-
message parameters should be constructed.
|
|
166
|
-
|
|
167
|
-
Returns:
|
|
168
|
-
The list of constructed `FunctionResponse` parameters.
|
|
169
|
-
"""
|
|
170
|
-
return [
|
|
171
|
-
FunctionResponse(name=tool._name(), response={"result": output})
|
|
172
|
-
for tool, output in tools_and_outputs
|
|
173
|
-
]
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
"""This module contains the `GeminiCallResponseChunk` class.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md#handling-streamed-responses
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from google.ai.generativelanguage import Candidate
|
|
7
|
-
from google.generativeai.types import ( # type: ignore
|
|
8
|
-
GenerateContentResponse,
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
from ..base import BaseCallResponseChunk
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class GeminiCallResponseChunk(
|
|
15
|
-
BaseCallResponseChunk[GenerateContentResponse, Candidate.FinishReason]
|
|
16
|
-
):
|
|
17
|
-
"""Convenience wrapper around chat completion streaming chunks.
|
|
18
|
-
|
|
19
|
-
When using Mirascope's convenience wrappers to interact with Gemini models via
|
|
20
|
-
`GeminiCall`, responses using `GeminiCall.stream()` will return a
|
|
21
|
-
`GeminiCallResponseChunk`, whereby the implemented properties allow for simpler
|
|
22
|
-
syntax and a convenient developer experience.
|
|
23
|
-
|
|
24
|
-
Example:
|
|
25
|
-
|
|
26
|
-
```python
|
|
27
|
-
from mirascope.core import prompt_template
|
|
28
|
-
from mirascope.core.gemini import gemini_call
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@gemini_call("gemini-1.5-flash", stream=True)
|
|
32
|
-
@prompt_template("Recommend a {genre} book")
|
|
33
|
-
def recommend_book(genre: str):
|
|
34
|
-
...
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
stream = recommend_book("fantasy") # response is an `GeminiStream`
|
|
38
|
-
for chunk, _ in stream:
|
|
39
|
-
print(chunk.content, end="", flush=True)
|
|
40
|
-
```
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
@property
|
|
44
|
-
def content(self) -> str:
|
|
45
|
-
"""Returns the chunk content for the 0th choice."""
|
|
46
|
-
return self.chunk.candidates[0].content.parts[0].text
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def finish_reasons(self) -> list[Candidate.FinishReason]:
|
|
50
|
-
"""Returns the finish reasons of the response."""
|
|
51
|
-
return [candidate.finish_reason for candidate in self.chunk.candidates]
|
|
52
|
-
|
|
53
|
-
@property
|
|
54
|
-
def model(self) -> None:
|
|
55
|
-
"""Returns the model name.
|
|
56
|
-
|
|
57
|
-
google.generativeai does not return model, so we return None
|
|
58
|
-
"""
|
|
59
|
-
return None
|
|
60
|
-
|
|
61
|
-
@property
|
|
62
|
-
def id(self) -> str | None:
|
|
63
|
-
"""Returns the id of the response.
|
|
64
|
-
|
|
65
|
-
google.generativeai does not return an id
|
|
66
|
-
"""
|
|
67
|
-
return None
|
|
68
|
-
|
|
69
|
-
@property
|
|
70
|
-
def usage(self) -> None:
|
|
71
|
-
"""Returns the usage of the chat completion.
|
|
72
|
-
|
|
73
|
-
google.generativeai does not have Usage, so we return None
|
|
74
|
-
"""
|
|
75
|
-
return None
|
|
76
|
-
|
|
77
|
-
@property
|
|
78
|
-
def input_tokens(self) -> None:
|
|
79
|
-
"""Returns the number of input tokens."""
|
|
80
|
-
return None
|
|
81
|
-
|
|
82
|
-
@property
|
|
83
|
-
def output_tokens(self) -> None:
|
|
84
|
-
"""Returns the number of output tokens."""
|
|
85
|
-
return None
|
|
@@ -1,26 +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 google.generativeai.types import ContentsType # type: ignore
|
|
7
|
-
|
|
8
|
-
from ..base import BaseDynamicConfig
|
|
9
|
-
from .call_params import GeminiCallParams
|
|
10
|
-
|
|
11
|
-
GeminiDynamicConfig = BaseDynamicConfig[ContentsType, GeminiCallParams]
|
|
12
|
-
"""The function return type for functions wrapped with the `gemini_call` decorator.
|
|
13
|
-
|
|
14
|
-
Example:
|
|
15
|
-
|
|
16
|
-
```python
|
|
17
|
-
from mirascope.core import prompt_template
|
|
18
|
-
from mirascope.core.gemini import GeminiDynamicConfig, gemini_call
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@gemini_call("gemini-flash-1.5")
|
|
22
|
-
@prompt_template("Recommend a {capitalized_genre} book")
|
|
23
|
-
def recommend_book(genre: str) -> GeminiDynamicConfig:
|
|
24
|
-
return {"computed_fields": {"capitalized_genre": genre.capitalize()}}
|
|
25
|
-
```
|
|
26
|
-
"""
|
mirascope/core/gemini/stream.py
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
"""The `GeminiStream` class for convenience around streaming LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/streams.md
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from typing import cast
|
|
7
|
-
|
|
8
|
-
from google.ai.generativelanguage import (
|
|
9
|
-
Candidate,
|
|
10
|
-
Content,
|
|
11
|
-
FunctionCall,
|
|
12
|
-
GenerateContentResponse,
|
|
13
|
-
)
|
|
14
|
-
from google.generativeai.types import (
|
|
15
|
-
ContentDict,
|
|
16
|
-
ContentsType, # type: ignore
|
|
17
|
-
)
|
|
18
|
-
from google.generativeai.types import ( # type: ignore
|
|
19
|
-
GenerateContentResponse as GenerateContentResponseType,
|
|
20
|
-
)
|
|
21
|
-
from google.generativeai.types.content_types import PartType
|
|
22
|
-
|
|
23
|
-
from ..base.stream import BaseStream
|
|
24
|
-
from ._utils import calculate_cost
|
|
25
|
-
from .call_params import GeminiCallParams
|
|
26
|
-
from .call_response import GeminiCallResponse
|
|
27
|
-
from .call_response_chunk import GeminiCallResponseChunk
|
|
28
|
-
from .dynamic_config import GeminiDynamicConfig
|
|
29
|
-
from .tool import GeminiTool
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class GeminiStream(
|
|
33
|
-
BaseStream[
|
|
34
|
-
GeminiCallResponse,
|
|
35
|
-
GeminiCallResponseChunk,
|
|
36
|
-
ContentDict,
|
|
37
|
-
ContentDict,
|
|
38
|
-
ContentDict,
|
|
39
|
-
ContentsType,
|
|
40
|
-
GeminiTool,
|
|
41
|
-
GeminiDynamicConfig,
|
|
42
|
-
GeminiCallParams,
|
|
43
|
-
Candidate.FinishReason,
|
|
44
|
-
]
|
|
45
|
-
):
|
|
46
|
-
"""A class for convenience around streaming Gemini LLM calls.
|
|
47
|
-
|
|
48
|
-
Example:
|
|
49
|
-
|
|
50
|
-
```python
|
|
51
|
-
from mirascope.core import prompt_template
|
|
52
|
-
from mirascope.core.gemini import gemini_call
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
@gemini_call("gemini-1.5-flash", stream=True)
|
|
56
|
-
@prompt_template("Recommend a {genre} book")
|
|
57
|
-
def recommend_book(genre: str):
|
|
58
|
-
...
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
stream = recommend_book("fantasy") # returns `GeminiStream` instance
|
|
62
|
-
for chunk, _ in stream:
|
|
63
|
-
print(chunk.content, end="", flush=True)
|
|
64
|
-
```
|
|
65
|
-
"""
|
|
66
|
-
|
|
67
|
-
_provider = "gemini"
|
|
68
|
-
|
|
69
|
-
@property
|
|
70
|
-
def cost(self) -> float | None:
|
|
71
|
-
"""Returns the cost of the call."""
|
|
72
|
-
return calculate_cost(self.input_tokens, self.output_tokens, self.model)
|
|
73
|
-
|
|
74
|
-
def _construct_message_param(
|
|
75
|
-
self, tool_calls: list[FunctionCall] | None = None, content: str | None = None
|
|
76
|
-
) -> ContentDict:
|
|
77
|
-
"""Constructs the message parameter for the assistant."""
|
|
78
|
-
return {
|
|
79
|
-
"role": "model",
|
|
80
|
-
"parts": cast(list[PartType], [{"text": content}] + (tool_calls or [])),
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
def construct_call_response(self) -> GeminiCallResponse:
|
|
84
|
-
"""Constructs the call response from a consumed GeminiStream.
|
|
85
|
-
|
|
86
|
-
Raises:
|
|
87
|
-
ValueError: if the stream has not yet been consumed.
|
|
88
|
-
"""
|
|
89
|
-
if not hasattr(self, "message_param"):
|
|
90
|
-
raise ValueError(
|
|
91
|
-
"No stream response, check if the stream has been consumed."
|
|
92
|
-
)
|
|
93
|
-
response = GenerateContentResponseType.from_response(
|
|
94
|
-
GenerateContentResponse(
|
|
95
|
-
candidates=[
|
|
96
|
-
Candidate(
|
|
97
|
-
finish_reason=self.finish_reasons[0]
|
|
98
|
-
if self.finish_reasons
|
|
99
|
-
else Candidate.FinishReason.STOP,
|
|
100
|
-
content=Content(
|
|
101
|
-
role=self.message_param["role"],
|
|
102
|
-
parts=self.message_param["parts"],
|
|
103
|
-
),
|
|
104
|
-
)
|
|
105
|
-
]
|
|
106
|
-
)
|
|
107
|
-
)
|
|
108
|
-
return GeminiCallResponse(
|
|
109
|
-
metadata=self.metadata,
|
|
110
|
-
response=response,
|
|
111
|
-
tool_types=self.tool_types,
|
|
112
|
-
prompt_template=self.prompt_template,
|
|
113
|
-
fn_args=self.fn_args if self.fn_args else {},
|
|
114
|
-
dynamic_config=self.dynamic_config,
|
|
115
|
-
messages=self.messages,
|
|
116
|
-
call_params=self.call_params,
|
|
117
|
-
call_kwargs=self.call_kwargs,
|
|
118
|
-
user_message_param=self.user_message_param,
|
|
119
|
-
start_time=self.start_time,
|
|
120
|
-
end_time=self.end_time,
|
|
121
|
-
)
|
mirascope/core/gemini/tool.py
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"""The `GeminiTool` class for easy tool usage with Google's Gemini LLM calls.
|
|
2
|
-
|
|
3
|
-
usage docs: learn/tools.md#using-tools-with-standard-calls
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
from typing import Any
|
|
9
|
-
|
|
10
|
-
from google.ai.generativelanguage import FunctionCall
|
|
11
|
-
from google.generativeai.types import ( # type: ignore
|
|
12
|
-
FunctionDeclaration,
|
|
13
|
-
Tool,
|
|
14
|
-
)
|
|
15
|
-
from pydantic.json_schema import SkipJsonSchema
|
|
16
|
-
|
|
17
|
-
from ..base import BaseTool
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class GeminiTool(BaseTool):
|
|
21
|
-
"""A class for defining tools for Gemini LLM calls.
|
|
22
|
-
|
|
23
|
-
Example:
|
|
24
|
-
|
|
25
|
-
```python
|
|
26
|
-
from mirascope.core import prompt_template
|
|
27
|
-
from mirascope.core.gemini import gemini_call
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def format_book(title: str, author: str) -> str:
|
|
31
|
-
return f"{title} by {author}"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@gemini_call("gemini-1.5-flash", tools=[format_book])
|
|
35
|
-
@prompt_template("Recommend a {genre} book")
|
|
36
|
-
def recommend_book(genre: str):
|
|
37
|
-
...
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
response = recommend_book("fantasy")
|
|
41
|
-
if tool := response.tool: # returns an `GeminiTool` instance
|
|
42
|
-
print(tool.call())
|
|
43
|
-
```
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
tool_call: SkipJsonSchema[FunctionCall]
|
|
47
|
-
|
|
48
|
-
@classmethod
|
|
49
|
-
def tool_schema(cls) -> Tool:
|
|
50
|
-
"""Constructs a JSON Schema tool schema from the `BaseModel` schema defined.
|
|
51
|
-
|
|
52
|
-
Example:
|
|
53
|
-
```python
|
|
54
|
-
from mirascope.core.gemini import GeminiTool
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def format_book(title: str, author: str) -> str:
|
|
58
|
-
return f"{title} by {author}"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
tool_type = GeminiTool.type_from_fn(format_book)
|
|
62
|
-
print(tool_type.tool_schema()) # prints the Gemini-specific tool schema
|
|
63
|
-
```
|
|
64
|
-
"""
|
|
65
|
-
model_schema = cls.model_tool_schema()
|
|
66
|
-
fn: dict[str, Any] = {"name": cls._name(), "description": cls._description()}
|
|
67
|
-
if model_schema["properties"]:
|
|
68
|
-
fn["parameters"] = model_schema # type: ignore
|
|
69
|
-
if model_schema["required"]:
|
|
70
|
-
fn["parameters"]["required"] = model_schema["required"]
|
|
71
|
-
if "parameters" in fn:
|
|
72
|
-
if "$defs" in fn["parameters"]:
|
|
73
|
-
raise ValueError(
|
|
74
|
-
"Unfortunately Google's Gemini API cannot handle nested structures "
|
|
75
|
-
"with $defs."
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
def handle_enum_schema(prop_schema: dict[str, Any]) -> dict[str, Any]:
|
|
79
|
-
if "enum" in prop_schema:
|
|
80
|
-
prop_schema["format"] = "enum"
|
|
81
|
-
return prop_schema
|
|
82
|
-
|
|
83
|
-
fn["parameters"]["properties"] = {
|
|
84
|
-
prop: {
|
|
85
|
-
key: value
|
|
86
|
-
for key, value in handle_enum_schema(prop_schema).items()
|
|
87
|
-
if key != "default"
|
|
88
|
-
}
|
|
89
|
-
for prop, prop_schema in fn["parameters"]["properties"].items()
|
|
90
|
-
}
|
|
91
|
-
return Tool(function_declarations=[FunctionDeclaration(**fn)])
|
|
92
|
-
|
|
93
|
-
@classmethod
|
|
94
|
-
def from_tool_call(cls, tool_call: FunctionCall) -> GeminiTool:
|
|
95
|
-
"""Constructs an `GeminiTool` instance from a `tool_call`.
|
|
96
|
-
|
|
97
|
-
Args:
|
|
98
|
-
tool_call: The Gemini tool call from which to construct this tool instance.
|
|
99
|
-
"""
|
|
100
|
-
if not tool_call.args:
|
|
101
|
-
raise ValueError("Tool call doesn't have any arguments.")
|
|
102
|
-
model_json: dict[str, Any] = dict(tool_call.args.items())
|
|
103
|
-
model_json["tool_call"] = tool_call
|
|
104
|
-
return cls.model_validate(model_json)
|
mirascope/core/groq/__init__.py
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"""The Mirascope Groq Module."""
|
|
2
|
-
|
|
3
|
-
from ._call import groq_call
|
|
4
|
-
from ._call import groq_call as call
|
|
5
|
-
from .call_params import GroqCallParams
|
|
6
|
-
from .call_response import GroqCallResponse
|
|
7
|
-
from .call_response_chunk import GroqCallResponseChunk
|
|
8
|
-
from .dynamic_config import GroqDynamicConfig
|
|
9
|
-
from .stream import GroqStream
|
|
10
|
-
from .tool import GroqTool
|
|
11
|
-
|
|
12
|
-
__all__ = [
|
|
13
|
-
"call",
|
|
14
|
-
"GroqDynamicConfig",
|
|
15
|
-
"GroqCallParams",
|
|
16
|
-
"GroqCallResponse",
|
|
17
|
-
"GroqCallResponseChunk",
|
|
18
|
-
"GroqStream",
|
|
19
|
-
"GroqTool",
|
|
20
|
-
"groq_call",
|
|
21
|
-
]
|