letta-client 0.1.226__py3-none-any.whl → 1.7.2__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.
- letta_client/__init__.py +91 -672
- letta_client/_base_client.py +2125 -0
- letta_client/_client.py +1136 -0
- letta_client/_compat.py +219 -0
- letta_client/_constants.py +14 -0
- letta_client/_exceptions.py +108 -0
- letta_client/_files.py +123 -0
- letta_client/_models.py +872 -0
- letta_client/_qs.py +150 -0
- letta_client/_resource.py +43 -0
- letta_client/_response.py +832 -0
- letta_client/_streaming.py +371 -0
- letta_client/_types.py +270 -0
- letta_client/_utils/__init__.py +64 -0
- letta_client/_utils/_compat.py +45 -0
- letta_client/_utils/_datetime_parse.py +136 -0
- letta_client/_utils/_logs.py +25 -0
- letta_client/_utils/_proxy.py +65 -0
- letta_client/_utils/_reflection.py +42 -0
- letta_client/_utils/_resources_proxy.py +24 -0
- letta_client/_utils/_streams.py +12 -0
- letta_client/_utils/_sync.py +58 -0
- letta_client/_utils/_transform.py +457 -0
- letta_client/_utils/_typing.py +156 -0
- letta_client/_utils/_utils.py +421 -0
- letta_client/_version.py +4 -0
- letta_client/lib/.keep +4 -0
- letta_client/pagination.py +280 -0
- letta_client/resources/__init__.py +215 -0
- letta_client/resources/access_tokens.py +396 -0
- letta_client/resources/agents/__init__.py +131 -0
- letta_client/resources/agents/agents.py +2148 -0
- letta_client/resources/agents/archives.py +260 -0
- letta_client/resources/agents/blocks.py +736 -0
- letta_client/resources/agents/files.py +541 -0
- letta_client/resources/agents/folders.py +422 -0
- letta_client/resources/agents/identities.py +260 -0
- letta_client/resources/agents/messages.py +1800 -0
- letta_client/resources/agents/passages.py +638 -0
- letta_client/resources/agents/tools.py +651 -0
- letta_client/resources/archives/__init__.py +33 -0
- letta_client/resources/archives/archives.py +650 -0
- letta_client/resources/archives/passages.py +309 -0
- letta_client/resources/blocks/__init__.py +33 -0
- letta_client/resources/blocks/agents.py +289 -0
- letta_client/resources/blocks/blocks.py +977 -0
- letta_client/resources/conversations/__init__.py +33 -0
- letta_client/resources/conversations/conversations.py +611 -0
- letta_client/resources/conversations/messages.py +650 -0
- letta_client/resources/folders/__init__.py +47 -0
- letta_client/resources/folders/agents.py +234 -0
- letta_client/resources/folders/files.py +581 -0
- letta_client/resources/folders/folders.py +734 -0
- letta_client/resources/mcp_servers/__init__.py +33 -0
- letta_client/resources/mcp_servers/mcp_servers.py +670 -0
- letta_client/resources/mcp_servers/tools.py +351 -0
- letta_client/resources/messages.py +455 -0
- letta_client/resources/models/__init__.py +33 -0
- letta_client/resources/models/embeddings.py +149 -0
- letta_client/resources/models/models.py +233 -0
- letta_client/resources/passages.py +259 -0
- letta_client/resources/runs/__init__.py +75 -0
- letta_client/resources/runs/messages.py +363 -0
- letta_client/resources/runs/runs.py +502 -0
- letta_client/resources/runs/steps.py +229 -0
- letta_client/resources/runs/trace.py +197 -0
- letta_client/resources/runs/usage.py +163 -0
- letta_client/resources/steps/__init__.py +75 -0
- letta_client/resources/steps/feedback.py +198 -0
- letta_client/resources/steps/messages.py +237 -0
- letta_client/resources/steps/metrics.py +167 -0
- letta_client/resources/steps/steps.py +505 -0
- letta_client/resources/steps/trace.py +169 -0
- letta_client/resources/tags.py +240 -0
- letta_client/resources/templates/__init__.py +33 -0
- letta_client/resources/templates/agents.py +229 -0
- letta_client/resources/templates/templates.py +540 -0
- letta_client/resources/tools.py +1721 -0
- letta_client/types/__init__.py +148 -530
- letta_client/types/access_token_create_params.py +32 -0
- letta_client/types/access_token_create_response.py +34 -0
- letta_client/types/access_token_delete_params.py +11 -0
- letta_client/types/access_token_list_params.py +23 -0
- letta_client/types/access_token_list_response.py +40 -0
- letta_client/types/agent_create_params.py +444 -0
- letta_client/types/agent_environment_variable.py +40 -63
- letta_client/types/agent_export_file_params.py +26 -0
- letta_client/types/agent_export_file_response.py +7 -0
- letta_client/types/agent_import_file_params.py +57 -0
- letta_client/types/agent_import_file_response.py +14 -0
- letta_client/types/agent_list_params.py +100 -0
- letta_client/types/agent_retrieve_params.py +37 -0
- letta_client/types/agent_state.py +651 -138
- letta_client/types/agent_type.py +14 -14
- letta_client/types/agent_update_params.py +386 -0
- letta_client/types/agents/__init__.py +76 -0
- letta_client/types/agents/approval_create_param.py +35 -0
- letta_client/types/agents/approval_request_message.py +57 -0
- letta_client/types/agents/approval_response_message.py +61 -0
- letta_client/types/agents/approval_return.py +22 -0
- letta_client/types/agents/approval_return_param.py +22 -0
- letta_client/types/agents/assistant_message.py +48 -0
- letta_client/types/agents/block.py +68 -0
- letta_client/types/agents/block_list_params.py +34 -0
- letta_client/types/agents/block_update_params.py +63 -0
- letta_client/types/agents/event_message.py +40 -0
- letta_client/types/agents/file_close_all_response.py +8 -0
- letta_client/types/agents/file_list_params.py +40 -0
- letta_client/types/agents/file_list_response.py +42 -0
- letta_client/types/agents/file_open_response.py +8 -0
- letta_client/types/agents/folder_list_params.py +34 -0
- letta_client/types/agents/folder_list_response.py +49 -0
- letta_client/types/agents/hidden_reasoning_message.py +49 -0
- letta_client/types/agents/image_content.py +67 -0
- letta_client/types/agents/image_content_param.py +64 -0
- letta_client/types/agents/internal_message.py +271 -0
- letta_client/types/agents/job_status.py +7 -0
- letta_client/types/agents/job_type.py +7 -0
- letta_client/types/agents/letta_assistant_message_content_union.py +19 -0
- letta_client/types/agents/letta_response.py +76 -0
- letta_client/types/agents/letta_streaming_response.py +155 -0
- letta_client/types/agents/letta_user_message_content_union.py +14 -0
- letta_client/types/agents/message.py +36 -0
- letta_client/types/agents/message_cancel_params.py +15 -0
- letta_client/types/agents/message_cancel_response.py +8 -0
- letta_client/types/agents/message_compact_params.py +145 -0
- letta_client/types/agents/message_compact_response.py +13 -0
- letta_client/types/agents/message_create_async_params.py +145 -0
- letta_client/types/agents/message_create_params.py +181 -0
- letta_client/types/agents/message_list_params.py +55 -0
- letta_client/types/agents/message_reset_params.py +12 -0
- letta_client/types/agents/message_role.py +7 -0
- letta_client/types/agents/message_stream_params.py +166 -0
- letta_client/types/agents/message_type.py +17 -0
- letta_client/types/agents/omitted_reasoning_content.py +20 -0
- letta_client/types/agents/omitted_reasoning_content_param.py +20 -0
- letta_client/types/agents/passage_create_params.py +23 -0
- letta_client/types/agents/passage_create_response.py +10 -0
- letta_client/types/agents/passage_list_params.py +28 -0
- letta_client/types/agents/passage_list_response.py +10 -0
- letta_client/types/agents/passage_search_params.py +35 -0
- letta_client/types/agents/passage_search_response.py +29 -0
- letta_client/types/agents/reasoning_content.py +27 -0
- letta_client/types/agents/reasoning_content_param.py +27 -0
- letta_client/types/agents/reasoning_message.py +50 -0
- letta_client/types/agents/redacted_reasoning_content.py +18 -0
- letta_client/types/agents/redacted_reasoning_content_param.py +17 -0
- letta_client/types/agents/run.py +91 -0
- letta_client/types/agents/summary_message.py +38 -0
- letta_client/types/agents/system_message.py +46 -0
- letta_client/types/agents/text_content.py +19 -0
- letta_client/types/agents/text_content_param.py +19 -0
- letta_client/types/agents/tool_call.py +13 -0
- letta_client/types/agents/tool_call_content.py +28 -0
- letta_client/types/agents/tool_call_content_param.py +28 -0
- letta_client/types/agents/tool_call_delta.py +15 -0
- letta_client/types/agents/tool_call_message.py +52 -0
- letta_client/types/agents/tool_execution_result.py +33 -0
- letta_client/types/agents/tool_list_params.py +34 -0
- letta_client/types/agents/tool_return.py +29 -0
- letta_client/types/agents/tool_return_content.py +22 -0
- letta_client/types/agents/tool_return_content_param.py +21 -0
- letta_client/types/agents/tool_return_param.py +30 -0
- letta_client/types/agents/tool_run_params.py +16 -0
- letta_client/types/agents/tool_update_approval_params.py +21 -0
- letta_client/types/agents/user_message.py +50 -0
- letta_client/types/anthropic_model_settings.py +62 -0
- letta_client/types/anthropic_model_settings_param.py +59 -0
- letta_client/types/archive.py +46 -0
- letta_client/types/archive_create_params.py +22 -0
- letta_client/types/archive_list_params.py +40 -0
- letta_client/types/archive_update_params.py +14 -0
- letta_client/types/archives/__init__.py +5 -0
- letta_client/types/archives/passage_create_params.py +21 -0
- letta_client/types/azure_model_settings.py +36 -0
- letta_client/types/azure_model_settings_param.py +33 -0
- letta_client/types/bedrock_model_settings.py +36 -0
- letta_client/types/bedrock_model_settings_param.py +33 -0
- letta_client/types/block_create_params.py +59 -0
- letta_client/types/block_list_params.py +102 -0
- letta_client/types/block_response.py +66 -0
- letta_client/types/block_update_params.py +60 -0
- letta_client/types/blocks/__init__.py +5 -0
- letta_client/types/blocks/agent_list_params.py +61 -0
- letta_client/types/child_tool_rule.py +37 -26
- letta_client/types/child_tool_rule_param.py +50 -0
- letta_client/types/conditional_tool_rule.py +19 -35
- letta_client/types/conditional_tool_rule_param.py +31 -0
- letta_client/types/continue_tool_rule.py +13 -23
- letta_client/types/continue_tool_rule_param.py +22 -0
- letta_client/types/conversation.py +42 -0
- letta_client/types/conversation_cancel_response.py +8 -0
- letta_client/types/conversation_create_params.py +25 -0
- letta_client/types/conversation_list_params.py +19 -0
- letta_client/types/conversation_list_response.py +10 -0
- letta_client/types/conversation_update_params.py +13 -0
- letta_client/types/conversations/__init__.py +7 -0
- letta_client/types/conversations/message_create_params.py +166 -0
- letta_client/types/conversations/message_list_params.py +43 -0
- letta_client/types/conversations/message_stream_params.py +28 -0
- letta_client/types/create_block_param.py +61 -0
- letta_client/types/create_sse_mcp_server_param.py +26 -0
- letta_client/types/create_stdio_mcp_server_param.py +25 -0
- letta_client/types/create_streamable_http_mcp_server_param.py +26 -0
- letta_client/types/deepseek_model_settings.py +36 -0
- letta_client/types/deepseek_model_settings_param.py +33 -0
- letta_client/types/embedding_config.py +47 -67
- letta_client/types/embedding_config_param.py +64 -0
- letta_client/types/embedding_model.py +81 -0
- letta_client/types/folder.py +28 -66
- letta_client/types/folder_create_params.py +33 -0
- letta_client/types/folder_list_params.py +37 -0
- letta_client/types/folder_update_params.py +27 -0
- letta_client/types/folders/__init__.py +12 -0
- letta_client/types/folders/agent_list_params.py +34 -0
- letta_client/types/folders/agent_list_response.py +8 -0
- letta_client/types/folders/file_list_params.py +37 -0
- letta_client/types/folders/file_list_response.py +70 -0
- letta_client/types/folders/file_retrieve_params.py +15 -0
- letta_client/types/folders/file_retrieve_response.py +70 -0
- letta_client/types/folders/file_upload_params.py +20 -0
- letta_client/types/folders/file_upload_response.py +70 -0
- letta_client/types/google_ai_model_settings.py +47 -0
- letta_client/types/google_ai_model_settings_param.py +44 -0
- letta_client/types/google_vertex_model_settings.py +47 -0
- letta_client/types/google_vertex_model_settings_param.py +44 -0
- letta_client/types/groq_model_settings.py +36 -0
- letta_client/types/groq_model_settings_param.py +33 -0
- letta_client/types/health_response.py +13 -0
- letta_client/types/init_tool_rule.py +24 -24
- letta_client/types/init_tool_rule_param.py +32 -0
- letta_client/types/json_object_response_format.py +9 -17
- letta_client/types/json_object_response_format_param.py +14 -0
- letta_client/types/json_schema_response_format.py +12 -21
- letta_client/types/json_schema_response_format_param.py +18 -0
- letta_client/types/letta_message_content_union_param.py +26 -0
- letta_client/types/llm_config.py +124 -75
- letta_client/types/llm_config_param.py +155 -0
- letta_client/types/max_count_per_step_tool_rule.py +16 -25
- letta_client/types/max_count_per_step_tool_rule_param.py +28 -0
- letta_client/types/mcp_server_create_params.py +23 -0
- letta_client/types/mcp_server_create_response.py +12 -0
- letta_client/types/mcp_server_list_response.py +14 -0
- letta_client/types/mcp_server_refresh_params.py +12 -0
- letta_client/types/mcp_server_retrieve_response.py +12 -0
- letta_client/types/mcp_server_update_params.py +23 -0
- letta_client/types/mcp_server_update_response.py +12 -0
- letta_client/types/mcp_servers/__init__.py +6 -0
- letta_client/types/mcp_servers/tool_list_response.py +10 -0
- letta_client/types/mcp_servers/tool_run_params.py +15 -0
- letta_client/types/message_create_param.py +38 -0
- letta_client/types/message_list_params.py +34 -0
- letta_client/types/message_list_response.py +10 -0
- letta_client/types/message_retrieve_response.py +10 -0
- letta_client/types/message_search_params.py +34 -0
- letta_client/types/message_search_response.py +124 -0
- letta_client/types/model.py +148 -0
- letta_client/types/model_list_params.py +19 -0
- letta_client/types/model_list_response.py +10 -0
- letta_client/types/models/__init__.py +5 -0
- letta_client/types/models/embedding_list_response.py +10 -0
- letta_client/types/npm_requirement.py +15 -0
- letta_client/types/npm_requirement_param.py +16 -0
- letta_client/types/openai_model_settings.py +51 -0
- letta_client/types/openai_model_settings_param.py +48 -0
- letta_client/types/parent_tool_rule.py +15 -27
- letta_client/types/parent_tool_rule_param.py +27 -0
- letta_client/types/passage.py +56 -101
- letta_client/types/passage_search_params.py +41 -0
- letta_client/types/passage_search_response.py +25 -0
- letta_client/types/pip_requirement.py +9 -21
- letta_client/types/pip_requirement_param.py +16 -0
- letta_client/types/provider_category.py +5 -3
- letta_client/types/provider_trace.py +43 -48
- letta_client/types/provider_type.py +25 -23
- letta_client/types/required_before_exit_tool_rule.py +13 -23
- letta_client/types/required_before_exit_tool_rule_param.py +22 -0
- letta_client/types/requires_approval_tool_rule.py +25 -0
- letta_client/types/requires_approval_tool_rule_param.py +25 -0
- letta_client/types/run_list_params.py +67 -0
- letta_client/types/runs/__init__.py +10 -0
- letta_client/types/runs/message_list_params.py +34 -0
- letta_client/types/runs/message_stream_params.py +28 -0
- letta_client/types/runs/step_list_params.py +28 -0
- letta_client/types/runs/trace_retrieve_params.py +12 -0
- letta_client/types/runs/trace_retrieve_response.py +8 -0
- letta_client/types/runs/usage_retrieve_response.py +31 -0
- letta_client/types/sse_mcp_server.py +32 -0
- letta_client/types/stdio_mcp_server.py +29 -0
- letta_client/types/step.py +71 -97
- letta_client/types/step_list_params.py +57 -0
- letta_client/types/steps/__init__.py +8 -0
- letta_client/types/steps/feedback_create_params.py +18 -0
- letta_client/types/steps/message_list_params.py +34 -0
- letta_client/types/steps/message_list_response.py +36 -0
- letta_client/types/steps/metric_retrieve_response.py +45 -0
- letta_client/types/stop_reason_type.py +17 -5
- letta_client/types/streamable_http_mcp_server.py +32 -0
- letta_client/types/tag_list_params.py +40 -0
- letta_client/types/tag_list_response.py +8 -0
- letta_client/types/template_create_params.py +46 -0
- letta_client/types/template_create_response.py +29 -0
- letta_client/types/template_delete_response.py +9 -0
- letta_client/types/template_update_params.py +25 -0
- letta_client/types/template_update_response.py +13 -0
- letta_client/types/templates/__init__.py +6 -0
- letta_client/types/templates/agent_create_params.py +50 -0
- letta_client/types/templates/agent_create_response.py +20 -0
- letta_client/types/terminal_tool_rule.py +13 -23
- letta_client/types/terminal_tool_rule_param.py +22 -0
- letta_client/types/text_response_format.py +9 -17
- letta_client/types/text_response_format_param.py +14 -0
- letta_client/types/together_model_settings.py +36 -0
- letta_client/types/together_model_settings_param.py +33 -0
- letta_client/types/tool.py +154 -81
- letta_client/types/tool_create_params.py +53 -0
- letta_client/types/tool_list_params.py +57 -0
- letta_client/types/tool_return_message.py +44 -31
- letta_client/types/tool_search_params.py +27 -0
- letta_client/types/tool_search_response.py +10 -0
- letta_client/types/tool_search_result.py +27 -0
- letta_client/types/tool_type.py +16 -17
- letta_client/types/tool_update_params.py +57 -0
- letta_client/types/tool_upsert_params.py +53 -0
- letta_client/types/update_sse_mcp_server_param.py +26 -0
- letta_client/types/update_stdio_mcp_server_param.py +25 -0
- letta_client/types/update_streamable_http_mcp_server_param.py +26 -0
- letta_client/types/vector_db_provider.py +7 -0
- letta_client/types/xai_model_settings.py +36 -0
- letta_client/types/xai_model_settings_param.py +33 -0
- letta_client-1.7.2.dist-info/METADATA +436 -0
- letta_client-1.7.2.dist-info/RECORD +335 -0
- {letta_client-0.1.226.dist-info → letta_client-1.7.2.dist-info}/WHEEL +1 -1
- letta_client-1.7.2.dist-info/licenses/LICENSE +201 -0
- letta_client/agents/__init__.py +0 -77
- letta_client/agents/blocks/__init__.py +0 -2
- letta_client/agents/blocks/client.py +0 -793
- letta_client/agents/client.py +0 -2371
- letta_client/agents/context/__init__.py +0 -2
- letta_client/agents/context/client.py +0 -149
- letta_client/agents/core_memory/__init__.py +0 -2
- letta_client/agents/core_memory/client.py +0 -147
- letta_client/agents/files/__init__.py +0 -2
- letta_client/agents/files/client.py +0 -430
- letta_client/agents/folders/__init__.py +0 -2
- letta_client/agents/folders/client.py +0 -412
- letta_client/agents/groups/__init__.py +0 -2
- letta_client/agents/groups/client.py +0 -169
- letta_client/agents/memory_variables/__init__.py +0 -5
- letta_client/agents/memory_variables/client.py +0 -152
- letta_client/agents/memory_variables/types/__init__.py +0 -5
- letta_client/agents/memory_variables/types/memory_variables_list_response.py +0 -19
- letta_client/agents/messages/__init__.py +0 -15
- letta_client/agents/messages/client.py +0 -1638
- letta_client/agents/messages/types/__init__.py +0 -13
- letta_client/agents/messages/types/letta_streaming_response.py +0 -22
- letta_client/agents/messages/types/messages_modify_request.py +0 -11
- letta_client/agents/messages/types/messages_modify_response.py +0 -20
- letta_client/agents/messages/types/messages_preview_raw_payload_request.py +0 -7
- letta_client/agents/passages/__init__.py +0 -2
- letta_client/agents/passages/client.py +0 -793
- letta_client/agents/sources/__init__.py +0 -2
- letta_client/agents/sources/client.py +0 -412
- letta_client/agents/templates/__init__.py +0 -5
- letta_client/agents/templates/client.py +0 -588
- letta_client/agents/templates/types/__init__.py +0 -7
- letta_client/agents/templates/types/templates_create_response.py +0 -22
- letta_client/agents/templates/types/templates_create_version_request_return_agent_state.py +0 -5
- letta_client/agents/templates/types/templates_migrate_response.py +0 -19
- letta_client/agents/tools/__init__.py +0 -2
- letta_client/agents/tools/client.py +0 -412
- letta_client/agents/types/__init__.py +0 -33
- letta_client/agents/types/agents_search_request_search_item.py +0 -16
- letta_client/agents/types/agents_search_request_search_item_field.py +0 -22
- letta_client/agents/types/agents_search_request_search_item_field_operator.py +0 -5
- letta_client/agents/types/agents_search_request_search_item_one.py +0 -22
- letta_client/agents/types/agents_search_request_search_item_one_operator.py +0 -5
- letta_client/agents/types/agents_search_request_search_item_three.py +0 -21
- letta_client/agents/types/agents_search_request_search_item_two.py +0 -21
- letta_client/agents/types/agents_search_request_search_item_zero.py +0 -20
- letta_client/agents/types/agents_search_request_sort_by.py +0 -5
- letta_client/agents/types/agents_search_response.py +0 -23
- letta_client/agents/types/create_agent_request_response_format.py +0 -8
- letta_client/agents/types/create_agent_request_tool_rules_item.py +0 -22
- letta_client/agents/types/update_agent_response_format.py +0 -8
- letta_client/agents/types/update_agent_tool_rules_item.py +0 -22
- letta_client/base_client.py +0 -232
- letta_client/batches/__init__.py +0 -2
- letta_client/batches/client.py +0 -587
- letta_client/blocks/__init__.py +0 -5
- letta_client/blocks/agents/__init__.py +0 -2
- letta_client/blocks/agents/client.py +0 -171
- letta_client/blocks/client.py +0 -1038
- letta_client/client.py +0 -661
- letta_client/client_side_access_tokens/__init__.py +0 -29
- letta_client/client_side_access_tokens/client.py +0 -524
- letta_client/client_side_access_tokens/types/__init__.py +0 -43
- letta_client/client_side_access_tokens/types/client_side_access_tokens_create_request_policy_item.py +0 -24
- letta_client/client_side_access_tokens/types/client_side_access_tokens_create_request_policy_item_access_item.py +0 -7
- letta_client/client_side_access_tokens/types/client_side_access_tokens_create_response.py +0 -25
- letta_client/client_side_access_tokens/types/client_side_access_tokens_create_response_policy.py +0 -23
- letta_client/client_side_access_tokens/types/client_side_access_tokens_create_response_policy_data_item.py +0 -24
- letta_client/client_side_access_tokens/types/client_side_access_tokens_create_response_policy_data_item_access_item.py +0 -7
- letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response.py +0 -25
- letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response_tokens_item.py +0 -27
- letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response_tokens_item_policy.py +0 -23
- letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response_tokens_item_policy_data_item.py +0 -24
- letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response_tokens_item_policy_data_item_access_item.py +0 -7
- letta_client/core/__init__.py +0 -51
- letta_client/core/api_error.py +0 -15
- letta_client/core/client_wrapper.py +0 -77
- letta_client/core/datetime_utils.py +0 -28
- letta_client/core/file.py +0 -67
- letta_client/core/http_client.py +0 -499
- letta_client/core/jsonable_encoder.py +0 -101
- letta_client/core/pydantic_utilities.py +0 -296
- letta_client/core/query_encoder.py +0 -58
- letta_client/core/remove_none_from_dict.py +0 -11
- letta_client/core/request_options.py +0 -35
- letta_client/core/serialization.py +0 -272
- letta_client/core/unchecked_base_model.py +0 -305
- letta_client/embedding_models/__init__.py +0 -2
- letta_client/embedding_models/client.py +0 -136
- letta_client/environment.py +0 -8
- letta_client/errors/__init__.py +0 -17
- letta_client/errors/bad_request_error.py +0 -9
- letta_client/errors/conflict_error.py +0 -9
- letta_client/errors/internal_server_error.py +0 -9
- letta_client/errors/not_found_error.py +0 -9
- letta_client/errors/payment_required_error.py +0 -9
- letta_client/errors/unprocessable_entity_error.py +0 -9
- letta_client/folders/__init__.py +0 -5
- letta_client/folders/client.py +0 -1307
- letta_client/folders/files/__init__.py +0 -2
- letta_client/folders/files/client.py +0 -474
- letta_client/folders/passages/__init__.py +0 -2
- letta_client/folders/passages/client.py +0 -189
- letta_client/groups/__init__.py +0 -14
- letta_client/groups/client.py +0 -964
- letta_client/groups/messages/__init__.py +0 -5
- letta_client/groups/messages/client.py +0 -1015
- letta_client/groups/messages/types/__init__.py +0 -7
- letta_client/groups/messages/types/letta_streaming_response.py +0 -20
- letta_client/groups/messages/types/messages_modify_request.py +0 -11
- letta_client/groups/messages/types/messages_modify_response.py +0 -20
- letta_client/groups/types/__init__.py +0 -6
- letta_client/groups/types/group_create_manager_config.py +0 -12
- letta_client/groups/types/group_update_manager_config.py +0 -16
- letta_client/health/__init__.py +0 -2
- letta_client/health/client.py +0 -110
- letta_client/identities/__init__.py +0 -5
- letta_client/identities/client.py +0 -1201
- letta_client/identities/properties/__init__.py +0 -2
- letta_client/identities/properties/client.py +0 -183
- letta_client/jobs/__init__.py +0 -2
- letta_client/jobs/client.py +0 -749
- letta_client/messages/__init__.py +0 -2
- letta_client/messages/client.py +0 -213
- letta_client/models/__init__.py +0 -2
- letta_client/models/client.py +0 -174
- letta_client/projects/__init__.py +0 -5
- letta_client/projects/client.py +0 -150
- letta_client/projects/types/__init__.py +0 -6
- letta_client/projects/types/projects_list_response.py +0 -23
- letta_client/projects/types/projects_list_response_projects_item.py +0 -21
- letta_client/providers/__init__.py +0 -2
- letta_client/providers/client.py +0 -789
- letta_client/runs/__init__.py +0 -5
- letta_client/runs/client.py +0 -551
- letta_client/runs/messages/__init__.py +0 -2
- letta_client/runs/messages/client.py +0 -236
- letta_client/runs/steps/__init__.py +0 -2
- letta_client/runs/steps/client.py +0 -219
- letta_client/runs/usage/__init__.py +0 -2
- letta_client/runs/usage/client.py +0 -147
- letta_client/sources/__init__.py +0 -5
- letta_client/sources/client.py +0 -1462
- letta_client/sources/files/__init__.py +0 -2
- letta_client/sources/files/client.py +0 -474
- letta_client/sources/passages/__init__.py +0 -2
- letta_client/sources/passages/client.py +0 -189
- letta_client/steps/__init__.py +0 -6
- letta_client/steps/client.py +0 -408
- letta_client/steps/feedback/__init__.py +0 -2
- letta_client/steps/feedback/client.py +0 -168
- letta_client/steps/types/__init__.py +0 -5
- letta_client/steps/types/steps_list_request_feedback.py +0 -5
- letta_client/tags/__init__.py +0 -2
- letta_client/tags/client.py +0 -171
- letta_client/telemetry/__init__.py +0 -2
- letta_client/telemetry/client.py +0 -145
- letta_client/templates/__init__.py +0 -18
- letta_client/templates/agents/__init__.py +0 -13
- letta_client/templates/agents/client.py +0 -256
- letta_client/templates/agents/types/__init__.py +0 -11
- letta_client/templates/agents/types/agents_create_request_initial_message_sequence_item.py +0 -26
- letta_client/templates/agents/types/agents_create_request_initial_message_sequence_item_role.py +0 -7
- letta_client/templates/agents/types/agents_create_response.py +0 -20
- letta_client/templates/client.py +0 -162
- letta_client/templates/types/__init__.py +0 -6
- letta_client/templates/types/templates_list_response.py +0 -23
- letta_client/templates/types/templates_list_response_templates_item.py +0 -20
- letta_client/tools/__init__.py +0 -27
- letta_client/tools/client.py +0 -3063
- letta_client/tools/types/__init__.py +0 -25
- letta_client/tools/types/add_mcp_server_request.py +0 -8
- letta_client/tools/types/add_mcp_server_response_item.py +0 -8
- letta_client/tools/types/connect_mcp_server_request.py +0 -8
- letta_client/tools/types/connect_mcp_server_response_event.py +0 -8
- letta_client/tools/types/delete_mcp_server_response_item.py +0 -8
- letta_client/tools/types/list_mcp_servers_response_value.py +0 -8
- letta_client/tools/types/streaming_response.py +0 -23
- letta_client/tools/types/test_mcp_server_request.py +0 -8
- letta_client/tools/types/update_mcp_server_request.py +0 -8
- letta_client/tools/types/update_mcp_server_response.py +0 -8
- letta_client/types/action_model.py +0 -38
- letta_client/types/action_parameters_model.py +0 -27
- letta_client/types/action_response_model.py +0 -27
- letta_client/types/agent_schema.py +0 -49
- letta_client/types/agent_schema_tool_rules_item.py +0 -11
- letta_client/types/agent_state_response_format.py +0 -8
- letta_client/types/agent_state_tool_rules_item.py +0 -22
- letta_client/types/app_auth_scheme.py +0 -34
- letta_client/types/app_auth_scheme_auth_mode.py +0 -19
- letta_client/types/app_model.py +0 -44
- letta_client/types/assistant_message.py +0 -42
- letta_client/types/assistant_message_content.py +0 -6
- letta_client/types/audio.py +0 -19
- letta_client/types/auth_request.py +0 -22
- letta_client/types/auth_response.py +0 -29
- letta_client/types/auth_scheme_field.py +0 -30
- letta_client/types/bad_request_error_body.py +0 -19
- letta_client/types/base_64_image.py +0 -33
- letta_client/types/base_tool_rule_schema.py +0 -20
- letta_client/types/batch_job.py +0 -81
- letta_client/types/block.py +0 -97
- letta_client/types/block_update.py +0 -71
- letta_client/types/chat_completion_assistant_message_param.py +0 -29
- letta_client/types/chat_completion_assistant_message_param_content.py +0 -8
- letta_client/types/chat_completion_assistant_message_param_content_item.py +0 -9
- letta_client/types/chat_completion_audio_param.py +0 -22
- letta_client/types/chat_completion_audio_param_format.py +0 -5
- letta_client/types/chat_completion_audio_param_voice.py +0 -18
- letta_client/types/chat_completion_content_part_image_param.py +0 -21
- letta_client/types/chat_completion_content_part_input_audio_param.py +0 -21
- letta_client/types/chat_completion_content_part_refusal_param.py +0 -20
- letta_client/types/chat_completion_content_part_text_param.py +0 -20
- letta_client/types/chat_completion_developer_message_param.py +0 -22
- letta_client/types/chat_completion_developer_message_param_content.py +0 -6
- letta_client/types/chat_completion_function_call_option_param.py +0 -19
- letta_client/types/chat_completion_function_message_param.py +0 -21
- letta_client/types/chat_completion_message_tool_call.py +0 -22
- letta_client/types/chat_completion_message_tool_call_param.py +0 -24
- letta_client/types/chat_completion_named_tool_choice_param.py +0 -23
- letta_client/types/chat_completion_prediction_content_param.py +0 -21
- letta_client/types/chat_completion_prediction_content_param_content.py +0 -6
- letta_client/types/chat_completion_stream_options_param.py +0 -19
- letta_client/types/chat_completion_system_message_param.py +0 -22
- letta_client/types/chat_completion_system_message_param_content.py +0 -6
- letta_client/types/chat_completion_tool_message_param.py +0 -22
- letta_client/types/chat_completion_tool_message_param_content.py +0 -6
- letta_client/types/chat_completion_tool_param.py +0 -21
- letta_client/types/chat_completion_user_message_param.py +0 -22
- letta_client/types/chat_completion_user_message_param_content.py +0 -6
- letta_client/types/chat_completion_user_message_param_content_item.py +0 -14
- letta_client/types/child_tool_rule_schema.py +0 -21
- letta_client/types/code_input.py +0 -22
- letta_client/types/completion_create_params_non_streaming.py +0 -64
- letta_client/types/completion_create_params_non_streaming_function_call.py +0 -8
- letta_client/types/completion_create_params_non_streaming_messages_item.py +0 -18
- letta_client/types/completion_create_params_non_streaming_modalities_item.py +0 -5
- letta_client/types/completion_create_params_non_streaming_model.py +0 -62
- letta_client/types/completion_create_params_non_streaming_reasoning_effort.py +0 -5
- letta_client/types/completion_create_params_non_streaming_response_format.py +0 -10
- letta_client/types/completion_create_params_non_streaming_service_tier.py +0 -7
- letta_client/types/completion_create_params_non_streaming_stop.py +0 -5
- letta_client/types/completion_create_params_non_streaming_tool_choice.py +0 -8
- letta_client/types/completion_create_params_streaming.py +0 -64
- letta_client/types/completion_create_params_streaming_function_call.py +0 -8
- letta_client/types/completion_create_params_streaming_messages_item.py +0 -18
- letta_client/types/completion_create_params_streaming_modalities_item.py +0 -5
- letta_client/types/completion_create_params_streaming_model.py +0 -62
- letta_client/types/completion_create_params_streaming_reasoning_effort.py +0 -5
- letta_client/types/completion_create_params_streaming_response_format.py +0 -10
- letta_client/types/completion_create_params_streaming_service_tier.py +0 -7
- letta_client/types/completion_create_params_streaming_stop.py +0 -5
- letta_client/types/completion_create_params_streaming_tool_choice.py +0 -8
- letta_client/types/components_schemas_text_content.py +0 -5
- letta_client/types/conditional_tool_rule_schema.py +0 -23
- letta_client/types/conflict_error_body.py +0 -21
- letta_client/types/context_window_overview.py +0 -108
- letta_client/types/core_memory_block_schema.py +0 -31
- letta_client/types/create_block.py +0 -67
- letta_client/types/duplicate_file_handling.py +0 -5
- letta_client/types/dynamic_manager.py +0 -33
- letta_client/types/dynamic_manager_update.py +0 -33
- letta_client/types/e_2_b_sandbox_config.py +0 -32
- letta_client/types/embedding_config_embedding_endpoint_type.py +0 -29
- letta_client/types/feedback_type.py +0 -5
- letta_client/types/file.py +0 -21
- letta_client/types/file_block.py +0 -103
- letta_client/types/file_file.py +0 -21
- letta_client/types/file_metadata.py +0 -108
- letta_client/types/file_processing_status.py +0 -5
- letta_client/types/file_stats.py +0 -36
- letta_client/types/function_call.py +0 -20
- letta_client/types/function_definition_input.py +0 -22
- letta_client/types/function_definition_output.py +0 -22
- letta_client/types/function_output.py +0 -20
- letta_client/types/function_tool.py +0 -21
- letta_client/types/generate_tool_input.py +0 -42
- letta_client/types/generate_tool_output.py +0 -33
- letta_client/types/group.py +0 -88
- letta_client/types/health.py +0 -24
- letta_client/types/hidden_reasoning_message.py +0 -43
- letta_client/types/hidden_reasoning_message_state.py +0 -5
- letta_client/types/http_validation_error.py +0 -20
- letta_client/types/identity.py +0 -59
- letta_client/types/identity_property.py +0 -38
- letta_client/types/identity_property_type.py +0 -5
- letta_client/types/identity_property_value.py +0 -5
- letta_client/types/identity_type.py +0 -5
- letta_client/types/image_content.py +0 -24
- letta_client/types/image_content_source.py +0 -8
- letta_client/types/image_url.py +0 -21
- letta_client/types/image_url_detail.py +0 -5
- letta_client/types/input_audio.py +0 -21
- letta_client/types/input_audio_format.py +0 -5
- letta_client/types/internal_server_error_body.py +0 -19
- letta_client/types/job.py +0 -96
- letta_client/types/job_status.py +0 -7
- letta_client/types/job_type.py +0 -5
- letta_client/types/json_schema.py +0 -26
- letta_client/types/letta_batch_messages.py +0 -20
- letta_client/types/letta_batch_request.py +0 -59
- letta_client/types/letta_image.py +0 -38
- letta_client/types/letta_message_content_union.py +0 -13
- letta_client/types/letta_message_union.py +0 -20
- letta_client/types/letta_request.py +0 -54
- letta_client/types/letta_request_config.py +0 -38
- letta_client/types/letta_response.py +0 -40
- letta_client/types/letta_stop_reason.py +0 -32
- letta_client/types/letta_streaming_request.py +0 -59
- letta_client/types/letta_usage_statistics.py +0 -59
- letta_client/types/letta_user_message_content_union.py +0 -7
- letta_client/types/llm_config_model_endpoint_type.py +0 -31
- letta_client/types/llm_config_reasoning_effort.py +0 -5
- letta_client/types/local_sandbox_config.py +0 -38
- letta_client/types/manager_type.py +0 -7
- letta_client/types/max_count_per_step_tool_rule_schema.py +0 -21
- letta_client/types/mcp_server_type.py +0 -5
- letta_client/types/mcp_tool.py +0 -38
- letta_client/types/memory.py +0 -38
- letta_client/types/message.py +0 -139
- letta_client/types/message_content_item.py +0 -20
- letta_client/types/message_create.py +0 -58
- letta_client/types/message_create_content.py +0 -6
- letta_client/types/message_create_role.py +0 -5
- letta_client/types/message_role.py +0 -5
- letta_client/types/message_schema.py +0 -29
- letta_client/types/message_type.py +0 -16
- letta_client/types/not_found_error_body.py +0 -19
- letta_client/types/not_found_error_body_message.py +0 -11
- letta_client/types/omitted_reasoning_content.py +0 -19
- letta_client/types/openai_types_chat_chat_completion_message_tool_call_param_function.py +0 -20
- letta_client/types/openai_types_chat_chat_completion_named_tool_choice_param_function.py +0 -19
- letta_client/types/openai_types_chat_completion_create_params_function.py +0 -21
- letta_client/types/organization.py +0 -38
- letta_client/types/organization_create.py +0 -27
- letta_client/types/organization_sources_stats.py +0 -42
- letta_client/types/organization_update.py +0 -27
- letta_client/types/parameter_properties.py +0 -20
- letta_client/types/parameters_schema.py +0 -22
- letta_client/types/payment_required_error_body.py +0 -20
- letta_client/types/provider.py +0 -65
- letta_client/types/provider_check.py +0 -38
- letta_client/types/reasoning_content.py +0 -33
- letta_client/types/reasoning_message.py +0 -44
- letta_client/types/reasoning_message_source.py +0 -5
- letta_client/types/redacted_reasoning_content.py +0 -23
- letta_client/types/response_format_json_object.py +0 -19
- letta_client/types/response_format_json_schema.py +0 -21
- letta_client/types/response_format_text.py +0 -19
- letta_client/types/round_robin_manager.py +0 -23
- letta_client/types/round_robin_manager_update.py +0 -23
- letta_client/types/run.py +0 -99
- letta_client/types/sandbox_config.py +0 -54
- letta_client/types/sandbox_config_create.py +0 -23
- letta_client/types/sandbox_config_create_config.py +0 -7
- letta_client/types/sandbox_config_update.py +0 -27
- letta_client/types/sandbox_config_update_config.py +0 -7
- letta_client/types/sandbox_environment_variable.py +0 -63
- letta_client/types/sandbox_environment_variable_create.py +0 -32
- letta_client/types/sandbox_environment_variable_update.py +0 -32
- letta_client/types/sandbox_type.py +0 -5
- letta_client/types/sleeptime_manager.py +0 -28
- letta_client/types/sleeptime_manager_update.py +0 -28
- letta_client/types/source.py +0 -81
- letta_client/types/source_create.py +0 -57
- letta_client/types/source_stats.py +0 -47
- letta_client/types/source_update.py +0 -47
- letta_client/types/sse_server_config.py +0 -55
- letta_client/types/stdio_server_config.py +0 -39
- letta_client/types/step_feedback.py +0 -5
- letta_client/types/streamable_http_server_config.py +0 -55
- letta_client/types/supervisor_manager.py +0 -23
- letta_client/types/supervisor_manager_update.py +0 -23
- letta_client/types/system_message.py +0 -41
- letta_client/types/tag_schema.py +0 -19
- letta_client/types/text_content.py +0 -23
- letta_client/types/tool_annotations.py +0 -36
- letta_client/types/tool_call.py +0 -21
- letta_client/types/tool_call_content.py +0 -33
- letta_client/types/tool_call_delta.py +0 -21
- letta_client/types/tool_call_message.py +0 -39
- letta_client/types/tool_call_message_tool_call.py +0 -7
- letta_client/types/tool_create.py +0 -58
- letta_client/types/tool_env_var_schema.py +0 -23
- letta_client/types/tool_json_schema.py +0 -24
- letta_client/types/tool_return.py +0 -33
- letta_client/types/tool_return_content.py +0 -33
- letta_client/types/tool_return_message_status.py +0 -5
- letta_client/types/tool_return_status.py +0 -5
- letta_client/types/tool_schema.py +0 -35
- letta_client/types/update_assistant_message.py +0 -24
- letta_client/types/update_assistant_message_content.py +0 -6
- letta_client/types/update_reasoning_message.py +0 -20
- letta_client/types/update_ssemcp_server.py +0 -41
- letta_client/types/update_stdio_mcp_server.py +0 -32
- letta_client/types/update_streamable_httpmcp_server.py +0 -46
- letta_client/types/update_system_message.py +0 -23
- letta_client/types/update_user_message.py +0 -24
- letta_client/types/update_user_message_content.py +0 -6
- letta_client/types/url_image.py +0 -23
- letta_client/types/usage_statistics.py +0 -25
- letta_client/types/usage_statistics_completion_token_details.py +0 -19
- letta_client/types/usage_statistics_prompt_token_details.py +0 -19
- letta_client/types/user.py +0 -52
- letta_client/types/user_create.py +0 -22
- letta_client/types/user_message.py +0 -42
- letta_client/types/user_message_content.py +0 -6
- letta_client/types/user_update.py +0 -27
- letta_client/types/validation_error.py +0 -22
- letta_client/types/validation_error_loc_item.py +0 -5
- letta_client/types/voice_sleeptime_manager.py +0 -33
- letta_client/types/voice_sleeptime_manager_update.py +0 -33
- letta_client/types/web_search_options.py +0 -22
- letta_client/types/web_search_options_search_context_size.py +0 -5
- letta_client/types/web_search_options_user_location.py +0 -21
- letta_client/types/web_search_options_user_location_approximate.py +0 -22
- letta_client/version.py +0 -3
- letta_client/voice/__init__.py +0 -2
- letta_client/voice/client.py +0 -177
- letta_client-0.1.226.dist-info/METADATA +0 -190
- letta_client-0.1.226.dist-info/RECORD +0 -452
letta_client/tools/client.py
DELETED
|
@@ -1,3063 +0,0 @@
|
|
|
1
|
-
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
-
|
|
3
|
-
import typing
|
|
4
|
-
from ..core.client_wrapper import SyncClientWrapper
|
|
5
|
-
from ..core.request_options import RequestOptions
|
|
6
|
-
from ..types.tool import Tool
|
|
7
|
-
from ..core.jsonable_encoder import jsonable_encoder
|
|
8
|
-
from ..core.unchecked_base_model import construct_type
|
|
9
|
-
from ..errors.unprocessable_entity_error import UnprocessableEntityError
|
|
10
|
-
from ..types.http_validation_error import HttpValidationError
|
|
11
|
-
from json.decoder import JSONDecodeError
|
|
12
|
-
from ..core.api_error import ApiError
|
|
13
|
-
from ..types.pip_requirement import PipRequirement
|
|
14
|
-
from ..core.serialization import convert_and_respect_annotation_metadata
|
|
15
|
-
from ..types.tool_return_message import ToolReturnMessage
|
|
16
|
-
from ..types.app_model import AppModel
|
|
17
|
-
from ..types.action_model import ActionModel
|
|
18
|
-
from .types.list_mcp_servers_response_value import ListMcpServersResponseValue
|
|
19
|
-
from .types.add_mcp_server_request import AddMcpServerRequest
|
|
20
|
-
from .types.add_mcp_server_response_item import AddMcpServerResponseItem
|
|
21
|
-
from ..types.mcp_tool import McpTool
|
|
22
|
-
from .types.delete_mcp_server_response_item import DeleteMcpServerResponseItem
|
|
23
|
-
from .types.update_mcp_server_request import UpdateMcpServerRequest
|
|
24
|
-
from .types.update_mcp_server_response import UpdateMcpServerResponse
|
|
25
|
-
from .types.test_mcp_server_request import TestMcpServerRequest
|
|
26
|
-
from .types.connect_mcp_server_request import ConnectMcpServerRequest
|
|
27
|
-
from .types.streaming_response import StreamingResponse
|
|
28
|
-
import httpx_sse
|
|
29
|
-
import json
|
|
30
|
-
from ..core.client_wrapper import AsyncClientWrapper
|
|
31
|
-
|
|
32
|
-
# this is used as the default value for optional parameters
|
|
33
|
-
OMIT = typing.cast(typing.Any, ...)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class ToolsClient:
|
|
37
|
-
def __init__(self, *, client_wrapper: SyncClientWrapper):
|
|
38
|
-
self._client_wrapper = client_wrapper
|
|
39
|
-
|
|
40
|
-
def retrieve(self, tool_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> Tool:
|
|
41
|
-
"""
|
|
42
|
-
Get a tool by ID
|
|
43
|
-
|
|
44
|
-
Parameters
|
|
45
|
-
----------
|
|
46
|
-
tool_id : str
|
|
47
|
-
|
|
48
|
-
request_options : typing.Optional[RequestOptions]
|
|
49
|
-
Request-specific configuration.
|
|
50
|
-
|
|
51
|
-
Returns
|
|
52
|
-
-------
|
|
53
|
-
Tool
|
|
54
|
-
Successful Response
|
|
55
|
-
|
|
56
|
-
Examples
|
|
57
|
-
--------
|
|
58
|
-
from letta_client import Letta
|
|
59
|
-
|
|
60
|
-
client = Letta(
|
|
61
|
-
project="YOUR_PROJECT",
|
|
62
|
-
token="YOUR_TOKEN",
|
|
63
|
-
)
|
|
64
|
-
client.tools.retrieve(
|
|
65
|
-
tool_id="tool_id",
|
|
66
|
-
)
|
|
67
|
-
"""
|
|
68
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
69
|
-
f"v1/tools/{jsonable_encoder(tool_id)}",
|
|
70
|
-
method="GET",
|
|
71
|
-
request_options=request_options,
|
|
72
|
-
)
|
|
73
|
-
try:
|
|
74
|
-
if 200 <= _response.status_code < 300:
|
|
75
|
-
return typing.cast(
|
|
76
|
-
Tool,
|
|
77
|
-
construct_type(
|
|
78
|
-
type_=Tool, # type: ignore
|
|
79
|
-
object_=_response.json(),
|
|
80
|
-
),
|
|
81
|
-
)
|
|
82
|
-
if _response.status_code == 422:
|
|
83
|
-
raise UnprocessableEntityError(
|
|
84
|
-
typing.cast(
|
|
85
|
-
HttpValidationError,
|
|
86
|
-
construct_type(
|
|
87
|
-
type_=HttpValidationError, # type: ignore
|
|
88
|
-
object_=_response.json(),
|
|
89
|
-
),
|
|
90
|
-
)
|
|
91
|
-
)
|
|
92
|
-
_response_json = _response.json()
|
|
93
|
-
except JSONDecodeError:
|
|
94
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
95
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
96
|
-
|
|
97
|
-
def delete(
|
|
98
|
-
self, tool_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
99
|
-
) -> typing.Optional[typing.Any]:
|
|
100
|
-
"""
|
|
101
|
-
Delete a tool by name
|
|
102
|
-
|
|
103
|
-
Parameters
|
|
104
|
-
----------
|
|
105
|
-
tool_id : str
|
|
106
|
-
|
|
107
|
-
request_options : typing.Optional[RequestOptions]
|
|
108
|
-
Request-specific configuration.
|
|
109
|
-
|
|
110
|
-
Returns
|
|
111
|
-
-------
|
|
112
|
-
typing.Optional[typing.Any]
|
|
113
|
-
Successful Response
|
|
114
|
-
|
|
115
|
-
Examples
|
|
116
|
-
--------
|
|
117
|
-
from letta_client import Letta
|
|
118
|
-
|
|
119
|
-
client = Letta(
|
|
120
|
-
project="YOUR_PROJECT",
|
|
121
|
-
token="YOUR_TOKEN",
|
|
122
|
-
)
|
|
123
|
-
client.tools.delete(
|
|
124
|
-
tool_id="tool_id",
|
|
125
|
-
)
|
|
126
|
-
"""
|
|
127
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
128
|
-
f"v1/tools/{jsonable_encoder(tool_id)}",
|
|
129
|
-
method="DELETE",
|
|
130
|
-
request_options=request_options,
|
|
131
|
-
)
|
|
132
|
-
try:
|
|
133
|
-
if 200 <= _response.status_code < 300:
|
|
134
|
-
return typing.cast(
|
|
135
|
-
typing.Optional[typing.Any],
|
|
136
|
-
construct_type(
|
|
137
|
-
type_=typing.Optional[typing.Any], # type: ignore
|
|
138
|
-
object_=_response.json(),
|
|
139
|
-
),
|
|
140
|
-
)
|
|
141
|
-
if _response.status_code == 422:
|
|
142
|
-
raise UnprocessableEntityError(
|
|
143
|
-
typing.cast(
|
|
144
|
-
HttpValidationError,
|
|
145
|
-
construct_type(
|
|
146
|
-
type_=HttpValidationError, # type: ignore
|
|
147
|
-
object_=_response.json(),
|
|
148
|
-
),
|
|
149
|
-
)
|
|
150
|
-
)
|
|
151
|
-
_response_json = _response.json()
|
|
152
|
-
except JSONDecodeError:
|
|
153
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
154
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
155
|
-
|
|
156
|
-
def modify(
|
|
157
|
-
self,
|
|
158
|
-
tool_id: str,
|
|
159
|
-
*,
|
|
160
|
-
description: typing.Optional[str] = OMIT,
|
|
161
|
-
tags: typing.Optional[typing.Sequence[str]] = OMIT,
|
|
162
|
-
source_code: typing.Optional[str] = OMIT,
|
|
163
|
-
source_type: typing.Optional[str] = OMIT,
|
|
164
|
-
json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
165
|
-
args_json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
166
|
-
return_char_limit: typing.Optional[int] = OMIT,
|
|
167
|
-
pip_requirements: typing.Optional[typing.Sequence[PipRequirement]] = OMIT,
|
|
168
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
169
|
-
) -> Tool:
|
|
170
|
-
"""
|
|
171
|
-
Update an existing tool
|
|
172
|
-
|
|
173
|
-
Parameters
|
|
174
|
-
----------
|
|
175
|
-
tool_id : str
|
|
176
|
-
|
|
177
|
-
description : typing.Optional[str]
|
|
178
|
-
The description of the tool.
|
|
179
|
-
|
|
180
|
-
tags : typing.Optional[typing.Sequence[str]]
|
|
181
|
-
Metadata tags.
|
|
182
|
-
|
|
183
|
-
source_code : typing.Optional[str]
|
|
184
|
-
The source code of the function.
|
|
185
|
-
|
|
186
|
-
source_type : typing.Optional[str]
|
|
187
|
-
The type of the source code.
|
|
188
|
-
|
|
189
|
-
json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
190
|
-
The JSON schema of the function (auto-generated from source_code if not provided)
|
|
191
|
-
|
|
192
|
-
args_json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
193
|
-
The args JSON schema of the function.
|
|
194
|
-
|
|
195
|
-
return_char_limit : typing.Optional[int]
|
|
196
|
-
The maximum number of characters in the response.
|
|
197
|
-
|
|
198
|
-
pip_requirements : typing.Optional[typing.Sequence[PipRequirement]]
|
|
199
|
-
Optional list of pip packages required by this tool.
|
|
200
|
-
|
|
201
|
-
request_options : typing.Optional[RequestOptions]
|
|
202
|
-
Request-specific configuration.
|
|
203
|
-
|
|
204
|
-
Returns
|
|
205
|
-
-------
|
|
206
|
-
Tool
|
|
207
|
-
Successful Response
|
|
208
|
-
|
|
209
|
-
Examples
|
|
210
|
-
--------
|
|
211
|
-
from letta_client import Letta
|
|
212
|
-
|
|
213
|
-
client = Letta(
|
|
214
|
-
project="YOUR_PROJECT",
|
|
215
|
-
token="YOUR_TOKEN",
|
|
216
|
-
)
|
|
217
|
-
client.tools.modify(
|
|
218
|
-
tool_id="tool_id",
|
|
219
|
-
)
|
|
220
|
-
"""
|
|
221
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
222
|
-
f"v1/tools/{jsonable_encoder(tool_id)}",
|
|
223
|
-
method="PATCH",
|
|
224
|
-
json={
|
|
225
|
-
"description": description,
|
|
226
|
-
"tags": tags,
|
|
227
|
-
"source_code": source_code,
|
|
228
|
-
"source_type": source_type,
|
|
229
|
-
"json_schema": json_schema,
|
|
230
|
-
"args_json_schema": args_json_schema,
|
|
231
|
-
"return_char_limit": return_char_limit,
|
|
232
|
-
"pip_requirements": convert_and_respect_annotation_metadata(
|
|
233
|
-
object_=pip_requirements, annotation=typing.Sequence[PipRequirement], direction="write"
|
|
234
|
-
),
|
|
235
|
-
},
|
|
236
|
-
headers={
|
|
237
|
-
"content-type": "application/json",
|
|
238
|
-
},
|
|
239
|
-
request_options=request_options,
|
|
240
|
-
omit=OMIT,
|
|
241
|
-
)
|
|
242
|
-
try:
|
|
243
|
-
if 200 <= _response.status_code < 300:
|
|
244
|
-
return typing.cast(
|
|
245
|
-
Tool,
|
|
246
|
-
construct_type(
|
|
247
|
-
type_=Tool, # type: ignore
|
|
248
|
-
object_=_response.json(),
|
|
249
|
-
),
|
|
250
|
-
)
|
|
251
|
-
if _response.status_code == 422:
|
|
252
|
-
raise UnprocessableEntityError(
|
|
253
|
-
typing.cast(
|
|
254
|
-
HttpValidationError,
|
|
255
|
-
construct_type(
|
|
256
|
-
type_=HttpValidationError, # type: ignore
|
|
257
|
-
object_=_response.json(),
|
|
258
|
-
),
|
|
259
|
-
)
|
|
260
|
-
)
|
|
261
|
-
_response_json = _response.json()
|
|
262
|
-
except JSONDecodeError:
|
|
263
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
264
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
265
|
-
|
|
266
|
-
def count(
|
|
267
|
-
self,
|
|
268
|
-
*,
|
|
269
|
-
include_base_tools: typing.Optional[bool] = None,
|
|
270
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
271
|
-
) -> int:
|
|
272
|
-
"""
|
|
273
|
-
Get a count of all tools available to agents belonging to the org of the user.
|
|
274
|
-
|
|
275
|
-
Parameters
|
|
276
|
-
----------
|
|
277
|
-
include_base_tools : typing.Optional[bool]
|
|
278
|
-
Include built-in Letta tools in the count
|
|
279
|
-
|
|
280
|
-
request_options : typing.Optional[RequestOptions]
|
|
281
|
-
Request-specific configuration.
|
|
282
|
-
|
|
283
|
-
Returns
|
|
284
|
-
-------
|
|
285
|
-
int
|
|
286
|
-
Successful Response
|
|
287
|
-
|
|
288
|
-
Examples
|
|
289
|
-
--------
|
|
290
|
-
from letta_client import Letta
|
|
291
|
-
|
|
292
|
-
client = Letta(
|
|
293
|
-
project="YOUR_PROJECT",
|
|
294
|
-
token="YOUR_TOKEN",
|
|
295
|
-
)
|
|
296
|
-
client.tools.count()
|
|
297
|
-
"""
|
|
298
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
299
|
-
"v1/tools/count",
|
|
300
|
-
method="GET",
|
|
301
|
-
params={
|
|
302
|
-
"include_base_tools": include_base_tools,
|
|
303
|
-
},
|
|
304
|
-
request_options=request_options,
|
|
305
|
-
)
|
|
306
|
-
try:
|
|
307
|
-
if 200 <= _response.status_code < 300:
|
|
308
|
-
return typing.cast(
|
|
309
|
-
int,
|
|
310
|
-
construct_type(
|
|
311
|
-
type_=int, # type: ignore
|
|
312
|
-
object_=_response.json(),
|
|
313
|
-
),
|
|
314
|
-
)
|
|
315
|
-
if _response.status_code == 422:
|
|
316
|
-
raise UnprocessableEntityError(
|
|
317
|
-
typing.cast(
|
|
318
|
-
HttpValidationError,
|
|
319
|
-
construct_type(
|
|
320
|
-
type_=HttpValidationError, # type: ignore
|
|
321
|
-
object_=_response.json(),
|
|
322
|
-
),
|
|
323
|
-
)
|
|
324
|
-
)
|
|
325
|
-
_response_json = _response.json()
|
|
326
|
-
except JSONDecodeError:
|
|
327
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
328
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
329
|
-
|
|
330
|
-
def list(
|
|
331
|
-
self,
|
|
332
|
-
*,
|
|
333
|
-
after: typing.Optional[str] = None,
|
|
334
|
-
limit: typing.Optional[int] = None,
|
|
335
|
-
name: typing.Optional[str] = None,
|
|
336
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
337
|
-
) -> typing.List[Tool]:
|
|
338
|
-
"""
|
|
339
|
-
Get a list of all tools available to agents belonging to the org of the user
|
|
340
|
-
|
|
341
|
-
Parameters
|
|
342
|
-
----------
|
|
343
|
-
after : typing.Optional[str]
|
|
344
|
-
|
|
345
|
-
limit : typing.Optional[int]
|
|
346
|
-
|
|
347
|
-
name : typing.Optional[str]
|
|
348
|
-
|
|
349
|
-
request_options : typing.Optional[RequestOptions]
|
|
350
|
-
Request-specific configuration.
|
|
351
|
-
|
|
352
|
-
Returns
|
|
353
|
-
-------
|
|
354
|
-
typing.List[Tool]
|
|
355
|
-
Successful Response
|
|
356
|
-
|
|
357
|
-
Examples
|
|
358
|
-
--------
|
|
359
|
-
from letta_client import Letta
|
|
360
|
-
|
|
361
|
-
client = Letta(
|
|
362
|
-
project="YOUR_PROJECT",
|
|
363
|
-
token="YOUR_TOKEN",
|
|
364
|
-
)
|
|
365
|
-
client.tools.list()
|
|
366
|
-
"""
|
|
367
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
368
|
-
"v1/tools/",
|
|
369
|
-
method="GET",
|
|
370
|
-
params={
|
|
371
|
-
"after": after,
|
|
372
|
-
"limit": limit,
|
|
373
|
-
"name": name,
|
|
374
|
-
},
|
|
375
|
-
request_options=request_options,
|
|
376
|
-
)
|
|
377
|
-
try:
|
|
378
|
-
if 200 <= _response.status_code < 300:
|
|
379
|
-
return typing.cast(
|
|
380
|
-
typing.List[Tool],
|
|
381
|
-
construct_type(
|
|
382
|
-
type_=typing.List[Tool], # type: ignore
|
|
383
|
-
object_=_response.json(),
|
|
384
|
-
),
|
|
385
|
-
)
|
|
386
|
-
if _response.status_code == 422:
|
|
387
|
-
raise UnprocessableEntityError(
|
|
388
|
-
typing.cast(
|
|
389
|
-
HttpValidationError,
|
|
390
|
-
construct_type(
|
|
391
|
-
type_=HttpValidationError, # type: ignore
|
|
392
|
-
object_=_response.json(),
|
|
393
|
-
),
|
|
394
|
-
)
|
|
395
|
-
)
|
|
396
|
-
_response_json = _response.json()
|
|
397
|
-
except JSONDecodeError:
|
|
398
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
399
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
400
|
-
|
|
401
|
-
def create(
|
|
402
|
-
self,
|
|
403
|
-
*,
|
|
404
|
-
source_code: str,
|
|
405
|
-
description: typing.Optional[str] = OMIT,
|
|
406
|
-
tags: typing.Optional[typing.Sequence[str]] = OMIT,
|
|
407
|
-
source_type: typing.Optional[str] = OMIT,
|
|
408
|
-
json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
409
|
-
args_json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
410
|
-
return_char_limit: typing.Optional[int] = OMIT,
|
|
411
|
-
pip_requirements: typing.Optional[typing.Sequence[PipRequirement]] = OMIT,
|
|
412
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
413
|
-
) -> Tool:
|
|
414
|
-
"""
|
|
415
|
-
Create a new tool
|
|
416
|
-
|
|
417
|
-
Parameters
|
|
418
|
-
----------
|
|
419
|
-
source_code : str
|
|
420
|
-
The source code of the function.
|
|
421
|
-
|
|
422
|
-
description : typing.Optional[str]
|
|
423
|
-
The description of the tool.
|
|
424
|
-
|
|
425
|
-
tags : typing.Optional[typing.Sequence[str]]
|
|
426
|
-
Metadata tags.
|
|
427
|
-
|
|
428
|
-
source_type : typing.Optional[str]
|
|
429
|
-
The source type of the function.
|
|
430
|
-
|
|
431
|
-
json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
432
|
-
The JSON schema of the function (auto-generated from source_code if not provided)
|
|
433
|
-
|
|
434
|
-
args_json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
435
|
-
The args JSON schema of the function.
|
|
436
|
-
|
|
437
|
-
return_char_limit : typing.Optional[int]
|
|
438
|
-
The maximum number of characters in the response.
|
|
439
|
-
|
|
440
|
-
pip_requirements : typing.Optional[typing.Sequence[PipRequirement]]
|
|
441
|
-
Optional list of pip packages required by this tool.
|
|
442
|
-
|
|
443
|
-
request_options : typing.Optional[RequestOptions]
|
|
444
|
-
Request-specific configuration.
|
|
445
|
-
|
|
446
|
-
Returns
|
|
447
|
-
-------
|
|
448
|
-
Tool
|
|
449
|
-
Successful Response
|
|
450
|
-
|
|
451
|
-
Examples
|
|
452
|
-
--------
|
|
453
|
-
from letta_client import Letta
|
|
454
|
-
|
|
455
|
-
client = Letta(
|
|
456
|
-
project="YOUR_PROJECT",
|
|
457
|
-
token="YOUR_TOKEN",
|
|
458
|
-
)
|
|
459
|
-
client.tools.create(
|
|
460
|
-
source_code="source_code",
|
|
461
|
-
)
|
|
462
|
-
"""
|
|
463
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
464
|
-
"v1/tools/",
|
|
465
|
-
method="POST",
|
|
466
|
-
json={
|
|
467
|
-
"description": description,
|
|
468
|
-
"tags": tags,
|
|
469
|
-
"source_code": source_code,
|
|
470
|
-
"source_type": source_type,
|
|
471
|
-
"json_schema": json_schema,
|
|
472
|
-
"args_json_schema": args_json_schema,
|
|
473
|
-
"return_char_limit": return_char_limit,
|
|
474
|
-
"pip_requirements": convert_and_respect_annotation_metadata(
|
|
475
|
-
object_=pip_requirements, annotation=typing.Sequence[PipRequirement], direction="write"
|
|
476
|
-
),
|
|
477
|
-
},
|
|
478
|
-
request_options=request_options,
|
|
479
|
-
omit=OMIT,
|
|
480
|
-
)
|
|
481
|
-
try:
|
|
482
|
-
if 200 <= _response.status_code < 300:
|
|
483
|
-
return typing.cast(
|
|
484
|
-
Tool,
|
|
485
|
-
construct_type(
|
|
486
|
-
type_=Tool, # type: ignore
|
|
487
|
-
object_=_response.json(),
|
|
488
|
-
),
|
|
489
|
-
)
|
|
490
|
-
if _response.status_code == 422:
|
|
491
|
-
raise UnprocessableEntityError(
|
|
492
|
-
typing.cast(
|
|
493
|
-
HttpValidationError,
|
|
494
|
-
construct_type(
|
|
495
|
-
type_=HttpValidationError, # type: ignore
|
|
496
|
-
object_=_response.json(),
|
|
497
|
-
),
|
|
498
|
-
)
|
|
499
|
-
)
|
|
500
|
-
_response_json = _response.json()
|
|
501
|
-
except JSONDecodeError:
|
|
502
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
503
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
504
|
-
|
|
505
|
-
def upsert(
|
|
506
|
-
self,
|
|
507
|
-
*,
|
|
508
|
-
source_code: str,
|
|
509
|
-
description: typing.Optional[str] = OMIT,
|
|
510
|
-
tags: typing.Optional[typing.Sequence[str]] = OMIT,
|
|
511
|
-
source_type: typing.Optional[str] = OMIT,
|
|
512
|
-
json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
513
|
-
args_json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
514
|
-
return_char_limit: typing.Optional[int] = OMIT,
|
|
515
|
-
pip_requirements: typing.Optional[typing.Sequence[PipRequirement]] = OMIT,
|
|
516
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
517
|
-
) -> Tool:
|
|
518
|
-
"""
|
|
519
|
-
Create or update a tool
|
|
520
|
-
|
|
521
|
-
Parameters
|
|
522
|
-
----------
|
|
523
|
-
source_code : str
|
|
524
|
-
The source code of the function.
|
|
525
|
-
|
|
526
|
-
description : typing.Optional[str]
|
|
527
|
-
The description of the tool.
|
|
528
|
-
|
|
529
|
-
tags : typing.Optional[typing.Sequence[str]]
|
|
530
|
-
Metadata tags.
|
|
531
|
-
|
|
532
|
-
source_type : typing.Optional[str]
|
|
533
|
-
The source type of the function.
|
|
534
|
-
|
|
535
|
-
json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
536
|
-
The JSON schema of the function (auto-generated from source_code if not provided)
|
|
537
|
-
|
|
538
|
-
args_json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
539
|
-
The args JSON schema of the function.
|
|
540
|
-
|
|
541
|
-
return_char_limit : typing.Optional[int]
|
|
542
|
-
The maximum number of characters in the response.
|
|
543
|
-
|
|
544
|
-
pip_requirements : typing.Optional[typing.Sequence[PipRequirement]]
|
|
545
|
-
Optional list of pip packages required by this tool.
|
|
546
|
-
|
|
547
|
-
request_options : typing.Optional[RequestOptions]
|
|
548
|
-
Request-specific configuration.
|
|
549
|
-
|
|
550
|
-
Returns
|
|
551
|
-
-------
|
|
552
|
-
Tool
|
|
553
|
-
Successful Response
|
|
554
|
-
|
|
555
|
-
Examples
|
|
556
|
-
--------
|
|
557
|
-
from letta_client import Letta
|
|
558
|
-
|
|
559
|
-
client = Letta(
|
|
560
|
-
project="YOUR_PROJECT",
|
|
561
|
-
token="YOUR_TOKEN",
|
|
562
|
-
)
|
|
563
|
-
client.tools.upsert(
|
|
564
|
-
source_code="source_code",
|
|
565
|
-
)
|
|
566
|
-
"""
|
|
567
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
568
|
-
"v1/tools/",
|
|
569
|
-
method="PUT",
|
|
570
|
-
json={
|
|
571
|
-
"description": description,
|
|
572
|
-
"tags": tags,
|
|
573
|
-
"source_code": source_code,
|
|
574
|
-
"source_type": source_type,
|
|
575
|
-
"json_schema": json_schema,
|
|
576
|
-
"args_json_schema": args_json_schema,
|
|
577
|
-
"return_char_limit": return_char_limit,
|
|
578
|
-
"pip_requirements": convert_and_respect_annotation_metadata(
|
|
579
|
-
object_=pip_requirements, annotation=typing.Sequence[PipRequirement], direction="write"
|
|
580
|
-
),
|
|
581
|
-
},
|
|
582
|
-
request_options=request_options,
|
|
583
|
-
omit=OMIT,
|
|
584
|
-
)
|
|
585
|
-
try:
|
|
586
|
-
if 200 <= _response.status_code < 300:
|
|
587
|
-
return typing.cast(
|
|
588
|
-
Tool,
|
|
589
|
-
construct_type(
|
|
590
|
-
type_=Tool, # type: ignore
|
|
591
|
-
object_=_response.json(),
|
|
592
|
-
),
|
|
593
|
-
)
|
|
594
|
-
if _response.status_code == 422:
|
|
595
|
-
raise UnprocessableEntityError(
|
|
596
|
-
typing.cast(
|
|
597
|
-
HttpValidationError,
|
|
598
|
-
construct_type(
|
|
599
|
-
type_=HttpValidationError, # type: ignore
|
|
600
|
-
object_=_response.json(),
|
|
601
|
-
),
|
|
602
|
-
)
|
|
603
|
-
)
|
|
604
|
-
_response_json = _response.json()
|
|
605
|
-
except JSONDecodeError:
|
|
606
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
607
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
608
|
-
|
|
609
|
-
def upsert_base_tools(self, *, request_options: typing.Optional[RequestOptions] = None) -> typing.List[Tool]:
|
|
610
|
-
"""
|
|
611
|
-
Upsert base tools
|
|
612
|
-
|
|
613
|
-
Parameters
|
|
614
|
-
----------
|
|
615
|
-
request_options : typing.Optional[RequestOptions]
|
|
616
|
-
Request-specific configuration.
|
|
617
|
-
|
|
618
|
-
Returns
|
|
619
|
-
-------
|
|
620
|
-
typing.List[Tool]
|
|
621
|
-
Successful Response
|
|
622
|
-
|
|
623
|
-
Examples
|
|
624
|
-
--------
|
|
625
|
-
from letta_client import Letta
|
|
626
|
-
|
|
627
|
-
client = Letta(
|
|
628
|
-
project="YOUR_PROJECT",
|
|
629
|
-
token="YOUR_TOKEN",
|
|
630
|
-
)
|
|
631
|
-
client.tools.upsert_base_tools()
|
|
632
|
-
"""
|
|
633
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
634
|
-
"v1/tools/add-base-tools",
|
|
635
|
-
method="POST",
|
|
636
|
-
request_options=request_options,
|
|
637
|
-
)
|
|
638
|
-
try:
|
|
639
|
-
if 200 <= _response.status_code < 300:
|
|
640
|
-
return typing.cast(
|
|
641
|
-
typing.List[Tool],
|
|
642
|
-
construct_type(
|
|
643
|
-
type_=typing.List[Tool], # type: ignore
|
|
644
|
-
object_=_response.json(),
|
|
645
|
-
),
|
|
646
|
-
)
|
|
647
|
-
if _response.status_code == 422:
|
|
648
|
-
raise UnprocessableEntityError(
|
|
649
|
-
typing.cast(
|
|
650
|
-
HttpValidationError,
|
|
651
|
-
construct_type(
|
|
652
|
-
type_=HttpValidationError, # type: ignore
|
|
653
|
-
object_=_response.json(),
|
|
654
|
-
),
|
|
655
|
-
)
|
|
656
|
-
)
|
|
657
|
-
_response_json = _response.json()
|
|
658
|
-
except JSONDecodeError:
|
|
659
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
660
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
661
|
-
|
|
662
|
-
def run_tool_from_source(
|
|
663
|
-
self,
|
|
664
|
-
*,
|
|
665
|
-
source_code: str,
|
|
666
|
-
args: typing.Dict[str, typing.Optional[typing.Any]],
|
|
667
|
-
env_vars: typing.Optional[typing.Dict[str, str]] = OMIT,
|
|
668
|
-
name: typing.Optional[str] = OMIT,
|
|
669
|
-
source_type: typing.Optional[str] = OMIT,
|
|
670
|
-
args_json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
671
|
-
json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
672
|
-
pip_requirements: typing.Optional[typing.Sequence[PipRequirement]] = OMIT,
|
|
673
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
674
|
-
) -> ToolReturnMessage:
|
|
675
|
-
"""
|
|
676
|
-
Attempt to build a tool from source, then run it on the provided arguments
|
|
677
|
-
|
|
678
|
-
Parameters
|
|
679
|
-
----------
|
|
680
|
-
source_code : str
|
|
681
|
-
The source code of the function.
|
|
682
|
-
|
|
683
|
-
args : typing.Dict[str, typing.Optional[typing.Any]]
|
|
684
|
-
The arguments to pass to the tool.
|
|
685
|
-
|
|
686
|
-
env_vars : typing.Optional[typing.Dict[str, str]]
|
|
687
|
-
The environment variables to pass to the tool.
|
|
688
|
-
|
|
689
|
-
name : typing.Optional[str]
|
|
690
|
-
The name of the tool to run.
|
|
691
|
-
|
|
692
|
-
source_type : typing.Optional[str]
|
|
693
|
-
The type of the source code.
|
|
694
|
-
|
|
695
|
-
args_json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
696
|
-
The args JSON schema of the function.
|
|
697
|
-
|
|
698
|
-
json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
699
|
-
The JSON schema of the function (auto-generated from source_code if not provided)
|
|
700
|
-
|
|
701
|
-
pip_requirements : typing.Optional[typing.Sequence[PipRequirement]]
|
|
702
|
-
Optional list of pip packages required by this tool.
|
|
703
|
-
|
|
704
|
-
request_options : typing.Optional[RequestOptions]
|
|
705
|
-
Request-specific configuration.
|
|
706
|
-
|
|
707
|
-
Returns
|
|
708
|
-
-------
|
|
709
|
-
ToolReturnMessage
|
|
710
|
-
Successful Response
|
|
711
|
-
|
|
712
|
-
Examples
|
|
713
|
-
--------
|
|
714
|
-
from letta_client import Letta
|
|
715
|
-
|
|
716
|
-
client = Letta(
|
|
717
|
-
project="YOUR_PROJECT",
|
|
718
|
-
token="YOUR_TOKEN",
|
|
719
|
-
)
|
|
720
|
-
client.tools.run_tool_from_source(
|
|
721
|
-
source_code="source_code",
|
|
722
|
-
args={"key": "value"},
|
|
723
|
-
)
|
|
724
|
-
"""
|
|
725
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
726
|
-
"v1/tools/run",
|
|
727
|
-
method="POST",
|
|
728
|
-
json={
|
|
729
|
-
"source_code": source_code,
|
|
730
|
-
"args": args,
|
|
731
|
-
"env_vars": env_vars,
|
|
732
|
-
"name": name,
|
|
733
|
-
"source_type": source_type,
|
|
734
|
-
"args_json_schema": args_json_schema,
|
|
735
|
-
"json_schema": json_schema,
|
|
736
|
-
"pip_requirements": convert_and_respect_annotation_metadata(
|
|
737
|
-
object_=pip_requirements, annotation=typing.Sequence[PipRequirement], direction="write"
|
|
738
|
-
),
|
|
739
|
-
},
|
|
740
|
-
headers={
|
|
741
|
-
"content-type": "application/json",
|
|
742
|
-
},
|
|
743
|
-
request_options=request_options,
|
|
744
|
-
omit=OMIT,
|
|
745
|
-
)
|
|
746
|
-
try:
|
|
747
|
-
if 200 <= _response.status_code < 300:
|
|
748
|
-
return typing.cast(
|
|
749
|
-
ToolReturnMessage,
|
|
750
|
-
construct_type(
|
|
751
|
-
type_=ToolReturnMessage, # type: ignore
|
|
752
|
-
object_=_response.json(),
|
|
753
|
-
),
|
|
754
|
-
)
|
|
755
|
-
if _response.status_code == 422:
|
|
756
|
-
raise UnprocessableEntityError(
|
|
757
|
-
typing.cast(
|
|
758
|
-
HttpValidationError,
|
|
759
|
-
construct_type(
|
|
760
|
-
type_=HttpValidationError, # type: ignore
|
|
761
|
-
object_=_response.json(),
|
|
762
|
-
),
|
|
763
|
-
)
|
|
764
|
-
)
|
|
765
|
-
_response_json = _response.json()
|
|
766
|
-
except JSONDecodeError:
|
|
767
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
768
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
769
|
-
|
|
770
|
-
def list_composio_apps(
|
|
771
|
-
self, *, user_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
|
|
772
|
-
) -> typing.List[AppModel]:
|
|
773
|
-
"""
|
|
774
|
-
Get a list of all Composio apps
|
|
775
|
-
|
|
776
|
-
Parameters
|
|
777
|
-
----------
|
|
778
|
-
user_id : typing.Optional[str]
|
|
779
|
-
|
|
780
|
-
request_options : typing.Optional[RequestOptions]
|
|
781
|
-
Request-specific configuration.
|
|
782
|
-
|
|
783
|
-
Returns
|
|
784
|
-
-------
|
|
785
|
-
typing.List[AppModel]
|
|
786
|
-
Successful Response
|
|
787
|
-
|
|
788
|
-
Examples
|
|
789
|
-
--------
|
|
790
|
-
from letta_client import Letta
|
|
791
|
-
|
|
792
|
-
client = Letta(
|
|
793
|
-
project="YOUR_PROJECT",
|
|
794
|
-
token="YOUR_TOKEN",
|
|
795
|
-
)
|
|
796
|
-
client.tools.list_composio_apps()
|
|
797
|
-
"""
|
|
798
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
799
|
-
"v1/tools/composio/apps",
|
|
800
|
-
method="GET",
|
|
801
|
-
headers={
|
|
802
|
-
"user-id": str(user_id) if user_id is not None else None,
|
|
803
|
-
},
|
|
804
|
-
request_options=request_options,
|
|
805
|
-
)
|
|
806
|
-
try:
|
|
807
|
-
if 200 <= _response.status_code < 300:
|
|
808
|
-
return typing.cast(
|
|
809
|
-
typing.List[AppModel],
|
|
810
|
-
construct_type(
|
|
811
|
-
type_=typing.List[AppModel], # type: ignore
|
|
812
|
-
object_=_response.json(),
|
|
813
|
-
),
|
|
814
|
-
)
|
|
815
|
-
if _response.status_code == 422:
|
|
816
|
-
raise UnprocessableEntityError(
|
|
817
|
-
typing.cast(
|
|
818
|
-
HttpValidationError,
|
|
819
|
-
construct_type(
|
|
820
|
-
type_=HttpValidationError, # type: ignore
|
|
821
|
-
object_=_response.json(),
|
|
822
|
-
),
|
|
823
|
-
)
|
|
824
|
-
)
|
|
825
|
-
_response_json = _response.json()
|
|
826
|
-
except JSONDecodeError:
|
|
827
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
828
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
829
|
-
|
|
830
|
-
def list_composio_actions_by_app(
|
|
831
|
-
self, composio_app_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
832
|
-
) -> typing.List[ActionModel]:
|
|
833
|
-
"""
|
|
834
|
-
Get a list of all Composio actions for a specific app
|
|
835
|
-
|
|
836
|
-
Parameters
|
|
837
|
-
----------
|
|
838
|
-
composio_app_name : str
|
|
839
|
-
|
|
840
|
-
request_options : typing.Optional[RequestOptions]
|
|
841
|
-
Request-specific configuration.
|
|
842
|
-
|
|
843
|
-
Returns
|
|
844
|
-
-------
|
|
845
|
-
typing.List[ActionModel]
|
|
846
|
-
Successful Response
|
|
847
|
-
|
|
848
|
-
Examples
|
|
849
|
-
--------
|
|
850
|
-
from letta_client import Letta
|
|
851
|
-
|
|
852
|
-
client = Letta(
|
|
853
|
-
project="YOUR_PROJECT",
|
|
854
|
-
token="YOUR_TOKEN",
|
|
855
|
-
)
|
|
856
|
-
client.tools.list_composio_actions_by_app(
|
|
857
|
-
composio_app_name="composio_app_name",
|
|
858
|
-
)
|
|
859
|
-
"""
|
|
860
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
861
|
-
f"v1/tools/composio/apps/{jsonable_encoder(composio_app_name)}/actions",
|
|
862
|
-
method="GET",
|
|
863
|
-
request_options=request_options,
|
|
864
|
-
)
|
|
865
|
-
try:
|
|
866
|
-
if 200 <= _response.status_code < 300:
|
|
867
|
-
return typing.cast(
|
|
868
|
-
typing.List[ActionModel],
|
|
869
|
-
construct_type(
|
|
870
|
-
type_=typing.List[ActionModel], # type: ignore
|
|
871
|
-
object_=_response.json(),
|
|
872
|
-
),
|
|
873
|
-
)
|
|
874
|
-
if _response.status_code == 422:
|
|
875
|
-
raise UnprocessableEntityError(
|
|
876
|
-
typing.cast(
|
|
877
|
-
HttpValidationError,
|
|
878
|
-
construct_type(
|
|
879
|
-
type_=HttpValidationError, # type: ignore
|
|
880
|
-
object_=_response.json(),
|
|
881
|
-
),
|
|
882
|
-
)
|
|
883
|
-
)
|
|
884
|
-
_response_json = _response.json()
|
|
885
|
-
except JSONDecodeError:
|
|
886
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
887
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
888
|
-
|
|
889
|
-
def add_composio_tool(
|
|
890
|
-
self, composio_action_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
891
|
-
) -> Tool:
|
|
892
|
-
"""
|
|
893
|
-
Add a new Composio tool by action name (Composio refers to each tool as an `Action`)
|
|
894
|
-
|
|
895
|
-
Parameters
|
|
896
|
-
----------
|
|
897
|
-
composio_action_name : str
|
|
898
|
-
|
|
899
|
-
request_options : typing.Optional[RequestOptions]
|
|
900
|
-
Request-specific configuration.
|
|
901
|
-
|
|
902
|
-
Returns
|
|
903
|
-
-------
|
|
904
|
-
Tool
|
|
905
|
-
Successful Response
|
|
906
|
-
|
|
907
|
-
Examples
|
|
908
|
-
--------
|
|
909
|
-
from letta_client import Letta
|
|
910
|
-
|
|
911
|
-
client = Letta(
|
|
912
|
-
project="YOUR_PROJECT",
|
|
913
|
-
token="YOUR_TOKEN",
|
|
914
|
-
)
|
|
915
|
-
client.tools.add_composio_tool(
|
|
916
|
-
composio_action_name="composio_action_name",
|
|
917
|
-
)
|
|
918
|
-
"""
|
|
919
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
920
|
-
f"v1/tools/composio/{jsonable_encoder(composio_action_name)}",
|
|
921
|
-
method="POST",
|
|
922
|
-
request_options=request_options,
|
|
923
|
-
)
|
|
924
|
-
try:
|
|
925
|
-
if 200 <= _response.status_code < 300:
|
|
926
|
-
return typing.cast(
|
|
927
|
-
Tool,
|
|
928
|
-
construct_type(
|
|
929
|
-
type_=Tool, # type: ignore
|
|
930
|
-
object_=_response.json(),
|
|
931
|
-
),
|
|
932
|
-
)
|
|
933
|
-
if _response.status_code == 422:
|
|
934
|
-
raise UnprocessableEntityError(
|
|
935
|
-
typing.cast(
|
|
936
|
-
HttpValidationError,
|
|
937
|
-
construct_type(
|
|
938
|
-
type_=HttpValidationError, # type: ignore
|
|
939
|
-
object_=_response.json(),
|
|
940
|
-
),
|
|
941
|
-
)
|
|
942
|
-
)
|
|
943
|
-
_response_json = _response.json()
|
|
944
|
-
except JSONDecodeError:
|
|
945
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
946
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
947
|
-
|
|
948
|
-
def list_mcp_servers(
|
|
949
|
-
self, *, user_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
|
|
950
|
-
) -> typing.Dict[str, ListMcpServersResponseValue]:
|
|
951
|
-
"""
|
|
952
|
-
Get a list of all configured MCP servers
|
|
953
|
-
|
|
954
|
-
Parameters
|
|
955
|
-
----------
|
|
956
|
-
user_id : typing.Optional[str]
|
|
957
|
-
|
|
958
|
-
request_options : typing.Optional[RequestOptions]
|
|
959
|
-
Request-specific configuration.
|
|
960
|
-
|
|
961
|
-
Returns
|
|
962
|
-
-------
|
|
963
|
-
typing.Dict[str, ListMcpServersResponseValue]
|
|
964
|
-
Successful Response
|
|
965
|
-
|
|
966
|
-
Examples
|
|
967
|
-
--------
|
|
968
|
-
from letta_client import Letta
|
|
969
|
-
|
|
970
|
-
client = Letta(
|
|
971
|
-
project="YOUR_PROJECT",
|
|
972
|
-
token="YOUR_TOKEN",
|
|
973
|
-
)
|
|
974
|
-
client.tools.list_mcp_servers()
|
|
975
|
-
"""
|
|
976
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
977
|
-
"v1/tools/mcp/servers",
|
|
978
|
-
method="GET",
|
|
979
|
-
headers={
|
|
980
|
-
"user-id": str(user_id) if user_id is not None else None,
|
|
981
|
-
},
|
|
982
|
-
request_options=request_options,
|
|
983
|
-
)
|
|
984
|
-
try:
|
|
985
|
-
if 200 <= _response.status_code < 300:
|
|
986
|
-
return typing.cast(
|
|
987
|
-
typing.Dict[str, ListMcpServersResponseValue],
|
|
988
|
-
construct_type(
|
|
989
|
-
type_=typing.Dict[str, ListMcpServersResponseValue], # type: ignore
|
|
990
|
-
object_=_response.json(),
|
|
991
|
-
),
|
|
992
|
-
)
|
|
993
|
-
if _response.status_code == 422:
|
|
994
|
-
raise UnprocessableEntityError(
|
|
995
|
-
typing.cast(
|
|
996
|
-
HttpValidationError,
|
|
997
|
-
construct_type(
|
|
998
|
-
type_=HttpValidationError, # type: ignore
|
|
999
|
-
object_=_response.json(),
|
|
1000
|
-
),
|
|
1001
|
-
)
|
|
1002
|
-
)
|
|
1003
|
-
_response_json = _response.json()
|
|
1004
|
-
except JSONDecodeError:
|
|
1005
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1006
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1007
|
-
|
|
1008
|
-
def add_mcp_server(
|
|
1009
|
-
self, *, request: AddMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
|
|
1010
|
-
) -> typing.List[AddMcpServerResponseItem]:
|
|
1011
|
-
"""
|
|
1012
|
-
Add a new MCP server to the Letta MCP server config
|
|
1013
|
-
|
|
1014
|
-
Parameters
|
|
1015
|
-
----------
|
|
1016
|
-
request : AddMcpServerRequest
|
|
1017
|
-
|
|
1018
|
-
request_options : typing.Optional[RequestOptions]
|
|
1019
|
-
Request-specific configuration.
|
|
1020
|
-
|
|
1021
|
-
Returns
|
|
1022
|
-
-------
|
|
1023
|
-
typing.List[AddMcpServerResponseItem]
|
|
1024
|
-
Successful Response
|
|
1025
|
-
|
|
1026
|
-
Examples
|
|
1027
|
-
--------
|
|
1028
|
-
from letta_client import Letta, StdioServerConfig
|
|
1029
|
-
|
|
1030
|
-
client = Letta(
|
|
1031
|
-
project="YOUR_PROJECT",
|
|
1032
|
-
token="YOUR_TOKEN",
|
|
1033
|
-
)
|
|
1034
|
-
client.tools.add_mcp_server(
|
|
1035
|
-
request=StdioServerConfig(
|
|
1036
|
-
server_name="server_name",
|
|
1037
|
-
command="command",
|
|
1038
|
-
args=["args"],
|
|
1039
|
-
),
|
|
1040
|
-
)
|
|
1041
|
-
"""
|
|
1042
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
1043
|
-
"v1/tools/mcp/servers",
|
|
1044
|
-
method="PUT",
|
|
1045
|
-
json=convert_and_respect_annotation_metadata(
|
|
1046
|
-
object_=request, annotation=AddMcpServerRequest, direction="write"
|
|
1047
|
-
),
|
|
1048
|
-
request_options=request_options,
|
|
1049
|
-
omit=OMIT,
|
|
1050
|
-
)
|
|
1051
|
-
try:
|
|
1052
|
-
if 200 <= _response.status_code < 300:
|
|
1053
|
-
return typing.cast(
|
|
1054
|
-
typing.List[AddMcpServerResponseItem],
|
|
1055
|
-
construct_type(
|
|
1056
|
-
type_=typing.List[AddMcpServerResponseItem], # type: ignore
|
|
1057
|
-
object_=_response.json(),
|
|
1058
|
-
),
|
|
1059
|
-
)
|
|
1060
|
-
if _response.status_code == 422:
|
|
1061
|
-
raise UnprocessableEntityError(
|
|
1062
|
-
typing.cast(
|
|
1063
|
-
HttpValidationError,
|
|
1064
|
-
construct_type(
|
|
1065
|
-
type_=HttpValidationError, # type: ignore
|
|
1066
|
-
object_=_response.json(),
|
|
1067
|
-
),
|
|
1068
|
-
)
|
|
1069
|
-
)
|
|
1070
|
-
_response_json = _response.json()
|
|
1071
|
-
except JSONDecodeError:
|
|
1072
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1073
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1074
|
-
|
|
1075
|
-
def list_mcp_tools_by_server(
|
|
1076
|
-
self, mcp_server_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
1077
|
-
) -> typing.List[McpTool]:
|
|
1078
|
-
"""
|
|
1079
|
-
Get a list of all tools for a specific MCP server
|
|
1080
|
-
|
|
1081
|
-
Parameters
|
|
1082
|
-
----------
|
|
1083
|
-
mcp_server_name : str
|
|
1084
|
-
|
|
1085
|
-
request_options : typing.Optional[RequestOptions]
|
|
1086
|
-
Request-specific configuration.
|
|
1087
|
-
|
|
1088
|
-
Returns
|
|
1089
|
-
-------
|
|
1090
|
-
typing.List[McpTool]
|
|
1091
|
-
Successful Response
|
|
1092
|
-
|
|
1093
|
-
Examples
|
|
1094
|
-
--------
|
|
1095
|
-
from letta_client import Letta
|
|
1096
|
-
|
|
1097
|
-
client = Letta(
|
|
1098
|
-
project="YOUR_PROJECT",
|
|
1099
|
-
token="YOUR_TOKEN",
|
|
1100
|
-
)
|
|
1101
|
-
client.tools.list_mcp_tools_by_server(
|
|
1102
|
-
mcp_server_name="mcp_server_name",
|
|
1103
|
-
)
|
|
1104
|
-
"""
|
|
1105
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
1106
|
-
f"v1/tools/mcp/servers/{jsonable_encoder(mcp_server_name)}/tools",
|
|
1107
|
-
method="GET",
|
|
1108
|
-
request_options=request_options,
|
|
1109
|
-
)
|
|
1110
|
-
try:
|
|
1111
|
-
if 200 <= _response.status_code < 300:
|
|
1112
|
-
return typing.cast(
|
|
1113
|
-
typing.List[McpTool],
|
|
1114
|
-
construct_type(
|
|
1115
|
-
type_=typing.List[McpTool], # type: ignore
|
|
1116
|
-
object_=_response.json(),
|
|
1117
|
-
),
|
|
1118
|
-
)
|
|
1119
|
-
if _response.status_code == 422:
|
|
1120
|
-
raise UnprocessableEntityError(
|
|
1121
|
-
typing.cast(
|
|
1122
|
-
HttpValidationError,
|
|
1123
|
-
construct_type(
|
|
1124
|
-
type_=HttpValidationError, # type: ignore
|
|
1125
|
-
object_=_response.json(),
|
|
1126
|
-
),
|
|
1127
|
-
)
|
|
1128
|
-
)
|
|
1129
|
-
_response_json = _response.json()
|
|
1130
|
-
except JSONDecodeError:
|
|
1131
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1132
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1133
|
-
|
|
1134
|
-
def add_mcp_tool(
|
|
1135
|
-
self, mcp_server_name: str, mcp_tool_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
1136
|
-
) -> Tool:
|
|
1137
|
-
"""
|
|
1138
|
-
Register a new MCP tool as a Letta server by MCP server + tool name
|
|
1139
|
-
|
|
1140
|
-
Parameters
|
|
1141
|
-
----------
|
|
1142
|
-
mcp_server_name : str
|
|
1143
|
-
|
|
1144
|
-
mcp_tool_name : str
|
|
1145
|
-
|
|
1146
|
-
request_options : typing.Optional[RequestOptions]
|
|
1147
|
-
Request-specific configuration.
|
|
1148
|
-
|
|
1149
|
-
Returns
|
|
1150
|
-
-------
|
|
1151
|
-
Tool
|
|
1152
|
-
Successful Response
|
|
1153
|
-
|
|
1154
|
-
Examples
|
|
1155
|
-
--------
|
|
1156
|
-
from letta_client import Letta
|
|
1157
|
-
|
|
1158
|
-
client = Letta(
|
|
1159
|
-
project="YOUR_PROJECT",
|
|
1160
|
-
token="YOUR_TOKEN",
|
|
1161
|
-
)
|
|
1162
|
-
client.tools.add_mcp_tool(
|
|
1163
|
-
mcp_server_name="mcp_server_name",
|
|
1164
|
-
mcp_tool_name="mcp_tool_name",
|
|
1165
|
-
)
|
|
1166
|
-
"""
|
|
1167
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
1168
|
-
f"v1/tools/mcp/servers/{jsonable_encoder(mcp_server_name)}/{jsonable_encoder(mcp_tool_name)}",
|
|
1169
|
-
method="POST",
|
|
1170
|
-
request_options=request_options,
|
|
1171
|
-
)
|
|
1172
|
-
try:
|
|
1173
|
-
if 200 <= _response.status_code < 300:
|
|
1174
|
-
return typing.cast(
|
|
1175
|
-
Tool,
|
|
1176
|
-
construct_type(
|
|
1177
|
-
type_=Tool, # type: ignore
|
|
1178
|
-
object_=_response.json(),
|
|
1179
|
-
),
|
|
1180
|
-
)
|
|
1181
|
-
if _response.status_code == 422:
|
|
1182
|
-
raise UnprocessableEntityError(
|
|
1183
|
-
typing.cast(
|
|
1184
|
-
HttpValidationError,
|
|
1185
|
-
construct_type(
|
|
1186
|
-
type_=HttpValidationError, # type: ignore
|
|
1187
|
-
object_=_response.json(),
|
|
1188
|
-
),
|
|
1189
|
-
)
|
|
1190
|
-
)
|
|
1191
|
-
_response_json = _response.json()
|
|
1192
|
-
except JSONDecodeError:
|
|
1193
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1194
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1195
|
-
|
|
1196
|
-
def delete_mcp_server(
|
|
1197
|
-
self, mcp_server_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
1198
|
-
) -> typing.List[DeleteMcpServerResponseItem]:
|
|
1199
|
-
"""
|
|
1200
|
-
Add a new MCP server to the Letta MCP server config
|
|
1201
|
-
|
|
1202
|
-
Parameters
|
|
1203
|
-
----------
|
|
1204
|
-
mcp_server_name : str
|
|
1205
|
-
|
|
1206
|
-
request_options : typing.Optional[RequestOptions]
|
|
1207
|
-
Request-specific configuration.
|
|
1208
|
-
|
|
1209
|
-
Returns
|
|
1210
|
-
-------
|
|
1211
|
-
typing.List[DeleteMcpServerResponseItem]
|
|
1212
|
-
Successful Response
|
|
1213
|
-
|
|
1214
|
-
Examples
|
|
1215
|
-
--------
|
|
1216
|
-
from letta_client import Letta
|
|
1217
|
-
|
|
1218
|
-
client = Letta(
|
|
1219
|
-
project="YOUR_PROJECT",
|
|
1220
|
-
token="YOUR_TOKEN",
|
|
1221
|
-
)
|
|
1222
|
-
client.tools.delete_mcp_server(
|
|
1223
|
-
mcp_server_name="mcp_server_name",
|
|
1224
|
-
)
|
|
1225
|
-
"""
|
|
1226
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
1227
|
-
f"v1/tools/mcp/servers/{jsonable_encoder(mcp_server_name)}",
|
|
1228
|
-
method="DELETE",
|
|
1229
|
-
request_options=request_options,
|
|
1230
|
-
)
|
|
1231
|
-
try:
|
|
1232
|
-
if 200 <= _response.status_code < 300:
|
|
1233
|
-
return typing.cast(
|
|
1234
|
-
typing.List[DeleteMcpServerResponseItem],
|
|
1235
|
-
construct_type(
|
|
1236
|
-
type_=typing.List[DeleteMcpServerResponseItem], # type: ignore
|
|
1237
|
-
object_=_response.json(),
|
|
1238
|
-
),
|
|
1239
|
-
)
|
|
1240
|
-
if _response.status_code == 422:
|
|
1241
|
-
raise UnprocessableEntityError(
|
|
1242
|
-
typing.cast(
|
|
1243
|
-
HttpValidationError,
|
|
1244
|
-
construct_type(
|
|
1245
|
-
type_=HttpValidationError, # type: ignore
|
|
1246
|
-
object_=_response.json(),
|
|
1247
|
-
),
|
|
1248
|
-
)
|
|
1249
|
-
)
|
|
1250
|
-
_response_json = _response.json()
|
|
1251
|
-
except JSONDecodeError:
|
|
1252
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1253
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1254
|
-
|
|
1255
|
-
def update_mcp_server(
|
|
1256
|
-
self,
|
|
1257
|
-
mcp_server_name: str,
|
|
1258
|
-
*,
|
|
1259
|
-
request: UpdateMcpServerRequest,
|
|
1260
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
1261
|
-
) -> UpdateMcpServerResponse:
|
|
1262
|
-
"""
|
|
1263
|
-
Update an existing MCP server configuration
|
|
1264
|
-
|
|
1265
|
-
Parameters
|
|
1266
|
-
----------
|
|
1267
|
-
mcp_server_name : str
|
|
1268
|
-
|
|
1269
|
-
request : UpdateMcpServerRequest
|
|
1270
|
-
|
|
1271
|
-
request_options : typing.Optional[RequestOptions]
|
|
1272
|
-
Request-specific configuration.
|
|
1273
|
-
|
|
1274
|
-
Returns
|
|
1275
|
-
-------
|
|
1276
|
-
UpdateMcpServerResponse
|
|
1277
|
-
Successful Response
|
|
1278
|
-
|
|
1279
|
-
Examples
|
|
1280
|
-
--------
|
|
1281
|
-
from letta_client import Letta, UpdateStdioMcpServer
|
|
1282
|
-
|
|
1283
|
-
client = Letta(
|
|
1284
|
-
project="YOUR_PROJECT",
|
|
1285
|
-
token="YOUR_TOKEN",
|
|
1286
|
-
)
|
|
1287
|
-
client.tools.update_mcp_server(
|
|
1288
|
-
mcp_server_name="mcp_server_name",
|
|
1289
|
-
request=UpdateStdioMcpServer(),
|
|
1290
|
-
)
|
|
1291
|
-
"""
|
|
1292
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
1293
|
-
f"v1/tools/mcp/servers/{jsonable_encoder(mcp_server_name)}",
|
|
1294
|
-
method="PATCH",
|
|
1295
|
-
json=convert_and_respect_annotation_metadata(
|
|
1296
|
-
object_=request, annotation=UpdateMcpServerRequest, direction="write"
|
|
1297
|
-
),
|
|
1298
|
-
request_options=request_options,
|
|
1299
|
-
omit=OMIT,
|
|
1300
|
-
)
|
|
1301
|
-
try:
|
|
1302
|
-
if 200 <= _response.status_code < 300:
|
|
1303
|
-
return typing.cast(
|
|
1304
|
-
UpdateMcpServerResponse,
|
|
1305
|
-
construct_type(
|
|
1306
|
-
type_=UpdateMcpServerResponse, # type: ignore
|
|
1307
|
-
object_=_response.json(),
|
|
1308
|
-
),
|
|
1309
|
-
)
|
|
1310
|
-
if _response.status_code == 422:
|
|
1311
|
-
raise UnprocessableEntityError(
|
|
1312
|
-
typing.cast(
|
|
1313
|
-
HttpValidationError,
|
|
1314
|
-
construct_type(
|
|
1315
|
-
type_=HttpValidationError, # type: ignore
|
|
1316
|
-
object_=_response.json(),
|
|
1317
|
-
),
|
|
1318
|
-
)
|
|
1319
|
-
)
|
|
1320
|
-
_response_json = _response.json()
|
|
1321
|
-
except JSONDecodeError:
|
|
1322
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1323
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1324
|
-
|
|
1325
|
-
def test_mcp_server(
|
|
1326
|
-
self, *, request: TestMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
|
|
1327
|
-
) -> typing.Optional[typing.Any]:
|
|
1328
|
-
"""
|
|
1329
|
-
Test connection to an MCP server without adding it.
|
|
1330
|
-
Returns the list of available tools if successful.
|
|
1331
|
-
|
|
1332
|
-
Parameters
|
|
1333
|
-
----------
|
|
1334
|
-
request : TestMcpServerRequest
|
|
1335
|
-
|
|
1336
|
-
request_options : typing.Optional[RequestOptions]
|
|
1337
|
-
Request-specific configuration.
|
|
1338
|
-
|
|
1339
|
-
Returns
|
|
1340
|
-
-------
|
|
1341
|
-
typing.Optional[typing.Any]
|
|
1342
|
-
Successful Response
|
|
1343
|
-
|
|
1344
|
-
Examples
|
|
1345
|
-
--------
|
|
1346
|
-
from letta_client import Letta, StdioServerConfig
|
|
1347
|
-
|
|
1348
|
-
client = Letta(
|
|
1349
|
-
project="YOUR_PROJECT",
|
|
1350
|
-
token="YOUR_TOKEN",
|
|
1351
|
-
)
|
|
1352
|
-
client.tools.test_mcp_server(
|
|
1353
|
-
request=StdioServerConfig(
|
|
1354
|
-
server_name="server_name",
|
|
1355
|
-
command="command",
|
|
1356
|
-
args=["args"],
|
|
1357
|
-
),
|
|
1358
|
-
)
|
|
1359
|
-
"""
|
|
1360
|
-
_response = self._client_wrapper.httpx_client.request(
|
|
1361
|
-
"v1/tools/mcp/servers/test",
|
|
1362
|
-
method="POST",
|
|
1363
|
-
json=convert_and_respect_annotation_metadata(
|
|
1364
|
-
object_=request, annotation=TestMcpServerRequest, direction="write"
|
|
1365
|
-
),
|
|
1366
|
-
request_options=request_options,
|
|
1367
|
-
omit=OMIT,
|
|
1368
|
-
)
|
|
1369
|
-
try:
|
|
1370
|
-
if 200 <= _response.status_code < 300:
|
|
1371
|
-
return typing.cast(
|
|
1372
|
-
typing.Optional[typing.Any],
|
|
1373
|
-
construct_type(
|
|
1374
|
-
type_=typing.Optional[typing.Any], # type: ignore
|
|
1375
|
-
object_=_response.json(),
|
|
1376
|
-
),
|
|
1377
|
-
)
|
|
1378
|
-
if _response.status_code == 422:
|
|
1379
|
-
raise UnprocessableEntityError(
|
|
1380
|
-
typing.cast(
|
|
1381
|
-
HttpValidationError,
|
|
1382
|
-
construct_type(
|
|
1383
|
-
type_=HttpValidationError, # type: ignore
|
|
1384
|
-
object_=_response.json(),
|
|
1385
|
-
),
|
|
1386
|
-
)
|
|
1387
|
-
)
|
|
1388
|
-
_response_json = _response.json()
|
|
1389
|
-
except JSONDecodeError:
|
|
1390
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1391
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1392
|
-
|
|
1393
|
-
def connect_mcp_server(
|
|
1394
|
-
self, *, request: ConnectMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
|
|
1395
|
-
) -> typing.Iterator[StreamingResponse]:
|
|
1396
|
-
"""
|
|
1397
|
-
Connect to an MCP server with support for OAuth via SSE.
|
|
1398
|
-
Returns a stream of events handling authorization state and exchange if OAuth is required.
|
|
1399
|
-
|
|
1400
|
-
Parameters
|
|
1401
|
-
----------
|
|
1402
|
-
request : ConnectMcpServerRequest
|
|
1403
|
-
|
|
1404
|
-
request_options : typing.Optional[RequestOptions]
|
|
1405
|
-
Request-specific configuration.
|
|
1406
|
-
|
|
1407
|
-
Yields
|
|
1408
|
-
------
|
|
1409
|
-
typing.Iterator[StreamingResponse]
|
|
1410
|
-
Successful response
|
|
1411
|
-
|
|
1412
|
-
Examples
|
|
1413
|
-
--------
|
|
1414
|
-
from letta_client import Letta, StdioServerConfig
|
|
1415
|
-
|
|
1416
|
-
client = Letta(
|
|
1417
|
-
project="YOUR_PROJECT",
|
|
1418
|
-
token="YOUR_TOKEN",
|
|
1419
|
-
)
|
|
1420
|
-
response = client.tools.connect_mcp_server(
|
|
1421
|
-
request=StdioServerConfig(
|
|
1422
|
-
server_name="server_name",
|
|
1423
|
-
command="command",
|
|
1424
|
-
args=["args"],
|
|
1425
|
-
),
|
|
1426
|
-
)
|
|
1427
|
-
for chunk in response:
|
|
1428
|
-
yield chunk
|
|
1429
|
-
"""
|
|
1430
|
-
with self._client_wrapper.httpx_client.stream(
|
|
1431
|
-
"v1/tools/mcp/servers/connect",
|
|
1432
|
-
method="POST",
|
|
1433
|
-
json=convert_and_respect_annotation_metadata(
|
|
1434
|
-
object_=request, annotation=ConnectMcpServerRequest, direction="write"
|
|
1435
|
-
),
|
|
1436
|
-
request_options=request_options,
|
|
1437
|
-
omit=OMIT,
|
|
1438
|
-
) as _response:
|
|
1439
|
-
try:
|
|
1440
|
-
if 200 <= _response.status_code < 300:
|
|
1441
|
-
_event_source = httpx_sse.EventSource(_response)
|
|
1442
|
-
for _sse in _event_source.iter_sse():
|
|
1443
|
-
try:
|
|
1444
|
-
yield typing.cast(
|
|
1445
|
-
StreamingResponse,
|
|
1446
|
-
construct_type(
|
|
1447
|
-
type_=StreamingResponse, # type: ignore
|
|
1448
|
-
object_=json.loads(_sse.data),
|
|
1449
|
-
),
|
|
1450
|
-
)
|
|
1451
|
-
except:
|
|
1452
|
-
pass
|
|
1453
|
-
return
|
|
1454
|
-
_response.read()
|
|
1455
|
-
if _response.status_code == 422:
|
|
1456
|
-
raise UnprocessableEntityError(
|
|
1457
|
-
typing.cast(
|
|
1458
|
-
HttpValidationError,
|
|
1459
|
-
construct_type(
|
|
1460
|
-
type_=HttpValidationError, # type: ignore
|
|
1461
|
-
object_=_response.json(),
|
|
1462
|
-
),
|
|
1463
|
-
)
|
|
1464
|
-
)
|
|
1465
|
-
_response_json = _response.json()
|
|
1466
|
-
except JSONDecodeError:
|
|
1467
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1468
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
class AsyncToolsClient:
|
|
1472
|
-
def __init__(self, *, client_wrapper: AsyncClientWrapper):
|
|
1473
|
-
self._client_wrapper = client_wrapper
|
|
1474
|
-
|
|
1475
|
-
async def retrieve(self, tool_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> Tool:
|
|
1476
|
-
"""
|
|
1477
|
-
Get a tool by ID
|
|
1478
|
-
|
|
1479
|
-
Parameters
|
|
1480
|
-
----------
|
|
1481
|
-
tool_id : str
|
|
1482
|
-
|
|
1483
|
-
request_options : typing.Optional[RequestOptions]
|
|
1484
|
-
Request-specific configuration.
|
|
1485
|
-
|
|
1486
|
-
Returns
|
|
1487
|
-
-------
|
|
1488
|
-
Tool
|
|
1489
|
-
Successful Response
|
|
1490
|
-
|
|
1491
|
-
Examples
|
|
1492
|
-
--------
|
|
1493
|
-
import asyncio
|
|
1494
|
-
|
|
1495
|
-
from letta_client import AsyncLetta
|
|
1496
|
-
|
|
1497
|
-
client = AsyncLetta(
|
|
1498
|
-
project="YOUR_PROJECT",
|
|
1499
|
-
token="YOUR_TOKEN",
|
|
1500
|
-
)
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
async def main() -> None:
|
|
1504
|
-
await client.tools.retrieve(
|
|
1505
|
-
tool_id="tool_id",
|
|
1506
|
-
)
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
asyncio.run(main())
|
|
1510
|
-
"""
|
|
1511
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
1512
|
-
f"v1/tools/{jsonable_encoder(tool_id)}",
|
|
1513
|
-
method="GET",
|
|
1514
|
-
request_options=request_options,
|
|
1515
|
-
)
|
|
1516
|
-
try:
|
|
1517
|
-
if 200 <= _response.status_code < 300:
|
|
1518
|
-
return typing.cast(
|
|
1519
|
-
Tool,
|
|
1520
|
-
construct_type(
|
|
1521
|
-
type_=Tool, # type: ignore
|
|
1522
|
-
object_=_response.json(),
|
|
1523
|
-
),
|
|
1524
|
-
)
|
|
1525
|
-
if _response.status_code == 422:
|
|
1526
|
-
raise UnprocessableEntityError(
|
|
1527
|
-
typing.cast(
|
|
1528
|
-
HttpValidationError,
|
|
1529
|
-
construct_type(
|
|
1530
|
-
type_=HttpValidationError, # type: ignore
|
|
1531
|
-
object_=_response.json(),
|
|
1532
|
-
),
|
|
1533
|
-
)
|
|
1534
|
-
)
|
|
1535
|
-
_response_json = _response.json()
|
|
1536
|
-
except JSONDecodeError:
|
|
1537
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1538
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1539
|
-
|
|
1540
|
-
async def delete(
|
|
1541
|
-
self, tool_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
1542
|
-
) -> typing.Optional[typing.Any]:
|
|
1543
|
-
"""
|
|
1544
|
-
Delete a tool by name
|
|
1545
|
-
|
|
1546
|
-
Parameters
|
|
1547
|
-
----------
|
|
1548
|
-
tool_id : str
|
|
1549
|
-
|
|
1550
|
-
request_options : typing.Optional[RequestOptions]
|
|
1551
|
-
Request-specific configuration.
|
|
1552
|
-
|
|
1553
|
-
Returns
|
|
1554
|
-
-------
|
|
1555
|
-
typing.Optional[typing.Any]
|
|
1556
|
-
Successful Response
|
|
1557
|
-
|
|
1558
|
-
Examples
|
|
1559
|
-
--------
|
|
1560
|
-
import asyncio
|
|
1561
|
-
|
|
1562
|
-
from letta_client import AsyncLetta
|
|
1563
|
-
|
|
1564
|
-
client = AsyncLetta(
|
|
1565
|
-
project="YOUR_PROJECT",
|
|
1566
|
-
token="YOUR_TOKEN",
|
|
1567
|
-
)
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
async def main() -> None:
|
|
1571
|
-
await client.tools.delete(
|
|
1572
|
-
tool_id="tool_id",
|
|
1573
|
-
)
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
asyncio.run(main())
|
|
1577
|
-
"""
|
|
1578
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
1579
|
-
f"v1/tools/{jsonable_encoder(tool_id)}",
|
|
1580
|
-
method="DELETE",
|
|
1581
|
-
request_options=request_options,
|
|
1582
|
-
)
|
|
1583
|
-
try:
|
|
1584
|
-
if 200 <= _response.status_code < 300:
|
|
1585
|
-
return typing.cast(
|
|
1586
|
-
typing.Optional[typing.Any],
|
|
1587
|
-
construct_type(
|
|
1588
|
-
type_=typing.Optional[typing.Any], # type: ignore
|
|
1589
|
-
object_=_response.json(),
|
|
1590
|
-
),
|
|
1591
|
-
)
|
|
1592
|
-
if _response.status_code == 422:
|
|
1593
|
-
raise UnprocessableEntityError(
|
|
1594
|
-
typing.cast(
|
|
1595
|
-
HttpValidationError,
|
|
1596
|
-
construct_type(
|
|
1597
|
-
type_=HttpValidationError, # type: ignore
|
|
1598
|
-
object_=_response.json(),
|
|
1599
|
-
),
|
|
1600
|
-
)
|
|
1601
|
-
)
|
|
1602
|
-
_response_json = _response.json()
|
|
1603
|
-
except JSONDecodeError:
|
|
1604
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1605
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1606
|
-
|
|
1607
|
-
async def modify(
|
|
1608
|
-
self,
|
|
1609
|
-
tool_id: str,
|
|
1610
|
-
*,
|
|
1611
|
-
description: typing.Optional[str] = OMIT,
|
|
1612
|
-
tags: typing.Optional[typing.Sequence[str]] = OMIT,
|
|
1613
|
-
source_code: typing.Optional[str] = OMIT,
|
|
1614
|
-
source_type: typing.Optional[str] = OMIT,
|
|
1615
|
-
json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
1616
|
-
args_json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
1617
|
-
return_char_limit: typing.Optional[int] = OMIT,
|
|
1618
|
-
pip_requirements: typing.Optional[typing.Sequence[PipRequirement]] = OMIT,
|
|
1619
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
1620
|
-
) -> Tool:
|
|
1621
|
-
"""
|
|
1622
|
-
Update an existing tool
|
|
1623
|
-
|
|
1624
|
-
Parameters
|
|
1625
|
-
----------
|
|
1626
|
-
tool_id : str
|
|
1627
|
-
|
|
1628
|
-
description : typing.Optional[str]
|
|
1629
|
-
The description of the tool.
|
|
1630
|
-
|
|
1631
|
-
tags : typing.Optional[typing.Sequence[str]]
|
|
1632
|
-
Metadata tags.
|
|
1633
|
-
|
|
1634
|
-
source_code : typing.Optional[str]
|
|
1635
|
-
The source code of the function.
|
|
1636
|
-
|
|
1637
|
-
source_type : typing.Optional[str]
|
|
1638
|
-
The type of the source code.
|
|
1639
|
-
|
|
1640
|
-
json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
1641
|
-
The JSON schema of the function (auto-generated from source_code if not provided)
|
|
1642
|
-
|
|
1643
|
-
args_json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
1644
|
-
The args JSON schema of the function.
|
|
1645
|
-
|
|
1646
|
-
return_char_limit : typing.Optional[int]
|
|
1647
|
-
The maximum number of characters in the response.
|
|
1648
|
-
|
|
1649
|
-
pip_requirements : typing.Optional[typing.Sequence[PipRequirement]]
|
|
1650
|
-
Optional list of pip packages required by this tool.
|
|
1651
|
-
|
|
1652
|
-
request_options : typing.Optional[RequestOptions]
|
|
1653
|
-
Request-specific configuration.
|
|
1654
|
-
|
|
1655
|
-
Returns
|
|
1656
|
-
-------
|
|
1657
|
-
Tool
|
|
1658
|
-
Successful Response
|
|
1659
|
-
|
|
1660
|
-
Examples
|
|
1661
|
-
--------
|
|
1662
|
-
import asyncio
|
|
1663
|
-
|
|
1664
|
-
from letta_client import AsyncLetta
|
|
1665
|
-
|
|
1666
|
-
client = AsyncLetta(
|
|
1667
|
-
project="YOUR_PROJECT",
|
|
1668
|
-
token="YOUR_TOKEN",
|
|
1669
|
-
)
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
async def main() -> None:
|
|
1673
|
-
await client.tools.modify(
|
|
1674
|
-
tool_id="tool_id",
|
|
1675
|
-
)
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
asyncio.run(main())
|
|
1679
|
-
"""
|
|
1680
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
1681
|
-
f"v1/tools/{jsonable_encoder(tool_id)}",
|
|
1682
|
-
method="PATCH",
|
|
1683
|
-
json={
|
|
1684
|
-
"description": description,
|
|
1685
|
-
"tags": tags,
|
|
1686
|
-
"source_code": source_code,
|
|
1687
|
-
"source_type": source_type,
|
|
1688
|
-
"json_schema": json_schema,
|
|
1689
|
-
"args_json_schema": args_json_schema,
|
|
1690
|
-
"return_char_limit": return_char_limit,
|
|
1691
|
-
"pip_requirements": convert_and_respect_annotation_metadata(
|
|
1692
|
-
object_=pip_requirements, annotation=typing.Sequence[PipRequirement], direction="write"
|
|
1693
|
-
),
|
|
1694
|
-
},
|
|
1695
|
-
headers={
|
|
1696
|
-
"content-type": "application/json",
|
|
1697
|
-
},
|
|
1698
|
-
request_options=request_options,
|
|
1699
|
-
omit=OMIT,
|
|
1700
|
-
)
|
|
1701
|
-
try:
|
|
1702
|
-
if 200 <= _response.status_code < 300:
|
|
1703
|
-
return typing.cast(
|
|
1704
|
-
Tool,
|
|
1705
|
-
construct_type(
|
|
1706
|
-
type_=Tool, # type: ignore
|
|
1707
|
-
object_=_response.json(),
|
|
1708
|
-
),
|
|
1709
|
-
)
|
|
1710
|
-
if _response.status_code == 422:
|
|
1711
|
-
raise UnprocessableEntityError(
|
|
1712
|
-
typing.cast(
|
|
1713
|
-
HttpValidationError,
|
|
1714
|
-
construct_type(
|
|
1715
|
-
type_=HttpValidationError, # type: ignore
|
|
1716
|
-
object_=_response.json(),
|
|
1717
|
-
),
|
|
1718
|
-
)
|
|
1719
|
-
)
|
|
1720
|
-
_response_json = _response.json()
|
|
1721
|
-
except JSONDecodeError:
|
|
1722
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1723
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1724
|
-
|
|
1725
|
-
async def count(
|
|
1726
|
-
self,
|
|
1727
|
-
*,
|
|
1728
|
-
include_base_tools: typing.Optional[bool] = None,
|
|
1729
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
1730
|
-
) -> int:
|
|
1731
|
-
"""
|
|
1732
|
-
Get a count of all tools available to agents belonging to the org of the user.
|
|
1733
|
-
|
|
1734
|
-
Parameters
|
|
1735
|
-
----------
|
|
1736
|
-
include_base_tools : typing.Optional[bool]
|
|
1737
|
-
Include built-in Letta tools in the count
|
|
1738
|
-
|
|
1739
|
-
request_options : typing.Optional[RequestOptions]
|
|
1740
|
-
Request-specific configuration.
|
|
1741
|
-
|
|
1742
|
-
Returns
|
|
1743
|
-
-------
|
|
1744
|
-
int
|
|
1745
|
-
Successful Response
|
|
1746
|
-
|
|
1747
|
-
Examples
|
|
1748
|
-
--------
|
|
1749
|
-
import asyncio
|
|
1750
|
-
|
|
1751
|
-
from letta_client import AsyncLetta
|
|
1752
|
-
|
|
1753
|
-
client = AsyncLetta(
|
|
1754
|
-
project="YOUR_PROJECT",
|
|
1755
|
-
token="YOUR_TOKEN",
|
|
1756
|
-
)
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
async def main() -> None:
|
|
1760
|
-
await client.tools.count()
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
asyncio.run(main())
|
|
1764
|
-
"""
|
|
1765
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
1766
|
-
"v1/tools/count",
|
|
1767
|
-
method="GET",
|
|
1768
|
-
params={
|
|
1769
|
-
"include_base_tools": include_base_tools,
|
|
1770
|
-
},
|
|
1771
|
-
request_options=request_options,
|
|
1772
|
-
)
|
|
1773
|
-
try:
|
|
1774
|
-
if 200 <= _response.status_code < 300:
|
|
1775
|
-
return typing.cast(
|
|
1776
|
-
int,
|
|
1777
|
-
construct_type(
|
|
1778
|
-
type_=int, # type: ignore
|
|
1779
|
-
object_=_response.json(),
|
|
1780
|
-
),
|
|
1781
|
-
)
|
|
1782
|
-
if _response.status_code == 422:
|
|
1783
|
-
raise UnprocessableEntityError(
|
|
1784
|
-
typing.cast(
|
|
1785
|
-
HttpValidationError,
|
|
1786
|
-
construct_type(
|
|
1787
|
-
type_=HttpValidationError, # type: ignore
|
|
1788
|
-
object_=_response.json(),
|
|
1789
|
-
),
|
|
1790
|
-
)
|
|
1791
|
-
)
|
|
1792
|
-
_response_json = _response.json()
|
|
1793
|
-
except JSONDecodeError:
|
|
1794
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1795
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1796
|
-
|
|
1797
|
-
async def list(
|
|
1798
|
-
self,
|
|
1799
|
-
*,
|
|
1800
|
-
after: typing.Optional[str] = None,
|
|
1801
|
-
limit: typing.Optional[int] = None,
|
|
1802
|
-
name: typing.Optional[str] = None,
|
|
1803
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
1804
|
-
) -> typing.List[Tool]:
|
|
1805
|
-
"""
|
|
1806
|
-
Get a list of all tools available to agents belonging to the org of the user
|
|
1807
|
-
|
|
1808
|
-
Parameters
|
|
1809
|
-
----------
|
|
1810
|
-
after : typing.Optional[str]
|
|
1811
|
-
|
|
1812
|
-
limit : typing.Optional[int]
|
|
1813
|
-
|
|
1814
|
-
name : typing.Optional[str]
|
|
1815
|
-
|
|
1816
|
-
request_options : typing.Optional[RequestOptions]
|
|
1817
|
-
Request-specific configuration.
|
|
1818
|
-
|
|
1819
|
-
Returns
|
|
1820
|
-
-------
|
|
1821
|
-
typing.List[Tool]
|
|
1822
|
-
Successful Response
|
|
1823
|
-
|
|
1824
|
-
Examples
|
|
1825
|
-
--------
|
|
1826
|
-
import asyncio
|
|
1827
|
-
|
|
1828
|
-
from letta_client import AsyncLetta
|
|
1829
|
-
|
|
1830
|
-
client = AsyncLetta(
|
|
1831
|
-
project="YOUR_PROJECT",
|
|
1832
|
-
token="YOUR_TOKEN",
|
|
1833
|
-
)
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
async def main() -> None:
|
|
1837
|
-
await client.tools.list()
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
asyncio.run(main())
|
|
1841
|
-
"""
|
|
1842
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
1843
|
-
"v1/tools/",
|
|
1844
|
-
method="GET",
|
|
1845
|
-
params={
|
|
1846
|
-
"after": after,
|
|
1847
|
-
"limit": limit,
|
|
1848
|
-
"name": name,
|
|
1849
|
-
},
|
|
1850
|
-
request_options=request_options,
|
|
1851
|
-
)
|
|
1852
|
-
try:
|
|
1853
|
-
if 200 <= _response.status_code < 300:
|
|
1854
|
-
return typing.cast(
|
|
1855
|
-
typing.List[Tool],
|
|
1856
|
-
construct_type(
|
|
1857
|
-
type_=typing.List[Tool], # type: ignore
|
|
1858
|
-
object_=_response.json(),
|
|
1859
|
-
),
|
|
1860
|
-
)
|
|
1861
|
-
if _response.status_code == 422:
|
|
1862
|
-
raise UnprocessableEntityError(
|
|
1863
|
-
typing.cast(
|
|
1864
|
-
HttpValidationError,
|
|
1865
|
-
construct_type(
|
|
1866
|
-
type_=HttpValidationError, # type: ignore
|
|
1867
|
-
object_=_response.json(),
|
|
1868
|
-
),
|
|
1869
|
-
)
|
|
1870
|
-
)
|
|
1871
|
-
_response_json = _response.json()
|
|
1872
|
-
except JSONDecodeError:
|
|
1873
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1874
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1875
|
-
|
|
1876
|
-
async def create(
|
|
1877
|
-
self,
|
|
1878
|
-
*,
|
|
1879
|
-
source_code: str,
|
|
1880
|
-
description: typing.Optional[str] = OMIT,
|
|
1881
|
-
tags: typing.Optional[typing.Sequence[str]] = OMIT,
|
|
1882
|
-
source_type: typing.Optional[str] = OMIT,
|
|
1883
|
-
json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
1884
|
-
args_json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
1885
|
-
return_char_limit: typing.Optional[int] = OMIT,
|
|
1886
|
-
pip_requirements: typing.Optional[typing.Sequence[PipRequirement]] = OMIT,
|
|
1887
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
1888
|
-
) -> Tool:
|
|
1889
|
-
"""
|
|
1890
|
-
Create a new tool
|
|
1891
|
-
|
|
1892
|
-
Parameters
|
|
1893
|
-
----------
|
|
1894
|
-
source_code : str
|
|
1895
|
-
The source code of the function.
|
|
1896
|
-
|
|
1897
|
-
description : typing.Optional[str]
|
|
1898
|
-
The description of the tool.
|
|
1899
|
-
|
|
1900
|
-
tags : typing.Optional[typing.Sequence[str]]
|
|
1901
|
-
Metadata tags.
|
|
1902
|
-
|
|
1903
|
-
source_type : typing.Optional[str]
|
|
1904
|
-
The source type of the function.
|
|
1905
|
-
|
|
1906
|
-
json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
1907
|
-
The JSON schema of the function (auto-generated from source_code if not provided)
|
|
1908
|
-
|
|
1909
|
-
args_json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
1910
|
-
The args JSON schema of the function.
|
|
1911
|
-
|
|
1912
|
-
return_char_limit : typing.Optional[int]
|
|
1913
|
-
The maximum number of characters in the response.
|
|
1914
|
-
|
|
1915
|
-
pip_requirements : typing.Optional[typing.Sequence[PipRequirement]]
|
|
1916
|
-
Optional list of pip packages required by this tool.
|
|
1917
|
-
|
|
1918
|
-
request_options : typing.Optional[RequestOptions]
|
|
1919
|
-
Request-specific configuration.
|
|
1920
|
-
|
|
1921
|
-
Returns
|
|
1922
|
-
-------
|
|
1923
|
-
Tool
|
|
1924
|
-
Successful Response
|
|
1925
|
-
|
|
1926
|
-
Examples
|
|
1927
|
-
--------
|
|
1928
|
-
import asyncio
|
|
1929
|
-
|
|
1930
|
-
from letta_client import AsyncLetta
|
|
1931
|
-
|
|
1932
|
-
client = AsyncLetta(
|
|
1933
|
-
project="YOUR_PROJECT",
|
|
1934
|
-
token="YOUR_TOKEN",
|
|
1935
|
-
)
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
async def main() -> None:
|
|
1939
|
-
await client.tools.create(
|
|
1940
|
-
source_code="source_code",
|
|
1941
|
-
)
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
asyncio.run(main())
|
|
1945
|
-
"""
|
|
1946
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
1947
|
-
"v1/tools/",
|
|
1948
|
-
method="POST",
|
|
1949
|
-
json={
|
|
1950
|
-
"description": description,
|
|
1951
|
-
"tags": tags,
|
|
1952
|
-
"source_code": source_code,
|
|
1953
|
-
"source_type": source_type,
|
|
1954
|
-
"json_schema": json_schema,
|
|
1955
|
-
"args_json_schema": args_json_schema,
|
|
1956
|
-
"return_char_limit": return_char_limit,
|
|
1957
|
-
"pip_requirements": convert_and_respect_annotation_metadata(
|
|
1958
|
-
object_=pip_requirements, annotation=typing.Sequence[PipRequirement], direction="write"
|
|
1959
|
-
),
|
|
1960
|
-
},
|
|
1961
|
-
request_options=request_options,
|
|
1962
|
-
omit=OMIT,
|
|
1963
|
-
)
|
|
1964
|
-
try:
|
|
1965
|
-
if 200 <= _response.status_code < 300:
|
|
1966
|
-
return typing.cast(
|
|
1967
|
-
Tool,
|
|
1968
|
-
construct_type(
|
|
1969
|
-
type_=Tool, # type: ignore
|
|
1970
|
-
object_=_response.json(),
|
|
1971
|
-
),
|
|
1972
|
-
)
|
|
1973
|
-
if _response.status_code == 422:
|
|
1974
|
-
raise UnprocessableEntityError(
|
|
1975
|
-
typing.cast(
|
|
1976
|
-
HttpValidationError,
|
|
1977
|
-
construct_type(
|
|
1978
|
-
type_=HttpValidationError, # type: ignore
|
|
1979
|
-
object_=_response.json(),
|
|
1980
|
-
),
|
|
1981
|
-
)
|
|
1982
|
-
)
|
|
1983
|
-
_response_json = _response.json()
|
|
1984
|
-
except JSONDecodeError:
|
|
1985
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
1986
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
1987
|
-
|
|
1988
|
-
async def upsert(
|
|
1989
|
-
self,
|
|
1990
|
-
*,
|
|
1991
|
-
source_code: str,
|
|
1992
|
-
description: typing.Optional[str] = OMIT,
|
|
1993
|
-
tags: typing.Optional[typing.Sequence[str]] = OMIT,
|
|
1994
|
-
source_type: typing.Optional[str] = OMIT,
|
|
1995
|
-
json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
1996
|
-
args_json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
1997
|
-
return_char_limit: typing.Optional[int] = OMIT,
|
|
1998
|
-
pip_requirements: typing.Optional[typing.Sequence[PipRequirement]] = OMIT,
|
|
1999
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
2000
|
-
) -> Tool:
|
|
2001
|
-
"""
|
|
2002
|
-
Create or update a tool
|
|
2003
|
-
|
|
2004
|
-
Parameters
|
|
2005
|
-
----------
|
|
2006
|
-
source_code : str
|
|
2007
|
-
The source code of the function.
|
|
2008
|
-
|
|
2009
|
-
description : typing.Optional[str]
|
|
2010
|
-
The description of the tool.
|
|
2011
|
-
|
|
2012
|
-
tags : typing.Optional[typing.Sequence[str]]
|
|
2013
|
-
Metadata tags.
|
|
2014
|
-
|
|
2015
|
-
source_type : typing.Optional[str]
|
|
2016
|
-
The source type of the function.
|
|
2017
|
-
|
|
2018
|
-
json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
2019
|
-
The JSON schema of the function (auto-generated from source_code if not provided)
|
|
2020
|
-
|
|
2021
|
-
args_json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
2022
|
-
The args JSON schema of the function.
|
|
2023
|
-
|
|
2024
|
-
return_char_limit : typing.Optional[int]
|
|
2025
|
-
The maximum number of characters in the response.
|
|
2026
|
-
|
|
2027
|
-
pip_requirements : typing.Optional[typing.Sequence[PipRequirement]]
|
|
2028
|
-
Optional list of pip packages required by this tool.
|
|
2029
|
-
|
|
2030
|
-
request_options : typing.Optional[RequestOptions]
|
|
2031
|
-
Request-specific configuration.
|
|
2032
|
-
|
|
2033
|
-
Returns
|
|
2034
|
-
-------
|
|
2035
|
-
Tool
|
|
2036
|
-
Successful Response
|
|
2037
|
-
|
|
2038
|
-
Examples
|
|
2039
|
-
--------
|
|
2040
|
-
import asyncio
|
|
2041
|
-
|
|
2042
|
-
from letta_client import AsyncLetta
|
|
2043
|
-
|
|
2044
|
-
client = AsyncLetta(
|
|
2045
|
-
project="YOUR_PROJECT",
|
|
2046
|
-
token="YOUR_TOKEN",
|
|
2047
|
-
)
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
async def main() -> None:
|
|
2051
|
-
await client.tools.upsert(
|
|
2052
|
-
source_code="source_code",
|
|
2053
|
-
)
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
asyncio.run(main())
|
|
2057
|
-
"""
|
|
2058
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2059
|
-
"v1/tools/",
|
|
2060
|
-
method="PUT",
|
|
2061
|
-
json={
|
|
2062
|
-
"description": description,
|
|
2063
|
-
"tags": tags,
|
|
2064
|
-
"source_code": source_code,
|
|
2065
|
-
"source_type": source_type,
|
|
2066
|
-
"json_schema": json_schema,
|
|
2067
|
-
"args_json_schema": args_json_schema,
|
|
2068
|
-
"return_char_limit": return_char_limit,
|
|
2069
|
-
"pip_requirements": convert_and_respect_annotation_metadata(
|
|
2070
|
-
object_=pip_requirements, annotation=typing.Sequence[PipRequirement], direction="write"
|
|
2071
|
-
),
|
|
2072
|
-
},
|
|
2073
|
-
request_options=request_options,
|
|
2074
|
-
omit=OMIT,
|
|
2075
|
-
)
|
|
2076
|
-
try:
|
|
2077
|
-
if 200 <= _response.status_code < 300:
|
|
2078
|
-
return typing.cast(
|
|
2079
|
-
Tool,
|
|
2080
|
-
construct_type(
|
|
2081
|
-
type_=Tool, # type: ignore
|
|
2082
|
-
object_=_response.json(),
|
|
2083
|
-
),
|
|
2084
|
-
)
|
|
2085
|
-
if _response.status_code == 422:
|
|
2086
|
-
raise UnprocessableEntityError(
|
|
2087
|
-
typing.cast(
|
|
2088
|
-
HttpValidationError,
|
|
2089
|
-
construct_type(
|
|
2090
|
-
type_=HttpValidationError, # type: ignore
|
|
2091
|
-
object_=_response.json(),
|
|
2092
|
-
),
|
|
2093
|
-
)
|
|
2094
|
-
)
|
|
2095
|
-
_response_json = _response.json()
|
|
2096
|
-
except JSONDecodeError:
|
|
2097
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2098
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2099
|
-
|
|
2100
|
-
async def upsert_base_tools(self, *, request_options: typing.Optional[RequestOptions] = None) -> typing.List[Tool]:
|
|
2101
|
-
"""
|
|
2102
|
-
Upsert base tools
|
|
2103
|
-
|
|
2104
|
-
Parameters
|
|
2105
|
-
----------
|
|
2106
|
-
request_options : typing.Optional[RequestOptions]
|
|
2107
|
-
Request-specific configuration.
|
|
2108
|
-
|
|
2109
|
-
Returns
|
|
2110
|
-
-------
|
|
2111
|
-
typing.List[Tool]
|
|
2112
|
-
Successful Response
|
|
2113
|
-
|
|
2114
|
-
Examples
|
|
2115
|
-
--------
|
|
2116
|
-
import asyncio
|
|
2117
|
-
|
|
2118
|
-
from letta_client import AsyncLetta
|
|
2119
|
-
|
|
2120
|
-
client = AsyncLetta(
|
|
2121
|
-
project="YOUR_PROJECT",
|
|
2122
|
-
token="YOUR_TOKEN",
|
|
2123
|
-
)
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
async def main() -> None:
|
|
2127
|
-
await client.tools.upsert_base_tools()
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
asyncio.run(main())
|
|
2131
|
-
"""
|
|
2132
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2133
|
-
"v1/tools/add-base-tools",
|
|
2134
|
-
method="POST",
|
|
2135
|
-
request_options=request_options,
|
|
2136
|
-
)
|
|
2137
|
-
try:
|
|
2138
|
-
if 200 <= _response.status_code < 300:
|
|
2139
|
-
return typing.cast(
|
|
2140
|
-
typing.List[Tool],
|
|
2141
|
-
construct_type(
|
|
2142
|
-
type_=typing.List[Tool], # type: ignore
|
|
2143
|
-
object_=_response.json(),
|
|
2144
|
-
),
|
|
2145
|
-
)
|
|
2146
|
-
if _response.status_code == 422:
|
|
2147
|
-
raise UnprocessableEntityError(
|
|
2148
|
-
typing.cast(
|
|
2149
|
-
HttpValidationError,
|
|
2150
|
-
construct_type(
|
|
2151
|
-
type_=HttpValidationError, # type: ignore
|
|
2152
|
-
object_=_response.json(),
|
|
2153
|
-
),
|
|
2154
|
-
)
|
|
2155
|
-
)
|
|
2156
|
-
_response_json = _response.json()
|
|
2157
|
-
except JSONDecodeError:
|
|
2158
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2159
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2160
|
-
|
|
2161
|
-
async def run_tool_from_source(
|
|
2162
|
-
self,
|
|
2163
|
-
*,
|
|
2164
|
-
source_code: str,
|
|
2165
|
-
args: typing.Dict[str, typing.Optional[typing.Any]],
|
|
2166
|
-
env_vars: typing.Optional[typing.Dict[str, str]] = OMIT,
|
|
2167
|
-
name: typing.Optional[str] = OMIT,
|
|
2168
|
-
source_type: typing.Optional[str] = OMIT,
|
|
2169
|
-
args_json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
2170
|
-
json_schema: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
|
|
2171
|
-
pip_requirements: typing.Optional[typing.Sequence[PipRequirement]] = OMIT,
|
|
2172
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
2173
|
-
) -> ToolReturnMessage:
|
|
2174
|
-
"""
|
|
2175
|
-
Attempt to build a tool from source, then run it on the provided arguments
|
|
2176
|
-
|
|
2177
|
-
Parameters
|
|
2178
|
-
----------
|
|
2179
|
-
source_code : str
|
|
2180
|
-
The source code of the function.
|
|
2181
|
-
|
|
2182
|
-
args : typing.Dict[str, typing.Optional[typing.Any]]
|
|
2183
|
-
The arguments to pass to the tool.
|
|
2184
|
-
|
|
2185
|
-
env_vars : typing.Optional[typing.Dict[str, str]]
|
|
2186
|
-
The environment variables to pass to the tool.
|
|
2187
|
-
|
|
2188
|
-
name : typing.Optional[str]
|
|
2189
|
-
The name of the tool to run.
|
|
2190
|
-
|
|
2191
|
-
source_type : typing.Optional[str]
|
|
2192
|
-
The type of the source code.
|
|
2193
|
-
|
|
2194
|
-
args_json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
2195
|
-
The args JSON schema of the function.
|
|
2196
|
-
|
|
2197
|
-
json_schema : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
2198
|
-
The JSON schema of the function (auto-generated from source_code if not provided)
|
|
2199
|
-
|
|
2200
|
-
pip_requirements : typing.Optional[typing.Sequence[PipRequirement]]
|
|
2201
|
-
Optional list of pip packages required by this tool.
|
|
2202
|
-
|
|
2203
|
-
request_options : typing.Optional[RequestOptions]
|
|
2204
|
-
Request-specific configuration.
|
|
2205
|
-
|
|
2206
|
-
Returns
|
|
2207
|
-
-------
|
|
2208
|
-
ToolReturnMessage
|
|
2209
|
-
Successful Response
|
|
2210
|
-
|
|
2211
|
-
Examples
|
|
2212
|
-
--------
|
|
2213
|
-
import asyncio
|
|
2214
|
-
|
|
2215
|
-
from letta_client import AsyncLetta
|
|
2216
|
-
|
|
2217
|
-
client = AsyncLetta(
|
|
2218
|
-
project="YOUR_PROJECT",
|
|
2219
|
-
token="YOUR_TOKEN",
|
|
2220
|
-
)
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
async def main() -> None:
|
|
2224
|
-
await client.tools.run_tool_from_source(
|
|
2225
|
-
source_code="source_code",
|
|
2226
|
-
args={"key": "value"},
|
|
2227
|
-
)
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
asyncio.run(main())
|
|
2231
|
-
"""
|
|
2232
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2233
|
-
"v1/tools/run",
|
|
2234
|
-
method="POST",
|
|
2235
|
-
json={
|
|
2236
|
-
"source_code": source_code,
|
|
2237
|
-
"args": args,
|
|
2238
|
-
"env_vars": env_vars,
|
|
2239
|
-
"name": name,
|
|
2240
|
-
"source_type": source_type,
|
|
2241
|
-
"args_json_schema": args_json_schema,
|
|
2242
|
-
"json_schema": json_schema,
|
|
2243
|
-
"pip_requirements": convert_and_respect_annotation_metadata(
|
|
2244
|
-
object_=pip_requirements, annotation=typing.Sequence[PipRequirement], direction="write"
|
|
2245
|
-
),
|
|
2246
|
-
},
|
|
2247
|
-
headers={
|
|
2248
|
-
"content-type": "application/json",
|
|
2249
|
-
},
|
|
2250
|
-
request_options=request_options,
|
|
2251
|
-
omit=OMIT,
|
|
2252
|
-
)
|
|
2253
|
-
try:
|
|
2254
|
-
if 200 <= _response.status_code < 300:
|
|
2255
|
-
return typing.cast(
|
|
2256
|
-
ToolReturnMessage,
|
|
2257
|
-
construct_type(
|
|
2258
|
-
type_=ToolReturnMessage, # type: ignore
|
|
2259
|
-
object_=_response.json(),
|
|
2260
|
-
),
|
|
2261
|
-
)
|
|
2262
|
-
if _response.status_code == 422:
|
|
2263
|
-
raise UnprocessableEntityError(
|
|
2264
|
-
typing.cast(
|
|
2265
|
-
HttpValidationError,
|
|
2266
|
-
construct_type(
|
|
2267
|
-
type_=HttpValidationError, # type: ignore
|
|
2268
|
-
object_=_response.json(),
|
|
2269
|
-
),
|
|
2270
|
-
)
|
|
2271
|
-
)
|
|
2272
|
-
_response_json = _response.json()
|
|
2273
|
-
except JSONDecodeError:
|
|
2274
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2275
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2276
|
-
|
|
2277
|
-
async def list_composio_apps(
|
|
2278
|
-
self, *, user_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
|
|
2279
|
-
) -> typing.List[AppModel]:
|
|
2280
|
-
"""
|
|
2281
|
-
Get a list of all Composio apps
|
|
2282
|
-
|
|
2283
|
-
Parameters
|
|
2284
|
-
----------
|
|
2285
|
-
user_id : typing.Optional[str]
|
|
2286
|
-
|
|
2287
|
-
request_options : typing.Optional[RequestOptions]
|
|
2288
|
-
Request-specific configuration.
|
|
2289
|
-
|
|
2290
|
-
Returns
|
|
2291
|
-
-------
|
|
2292
|
-
typing.List[AppModel]
|
|
2293
|
-
Successful Response
|
|
2294
|
-
|
|
2295
|
-
Examples
|
|
2296
|
-
--------
|
|
2297
|
-
import asyncio
|
|
2298
|
-
|
|
2299
|
-
from letta_client import AsyncLetta
|
|
2300
|
-
|
|
2301
|
-
client = AsyncLetta(
|
|
2302
|
-
project="YOUR_PROJECT",
|
|
2303
|
-
token="YOUR_TOKEN",
|
|
2304
|
-
)
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
async def main() -> None:
|
|
2308
|
-
await client.tools.list_composio_apps()
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
asyncio.run(main())
|
|
2312
|
-
"""
|
|
2313
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2314
|
-
"v1/tools/composio/apps",
|
|
2315
|
-
method="GET",
|
|
2316
|
-
headers={
|
|
2317
|
-
"user-id": str(user_id) if user_id is not None else None,
|
|
2318
|
-
},
|
|
2319
|
-
request_options=request_options,
|
|
2320
|
-
)
|
|
2321
|
-
try:
|
|
2322
|
-
if 200 <= _response.status_code < 300:
|
|
2323
|
-
return typing.cast(
|
|
2324
|
-
typing.List[AppModel],
|
|
2325
|
-
construct_type(
|
|
2326
|
-
type_=typing.List[AppModel], # type: ignore
|
|
2327
|
-
object_=_response.json(),
|
|
2328
|
-
),
|
|
2329
|
-
)
|
|
2330
|
-
if _response.status_code == 422:
|
|
2331
|
-
raise UnprocessableEntityError(
|
|
2332
|
-
typing.cast(
|
|
2333
|
-
HttpValidationError,
|
|
2334
|
-
construct_type(
|
|
2335
|
-
type_=HttpValidationError, # type: ignore
|
|
2336
|
-
object_=_response.json(),
|
|
2337
|
-
),
|
|
2338
|
-
)
|
|
2339
|
-
)
|
|
2340
|
-
_response_json = _response.json()
|
|
2341
|
-
except JSONDecodeError:
|
|
2342
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2343
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2344
|
-
|
|
2345
|
-
async def list_composio_actions_by_app(
|
|
2346
|
-
self, composio_app_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
2347
|
-
) -> typing.List[ActionModel]:
|
|
2348
|
-
"""
|
|
2349
|
-
Get a list of all Composio actions for a specific app
|
|
2350
|
-
|
|
2351
|
-
Parameters
|
|
2352
|
-
----------
|
|
2353
|
-
composio_app_name : str
|
|
2354
|
-
|
|
2355
|
-
request_options : typing.Optional[RequestOptions]
|
|
2356
|
-
Request-specific configuration.
|
|
2357
|
-
|
|
2358
|
-
Returns
|
|
2359
|
-
-------
|
|
2360
|
-
typing.List[ActionModel]
|
|
2361
|
-
Successful Response
|
|
2362
|
-
|
|
2363
|
-
Examples
|
|
2364
|
-
--------
|
|
2365
|
-
import asyncio
|
|
2366
|
-
|
|
2367
|
-
from letta_client import AsyncLetta
|
|
2368
|
-
|
|
2369
|
-
client = AsyncLetta(
|
|
2370
|
-
project="YOUR_PROJECT",
|
|
2371
|
-
token="YOUR_TOKEN",
|
|
2372
|
-
)
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
async def main() -> None:
|
|
2376
|
-
await client.tools.list_composio_actions_by_app(
|
|
2377
|
-
composio_app_name="composio_app_name",
|
|
2378
|
-
)
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
asyncio.run(main())
|
|
2382
|
-
"""
|
|
2383
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2384
|
-
f"v1/tools/composio/apps/{jsonable_encoder(composio_app_name)}/actions",
|
|
2385
|
-
method="GET",
|
|
2386
|
-
request_options=request_options,
|
|
2387
|
-
)
|
|
2388
|
-
try:
|
|
2389
|
-
if 200 <= _response.status_code < 300:
|
|
2390
|
-
return typing.cast(
|
|
2391
|
-
typing.List[ActionModel],
|
|
2392
|
-
construct_type(
|
|
2393
|
-
type_=typing.List[ActionModel], # type: ignore
|
|
2394
|
-
object_=_response.json(),
|
|
2395
|
-
),
|
|
2396
|
-
)
|
|
2397
|
-
if _response.status_code == 422:
|
|
2398
|
-
raise UnprocessableEntityError(
|
|
2399
|
-
typing.cast(
|
|
2400
|
-
HttpValidationError,
|
|
2401
|
-
construct_type(
|
|
2402
|
-
type_=HttpValidationError, # type: ignore
|
|
2403
|
-
object_=_response.json(),
|
|
2404
|
-
),
|
|
2405
|
-
)
|
|
2406
|
-
)
|
|
2407
|
-
_response_json = _response.json()
|
|
2408
|
-
except JSONDecodeError:
|
|
2409
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2410
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2411
|
-
|
|
2412
|
-
async def add_composio_tool(
|
|
2413
|
-
self, composio_action_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
2414
|
-
) -> Tool:
|
|
2415
|
-
"""
|
|
2416
|
-
Add a new Composio tool by action name (Composio refers to each tool as an `Action`)
|
|
2417
|
-
|
|
2418
|
-
Parameters
|
|
2419
|
-
----------
|
|
2420
|
-
composio_action_name : str
|
|
2421
|
-
|
|
2422
|
-
request_options : typing.Optional[RequestOptions]
|
|
2423
|
-
Request-specific configuration.
|
|
2424
|
-
|
|
2425
|
-
Returns
|
|
2426
|
-
-------
|
|
2427
|
-
Tool
|
|
2428
|
-
Successful Response
|
|
2429
|
-
|
|
2430
|
-
Examples
|
|
2431
|
-
--------
|
|
2432
|
-
import asyncio
|
|
2433
|
-
|
|
2434
|
-
from letta_client import AsyncLetta
|
|
2435
|
-
|
|
2436
|
-
client = AsyncLetta(
|
|
2437
|
-
project="YOUR_PROJECT",
|
|
2438
|
-
token="YOUR_TOKEN",
|
|
2439
|
-
)
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
async def main() -> None:
|
|
2443
|
-
await client.tools.add_composio_tool(
|
|
2444
|
-
composio_action_name="composio_action_name",
|
|
2445
|
-
)
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
asyncio.run(main())
|
|
2449
|
-
"""
|
|
2450
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2451
|
-
f"v1/tools/composio/{jsonable_encoder(composio_action_name)}",
|
|
2452
|
-
method="POST",
|
|
2453
|
-
request_options=request_options,
|
|
2454
|
-
)
|
|
2455
|
-
try:
|
|
2456
|
-
if 200 <= _response.status_code < 300:
|
|
2457
|
-
return typing.cast(
|
|
2458
|
-
Tool,
|
|
2459
|
-
construct_type(
|
|
2460
|
-
type_=Tool, # type: ignore
|
|
2461
|
-
object_=_response.json(),
|
|
2462
|
-
),
|
|
2463
|
-
)
|
|
2464
|
-
if _response.status_code == 422:
|
|
2465
|
-
raise UnprocessableEntityError(
|
|
2466
|
-
typing.cast(
|
|
2467
|
-
HttpValidationError,
|
|
2468
|
-
construct_type(
|
|
2469
|
-
type_=HttpValidationError, # type: ignore
|
|
2470
|
-
object_=_response.json(),
|
|
2471
|
-
),
|
|
2472
|
-
)
|
|
2473
|
-
)
|
|
2474
|
-
_response_json = _response.json()
|
|
2475
|
-
except JSONDecodeError:
|
|
2476
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2477
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2478
|
-
|
|
2479
|
-
async def list_mcp_servers(
|
|
2480
|
-
self, *, user_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
|
|
2481
|
-
) -> typing.Dict[str, ListMcpServersResponseValue]:
|
|
2482
|
-
"""
|
|
2483
|
-
Get a list of all configured MCP servers
|
|
2484
|
-
|
|
2485
|
-
Parameters
|
|
2486
|
-
----------
|
|
2487
|
-
user_id : typing.Optional[str]
|
|
2488
|
-
|
|
2489
|
-
request_options : typing.Optional[RequestOptions]
|
|
2490
|
-
Request-specific configuration.
|
|
2491
|
-
|
|
2492
|
-
Returns
|
|
2493
|
-
-------
|
|
2494
|
-
typing.Dict[str, ListMcpServersResponseValue]
|
|
2495
|
-
Successful Response
|
|
2496
|
-
|
|
2497
|
-
Examples
|
|
2498
|
-
--------
|
|
2499
|
-
import asyncio
|
|
2500
|
-
|
|
2501
|
-
from letta_client import AsyncLetta
|
|
2502
|
-
|
|
2503
|
-
client = AsyncLetta(
|
|
2504
|
-
project="YOUR_PROJECT",
|
|
2505
|
-
token="YOUR_TOKEN",
|
|
2506
|
-
)
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
async def main() -> None:
|
|
2510
|
-
await client.tools.list_mcp_servers()
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
asyncio.run(main())
|
|
2514
|
-
"""
|
|
2515
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2516
|
-
"v1/tools/mcp/servers",
|
|
2517
|
-
method="GET",
|
|
2518
|
-
headers={
|
|
2519
|
-
"user-id": str(user_id) if user_id is not None else None,
|
|
2520
|
-
},
|
|
2521
|
-
request_options=request_options,
|
|
2522
|
-
)
|
|
2523
|
-
try:
|
|
2524
|
-
if 200 <= _response.status_code < 300:
|
|
2525
|
-
return typing.cast(
|
|
2526
|
-
typing.Dict[str, ListMcpServersResponseValue],
|
|
2527
|
-
construct_type(
|
|
2528
|
-
type_=typing.Dict[str, ListMcpServersResponseValue], # type: ignore
|
|
2529
|
-
object_=_response.json(),
|
|
2530
|
-
),
|
|
2531
|
-
)
|
|
2532
|
-
if _response.status_code == 422:
|
|
2533
|
-
raise UnprocessableEntityError(
|
|
2534
|
-
typing.cast(
|
|
2535
|
-
HttpValidationError,
|
|
2536
|
-
construct_type(
|
|
2537
|
-
type_=HttpValidationError, # type: ignore
|
|
2538
|
-
object_=_response.json(),
|
|
2539
|
-
),
|
|
2540
|
-
)
|
|
2541
|
-
)
|
|
2542
|
-
_response_json = _response.json()
|
|
2543
|
-
except JSONDecodeError:
|
|
2544
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2545
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2546
|
-
|
|
2547
|
-
async def add_mcp_server(
|
|
2548
|
-
self, *, request: AddMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
|
|
2549
|
-
) -> typing.List[AddMcpServerResponseItem]:
|
|
2550
|
-
"""
|
|
2551
|
-
Add a new MCP server to the Letta MCP server config
|
|
2552
|
-
|
|
2553
|
-
Parameters
|
|
2554
|
-
----------
|
|
2555
|
-
request : AddMcpServerRequest
|
|
2556
|
-
|
|
2557
|
-
request_options : typing.Optional[RequestOptions]
|
|
2558
|
-
Request-specific configuration.
|
|
2559
|
-
|
|
2560
|
-
Returns
|
|
2561
|
-
-------
|
|
2562
|
-
typing.List[AddMcpServerResponseItem]
|
|
2563
|
-
Successful Response
|
|
2564
|
-
|
|
2565
|
-
Examples
|
|
2566
|
-
--------
|
|
2567
|
-
import asyncio
|
|
2568
|
-
|
|
2569
|
-
from letta_client import AsyncLetta, StdioServerConfig
|
|
2570
|
-
|
|
2571
|
-
client = AsyncLetta(
|
|
2572
|
-
project="YOUR_PROJECT",
|
|
2573
|
-
token="YOUR_TOKEN",
|
|
2574
|
-
)
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
async def main() -> None:
|
|
2578
|
-
await client.tools.add_mcp_server(
|
|
2579
|
-
request=StdioServerConfig(
|
|
2580
|
-
server_name="server_name",
|
|
2581
|
-
command="command",
|
|
2582
|
-
args=["args"],
|
|
2583
|
-
),
|
|
2584
|
-
)
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
asyncio.run(main())
|
|
2588
|
-
"""
|
|
2589
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2590
|
-
"v1/tools/mcp/servers",
|
|
2591
|
-
method="PUT",
|
|
2592
|
-
json=convert_and_respect_annotation_metadata(
|
|
2593
|
-
object_=request, annotation=AddMcpServerRequest, direction="write"
|
|
2594
|
-
),
|
|
2595
|
-
request_options=request_options,
|
|
2596
|
-
omit=OMIT,
|
|
2597
|
-
)
|
|
2598
|
-
try:
|
|
2599
|
-
if 200 <= _response.status_code < 300:
|
|
2600
|
-
return typing.cast(
|
|
2601
|
-
typing.List[AddMcpServerResponseItem],
|
|
2602
|
-
construct_type(
|
|
2603
|
-
type_=typing.List[AddMcpServerResponseItem], # type: ignore
|
|
2604
|
-
object_=_response.json(),
|
|
2605
|
-
),
|
|
2606
|
-
)
|
|
2607
|
-
if _response.status_code == 422:
|
|
2608
|
-
raise UnprocessableEntityError(
|
|
2609
|
-
typing.cast(
|
|
2610
|
-
HttpValidationError,
|
|
2611
|
-
construct_type(
|
|
2612
|
-
type_=HttpValidationError, # type: ignore
|
|
2613
|
-
object_=_response.json(),
|
|
2614
|
-
),
|
|
2615
|
-
)
|
|
2616
|
-
)
|
|
2617
|
-
_response_json = _response.json()
|
|
2618
|
-
except JSONDecodeError:
|
|
2619
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2620
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2621
|
-
|
|
2622
|
-
async def list_mcp_tools_by_server(
|
|
2623
|
-
self, mcp_server_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
2624
|
-
) -> typing.List[McpTool]:
|
|
2625
|
-
"""
|
|
2626
|
-
Get a list of all tools for a specific MCP server
|
|
2627
|
-
|
|
2628
|
-
Parameters
|
|
2629
|
-
----------
|
|
2630
|
-
mcp_server_name : str
|
|
2631
|
-
|
|
2632
|
-
request_options : typing.Optional[RequestOptions]
|
|
2633
|
-
Request-specific configuration.
|
|
2634
|
-
|
|
2635
|
-
Returns
|
|
2636
|
-
-------
|
|
2637
|
-
typing.List[McpTool]
|
|
2638
|
-
Successful Response
|
|
2639
|
-
|
|
2640
|
-
Examples
|
|
2641
|
-
--------
|
|
2642
|
-
import asyncio
|
|
2643
|
-
|
|
2644
|
-
from letta_client import AsyncLetta
|
|
2645
|
-
|
|
2646
|
-
client = AsyncLetta(
|
|
2647
|
-
project="YOUR_PROJECT",
|
|
2648
|
-
token="YOUR_TOKEN",
|
|
2649
|
-
)
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
async def main() -> None:
|
|
2653
|
-
await client.tools.list_mcp_tools_by_server(
|
|
2654
|
-
mcp_server_name="mcp_server_name",
|
|
2655
|
-
)
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
asyncio.run(main())
|
|
2659
|
-
"""
|
|
2660
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2661
|
-
f"v1/tools/mcp/servers/{jsonable_encoder(mcp_server_name)}/tools",
|
|
2662
|
-
method="GET",
|
|
2663
|
-
request_options=request_options,
|
|
2664
|
-
)
|
|
2665
|
-
try:
|
|
2666
|
-
if 200 <= _response.status_code < 300:
|
|
2667
|
-
return typing.cast(
|
|
2668
|
-
typing.List[McpTool],
|
|
2669
|
-
construct_type(
|
|
2670
|
-
type_=typing.List[McpTool], # type: ignore
|
|
2671
|
-
object_=_response.json(),
|
|
2672
|
-
),
|
|
2673
|
-
)
|
|
2674
|
-
if _response.status_code == 422:
|
|
2675
|
-
raise UnprocessableEntityError(
|
|
2676
|
-
typing.cast(
|
|
2677
|
-
HttpValidationError,
|
|
2678
|
-
construct_type(
|
|
2679
|
-
type_=HttpValidationError, # type: ignore
|
|
2680
|
-
object_=_response.json(),
|
|
2681
|
-
),
|
|
2682
|
-
)
|
|
2683
|
-
)
|
|
2684
|
-
_response_json = _response.json()
|
|
2685
|
-
except JSONDecodeError:
|
|
2686
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2687
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2688
|
-
|
|
2689
|
-
async def add_mcp_tool(
|
|
2690
|
-
self, mcp_server_name: str, mcp_tool_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
2691
|
-
) -> Tool:
|
|
2692
|
-
"""
|
|
2693
|
-
Register a new MCP tool as a Letta server by MCP server + tool name
|
|
2694
|
-
|
|
2695
|
-
Parameters
|
|
2696
|
-
----------
|
|
2697
|
-
mcp_server_name : str
|
|
2698
|
-
|
|
2699
|
-
mcp_tool_name : str
|
|
2700
|
-
|
|
2701
|
-
request_options : typing.Optional[RequestOptions]
|
|
2702
|
-
Request-specific configuration.
|
|
2703
|
-
|
|
2704
|
-
Returns
|
|
2705
|
-
-------
|
|
2706
|
-
Tool
|
|
2707
|
-
Successful Response
|
|
2708
|
-
|
|
2709
|
-
Examples
|
|
2710
|
-
--------
|
|
2711
|
-
import asyncio
|
|
2712
|
-
|
|
2713
|
-
from letta_client import AsyncLetta
|
|
2714
|
-
|
|
2715
|
-
client = AsyncLetta(
|
|
2716
|
-
project="YOUR_PROJECT",
|
|
2717
|
-
token="YOUR_TOKEN",
|
|
2718
|
-
)
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
async def main() -> None:
|
|
2722
|
-
await client.tools.add_mcp_tool(
|
|
2723
|
-
mcp_server_name="mcp_server_name",
|
|
2724
|
-
mcp_tool_name="mcp_tool_name",
|
|
2725
|
-
)
|
|
2726
|
-
|
|
2727
|
-
|
|
2728
|
-
asyncio.run(main())
|
|
2729
|
-
"""
|
|
2730
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2731
|
-
f"v1/tools/mcp/servers/{jsonable_encoder(mcp_server_name)}/{jsonable_encoder(mcp_tool_name)}",
|
|
2732
|
-
method="POST",
|
|
2733
|
-
request_options=request_options,
|
|
2734
|
-
)
|
|
2735
|
-
try:
|
|
2736
|
-
if 200 <= _response.status_code < 300:
|
|
2737
|
-
return typing.cast(
|
|
2738
|
-
Tool,
|
|
2739
|
-
construct_type(
|
|
2740
|
-
type_=Tool, # type: ignore
|
|
2741
|
-
object_=_response.json(),
|
|
2742
|
-
),
|
|
2743
|
-
)
|
|
2744
|
-
if _response.status_code == 422:
|
|
2745
|
-
raise UnprocessableEntityError(
|
|
2746
|
-
typing.cast(
|
|
2747
|
-
HttpValidationError,
|
|
2748
|
-
construct_type(
|
|
2749
|
-
type_=HttpValidationError, # type: ignore
|
|
2750
|
-
object_=_response.json(),
|
|
2751
|
-
),
|
|
2752
|
-
)
|
|
2753
|
-
)
|
|
2754
|
-
_response_json = _response.json()
|
|
2755
|
-
except JSONDecodeError:
|
|
2756
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2757
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2758
|
-
|
|
2759
|
-
async def delete_mcp_server(
|
|
2760
|
-
self, mcp_server_name: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
2761
|
-
) -> typing.List[DeleteMcpServerResponseItem]:
|
|
2762
|
-
"""
|
|
2763
|
-
Add a new MCP server to the Letta MCP server config
|
|
2764
|
-
|
|
2765
|
-
Parameters
|
|
2766
|
-
----------
|
|
2767
|
-
mcp_server_name : str
|
|
2768
|
-
|
|
2769
|
-
request_options : typing.Optional[RequestOptions]
|
|
2770
|
-
Request-specific configuration.
|
|
2771
|
-
|
|
2772
|
-
Returns
|
|
2773
|
-
-------
|
|
2774
|
-
typing.List[DeleteMcpServerResponseItem]
|
|
2775
|
-
Successful Response
|
|
2776
|
-
|
|
2777
|
-
Examples
|
|
2778
|
-
--------
|
|
2779
|
-
import asyncio
|
|
2780
|
-
|
|
2781
|
-
from letta_client import AsyncLetta
|
|
2782
|
-
|
|
2783
|
-
client = AsyncLetta(
|
|
2784
|
-
project="YOUR_PROJECT",
|
|
2785
|
-
token="YOUR_TOKEN",
|
|
2786
|
-
)
|
|
2787
|
-
|
|
2788
|
-
|
|
2789
|
-
async def main() -> None:
|
|
2790
|
-
await client.tools.delete_mcp_server(
|
|
2791
|
-
mcp_server_name="mcp_server_name",
|
|
2792
|
-
)
|
|
2793
|
-
|
|
2794
|
-
|
|
2795
|
-
asyncio.run(main())
|
|
2796
|
-
"""
|
|
2797
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2798
|
-
f"v1/tools/mcp/servers/{jsonable_encoder(mcp_server_name)}",
|
|
2799
|
-
method="DELETE",
|
|
2800
|
-
request_options=request_options,
|
|
2801
|
-
)
|
|
2802
|
-
try:
|
|
2803
|
-
if 200 <= _response.status_code < 300:
|
|
2804
|
-
return typing.cast(
|
|
2805
|
-
typing.List[DeleteMcpServerResponseItem],
|
|
2806
|
-
construct_type(
|
|
2807
|
-
type_=typing.List[DeleteMcpServerResponseItem], # type: ignore
|
|
2808
|
-
object_=_response.json(),
|
|
2809
|
-
),
|
|
2810
|
-
)
|
|
2811
|
-
if _response.status_code == 422:
|
|
2812
|
-
raise UnprocessableEntityError(
|
|
2813
|
-
typing.cast(
|
|
2814
|
-
HttpValidationError,
|
|
2815
|
-
construct_type(
|
|
2816
|
-
type_=HttpValidationError, # type: ignore
|
|
2817
|
-
object_=_response.json(),
|
|
2818
|
-
),
|
|
2819
|
-
)
|
|
2820
|
-
)
|
|
2821
|
-
_response_json = _response.json()
|
|
2822
|
-
except JSONDecodeError:
|
|
2823
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2824
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2825
|
-
|
|
2826
|
-
async def update_mcp_server(
|
|
2827
|
-
self,
|
|
2828
|
-
mcp_server_name: str,
|
|
2829
|
-
*,
|
|
2830
|
-
request: UpdateMcpServerRequest,
|
|
2831
|
-
request_options: typing.Optional[RequestOptions] = None,
|
|
2832
|
-
) -> UpdateMcpServerResponse:
|
|
2833
|
-
"""
|
|
2834
|
-
Update an existing MCP server configuration
|
|
2835
|
-
|
|
2836
|
-
Parameters
|
|
2837
|
-
----------
|
|
2838
|
-
mcp_server_name : str
|
|
2839
|
-
|
|
2840
|
-
request : UpdateMcpServerRequest
|
|
2841
|
-
|
|
2842
|
-
request_options : typing.Optional[RequestOptions]
|
|
2843
|
-
Request-specific configuration.
|
|
2844
|
-
|
|
2845
|
-
Returns
|
|
2846
|
-
-------
|
|
2847
|
-
UpdateMcpServerResponse
|
|
2848
|
-
Successful Response
|
|
2849
|
-
|
|
2850
|
-
Examples
|
|
2851
|
-
--------
|
|
2852
|
-
import asyncio
|
|
2853
|
-
|
|
2854
|
-
from letta_client import AsyncLetta, UpdateStdioMcpServer
|
|
2855
|
-
|
|
2856
|
-
client = AsyncLetta(
|
|
2857
|
-
project="YOUR_PROJECT",
|
|
2858
|
-
token="YOUR_TOKEN",
|
|
2859
|
-
)
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
async def main() -> None:
|
|
2863
|
-
await client.tools.update_mcp_server(
|
|
2864
|
-
mcp_server_name="mcp_server_name",
|
|
2865
|
-
request=UpdateStdioMcpServer(),
|
|
2866
|
-
)
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
asyncio.run(main())
|
|
2870
|
-
"""
|
|
2871
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2872
|
-
f"v1/tools/mcp/servers/{jsonable_encoder(mcp_server_name)}",
|
|
2873
|
-
method="PATCH",
|
|
2874
|
-
json=convert_and_respect_annotation_metadata(
|
|
2875
|
-
object_=request, annotation=UpdateMcpServerRequest, direction="write"
|
|
2876
|
-
),
|
|
2877
|
-
request_options=request_options,
|
|
2878
|
-
omit=OMIT,
|
|
2879
|
-
)
|
|
2880
|
-
try:
|
|
2881
|
-
if 200 <= _response.status_code < 300:
|
|
2882
|
-
return typing.cast(
|
|
2883
|
-
UpdateMcpServerResponse,
|
|
2884
|
-
construct_type(
|
|
2885
|
-
type_=UpdateMcpServerResponse, # type: ignore
|
|
2886
|
-
object_=_response.json(),
|
|
2887
|
-
),
|
|
2888
|
-
)
|
|
2889
|
-
if _response.status_code == 422:
|
|
2890
|
-
raise UnprocessableEntityError(
|
|
2891
|
-
typing.cast(
|
|
2892
|
-
HttpValidationError,
|
|
2893
|
-
construct_type(
|
|
2894
|
-
type_=HttpValidationError, # type: ignore
|
|
2895
|
-
object_=_response.json(),
|
|
2896
|
-
),
|
|
2897
|
-
)
|
|
2898
|
-
)
|
|
2899
|
-
_response_json = _response.json()
|
|
2900
|
-
except JSONDecodeError:
|
|
2901
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2902
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2903
|
-
|
|
2904
|
-
async def test_mcp_server(
|
|
2905
|
-
self, *, request: TestMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
|
|
2906
|
-
) -> typing.Optional[typing.Any]:
|
|
2907
|
-
"""
|
|
2908
|
-
Test connection to an MCP server without adding it.
|
|
2909
|
-
Returns the list of available tools if successful.
|
|
2910
|
-
|
|
2911
|
-
Parameters
|
|
2912
|
-
----------
|
|
2913
|
-
request : TestMcpServerRequest
|
|
2914
|
-
|
|
2915
|
-
request_options : typing.Optional[RequestOptions]
|
|
2916
|
-
Request-specific configuration.
|
|
2917
|
-
|
|
2918
|
-
Returns
|
|
2919
|
-
-------
|
|
2920
|
-
typing.Optional[typing.Any]
|
|
2921
|
-
Successful Response
|
|
2922
|
-
|
|
2923
|
-
Examples
|
|
2924
|
-
--------
|
|
2925
|
-
import asyncio
|
|
2926
|
-
|
|
2927
|
-
from letta_client import AsyncLetta, StdioServerConfig
|
|
2928
|
-
|
|
2929
|
-
client = AsyncLetta(
|
|
2930
|
-
project="YOUR_PROJECT",
|
|
2931
|
-
token="YOUR_TOKEN",
|
|
2932
|
-
)
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
async def main() -> None:
|
|
2936
|
-
await client.tools.test_mcp_server(
|
|
2937
|
-
request=StdioServerConfig(
|
|
2938
|
-
server_name="server_name",
|
|
2939
|
-
command="command",
|
|
2940
|
-
args=["args"],
|
|
2941
|
-
),
|
|
2942
|
-
)
|
|
2943
|
-
|
|
2944
|
-
|
|
2945
|
-
asyncio.run(main())
|
|
2946
|
-
"""
|
|
2947
|
-
_response = await self._client_wrapper.httpx_client.request(
|
|
2948
|
-
"v1/tools/mcp/servers/test",
|
|
2949
|
-
method="POST",
|
|
2950
|
-
json=convert_and_respect_annotation_metadata(
|
|
2951
|
-
object_=request, annotation=TestMcpServerRequest, direction="write"
|
|
2952
|
-
),
|
|
2953
|
-
request_options=request_options,
|
|
2954
|
-
omit=OMIT,
|
|
2955
|
-
)
|
|
2956
|
-
try:
|
|
2957
|
-
if 200 <= _response.status_code < 300:
|
|
2958
|
-
return typing.cast(
|
|
2959
|
-
typing.Optional[typing.Any],
|
|
2960
|
-
construct_type(
|
|
2961
|
-
type_=typing.Optional[typing.Any], # type: ignore
|
|
2962
|
-
object_=_response.json(),
|
|
2963
|
-
),
|
|
2964
|
-
)
|
|
2965
|
-
if _response.status_code == 422:
|
|
2966
|
-
raise UnprocessableEntityError(
|
|
2967
|
-
typing.cast(
|
|
2968
|
-
HttpValidationError,
|
|
2969
|
-
construct_type(
|
|
2970
|
-
type_=HttpValidationError, # type: ignore
|
|
2971
|
-
object_=_response.json(),
|
|
2972
|
-
),
|
|
2973
|
-
)
|
|
2974
|
-
)
|
|
2975
|
-
_response_json = _response.json()
|
|
2976
|
-
except JSONDecodeError:
|
|
2977
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
2978
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
2979
|
-
|
|
2980
|
-
async def connect_mcp_server(
|
|
2981
|
-
self, *, request: ConnectMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
|
|
2982
|
-
) -> typing.AsyncIterator[StreamingResponse]:
|
|
2983
|
-
"""
|
|
2984
|
-
Connect to an MCP server with support for OAuth via SSE.
|
|
2985
|
-
Returns a stream of events handling authorization state and exchange if OAuth is required.
|
|
2986
|
-
|
|
2987
|
-
Parameters
|
|
2988
|
-
----------
|
|
2989
|
-
request : ConnectMcpServerRequest
|
|
2990
|
-
|
|
2991
|
-
request_options : typing.Optional[RequestOptions]
|
|
2992
|
-
Request-specific configuration.
|
|
2993
|
-
|
|
2994
|
-
Yields
|
|
2995
|
-
------
|
|
2996
|
-
typing.AsyncIterator[StreamingResponse]
|
|
2997
|
-
Successful response
|
|
2998
|
-
|
|
2999
|
-
Examples
|
|
3000
|
-
--------
|
|
3001
|
-
import asyncio
|
|
3002
|
-
|
|
3003
|
-
from letta_client import AsyncLetta, StdioServerConfig
|
|
3004
|
-
|
|
3005
|
-
client = AsyncLetta(
|
|
3006
|
-
project="YOUR_PROJECT",
|
|
3007
|
-
token="YOUR_TOKEN",
|
|
3008
|
-
)
|
|
3009
|
-
|
|
3010
|
-
|
|
3011
|
-
async def main() -> None:
|
|
3012
|
-
response = await client.tools.connect_mcp_server(
|
|
3013
|
-
request=StdioServerConfig(
|
|
3014
|
-
server_name="server_name",
|
|
3015
|
-
command="command",
|
|
3016
|
-
args=["args"],
|
|
3017
|
-
),
|
|
3018
|
-
)
|
|
3019
|
-
async for chunk in response:
|
|
3020
|
-
yield chunk
|
|
3021
|
-
|
|
3022
|
-
|
|
3023
|
-
asyncio.run(main())
|
|
3024
|
-
"""
|
|
3025
|
-
async with self._client_wrapper.httpx_client.stream(
|
|
3026
|
-
"v1/tools/mcp/servers/connect",
|
|
3027
|
-
method="POST",
|
|
3028
|
-
json=convert_and_respect_annotation_metadata(
|
|
3029
|
-
object_=request, annotation=ConnectMcpServerRequest, direction="write"
|
|
3030
|
-
),
|
|
3031
|
-
request_options=request_options,
|
|
3032
|
-
omit=OMIT,
|
|
3033
|
-
) as _response:
|
|
3034
|
-
try:
|
|
3035
|
-
if 200 <= _response.status_code < 300:
|
|
3036
|
-
_event_source = httpx_sse.EventSource(_response)
|
|
3037
|
-
async for _sse in _event_source.aiter_sse():
|
|
3038
|
-
try:
|
|
3039
|
-
yield typing.cast(
|
|
3040
|
-
StreamingResponse,
|
|
3041
|
-
construct_type(
|
|
3042
|
-
type_=StreamingResponse, # type: ignore
|
|
3043
|
-
object_=json.loads(_sse.data),
|
|
3044
|
-
),
|
|
3045
|
-
)
|
|
3046
|
-
except:
|
|
3047
|
-
pass
|
|
3048
|
-
return
|
|
3049
|
-
await _response.aread()
|
|
3050
|
-
if _response.status_code == 422:
|
|
3051
|
-
raise UnprocessableEntityError(
|
|
3052
|
-
typing.cast(
|
|
3053
|
-
HttpValidationError,
|
|
3054
|
-
construct_type(
|
|
3055
|
-
type_=HttpValidationError, # type: ignore
|
|
3056
|
-
object_=_response.json(),
|
|
3057
|
-
),
|
|
3058
|
-
)
|
|
3059
|
-
)
|
|
3060
|
-
_response_json = _response.json()
|
|
3061
|
-
except JSONDecodeError:
|
|
3062
|
-
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
3063
|
-
raise ApiError(status_code=_response.status_code, body=_response_json)
|