mirascope 2.0.0__py3-none-any.whl → 2.0.0a1__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 +2 -11
- mirascope/graphs/__init__.py +22 -0
- mirascope/graphs/finite_state_machine.py +625 -0
- mirascope/llm/__init__.py +15 -96
- mirascope/llm/agents/__init__.py +15 -0
- mirascope/llm/agents/agent.py +97 -0
- mirascope/llm/agents/agent_template.py +45 -0
- mirascope/llm/agents/decorator.py +176 -0
- mirascope/llm/calls/__init__.py +1 -2
- mirascope/llm/calls/base_call.py +33 -0
- mirascope/llm/calls/calls.py +58 -84
- mirascope/llm/calls/decorator.py +120 -140
- mirascope/llm/clients/__init__.py +34 -0
- mirascope/llm/clients/_missing_import_stubs.py +47 -0
- mirascope/llm/clients/anthropic/__init__.py +25 -0
- mirascope/llm/{providers/openai/completions → clients/anthropic}/_utils/__init__.py +0 -2
- mirascope/llm/{providers → clients}/anthropic/_utils/decode.py +22 -66
- mirascope/llm/clients/anthropic/_utils/encode.py +243 -0
- mirascope/llm/clients/anthropic/clients.py +819 -0
- mirascope/llm/clients/anthropic/model_ids.py +8 -0
- mirascope/llm/{providers → clients}/base/__init__.py +5 -4
- mirascope/llm/{providers → clients}/base/_utils.py +17 -78
- mirascope/llm/{providers/base/base_provider.py → clients/base/client.py} +145 -468
- mirascope/llm/{models → clients/base}/params.py +37 -16
- mirascope/llm/clients/google/__init__.py +20 -0
- mirascope/llm/{providers/openai/responses → clients/google}/_utils/__init__.py +0 -2
- mirascope/llm/{providers → clients}/google/_utils/decode.py +22 -98
- mirascope/llm/{providers → clients}/google/_utils/encode.py +46 -168
- mirascope/llm/clients/google/clients.py +853 -0
- mirascope/llm/clients/google/model_ids.py +15 -0
- mirascope/llm/clients/openai/__init__.py +25 -0
- mirascope/llm/clients/openai/completions/__init__.py +28 -0
- mirascope/llm/{providers/google → clients/openai/completions}/_utils/__init__.py +0 -4
- mirascope/llm/{providers → clients}/openai/completions/_utils/decode.py +9 -74
- mirascope/llm/{providers → clients}/openai/completions/_utils/encode.py +52 -70
- mirascope/llm/clients/openai/completions/_utils/model_features.py +81 -0
- mirascope/llm/clients/openai/completions/clients.py +833 -0
- mirascope/llm/clients/openai/completions/model_ids.py +8 -0
- mirascope/llm/clients/openai/responses/__init__.py +26 -0
- mirascope/llm/clients/openai/responses/_utils/__init__.py +13 -0
- mirascope/llm/{providers → clients}/openai/responses/_utils/decode.py +14 -80
- mirascope/llm/{providers → clients}/openai/responses/_utils/encode.py +41 -92
- mirascope/llm/clients/openai/responses/_utils/model_features.py +87 -0
- mirascope/llm/clients/openai/responses/clients.py +832 -0
- mirascope/llm/clients/openai/responses/model_ids.py +8 -0
- mirascope/llm/clients/openai/shared/__init__.py +7 -0
- mirascope/llm/clients/openai/shared/_utils.py +55 -0
- mirascope/llm/clients/providers.py +175 -0
- mirascope/llm/content/__init__.py +2 -3
- mirascope/llm/content/tool_call.py +0 -6
- mirascope/llm/content/tool_output.py +5 -22
- mirascope/llm/context/_utils.py +6 -19
- mirascope/llm/exceptions.py +43 -298
- mirascope/llm/formatting/__init__.py +2 -19
- mirascope/llm/formatting/_utils.py +74 -0
- mirascope/llm/formatting/format.py +30 -219
- mirascope/llm/formatting/from_call_args.py +2 -2
- mirascope/llm/formatting/partial.py +7 -80
- mirascope/llm/formatting/types.py +64 -21
- mirascope/llm/mcp/__init__.py +2 -2
- mirascope/llm/mcp/client.py +118 -0
- mirascope/llm/messages/__init__.py +0 -3
- mirascope/llm/messages/message.py +5 -13
- mirascope/llm/models/__init__.py +2 -7
- mirascope/llm/models/models.py +139 -315
- mirascope/llm/prompts/__init__.py +12 -13
- mirascope/llm/prompts/_utils.py +43 -14
- mirascope/llm/prompts/decorator.py +204 -144
- mirascope/llm/prompts/protocols.py +59 -25
- mirascope/llm/responses/__init__.py +1 -9
- mirascope/llm/responses/_utils.py +12 -102
- mirascope/llm/responses/base_response.py +6 -18
- mirascope/llm/responses/base_stream_response.py +50 -173
- mirascope/llm/responses/finish_reason.py +0 -1
- mirascope/llm/responses/response.py +13 -34
- mirascope/llm/responses/root_response.py +29 -100
- mirascope/llm/responses/stream_response.py +31 -40
- mirascope/llm/tools/__init__.py +2 -9
- mirascope/llm/tools/_utils.py +3 -12
- mirascope/llm/tools/decorator.py +16 -25
- mirascope/llm/tools/protocols.py +4 -4
- mirascope/llm/tools/tool_schema.py +19 -87
- mirascope/llm/tools/toolkit.py +27 -35
- mirascope/llm/tools/tools.py +41 -135
- {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/METADATA +13 -90
- mirascope-2.0.0a1.dist-info/RECORD +102 -0
- {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/WHEEL +1 -1
- {mirascope-2.0.0.dist-info → mirascope-2.0.0a1.dist-info}/licenses/LICENSE +1 -1
- mirascope/_stubs.py +0 -363
- mirascope/api/__init__.py +0 -14
- mirascope/api/_generated/README.md +0 -207
- mirascope/api/_generated/__init__.py +0 -440
- mirascope/api/_generated/annotations/__init__.py +0 -33
- mirascope/api/_generated/annotations/client.py +0 -506
- mirascope/api/_generated/annotations/raw_client.py +0 -1414
- mirascope/api/_generated/annotations/types/__init__.py +0 -31
- mirascope/api/_generated/annotations/types/annotations_create_request_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_create_response.py +0 -48
- mirascope/api/_generated/annotations/types/annotations_create_response_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_get_response.py +0 -48
- mirascope/api/_generated/annotations/types/annotations_get_response_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_list_request_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_list_response.py +0 -21
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +0 -50
- mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_update_request_label.py +0 -5
- mirascope/api/_generated/annotations/types/annotations_update_response.py +0 -48
- mirascope/api/_generated/annotations/types/annotations_update_response_label.py +0 -5
- mirascope/api/_generated/api_keys/__init__.py +0 -17
- mirascope/api/_generated/api_keys/client.py +0 -530
- mirascope/api/_generated/api_keys/raw_client.py +0 -1236
- mirascope/api/_generated/api_keys/types/__init__.py +0 -15
- mirascope/api/_generated/api_keys/types/api_keys_create_response.py +0 -28
- mirascope/api/_generated/api_keys/types/api_keys_get_response.py +0 -27
- mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +0 -40
- mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +0 -27
- mirascope/api/_generated/client.py +0 -211
- mirascope/api/_generated/core/__init__.py +0 -52
- mirascope/api/_generated/core/api_error.py +0 -23
- mirascope/api/_generated/core/client_wrapper.py +0 -46
- mirascope/api/_generated/core/datetime_utils.py +0 -28
- mirascope/api/_generated/core/file.py +0 -67
- mirascope/api/_generated/core/force_multipart.py +0 -16
- mirascope/api/_generated/core/http_client.py +0 -543
- mirascope/api/_generated/core/http_response.py +0 -55
- mirascope/api/_generated/core/jsonable_encoder.py +0 -100
- mirascope/api/_generated/core/pydantic_utilities.py +0 -255
- mirascope/api/_generated/core/query_encoder.py +0 -58
- mirascope/api/_generated/core/remove_none_from_dict.py +0 -11
- mirascope/api/_generated/core/request_options.py +0 -35
- mirascope/api/_generated/core/serialization.py +0 -276
- mirascope/api/_generated/docs/__init__.py +0 -4
- mirascope/api/_generated/docs/client.py +0 -91
- mirascope/api/_generated/docs/raw_client.py +0 -178
- mirascope/api/_generated/environment.py +0 -9
- mirascope/api/_generated/environments/__init__.py +0 -23
- mirascope/api/_generated/environments/client.py +0 -649
- mirascope/api/_generated/environments/raw_client.py +0 -1567
- mirascope/api/_generated/environments/types/__init__.py +0 -25
- mirascope/api/_generated/environments/types/environments_create_response.py +0 -24
- mirascope/api/_generated/environments/types/environments_get_analytics_response.py +0 -60
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +0 -24
- mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +0 -22
- mirascope/api/_generated/environments/types/environments_get_response.py +0 -24
- mirascope/api/_generated/environments/types/environments_list_response_item.py +0 -24
- mirascope/api/_generated/environments/types/environments_update_response.py +0 -24
- mirascope/api/_generated/errors/__init__.py +0 -25
- mirascope/api/_generated/errors/bad_request_error.py +0 -14
- mirascope/api/_generated/errors/conflict_error.py +0 -14
- mirascope/api/_generated/errors/forbidden_error.py +0 -11
- mirascope/api/_generated/errors/internal_server_error.py +0 -10
- mirascope/api/_generated/errors/not_found_error.py +0 -11
- mirascope/api/_generated/errors/payment_required_error.py +0 -15
- mirascope/api/_generated/errors/service_unavailable_error.py +0 -14
- mirascope/api/_generated/errors/too_many_requests_error.py +0 -15
- mirascope/api/_generated/errors/unauthorized_error.py +0 -11
- mirascope/api/_generated/functions/__init__.py +0 -39
- mirascope/api/_generated/functions/client.py +0 -647
- mirascope/api/_generated/functions/raw_client.py +0 -1890
- mirascope/api/_generated/functions/types/__init__.py +0 -53
- mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +0 -20
- mirascope/api/_generated/functions/types/functions_create_response.py +0 -37
- mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +0 -20
- mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +0 -39
- mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +0 -20
- mirascope/api/_generated/functions/types/functions_get_by_env_response.py +0 -53
- mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +0 -22
- mirascope/api/_generated/functions/types/functions_get_response.py +0 -37
- mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +0 -20
- mirascope/api/_generated/functions/types/functions_list_by_env_response.py +0 -25
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +0 -56
- mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +0 -22
- mirascope/api/_generated/functions/types/functions_list_response.py +0 -21
- mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +0 -41
- mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +0 -20
- mirascope/api/_generated/health/__init__.py +0 -7
- mirascope/api/_generated/health/client.py +0 -92
- mirascope/api/_generated/health/raw_client.py +0 -175
- mirascope/api/_generated/health/types/__init__.py +0 -8
- mirascope/api/_generated/health/types/health_check_response.py +0 -22
- mirascope/api/_generated/health/types/health_check_response_status.py +0 -5
- mirascope/api/_generated/organization_invitations/__init__.py +0 -33
- mirascope/api/_generated/organization_invitations/client.py +0 -546
- mirascope/api/_generated/organization_invitations/raw_client.py +0 -1519
- mirascope/api/_generated/organization_invitations/types/__init__.py +0 -53
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +0 -34
- mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +0 -48
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +0 -48
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +0 -48
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +0 -7
- mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +0 -7
- mirascope/api/_generated/organization_memberships/__init__.py +0 -19
- mirascope/api/_generated/organization_memberships/client.py +0 -302
- mirascope/api/_generated/organization_memberships/raw_client.py +0 -736
- mirascope/api/_generated/organization_memberships/types/__init__.py +0 -27
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +0 -33
- mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +0 -7
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +0 -7
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +0 -31
- mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +0 -7
- mirascope/api/_generated/organizations/__init__.py +0 -51
- mirascope/api/_generated/organizations/client.py +0 -869
- mirascope/api/_generated/organizations/raw_client.py +0 -2593
- mirascope/api/_generated/organizations/types/__init__.py +0 -71
- mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +0 -24
- mirascope/api/_generated/organizations/types/organizations_create_response.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_create_response_role.py +0 -5
- mirascope/api/_generated/organizations/types/organizations_get_response.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_get_response_role.py +0 -5
- mirascope/api/_generated/organizations/types/organizations_list_response_item.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +0 -5
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +0 -47
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +0 -33
- mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +0 -24
- mirascope/api/_generated/organizations/types/organizations_subscription_response.py +0 -53
- mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +0 -34
- mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_update_response.py +0 -26
- mirascope/api/_generated/organizations/types/organizations_update_response_role.py +0 -5
- mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +0 -7
- mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +0 -35
- mirascope/api/_generated/project_memberships/__init__.py +0 -25
- mirascope/api/_generated/project_memberships/client.py +0 -437
- mirascope/api/_generated/project_memberships/raw_client.py +0 -1039
- mirascope/api/_generated/project_memberships/types/__init__.py +0 -29
- mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +0 -7
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +0 -35
- mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +0 -7
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +0 -33
- mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +0 -7
- mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +0 -7
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +0 -35
- mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +0 -7
- mirascope/api/_generated/projects/__init__.py +0 -7
- mirascope/api/_generated/projects/client.py +0 -428
- mirascope/api/_generated/projects/raw_client.py +0 -1302
- mirascope/api/_generated/projects/types/__init__.py +0 -10
- mirascope/api/_generated/projects/types/projects_create_response.py +0 -25
- mirascope/api/_generated/projects/types/projects_get_response.py +0 -25
- mirascope/api/_generated/projects/types/projects_list_response_item.py +0 -25
- mirascope/api/_generated/projects/types/projects_update_response.py +0 -25
- mirascope/api/_generated/reference.md +0 -4915
- mirascope/api/_generated/tags/__init__.py +0 -19
- mirascope/api/_generated/tags/client.py +0 -504
- mirascope/api/_generated/tags/raw_client.py +0 -1288
- mirascope/api/_generated/tags/types/__init__.py +0 -17
- mirascope/api/_generated/tags/types/tags_create_response.py +0 -41
- mirascope/api/_generated/tags/types/tags_get_response.py +0 -41
- mirascope/api/_generated/tags/types/tags_list_response.py +0 -23
- mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +0 -41
- mirascope/api/_generated/tags/types/tags_update_response.py +0 -41
- mirascope/api/_generated/token_cost/__init__.py +0 -7
- mirascope/api/_generated/token_cost/client.py +0 -160
- mirascope/api/_generated/token_cost/raw_client.py +0 -264
- mirascope/api/_generated/token_cost/types/__init__.py +0 -8
- mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +0 -54
- mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +0 -52
- mirascope/api/_generated/traces/__init__.py +0 -97
- mirascope/api/_generated/traces/client.py +0 -1103
- mirascope/api/_generated/traces/raw_client.py +0 -2322
- mirascope/api/_generated/traces/types/__init__.py +0 -155
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +0 -29
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +0 -27
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +0 -23
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +0 -38
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +0 -19
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +0 -22
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +0 -20
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +0 -29
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +0 -31
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +0 -23
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +0 -38
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +0 -19
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +0 -22
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +0 -22
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +0 -48
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +0 -23
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +0 -38
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +0 -19
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +0 -24
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +0 -22
- mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +0 -20
- mirascope/api/_generated/traces/types/traces_create_response.py +0 -24
- mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +0 -22
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +0 -60
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +0 -24
- mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +0 -22
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +0 -33
- mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +0 -88
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +0 -33
- mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +0 -88
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +0 -25
- mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +0 -44
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +0 -26
- mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_by_env_response.py +0 -26
- mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +0 -50
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +0 -26
- mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +0 -7
- mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +0 -5
- mirascope/api/_generated/traces/types/traces_search_response.py +0 -26
- mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +0 -50
- mirascope/api/_generated/types/__init__.py +0 -85
- mirascope/api/_generated/types/already_exists_error.py +0 -22
- mirascope/api/_generated/types/already_exists_error_tag.py +0 -5
- mirascope/api/_generated/types/bad_request_error_body.py +0 -50
- mirascope/api/_generated/types/click_house_error.py +0 -22
- mirascope/api/_generated/types/database_error.py +0 -22
- mirascope/api/_generated/types/database_error_tag.py +0 -5
- mirascope/api/_generated/types/date.py +0 -3
- mirascope/api/_generated/types/http_api_decode_error.py +0 -27
- mirascope/api/_generated/types/http_api_decode_error_tag.py +0 -5
- mirascope/api/_generated/types/immutable_resource_error.py +0 -22
- mirascope/api/_generated/types/internal_server_error_body.py +0 -49
- mirascope/api/_generated/types/issue.py +0 -38
- mirascope/api/_generated/types/issue_tag.py +0 -10
- mirascope/api/_generated/types/not_found_error_body.py +0 -22
- mirascope/api/_generated/types/not_found_error_tag.py +0 -5
- mirascope/api/_generated/types/number_from_string.py +0 -3
- mirascope/api/_generated/types/permission_denied_error.py +0 -22
- mirascope/api/_generated/types/permission_denied_error_tag.py +0 -5
- mirascope/api/_generated/types/plan_limit_exceeded_error.py +0 -32
- mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +0 -7
- mirascope/api/_generated/types/pricing_unavailable_error.py +0 -23
- mirascope/api/_generated/types/property_key.py +0 -7
- mirascope/api/_generated/types/property_key_key.py +0 -25
- mirascope/api/_generated/types/property_key_key_tag.py +0 -5
- mirascope/api/_generated/types/rate_limit_error.py +0 -31
- mirascope/api/_generated/types/rate_limit_error_tag.py +0 -5
- mirascope/api/_generated/types/service_unavailable_error_body.py +0 -24
- mirascope/api/_generated/types/service_unavailable_error_tag.py +0 -7
- mirascope/api/_generated/types/stripe_error.py +0 -20
- mirascope/api/_generated/types/subscription_past_due_error.py +0 -31
- mirascope/api/_generated/types/subscription_past_due_error_tag.py +0 -7
- mirascope/api/_generated/types/unauthorized_error_body.py +0 -21
- mirascope/api/_generated/types/unauthorized_error_tag.py +0 -5
- mirascope/api/client.py +0 -255
- mirascope/api/settings.py +0 -99
- mirascope/llm/formatting/output_parser.py +0 -178
- mirascope/llm/formatting/primitives.py +0 -192
- mirascope/llm/mcp/mcp_client.py +0 -130
- mirascope/llm/messages/_utils.py +0 -34
- mirascope/llm/models/thinking_config.py +0 -61
- mirascope/llm/prompts/prompts.py +0 -487
- mirascope/llm/providers/__init__.py +0 -62
- mirascope/llm/providers/anthropic/__init__.py +0 -11
- mirascope/llm/providers/anthropic/_utils/__init__.py +0 -27
- mirascope/llm/providers/anthropic/_utils/beta_decode.py +0 -282
- mirascope/llm/providers/anthropic/_utils/beta_encode.py +0 -266
- mirascope/llm/providers/anthropic/_utils/encode.py +0 -418
- mirascope/llm/providers/anthropic/_utils/errors.py +0 -46
- mirascope/llm/providers/anthropic/beta_provider.py +0 -374
- mirascope/llm/providers/anthropic/model_id.py +0 -23
- mirascope/llm/providers/anthropic/model_info.py +0 -87
- mirascope/llm/providers/anthropic/provider.py +0 -479
- mirascope/llm/providers/google/__init__.py +0 -6
- mirascope/llm/providers/google/_utils/errors.py +0 -50
- mirascope/llm/providers/google/model_id.py +0 -22
- mirascope/llm/providers/google/model_info.py +0 -63
- mirascope/llm/providers/google/provider.py +0 -492
- mirascope/llm/providers/mirascope/__init__.py +0 -5
- mirascope/llm/providers/mirascope/_utils.py +0 -73
- mirascope/llm/providers/mirascope/provider.py +0 -349
- mirascope/llm/providers/mlx/__init__.py +0 -9
- mirascope/llm/providers/mlx/_utils.py +0 -141
- mirascope/llm/providers/mlx/encoding/__init__.py +0 -8
- mirascope/llm/providers/mlx/encoding/base.py +0 -72
- mirascope/llm/providers/mlx/encoding/transformers.py +0 -150
- mirascope/llm/providers/mlx/mlx.py +0 -254
- mirascope/llm/providers/mlx/model_id.py +0 -17
- mirascope/llm/providers/mlx/provider.py +0 -452
- mirascope/llm/providers/model_id.py +0 -16
- mirascope/llm/providers/ollama/__init__.py +0 -7
- mirascope/llm/providers/ollama/provider.py +0 -71
- mirascope/llm/providers/openai/__init__.py +0 -15
- mirascope/llm/providers/openai/_utils/__init__.py +0 -5
- mirascope/llm/providers/openai/_utils/errors.py +0 -46
- mirascope/llm/providers/openai/completions/__init__.py +0 -7
- mirascope/llm/providers/openai/completions/base_provider.py +0 -542
- mirascope/llm/providers/openai/completions/provider.py +0 -22
- mirascope/llm/providers/openai/model_id.py +0 -31
- mirascope/llm/providers/openai/model_info.py +0 -303
- mirascope/llm/providers/openai/provider.py +0 -441
- mirascope/llm/providers/openai/responses/__init__.py +0 -5
- mirascope/llm/providers/openai/responses/provider.py +0 -513
- mirascope/llm/providers/provider_id.py +0 -24
- mirascope/llm/providers/provider_registry.py +0 -299
- mirascope/llm/providers/together/__init__.py +0 -7
- mirascope/llm/providers/together/provider.py +0 -40
- mirascope/llm/responses/usage.py +0 -95
- mirascope/ops/__init__.py +0 -111
- mirascope/ops/_internal/__init__.py +0 -5
- mirascope/ops/_internal/closure.py +0 -1169
- mirascope/ops/_internal/configuration.py +0 -177
- mirascope/ops/_internal/context.py +0 -76
- mirascope/ops/_internal/exporters/__init__.py +0 -26
- mirascope/ops/_internal/exporters/exporters.py +0 -395
- mirascope/ops/_internal/exporters/processors.py +0 -104
- mirascope/ops/_internal/exporters/types.py +0 -165
- mirascope/ops/_internal/exporters/utils.py +0 -29
- mirascope/ops/_internal/instrumentation/__init__.py +0 -8
- mirascope/ops/_internal/instrumentation/llm/__init__.py +0 -8
- mirascope/ops/_internal/instrumentation/llm/common.py +0 -530
- mirascope/ops/_internal/instrumentation/llm/cost.py +0 -190
- mirascope/ops/_internal/instrumentation/llm/encode.py +0 -238
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/__init__.py +0 -38
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_input_messages.py +0 -31
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_output_messages.py +0 -38
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/gen_ai_system_instructions.py +0 -18
- mirascope/ops/_internal/instrumentation/llm/gen_ai_types/shared.py +0 -100
- mirascope/ops/_internal/instrumentation/llm/llm.py +0 -161
- mirascope/ops/_internal/instrumentation/llm/model.py +0 -1798
- mirascope/ops/_internal/instrumentation/llm/response.py +0 -521
- mirascope/ops/_internal/instrumentation/llm/serialize.py +0 -300
- mirascope/ops/_internal/propagation.py +0 -198
- mirascope/ops/_internal/protocols.py +0 -133
- mirascope/ops/_internal/session.py +0 -139
- mirascope/ops/_internal/spans.py +0 -232
- mirascope/ops/_internal/traced_calls.py +0 -375
- mirascope/ops/_internal/traced_functions.py +0 -523
- mirascope/ops/_internal/tracing.py +0 -353
- mirascope/ops/_internal/types.py +0 -13
- mirascope/ops/_internal/utils.py +0 -123
- mirascope/ops/_internal/versioned_calls.py +0 -512
- mirascope/ops/_internal/versioned_functions.py +0 -357
- mirascope/ops/_internal/versioning.py +0 -303
- mirascope/ops/exceptions.py +0 -21
- mirascope-2.0.0.dist-info/RECORD +0 -423
- /mirascope/llm/{providers → clients}/base/kwargs.py +0 -0
- /mirascope/llm/{providers → clients}/google/message.py +0 -0
mirascope/llm/tools/decorator.py
CHANGED
|
@@ -14,24 +14,20 @@ from .tools import AsyncContextTool, AsyncTool, ContextTool, Tool
|
|
|
14
14
|
class ToolDecorator:
|
|
15
15
|
"""Protocol for the tool decorator."""
|
|
16
16
|
|
|
17
|
-
strict: bool
|
|
18
|
-
"""Whether to use strict tool calling, if supported by the provider.
|
|
19
|
-
|
|
20
|
-
If set to None, then it will use the provider's default setting (usually the
|
|
21
|
-
strictest possible).
|
|
22
|
-
"""
|
|
17
|
+
strict: bool
|
|
18
|
+
"""Whether to use strict tool calling, if supported by the provider."""
|
|
23
19
|
|
|
24
20
|
@overload
|
|
25
21
|
def __call__( # pyright:ignore[reportOverlappingOverload]
|
|
26
22
|
self, fn: ContextToolFn[DepsT, P, JsonableCovariantT]
|
|
27
|
-
) -> ContextTool[DepsT,
|
|
23
|
+
) -> ContextTool[DepsT, P, JsonableCovariantT]:
|
|
28
24
|
"""Call the decorator with a context function."""
|
|
29
25
|
...
|
|
30
26
|
|
|
31
27
|
@overload
|
|
32
28
|
def __call__( # pyright:ignore[reportOverlappingOverload]
|
|
33
29
|
self, fn: AsyncContextToolFn[DepsT, P, JsonableCovariantT]
|
|
34
|
-
) -> AsyncContextTool[DepsT,
|
|
30
|
+
) -> AsyncContextTool[DepsT, P, JsonableCovariantT]:
|
|
35
31
|
"""Call the decorator with an async context function."""
|
|
36
32
|
...
|
|
37
33
|
|
|
@@ -56,8 +52,8 @@ class ToolDecorator:
|
|
|
56
52
|
| ToolFn[P, JsonableCovariantT]
|
|
57
53
|
| AsyncToolFn[P, JsonableCovariantT],
|
|
58
54
|
) -> (
|
|
59
|
-
ContextTool[DepsT,
|
|
60
|
-
| AsyncContextTool[DepsT,
|
|
55
|
+
ContextTool[DepsT, P, JsonableCovariantT]
|
|
56
|
+
| AsyncContextTool[DepsT, P, JsonableCovariantT]
|
|
61
57
|
| Tool[P, JsonableCovariantT]
|
|
62
58
|
| AsyncTool[P, JsonableCovariantT]
|
|
63
59
|
):
|
|
@@ -66,25 +62,21 @@ class ToolDecorator:
|
|
|
66
62
|
is_async = _tool_utils.is_async_tool_fn(fn)
|
|
67
63
|
|
|
68
64
|
if is_context and is_async:
|
|
69
|
-
return AsyncContextTool[DepsT,
|
|
65
|
+
return AsyncContextTool[DepsT, P, JsonableCovariantT](
|
|
70
66
|
fn, strict=self.strict
|
|
71
67
|
)
|
|
72
68
|
elif is_context:
|
|
73
|
-
return ContextTool[DepsT, JsonableCovariantT,
|
|
74
|
-
fn, strict=self.strict
|
|
75
|
-
)
|
|
69
|
+
return ContextTool[DepsT, P, JsonableCovariantT](fn, strict=self.strict)
|
|
76
70
|
elif is_async:
|
|
77
|
-
return AsyncTool[P, JsonableCovariantT].
|
|
78
|
-
fn, strict=self.strict
|
|
79
|
-
)
|
|
71
|
+
return AsyncTool[P, JsonableCovariantT](fn, strict=self.strict)
|
|
80
72
|
else:
|
|
81
|
-
return Tool[P, JsonableCovariantT]
|
|
73
|
+
return Tool[P, JsonableCovariantT](fn, strict=self.strict)
|
|
82
74
|
|
|
83
75
|
|
|
84
76
|
@overload
|
|
85
77
|
def tool( # pyright:ignore[reportOverlappingOverload]
|
|
86
78
|
__fn: AsyncContextToolFn[DepsT, P, JsonableCovariantT],
|
|
87
|
-
) -> AsyncContextTool[DepsT,
|
|
79
|
+
) -> AsyncContextTool[DepsT, P, JsonableCovariantT]:
|
|
88
80
|
"""Overload for async context tool functions."""
|
|
89
81
|
...
|
|
90
82
|
|
|
@@ -92,7 +84,7 @@ def tool( # pyright:ignore[reportOverlappingOverload]
|
|
|
92
84
|
@overload
|
|
93
85
|
def tool( # pyright:ignore[reportOverlappingOverload]
|
|
94
86
|
__fn: ContextToolFn[DepsT, P, JsonableCovariantT],
|
|
95
|
-
) -> ContextTool[DepsT,
|
|
87
|
+
) -> ContextTool[DepsT, P, JsonableCovariantT]:
|
|
96
88
|
"""Overload for context tool functions."""
|
|
97
89
|
...
|
|
98
90
|
|
|
@@ -110,7 +102,7 @@ def tool(__fn: ToolFn[P, JsonableCovariantT]) -> Tool[P, JsonableCovariantT]:
|
|
|
110
102
|
|
|
111
103
|
|
|
112
104
|
@overload
|
|
113
|
-
def tool(*, strict: bool
|
|
105
|
+
def tool(*, strict: bool = False) -> ToolDecorator:
|
|
114
106
|
"""Overload for setting non-default arguments."""
|
|
115
107
|
...
|
|
116
108
|
|
|
@@ -122,10 +114,10 @@ def tool(
|
|
|
122
114
|
| AsyncToolFn[P, JsonableCovariantT]
|
|
123
115
|
| None = None,
|
|
124
116
|
*,
|
|
125
|
-
strict: bool
|
|
117
|
+
strict: bool = False,
|
|
126
118
|
) -> (
|
|
127
|
-
ContextTool[DepsT,
|
|
128
|
-
| AsyncContextTool[DepsT,
|
|
119
|
+
ContextTool[DepsT, P, JsonableCovariantT]
|
|
120
|
+
| AsyncContextTool[DepsT, P, JsonableCovariantT]
|
|
129
121
|
| Tool[P, JsonableCovariantT]
|
|
130
122
|
| AsyncTool[P, JsonableCovariantT]
|
|
131
123
|
| ToolDecorator
|
|
@@ -141,7 +133,6 @@ def tool(
|
|
|
141
133
|
|
|
142
134
|
Args:
|
|
143
135
|
strict: Whether the tool should use strict mode when supported by the model.
|
|
144
|
-
If None, uses provider's default (usually as strict as possible).
|
|
145
136
|
|
|
146
137
|
Returns:
|
|
147
138
|
A decorator function that converts the function into a Tool or ContextTool.
|
mirascope/llm/tools/protocols.py
CHANGED
|
@@ -52,7 +52,7 @@ class AsyncContextToolFn(Protocol[DepsT, P, JsonableCovariantT]):
|
|
|
52
52
|
raise NotImplementedError()
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
class
|
|
55
|
+
class _KwargsCallable(Protocol[JsonableCovariantT]):
|
|
56
56
|
"""Protocol for functions that can be called with `Any`-typed kwargs.
|
|
57
57
|
|
|
58
58
|
Used internally to type-cast tool functions for compatibility with
|
|
@@ -62,7 +62,7 @@ class KwargsCallable(Protocol[JsonableCovariantT]):
|
|
|
62
62
|
def __call__(self, **kwargs: dict[str, Any]) -> JsonableCovariantT: ...
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
class
|
|
65
|
+
class _AsyncKwargsCallable(Protocol[JsonableCovariantT]):
|
|
66
66
|
"""Protocol for async functions that can be called with `Any`-typed kwargs.
|
|
67
67
|
|
|
68
68
|
Used internally to type-cast async tool functions for compatibility with
|
|
@@ -72,7 +72,7 @@ class AsyncKwargsCallable(Protocol[JsonableCovariantT]):
|
|
|
72
72
|
async def __call__(self, **kwargs: dict[str, Any]) -> JsonableCovariantT: ...
|
|
73
73
|
|
|
74
74
|
|
|
75
|
-
class
|
|
75
|
+
class _ContextKwargsCallable(Protocol[DepsT, JsonableCovariantT]):
|
|
76
76
|
"""Protocol for context functions that can be called with `Any`-typed kwargs.
|
|
77
77
|
|
|
78
78
|
Used internally to type-cast context tool functions for compatibility with
|
|
@@ -84,7 +84,7 @@ class ContextKwargsCallable(Protocol[DepsT, JsonableCovariantT]):
|
|
|
84
84
|
) -> JsonableCovariantT: ...
|
|
85
85
|
|
|
86
86
|
|
|
87
|
-
class
|
|
87
|
+
class _AsyncJsonKwargsCallable(Protocol[DepsT, JsonableCovariantT]):
|
|
88
88
|
"""Protocol for async context functions that can be called with `Any`-typed kwargs.
|
|
89
89
|
|
|
90
90
|
Used internally to type-cast async context tool functions for compatibility with
|
|
@@ -3,16 +3,13 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import inspect
|
|
6
|
+
from collections import namedtuple
|
|
6
7
|
from dataclasses import dataclass
|
|
7
8
|
from typing import (
|
|
8
9
|
Annotated,
|
|
9
10
|
Any,
|
|
10
11
|
Generic,
|
|
11
|
-
NamedTuple,
|
|
12
|
-
TypeAlias,
|
|
13
|
-
TypedDict,
|
|
14
12
|
TypeVar,
|
|
15
|
-
cast,
|
|
16
13
|
get_args,
|
|
17
14
|
get_origin,
|
|
18
15
|
get_type_hints,
|
|
@@ -23,48 +20,16 @@ from pydantic import BaseModel, Field, create_model
|
|
|
23
20
|
from pydantic.fields import FieldInfo
|
|
24
21
|
|
|
25
22
|
from ..content import ToolCall
|
|
26
|
-
from ..types import Jsonable
|
|
27
23
|
from .protocols import AsyncContextToolFn, AsyncToolFn, ContextToolFn, ToolFn
|
|
28
24
|
|
|
29
|
-
AnyToolFn: TypeAlias = (
|
|
30
|
-
ToolFn[..., Jsonable]
|
|
31
|
-
| AsyncToolFn[..., Jsonable]
|
|
32
|
-
| ContextToolFn[Any, ..., Jsonable]
|
|
33
|
-
| AsyncContextToolFn[Any, ..., Jsonable]
|
|
34
|
-
)
|
|
35
|
-
|
|
36
25
|
ToolFnT = TypeVar(
|
|
37
26
|
"ToolFnT",
|
|
38
|
-
bound=
|
|
27
|
+
bound=ToolFn | AsyncToolFn | ContextToolFn | AsyncContextToolFn,
|
|
39
28
|
covariant=True,
|
|
40
29
|
)
|
|
30
|
+
ToolSchemaT = TypeVar("ToolSchemaT", bound="ToolSchema")
|
|
41
31
|
|
|
42
|
-
|
|
43
|
-
ToolSchemaT = TypeVar("ToolSchemaT", bound=AnyToolSchema, covariant=True)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
ModelJsonSchema = TypedDict(
|
|
47
|
-
"ModelJsonSchema",
|
|
48
|
-
{
|
|
49
|
-
"properties": dict[str, dict[str, Any]],
|
|
50
|
-
"required": list[str],
|
|
51
|
-
"$defs": dict[str, dict[str, Any]],
|
|
52
|
-
},
|
|
53
|
-
total=False,
|
|
54
|
-
)
|
|
55
|
-
"""Type for Pydantic's model_json_schema() output.
|
|
56
|
-
|
|
57
|
-
This TypedDict defines the structure of JSON schemas returned by Pydantic models,
|
|
58
|
-
allowing us to avoid type casts when extracting schema components.
|
|
59
|
-
"""
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
class DocstringArg(NamedTuple):
|
|
63
|
-
"""A parameter from a docstring."""
|
|
64
|
-
|
|
65
|
-
name: str
|
|
66
|
-
description: str
|
|
67
|
-
|
|
32
|
+
DocstringArg = namedtuple("DocstringArg", ["name", "description"])
|
|
68
33
|
|
|
69
34
|
FORMAT_TOOL_NAME = "__mirascope_formatted_output_tool__"
|
|
70
35
|
"""Reserved name of the formatted output tool.
|
|
@@ -98,7 +63,7 @@ def _parse_docstring_params(docstring: str | None) -> ParsedDocstring:
|
|
|
98
63
|
return ParsedDocstring(args=[])
|
|
99
64
|
|
|
100
65
|
parsed = parse(docstring)
|
|
101
|
-
args
|
|
66
|
+
args = []
|
|
102
67
|
|
|
103
68
|
for param in parsed.params:
|
|
104
69
|
if param.description:
|
|
@@ -157,12 +122,8 @@ class ToolSchema(Generic[ToolFnT]):
|
|
|
157
122
|
it should **not be modified** after the ToolSchema is created.
|
|
158
123
|
"""
|
|
159
124
|
|
|
160
|
-
strict: bool
|
|
161
|
-
"""Whether the tool should use strict mode when supported by the model.
|
|
162
|
-
|
|
163
|
-
If set to None, will use the provider's default setting (usually as strict as
|
|
164
|
-
possible).
|
|
165
|
-
"""
|
|
125
|
+
strict: bool
|
|
126
|
+
"""Whether the tool should use strict mode when supported by the model."""
|
|
166
127
|
|
|
167
128
|
def __hash__(self) -> int:
|
|
168
129
|
if not hasattr(self, "_hash"):
|
|
@@ -179,36 +140,10 @@ class ToolSchema(Generic[ToolFnT]):
|
|
|
179
140
|
def __init__(
|
|
180
141
|
self,
|
|
181
142
|
fn: ToolFnT,
|
|
182
|
-
name: str,
|
|
183
|
-
description: str,
|
|
184
|
-
parameters: ToolParameterSchema,
|
|
185
143
|
*,
|
|
186
|
-
strict: bool
|
|
187
|
-
) -> None:
|
|
188
|
-
"""Create a `ToolSchema` with the provided values.
|
|
189
|
-
|
|
190
|
-
Args:
|
|
191
|
-
fn: The function that implements the tool's functionality
|
|
192
|
-
name: The name of the tool
|
|
193
|
-
description: Description of what the tool does
|
|
194
|
-
parameters: JSON Schema describing the parameters accepted by the tool
|
|
195
|
-
strict: Whether the tool should use strict mode when supported.
|
|
196
|
-
If None, uses provider's default (usually as strict as possible).
|
|
197
|
-
"""
|
|
198
|
-
self.fn = fn
|
|
199
|
-
self.name = name
|
|
200
|
-
self.description = description
|
|
201
|
-
self.parameters = parameters
|
|
202
|
-
self.strict = strict
|
|
203
|
-
|
|
204
|
-
@classmethod
|
|
205
|
-
def from_function(
|
|
206
|
-
cls,
|
|
207
|
-
fn: AnyToolFn,
|
|
208
|
-
*,
|
|
209
|
-
strict: bool | None = None,
|
|
144
|
+
strict: bool = False,
|
|
210
145
|
is_context_tool: bool = False,
|
|
211
|
-
) ->
|
|
146
|
+
) -> None:
|
|
212
147
|
"""Create a `ToolSchema` by inspecting a function and its docstring.
|
|
213
148
|
|
|
214
149
|
Uses Pydantic's create_model to dynamically build a model from the function
|
|
@@ -217,8 +152,7 @@ class ToolSchema(Generic[ToolFnT]):
|
|
|
217
152
|
|
|
218
153
|
Args:
|
|
219
154
|
fn: The function to extract schema from
|
|
220
|
-
strict: Whether the tool should use strict mode when supported
|
|
221
|
-
If None, uses provider's default (usually as strict as possible).
|
|
155
|
+
strict: Whether the tool should use strict mode when supported
|
|
222
156
|
is_context_tool: Whether this is a context tool (skips the context parameter)
|
|
223
157
|
|
|
224
158
|
Returns:
|
|
@@ -236,7 +170,7 @@ class ToolSchema(Generic[ToolFnT]):
|
|
|
236
170
|
|
|
237
171
|
param_descriptions = _parse_docstring_params(fn.__doc__)
|
|
238
172
|
|
|
239
|
-
field_definitions
|
|
173
|
+
field_definitions = {}
|
|
240
174
|
hints = get_type_hints(fn, include_extras=True)
|
|
241
175
|
|
|
242
176
|
context_param_skipped = False
|
|
@@ -269,7 +203,7 @@ class ToolSchema(Generic[ToolFnT]):
|
|
|
269
203
|
description=field_info.description,
|
|
270
204
|
)
|
|
271
205
|
else:
|
|
272
|
-
docstring_description
|
|
206
|
+
docstring_description = None
|
|
273
207
|
for arg in param_descriptions.args:
|
|
274
208
|
if arg.name == param.name:
|
|
275
209
|
docstring_description = arg.description
|
|
@@ -283,9 +217,9 @@ class ToolSchema(Generic[ToolFnT]):
|
|
|
283
217
|
|
|
284
218
|
field_definitions[param.name] = (param_type, field_value)
|
|
285
219
|
|
|
286
|
-
TempModel = create_model("TempModel", **
|
|
220
|
+
TempModel = create_model("TempModel", **field_definitions)
|
|
287
221
|
|
|
288
|
-
schema =
|
|
222
|
+
schema = TempModel.model_json_schema()
|
|
289
223
|
|
|
290
224
|
parameters = ToolParameterSchema(
|
|
291
225
|
properties=schema.get("properties", {}),
|
|
@@ -295,13 +229,11 @@ class ToolSchema(Generic[ToolFnT]):
|
|
|
295
229
|
if "$defs" in schema:
|
|
296
230
|
parameters.defs = schema["$defs"]
|
|
297
231
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
strict=strict,
|
|
304
|
-
)
|
|
232
|
+
self.fn = fn
|
|
233
|
+
self.name = name
|
|
234
|
+
self.description = description
|
|
235
|
+
self.parameters = parameters
|
|
236
|
+
self.strict = strict
|
|
305
237
|
|
|
306
238
|
def can_execute(self, tool_call: ToolCall) -> bool:
|
|
307
239
|
"""Check if a `ToolCall` can be executed by tools with this `ToolSchema`.
|
mirascope/llm/tools/toolkit.py
CHANGED
|
@@ -60,7 +60,7 @@ class BaseToolkit(Generic[ToolSchemaT]):
|
|
|
60
60
|
"""
|
|
61
61
|
tool = self.tools_dict.get(tool_call.name, None)
|
|
62
62
|
if not tool:
|
|
63
|
-
raise ToolNotFoundError(tool_call.name)
|
|
63
|
+
raise ToolNotFoundError(f"Tool not found in toolkit: {tool_call.name}")
|
|
64
64
|
return tool
|
|
65
65
|
|
|
66
66
|
|
|
@@ -75,14 +75,12 @@ class Toolkit(BaseToolkit[Tool]):
|
|
|
75
75
|
|
|
76
76
|
Returns:
|
|
77
77
|
The output from executing the `Tool`.
|
|
78
|
+
|
|
79
|
+
Raises:
|
|
80
|
+
ToolNotFoundError: If the requested tool is not found.
|
|
78
81
|
"""
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return tool.execute(tool_call)
|
|
82
|
-
except ToolNotFoundError as e:
|
|
83
|
-
return ToolOutput(
|
|
84
|
-
id=tool_call.id, result=str(e), error=e, name=tool_call.name
|
|
85
|
-
)
|
|
82
|
+
tool = self.get(tool_call)
|
|
83
|
+
return tool.execute(tool_call)
|
|
86
84
|
|
|
87
85
|
|
|
88
86
|
class AsyncToolkit(BaseToolkit[AsyncTool]):
|
|
@@ -96,14 +94,12 @@ class AsyncToolkit(BaseToolkit[AsyncTool]):
|
|
|
96
94
|
|
|
97
95
|
Returns:
|
|
98
96
|
The output from executing the `AsyncTool`.
|
|
97
|
+
|
|
98
|
+
Raises:
|
|
99
|
+
ToolNotFoundError: If the requested tool is not found.
|
|
99
100
|
"""
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return await tool.execute(tool_call)
|
|
103
|
-
except ToolNotFoundError as e:
|
|
104
|
-
return ToolOutput(
|
|
105
|
-
id=tool_call.id, result=str(e), error=e, name=tool_call.name
|
|
106
|
-
)
|
|
101
|
+
tool = self.get(tool_call)
|
|
102
|
+
return await tool.execute(tool_call)
|
|
107
103
|
|
|
108
104
|
|
|
109
105
|
class ContextToolkit(BaseToolkit[Tool | ContextTool[DepsT]], Generic[DepsT]):
|
|
@@ -118,17 +114,15 @@ class ContextToolkit(BaseToolkit[Tool | ContextTool[DepsT]], Generic[DepsT]):
|
|
|
118
114
|
|
|
119
115
|
Returns:
|
|
120
116
|
The output from executing the `ContextTool`.
|
|
117
|
+
|
|
118
|
+
Raises:
|
|
119
|
+
ToolNotFoundError: If the requested tool is not found.
|
|
121
120
|
"""
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return tool.execute(tool_call)
|
|
128
|
-
except ToolNotFoundError as e:
|
|
129
|
-
return ToolOutput(
|
|
130
|
-
id=tool_call.id, result=str(e), error=e, name=tool_call.name
|
|
131
|
-
)
|
|
121
|
+
tool = self.get(tool_call)
|
|
122
|
+
if isinstance(tool, ContextTool):
|
|
123
|
+
return tool.execute(ctx, tool_call)
|
|
124
|
+
else:
|
|
125
|
+
return tool.execute(tool_call)
|
|
132
126
|
|
|
133
127
|
|
|
134
128
|
class AsyncContextToolkit(
|
|
@@ -147,14 +141,12 @@ class AsyncContextToolkit(
|
|
|
147
141
|
|
|
148
142
|
Returns:
|
|
149
143
|
The output from executing the `AsyncContextTool`.
|
|
144
|
+
|
|
145
|
+
Raises:
|
|
146
|
+
ToolNotFoundError: If the requested tool is not found.
|
|
150
147
|
"""
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return await tool.execute(tool_call)
|
|
157
|
-
except ToolNotFoundError as e:
|
|
158
|
-
return ToolOutput(
|
|
159
|
-
id=tool_call.id, result=str(e), error=e, name=tool_call.name
|
|
160
|
-
)
|
|
148
|
+
tool = self.get(tool_call)
|
|
149
|
+
if isinstance(tool, AsyncContextTool):
|
|
150
|
+
return await tool.execute(ctx, tool_call)
|
|
151
|
+
else:
|
|
152
|
+
return await tool.execute(tool_call)
|