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
|
@@ -5,30 +5,29 @@ python functions.
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
from . import _utils
|
|
8
|
-
from .decorator import
|
|
9
|
-
from .
|
|
8
|
+
from .decorator import prompt
|
|
9
|
+
from .protocols import (
|
|
10
10
|
AsyncContextPrompt,
|
|
11
|
+
AsyncContextPromptable,
|
|
11
12
|
AsyncPrompt,
|
|
13
|
+
AsyncPromptable,
|
|
12
14
|
ContextPrompt,
|
|
15
|
+
ContextPromptable,
|
|
13
16
|
Prompt,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
AsyncContextMessageTemplate,
|
|
17
|
-
AsyncMessageTemplate,
|
|
18
|
-
ContextMessageTemplate,
|
|
19
|
-
MessageTemplate,
|
|
17
|
+
Promptable,
|
|
18
|
+
PromptT,
|
|
20
19
|
)
|
|
21
20
|
|
|
22
21
|
__all__ = [
|
|
23
|
-
"AsyncContextMessageTemplate",
|
|
24
22
|
"AsyncContextPrompt",
|
|
25
|
-
"
|
|
23
|
+
"AsyncContextPromptable",
|
|
26
24
|
"AsyncPrompt",
|
|
27
|
-
"
|
|
25
|
+
"AsyncPromptable",
|
|
28
26
|
"ContextPrompt",
|
|
29
|
-
"
|
|
27
|
+
"ContextPromptable",
|
|
30
28
|
"Prompt",
|
|
31
|
-
"
|
|
29
|
+
"PromptT",
|
|
30
|
+
"Promptable",
|
|
32
31
|
"_utils",
|
|
33
32
|
"prompt",
|
|
34
33
|
]
|
mirascope/llm/prompts/_utils.py
CHANGED
|
@@ -2,30 +2,59 @@ import inspect
|
|
|
2
2
|
from typing_extensions import TypeIs
|
|
3
3
|
|
|
4
4
|
from ..context import DepsT, _utils as _context_utils
|
|
5
|
+
from ..messages import (
|
|
6
|
+
AssistantMessage,
|
|
7
|
+
Message,
|
|
8
|
+
SystemMessage,
|
|
9
|
+
UserContent,
|
|
10
|
+
UserMessage,
|
|
11
|
+
user,
|
|
12
|
+
)
|
|
5
13
|
from ..types import P
|
|
6
14
|
from .protocols import (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
AsyncContextPromptable,
|
|
16
|
+
AsyncPromptable,
|
|
17
|
+
ContextPromptable,
|
|
18
|
+
Promptable,
|
|
11
19
|
)
|
|
12
20
|
|
|
13
21
|
|
|
22
|
+
def is_messages(
|
|
23
|
+
messages_or_content: list[Message] | UserContent,
|
|
24
|
+
) -> TypeIs[list[Message]]:
|
|
25
|
+
if not messages_or_content:
|
|
26
|
+
raise ValueError("Prompt returned empty content")
|
|
27
|
+
return isinstance(messages_or_content, list) and isinstance(
|
|
28
|
+
messages_or_content[0], SystemMessage | UserMessage | AssistantMessage
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def promote_to_messages(result: list[Message] | UserContent) -> list[Message]:
|
|
33
|
+
"""Promote a prompt result to a list of messages.
|
|
34
|
+
|
|
35
|
+
If the result is already a list of Messages, returns it as-is.
|
|
36
|
+
If the result is UserContent, wraps it in a single user message.
|
|
37
|
+
"""
|
|
38
|
+
if is_messages(result):
|
|
39
|
+
return result
|
|
40
|
+
return [user(result)]
|
|
41
|
+
|
|
42
|
+
|
|
14
43
|
def is_context_promptable(
|
|
15
|
-
fn:
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
) -> TypeIs[
|
|
44
|
+
fn: ContextPromptable[P, DepsT]
|
|
45
|
+
| AsyncContextPromptable[P, DepsT]
|
|
46
|
+
| Promptable[P]
|
|
47
|
+
| AsyncPromptable[P],
|
|
48
|
+
) -> TypeIs[ContextPromptable[P, DepsT] | AsyncContextPromptable[P, DepsT]]:
|
|
20
49
|
"""Type guard to check if a function is a context promptable function."""
|
|
21
50
|
return _context_utils.first_param_is_context(fn)
|
|
22
51
|
|
|
23
52
|
|
|
24
53
|
def is_async_promptable(
|
|
25
|
-
fn:
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
) -> TypeIs[
|
|
54
|
+
fn: ContextPromptable[P, DepsT]
|
|
55
|
+
| AsyncContextPromptable[P, DepsT]
|
|
56
|
+
| Promptable[P]
|
|
57
|
+
| AsyncPromptable[P],
|
|
58
|
+
) -> TypeIs[AsyncPromptable[P] | AsyncContextPromptable[P, DepsT]]:
|
|
30
59
|
"""Type guard to check if a function is an async promptable function."""
|
|
31
60
|
return inspect.iscoroutinefunction(fn)
|
|
@@ -1,170 +1,196 @@
|
|
|
1
1
|
"""The `prompt` decorator for writing messages as string templates."""
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
from ..
|
|
7
|
-
|
|
8
|
-
from ..tools import (
|
|
9
|
-
AsyncContextTool,
|
|
10
|
-
AsyncContextToolkit,
|
|
11
|
-
AsyncTool,
|
|
12
|
-
AsyncToolkit,
|
|
13
|
-
ContextTool,
|
|
14
|
-
ContextToolkit,
|
|
15
|
-
Tool,
|
|
16
|
-
Toolkit,
|
|
17
|
-
ToolT,
|
|
3
|
+
from typing import overload
|
|
4
|
+
|
|
5
|
+
from ..context import Context, DepsT
|
|
6
|
+
from ..messages import (
|
|
7
|
+
Message,
|
|
18
8
|
)
|
|
19
9
|
from ..types import P
|
|
20
10
|
from . import _utils
|
|
21
|
-
from .
|
|
11
|
+
from .protocols import (
|
|
22
12
|
AsyncContextPrompt,
|
|
13
|
+
AsyncContextPromptable,
|
|
23
14
|
AsyncPrompt,
|
|
15
|
+
AsyncPromptable,
|
|
24
16
|
ContextPrompt,
|
|
17
|
+
ContextPromptable,
|
|
25
18
|
Prompt,
|
|
19
|
+
Promptable,
|
|
26
20
|
)
|
|
27
|
-
from .protocols import (
|
|
28
|
-
AsyncContextMessageTemplate,
|
|
29
|
-
AsyncMessageTemplate,
|
|
30
|
-
ContextMessageTemplate,
|
|
31
|
-
MessageTemplate,
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class PromptDecorator(Generic[ToolT, FormattableT]):
|
|
36
|
-
"""Decorator for converting a `MessageTemplate` into a `Prompt`.
|
|
37
|
-
|
|
38
|
-
Takes a raw prompt function that returns message content and wraps it with
|
|
39
|
-
tools and format support, creating a `Prompt` that can be called with a model.
|
|
40
|
-
|
|
41
|
-
The decorator automatically detects whether the function is async or context-aware
|
|
42
|
-
and creates the appropriate Prompt variant (Prompt, AsyncPrompt, ContextPrompt,
|
|
43
|
-
or AsyncContextPrompt).
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
tools: Sequence[ToolT] | None
|
|
47
|
-
"""The tools that are included in the prompt, if any."""
|
|
48
21
|
|
|
49
|
-
format: (
|
|
50
|
-
type[FormattableT] | Format[FormattableT] | OutputParser[FormattableT] | None
|
|
51
|
-
)
|
|
52
|
-
"""The structured output format off the prompt, if any."""
|
|
53
22
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
tools: Sequence[ToolT] | None = None,
|
|
57
|
-
format: type[FormattableT]
|
|
58
|
-
| Format[FormattableT]
|
|
59
|
-
| OutputParser[FormattableT]
|
|
60
|
-
| None = None,
|
|
61
|
-
) -> None:
|
|
62
|
-
"""Initialize the decorator with optional tools and format."""
|
|
63
|
-
self.tools = tools
|
|
64
|
-
self.format = format
|
|
23
|
+
class PromptDecorator:
|
|
24
|
+
"""Protocol for the `prompt` decorator when used without a template."""
|
|
65
25
|
|
|
66
26
|
@overload
|
|
67
27
|
def __call__(
|
|
68
|
-
self
|
|
69
|
-
fn:
|
|
70
|
-
) ->
|
|
71
|
-
"""Decorator for creating
|
|
28
|
+
self,
|
|
29
|
+
fn: ContextPromptable[P, DepsT],
|
|
30
|
+
) -> ContextPrompt[P, DepsT]:
|
|
31
|
+
"""Decorator for creating context prompts."""
|
|
72
32
|
...
|
|
73
33
|
|
|
74
34
|
@overload
|
|
75
35
|
def __call__(
|
|
76
|
-
self
|
|
77
|
-
fn:
|
|
78
|
-
) ->
|
|
79
|
-
"""Decorator for creating context prompts."""
|
|
36
|
+
self,
|
|
37
|
+
fn: AsyncContextPromptable[P, DepsT],
|
|
38
|
+
) -> AsyncContextPrompt[P, DepsT]:
|
|
39
|
+
"""Decorator for creating async context prompts."""
|
|
80
40
|
...
|
|
81
41
|
|
|
82
42
|
@overload
|
|
83
43
|
def __call__(
|
|
84
|
-
self
|
|
85
|
-
fn:
|
|
86
|
-
) ->
|
|
87
|
-
"""Decorator for creating
|
|
44
|
+
self,
|
|
45
|
+
fn: Promptable[P],
|
|
46
|
+
) -> Prompt[P]:
|
|
47
|
+
"""Decorator for creating prompts."""
|
|
88
48
|
...
|
|
89
49
|
|
|
90
50
|
@overload
|
|
91
51
|
def __call__(
|
|
92
|
-
self
|
|
93
|
-
fn:
|
|
94
|
-
) ->
|
|
95
|
-
"""Decorator for creating prompts."""
|
|
52
|
+
self,
|
|
53
|
+
fn: AsyncPromptable[P],
|
|
54
|
+
) -> AsyncPrompt[P]:
|
|
55
|
+
"""Decorator for creating async prompts."""
|
|
96
56
|
...
|
|
97
57
|
|
|
98
58
|
def __call__(
|
|
99
59
|
self,
|
|
100
|
-
fn:
|
|
101
|
-
|
|
|
102
|
-
|
|
|
103
|
-
|
|
|
60
|
+
fn: ContextPromptable[P, DepsT]
|
|
61
|
+
| AsyncContextPromptable[P, DepsT]
|
|
62
|
+
| Promptable[P]
|
|
63
|
+
| AsyncPromptable[P],
|
|
104
64
|
) -> (
|
|
105
|
-
Prompt[P
|
|
106
|
-
| AsyncPrompt[P
|
|
107
|
-
| ContextPrompt[P, DepsT
|
|
108
|
-
| AsyncContextPrompt[P, DepsT
|
|
65
|
+
Prompt[P]
|
|
66
|
+
| AsyncPrompt[P]
|
|
67
|
+
| ContextPrompt[P, DepsT]
|
|
68
|
+
| AsyncContextPrompt[P, DepsT]
|
|
109
69
|
):
|
|
110
|
-
"""Decorator for creating a prompt
|
|
70
|
+
"""Decorator for creating a prompt."""
|
|
111
71
|
is_context = _utils.is_context_promptable(fn)
|
|
112
72
|
is_async = _utils.is_async_promptable(fn)
|
|
113
73
|
|
|
74
|
+
# NOTE: unused `fn` expressions work around a Pyright bug
|
|
75
|
+
# TODO: Clean this up once the following Pyright bug is addressed:
|
|
76
|
+
# https://github.com/microsoft/pyright/issues/10951
|
|
114
77
|
if is_context and is_async:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
78
|
+
fn # pyright: ignore[reportUnusedExpression] # noqa: B018
|
|
79
|
+
|
|
80
|
+
async def async_context_prompt(
|
|
81
|
+
ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
82
|
+
) -> list[Message]:
|
|
83
|
+
result = await fn(ctx, *args, **kwargs)
|
|
84
|
+
return _utils.promote_to_messages(result)
|
|
85
|
+
|
|
86
|
+
return async_context_prompt
|
|
123
87
|
elif is_context:
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
88
|
+
fn # pyright: ignore[reportUnusedExpression] # noqa: B018
|
|
89
|
+
|
|
90
|
+
def context_prompt(
|
|
91
|
+
ctx: Context[DepsT], *args: P.args, **kwargs: P.kwargs
|
|
92
|
+
) -> list[Message]:
|
|
93
|
+
result = fn(ctx, *args, **kwargs)
|
|
94
|
+
return _utils.promote_to_messages(result)
|
|
95
|
+
|
|
96
|
+
return context_prompt
|
|
130
97
|
elif is_async:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
98
|
+
fn # pyright: ignore[reportUnusedExpression] # noqa: B018
|
|
99
|
+
|
|
100
|
+
async def async_prompt(*args: P.args, **kwargs: P.kwargs) -> list[Message]:
|
|
101
|
+
result = await fn(*args, **kwargs)
|
|
102
|
+
return _utils.promote_to_messages(result)
|
|
103
|
+
|
|
104
|
+
return async_prompt
|
|
135
105
|
else:
|
|
136
|
-
|
|
137
|
-
|
|
106
|
+
fn # pyright: ignore[reportUnusedExpression] # noqa: B018
|
|
107
|
+
|
|
108
|
+
def prompt(*args: P.args, **kwargs: P.kwargs) -> list[Message]:
|
|
109
|
+
result = fn(*args, **kwargs)
|
|
110
|
+
return _utils.promote_to_messages(result)
|
|
111
|
+
|
|
112
|
+
return prompt
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class PromptTemplateDecorator:
|
|
116
|
+
"""Protocol for the `prompt` decorator when used with a template."""
|
|
117
|
+
|
|
118
|
+
@overload
|
|
119
|
+
def __call__(
|
|
120
|
+
self,
|
|
121
|
+
fn: ContextPromptable[P, DepsT],
|
|
122
|
+
) -> ContextPrompt[P, DepsT]:
|
|
123
|
+
"""Decorator for creating context prompts from template functions."""
|
|
124
|
+
...
|
|
125
|
+
|
|
126
|
+
@overload
|
|
127
|
+
def __call__(
|
|
128
|
+
self,
|
|
129
|
+
fn: AsyncContextPromptable[P, DepsT],
|
|
130
|
+
) -> AsyncContextPrompt[P, DepsT]:
|
|
131
|
+
"""Decorator for creating async context prompts from template functions."""
|
|
132
|
+
...
|
|
133
|
+
|
|
134
|
+
@overload
|
|
135
|
+
def __call__(
|
|
136
|
+
self,
|
|
137
|
+
fn: Promptable[P],
|
|
138
|
+
) -> Prompt[P]:
|
|
139
|
+
"""Decorator for creating prompts from template functions."""
|
|
140
|
+
...
|
|
141
|
+
|
|
142
|
+
@overload
|
|
143
|
+
def __call__(
|
|
144
|
+
self,
|
|
145
|
+
fn: AsyncPromptable[P],
|
|
146
|
+
) -> AsyncPrompt[P]:
|
|
147
|
+
"""Decorator for creating async prompts from template functions."""
|
|
148
|
+
...
|
|
149
|
+
|
|
150
|
+
def __call__(
|
|
151
|
+
self,
|
|
152
|
+
fn: ContextPromptable[P, DepsT]
|
|
153
|
+
| AsyncContextPromptable[P, DepsT]
|
|
154
|
+
| Promptable[P]
|
|
155
|
+
| AsyncPromptable[P],
|
|
156
|
+
) -> (
|
|
157
|
+
Prompt[P]
|
|
158
|
+
| AsyncPrompt[P]
|
|
159
|
+
| ContextPrompt[P, DepsT]
|
|
160
|
+
| AsyncContextPrompt[P, DepsT]
|
|
161
|
+
):
|
|
162
|
+
"""Decorator for creating a prompt from a template function."""
|
|
163
|
+
raise NotImplementedError()
|
|
138
164
|
|
|
139
165
|
|
|
140
166
|
@overload
|
|
141
|
-
def prompt(
|
|
142
|
-
__fn:
|
|
143
|
-
) -> ContextPrompt[P, DepsT
|
|
167
|
+
def prompt(
|
|
168
|
+
__fn: ContextPromptable[P, DepsT],
|
|
169
|
+
) -> ContextPrompt[P, DepsT]:
|
|
144
170
|
"""Create a decorator for sync ContextPrompt functions (no arguments)."""
|
|
145
171
|
...
|
|
146
172
|
|
|
147
173
|
|
|
148
174
|
@overload
|
|
149
|
-
def prompt(
|
|
150
|
-
__fn:
|
|
151
|
-
) -> AsyncContextPrompt[P, DepsT
|
|
175
|
+
def prompt(
|
|
176
|
+
__fn: AsyncContextPromptable[P, DepsT],
|
|
177
|
+
) -> AsyncContextPrompt[P, DepsT]:
|
|
152
178
|
"""Create a decorator for async ContextPrompt functions (no arguments)."""
|
|
153
179
|
...
|
|
154
180
|
|
|
155
181
|
|
|
156
182
|
@overload
|
|
157
183
|
def prompt(
|
|
158
|
-
__fn:
|
|
159
|
-
) -> Prompt[P
|
|
184
|
+
__fn: Promptable[P],
|
|
185
|
+
) -> Prompt[P]:
|
|
160
186
|
"""Create a decorator for sync Prompt functions (no arguments)."""
|
|
161
187
|
...
|
|
162
188
|
|
|
163
189
|
|
|
164
190
|
@overload
|
|
165
191
|
def prompt(
|
|
166
|
-
__fn:
|
|
167
|
-
) -> AsyncPrompt[P
|
|
192
|
+
__fn: AsyncPromptable[P],
|
|
193
|
+
) -> AsyncPrompt[P]:
|
|
168
194
|
"""Create a decorator for async Prompt functions (no arguments)."""
|
|
169
195
|
...
|
|
170
196
|
|
|
@@ -172,55 +198,89 @@ def prompt(
|
|
|
172
198
|
@overload
|
|
173
199
|
def prompt(
|
|
174
200
|
*,
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
| OutputParser[FormattableT]
|
|
179
|
-
| None = None,
|
|
180
|
-
) -> PromptDecorator[ToolT, FormattableT]:
|
|
181
|
-
"""Create a decorator for Prompt functions with tools and format"""
|
|
201
|
+
template: None = None,
|
|
202
|
+
) -> PromptDecorator:
|
|
203
|
+
"""Create a decorator for Prompt functions (no template)"""
|
|
182
204
|
|
|
183
205
|
|
|
206
|
+
@overload
|
|
184
207
|
def prompt(
|
|
185
|
-
__fn: AsyncContextMessageTemplate[P, DepsT]
|
|
186
|
-
| ContextMessageTemplate[P, DepsT]
|
|
187
|
-
| AsyncMessageTemplate[P]
|
|
188
|
-
| MessageTemplate[P]
|
|
189
|
-
| None = None,
|
|
190
208
|
*,
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
209
|
+
template: str,
|
|
210
|
+
) -> PromptTemplateDecorator:
|
|
211
|
+
"""Create a decorator for template functions."""
|
|
212
|
+
...
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def prompt(
|
|
216
|
+
__fn: ContextPromptable[P, DepsT]
|
|
217
|
+
| AsyncContextPromptable[P, DepsT]
|
|
218
|
+
| Promptable[P]
|
|
219
|
+
| AsyncPromptable[P]
|
|
195
220
|
| None = None,
|
|
221
|
+
*,
|
|
222
|
+
template: str | None = None,
|
|
196
223
|
) -> (
|
|
197
|
-
|
|
198
|
-
|
|
|
199
|
-
|
|
|
200
|
-
|
|
|
201
|
-
| PromptDecorator
|
|
224
|
+
ContextPrompt[P, DepsT]
|
|
225
|
+
| AsyncContextPrompt[P, DepsT]
|
|
226
|
+
| Prompt[P]
|
|
227
|
+
| AsyncPrompt[P]
|
|
228
|
+
| PromptDecorator
|
|
229
|
+
| PromptTemplateDecorator
|
|
202
230
|
):
|
|
203
|
-
"""
|
|
231
|
+
"""Prompt decorator for turning functions (or "Prompts") into prompts.
|
|
232
|
+
|
|
233
|
+
This decorator transforms a function into a Prompt, i.e. a function that
|
|
234
|
+
returns `list[llm.Message]`. Its behavior depends on whether it's called with a spec
|
|
235
|
+
string.
|
|
204
236
|
|
|
205
|
-
|
|
206
|
-
|
|
237
|
+
If the first parameter is named 'ctx' or typed as `llm.Context[T]`, it creates
|
|
238
|
+
a ContextPrompt. Otherwise, it creates a regular Prompt.
|
|
207
239
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
240
|
+
With a template string, it returns a PromptTemplateDecorator, in which case it uses
|
|
241
|
+
the provided template to decorate an function with an empty body, and uses arguments
|
|
242
|
+
to the function for variable substitution in the template. The resulting PromptTemplate
|
|
243
|
+
returns messages based on the template.
|
|
244
|
+
|
|
245
|
+
Without a template string, it returns a PromptFunctionalDecorator, which
|
|
246
|
+
transforms a Prompt (a function returning either message content, or messages) into
|
|
247
|
+
a PromptTemplate. The resulting prompt template either promotes the content into a
|
|
248
|
+
list containing a single user message, or passes along the messages returned by the
|
|
249
|
+
decorated function.
|
|
212
250
|
|
|
213
251
|
Args:
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
format: Optional response format class (`BaseModel`) or Format instance
|
|
252
|
+
template: A string template with placeholders using `{{ variable_name }}`
|
|
253
|
+
and optional role markers like [SYSTEM], [USER], and [ASSISTANT].
|
|
217
254
|
|
|
218
255
|
Returns:
|
|
219
|
-
A
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
256
|
+
A PromptTemplateDecorator or PromptFunctionalDecorator that converts
|
|
257
|
+
the decorated function into a prompt.
|
|
258
|
+
|
|
259
|
+
Spec substitution rules:
|
|
260
|
+
- [USER], [ASSISTANT], [SYSTEM] demarcate the start of a new message with that role
|
|
261
|
+
- [MESSAGES] indicates the next variable contains a list of messages to include
|
|
262
|
+
- `{{ variable }}` injects the variable as a string, unless annotated
|
|
263
|
+
- Annotations: `{{ variable:annotation }}` where annotation is one of:
|
|
264
|
+
image, images, audio, audios, document, documents
|
|
265
|
+
- Single content annotations (image, audio, document) expect a file path,
|
|
266
|
+
URL, base64 string, or bytes, which becomes a content part with inferred mime-type
|
|
267
|
+
- Multiple content annotations (images, audios, documents) expect a list
|
|
268
|
+
of strings or bytes, each becoming a content part with inferred mime-type
|
|
269
|
+
|
|
270
|
+
Examples:
|
|
271
|
+
```python
|
|
272
|
+
@llm.prompt
|
|
273
|
+
def answer_question(question: str) -> str:
|
|
274
|
+
return f"Answer this question: {question}"
|
|
275
|
+
|
|
276
|
+
@llm.prompt
|
|
277
|
+
def answer_with_context(ctx: llm.Context[str], question: str) -> str:
|
|
278
|
+
return f"Using context {ctx.deps}, answer: {question}"
|
|
279
|
+
```
|
|
280
|
+
""" # TODO(docs): Update this docstring
|
|
281
|
+
if template:
|
|
282
|
+
raise NotImplementedError()
|
|
283
|
+
decorator = PromptDecorator()
|
|
223
284
|
if __fn is None:
|
|
224
285
|
return decorator
|
|
225
|
-
|
|
226
|
-
return decorator(__fn) # pyright: ignore[reportUnknownVariableType, reportCallIssue]
|
|
286
|
+
return decorator(__fn)
|
|
@@ -1,44 +1,69 @@
|
|
|
1
1
|
"""Types for prompt functions."""
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
from typing import Protocol
|
|
3
|
+
from typing import Protocol, TypeVar
|
|
5
4
|
|
|
6
5
|
from ..context import Context, DepsT
|
|
7
6
|
from ..messages import Message, UserContent
|
|
8
7
|
from ..types import P
|
|
9
8
|
|
|
9
|
+
PromptT = TypeVar(
|
|
10
|
+
"PromptT", bound="Prompt | AsyncPrompt | ContextPrompt | AsyncContextPrompt"
|
|
11
|
+
)
|
|
12
|
+
"""Type variable for prompt types.
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
This type var represents a resolved prompt, i.e. one that returns a list of messages.
|
|
15
|
+
"""
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
|
|
18
|
+
class Prompt(Protocol[P]):
|
|
19
|
+
"""Protocol for a `Prompt`, which returns `list[Message]`."""
|
|
20
|
+
|
|
21
|
+
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> list[Message]: ...
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Promptable(Protocol[P]):
|
|
25
|
+
"""Protocol for a `Promptable` that returns `UserContent` or `list[Message]`.
|
|
26
|
+
|
|
27
|
+
May be be converted by the `prompt` decorator into a `Prompt`.
|
|
17
28
|
"""
|
|
18
29
|
|
|
19
30
|
def __call__(
|
|
20
31
|
self, *args: P.args, **kwargs: P.kwargs
|
|
21
|
-
) -> UserContent |
|
|
32
|
+
) -> UserContent | list[Message]: ...
|
|
33
|
+
|
|
22
34
|
|
|
35
|
+
class AsyncPrompt(Protocol[P]):
|
|
36
|
+
"""Protocol for an `AsyncPrompt`, which returns `list[Message]`."""
|
|
23
37
|
|
|
24
|
-
|
|
25
|
-
"""Protocol for an async prompt function that returns `UserContent` or `Sequence[Message]`.
|
|
38
|
+
async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> list[Message]: ...
|
|
26
39
|
|
|
27
|
-
|
|
28
|
-
|
|
40
|
+
|
|
41
|
+
class AsyncPromptable(Protocol[P]):
|
|
42
|
+
"""Protocol for an `AsyncPromptable` that returns `UserContent` or `list[Message]`.
|
|
43
|
+
|
|
44
|
+
May be converted by the `prompt` decorator into an `AsyncPrompt`.
|
|
29
45
|
"""
|
|
30
46
|
|
|
31
47
|
async def __call__(
|
|
32
48
|
self, *args: P.args, **kwargs: P.kwargs
|
|
33
|
-
) -> UserContent |
|
|
49
|
+
) -> UserContent | list[Message]: ...
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ContextPrompt(Protocol[P, DepsT]):
|
|
53
|
+
"""Protocol for a `ContextPrompt`, which returns `list[Message]`."""
|
|
54
|
+
|
|
55
|
+
def __call__(
|
|
56
|
+
self,
|
|
57
|
+
ctx: Context[DepsT],
|
|
58
|
+
*args: P.args,
|
|
59
|
+
**kwargs: P.kwargs,
|
|
60
|
+
) -> list[Message]: ...
|
|
34
61
|
|
|
35
62
|
|
|
36
|
-
class
|
|
37
|
-
"""Protocol for a
|
|
63
|
+
class ContextPromptable(Protocol[P, DepsT]):
|
|
64
|
+
"""Protocol for a `ContextPromptable` that returns `UserContent` or `list[Message]`.
|
|
38
65
|
|
|
39
|
-
|
|
40
|
-
Can be converted by the `llm.prompt` decorator into a `ContextPrompt`, or by
|
|
41
|
-
the `llm.call` decorator into a `ContextCall`.
|
|
66
|
+
May be converted by the `prompt` decorator into a `ContextPrompt`.
|
|
42
67
|
"""
|
|
43
68
|
|
|
44
69
|
def __call__(
|
|
@@ -46,15 +71,24 @@ class ContextMessageTemplate(Protocol[P, DepsT]):
|
|
|
46
71
|
ctx: Context[DepsT],
|
|
47
72
|
*args: P.args,
|
|
48
73
|
**kwargs: P.kwargs,
|
|
49
|
-
) -> UserContent |
|
|
74
|
+
) -> UserContent | list[Message]: ...
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class AsyncContextPrompt(Protocol[P, DepsT]):
|
|
78
|
+
"""Protocol for an `AsyncContextPrompt`, which returns `list[Message]`."""
|
|
79
|
+
|
|
80
|
+
async def __call__(
|
|
81
|
+
self,
|
|
82
|
+
ctx: Context[DepsT],
|
|
83
|
+
*args: P.args,
|
|
84
|
+
**kwargs: P.kwargs,
|
|
85
|
+
) -> list[Message]: ...
|
|
50
86
|
|
|
51
87
|
|
|
52
|
-
class
|
|
53
|
-
"""Protocol for an
|
|
88
|
+
class AsyncContextPromptable(Protocol[P, DepsT]):
|
|
89
|
+
"""Protocol for an `AsyncContextPromptable` that returns `UserContent` or `list[Message]`.
|
|
54
90
|
|
|
55
|
-
|
|
56
|
-
Can be converted by the `llm.prompt` decorator into an `AsyncContextPrompt`, or by
|
|
57
|
-
the `llm.call` decorator into an `AsyncContextCall`.
|
|
91
|
+
May be converted by the `prompt` decorator into an `AsyncContextPrompt`.
|
|
58
92
|
"""
|
|
59
93
|
|
|
60
94
|
async def __call__(
|
|
@@ -62,4 +96,4 @@ class AsyncContextMessageTemplate(Protocol[P, DepsT]):
|
|
|
62
96
|
ctx: Context[DepsT],
|
|
63
97
|
*args: P.args,
|
|
64
98
|
**kwargs: P.kwargs,
|
|
65
|
-
) -> UserContent |
|
|
99
|
+
) -> UserContent | list[Message]: ...
|