aip-agents-binary 0.5.24__py3-none-any.whl → 0.5.25b1__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.
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.py +6 -0
- aip_agents/agent/base_langgraph_agent.pyi +232 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
- aip_agents/agent/langgraph_react_agent.py +96 -14
- aip_agents/agent/langgraph_react_agent.pyi +131 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.py +2 -2
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +1 -1
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/demo_memory_recall.pyi +58 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.pyi +67 -0
- aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +2 -2
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +1 -1
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/__init__.pyi +6 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/__init__.pyi +4 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/base.pyi +61 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/nemo.pyi +46 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/exceptions.pyi +23 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/manager.pyi +42 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/middleware.pyi +87 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/schemas.pyi +43 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/guardrails/utils.pyi +19 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.pyi +48 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.pyi +113 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.pyi +123 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.pyi +150 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.py +8 -0
- aip_agents/middleware/base.pyi +75 -0
- aip_agents/middleware/manager.py +22 -0
- aip_agents/middleware/manager.pyi +84 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.pyi +9 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.pyi +138 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.pyi +19 -0
- aip_agents/tools/memory_search/schema.pyi +15 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- {aip_agents_binary-0.5.24.dist-info → aip_agents_binary-0.5.25b1.dist-info}/METADATA +49 -49
- aip_agents_binary-0.5.25b1.dist-info/RECORD +566 -0
- {aip_agents_binary-0.5.24.dist-info → aip_agents_binary-0.5.25b1.dist-info}/WHEEL +1 -1
- aip_agents_binary-0.5.24.dist-info/RECORD +0 -280
- {aip_agents_binary-0.5.24.dist-info → aip_agents_binary-0.5.25b1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import Any
|
|
3
|
+
from typing_extensions import TypedDict
|
|
4
|
+
|
|
5
|
+
__all__ = ['A2AStreamEventType', 'A2AEvent', 'ToolCallInfo', 'ToolResultInfo']
|
|
6
|
+
|
|
7
|
+
class A2AStreamEventType(Enum):
|
|
8
|
+
"""Semantic event types for A2A agent-executor communication."""
|
|
9
|
+
STATUS_UPDATE: str
|
|
10
|
+
CONTENT_CHUNK: str
|
|
11
|
+
FINAL_RESPONSE: str
|
|
12
|
+
TOOL_CALL: str
|
|
13
|
+
TOOL_RESULT: str
|
|
14
|
+
ERROR: str
|
|
15
|
+
STEP_LIMIT_EXCEEDED: str
|
|
16
|
+
|
|
17
|
+
class A2AEvent(TypedDict):
|
|
18
|
+
"""Structured event data used by the A2A connector."""
|
|
19
|
+
event_type: A2AStreamEventType
|
|
20
|
+
content: str
|
|
21
|
+
metadata: dict[str, Any]
|
|
22
|
+
tool_info: dict[str, Any] | None
|
|
23
|
+
is_final: bool
|
|
24
|
+
artifacts: list[dict[str, Any]] | None
|
|
25
|
+
references: list[Any] | None
|
|
26
|
+
step_usage: dict[str, Any] | None
|
|
27
|
+
total_usage: dict[str, Any] | None
|
|
28
|
+
thinking_and_activity_info: dict[str, Any] | None
|
|
29
|
+
|
|
30
|
+
class ToolCallInfo(TypedDict):
|
|
31
|
+
"""Structured information for tool invocation events."""
|
|
32
|
+
tool_calls: list[dict[str, Any]]
|
|
33
|
+
status: str
|
|
34
|
+
|
|
35
|
+
class ToolResultInfo(TypedDict):
|
|
36
|
+
"""Structured information for tool completion events."""
|
|
37
|
+
name: str
|
|
38
|
+
args: dict[str, Any]
|
|
39
|
+
output: str
|
|
40
|
+
execution_time: float | None
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from a2a.types import AgentCard
|
|
3
|
+
from enum import StrEnum
|
|
4
|
+
from gllm_core.utils.retry import RetryConfig
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
__all__ = ['CredentialType', 'StreamMode', 'HttpxClientOptions', 'A2AClientConfig', 'BaseAgentConfig', 'AgentConfig', 'LangflowAgentConfig']
|
|
9
|
+
|
|
10
|
+
class CredentialType(StrEnum):
|
|
11
|
+
"""Credential type enumeration for type safety and better developer experience."""
|
|
12
|
+
API_KEY: str
|
|
13
|
+
FILE: str
|
|
14
|
+
DICT: str
|
|
15
|
+
|
|
16
|
+
class StreamMode(StrEnum):
|
|
17
|
+
"""LangGraph stream modes for astream operations."""
|
|
18
|
+
VALUES: str
|
|
19
|
+
CUSTOM: str
|
|
20
|
+
MESSAGES: str
|
|
21
|
+
|
|
22
|
+
class HttpxClientOptions(BaseModel):
|
|
23
|
+
"""Options for the HTTP client."""
|
|
24
|
+
timeout: float
|
|
25
|
+
trust_env: bool
|
|
26
|
+
follow_redirects: bool
|
|
27
|
+
model_config: Incomplete
|
|
28
|
+
class Config:
|
|
29
|
+
"""Pydantic v1 fallback config for HttpxClientOptions."""
|
|
30
|
+
extra: str
|
|
31
|
+
|
|
32
|
+
class A2AClientConfig(BaseModel):
|
|
33
|
+
"""Configuration for A2A client."""
|
|
34
|
+
discovery_urls: list[str] | None
|
|
35
|
+
known_agents: dict[str, AgentCard]
|
|
36
|
+
httpx_client_options: HttpxClientOptions | None
|
|
37
|
+
|
|
38
|
+
class BaseAgentConfig(BaseModel):
|
|
39
|
+
"""Base configuration for agent implementations."""
|
|
40
|
+
tools: list[Any] | None
|
|
41
|
+
default_hyperparameters: dict[str, Any] | None
|
|
42
|
+
model_config: Incomplete
|
|
43
|
+
class Config:
|
|
44
|
+
"""Pydantic v1 fallback config for BaseAgentConfig."""
|
|
45
|
+
extra: str
|
|
46
|
+
|
|
47
|
+
class AgentConfig(BaseAgentConfig):
|
|
48
|
+
"""Configuration for agent implementations with language model settings."""
|
|
49
|
+
lm_name: str | None
|
|
50
|
+
lm_hyperparameters: dict[str, Any] | None
|
|
51
|
+
lm_provider: str | None
|
|
52
|
+
lm_base_url: str | None
|
|
53
|
+
lm_api_key: str | None
|
|
54
|
+
lm_credentials: str | dict[str, Any] | None
|
|
55
|
+
lm_retry_config: RetryConfig | None
|
|
56
|
+
|
|
57
|
+
class LangflowAgentConfig(BaseAgentConfig):
|
|
58
|
+
"""Configuration for Langflow agent implementations."""
|
|
59
|
+
flow_id: str
|
|
60
|
+
base_url: str | None
|
|
61
|
+
api_key: str | None
|
|
62
|
+
model_config: Incomplete
|
|
63
|
+
class Config:
|
|
64
|
+
"""Pydantic v1 fallback config for LangflowAgentConfig."""
|
|
65
|
+
extra: str
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from enum import StrEnum
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
__all__ = ['ApprovalDecisionType', 'ApprovalRequest', 'ApprovalDecision', 'ApprovalLogEntry', 'HitlMetadata']
|
|
9
|
+
|
|
10
|
+
class ApprovalDecisionType(StrEnum):
|
|
11
|
+
"""Enumeration of possible approval decision types."""
|
|
12
|
+
APPROVED: str
|
|
13
|
+
REJECTED: str
|
|
14
|
+
SKIPPED: str
|
|
15
|
+
TIMEOUT_SKIP: str
|
|
16
|
+
PENDING: str
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class ApprovalRequest:
|
|
20
|
+
"""Represents an in-flight prompt shown to the operator."""
|
|
21
|
+
request_id: str
|
|
22
|
+
tool_name: str
|
|
23
|
+
arguments_preview: str
|
|
24
|
+
context: dict[str, str] | None = ...
|
|
25
|
+
created_at: datetime | None = ...
|
|
26
|
+
timeout_at: datetime | None = ...
|
|
27
|
+
def __post_init__(self) -> None:
|
|
28
|
+
"""Initialize timestamps if not provided."""
|
|
29
|
+
@classmethod
|
|
30
|
+
def create(cls, tool_name: str, arguments_preview: str, context: dict[str, str] | None = None) -> ApprovalRequest:
|
|
31
|
+
"""Create a new approval request with generated request_id.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
tool_name (str): The name of the tool requiring approval.
|
|
35
|
+
arguments_preview (str): A preview of the arguments for display.
|
|
36
|
+
context (dict[str, str] | None, optional): Additional context information.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
ApprovalRequest: A new approval request instance.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class ApprovalDecision:
|
|
44
|
+
"""Captures the operator outcome."""
|
|
45
|
+
request_id: str
|
|
46
|
+
decision: ApprovalDecisionType
|
|
47
|
+
operator_input: str
|
|
48
|
+
decided_at: datetime | None = ...
|
|
49
|
+
latency_ms: int | None = ...
|
|
50
|
+
def __post_init__(self) -> None:
|
|
51
|
+
"""Initialize timestamp if not provided."""
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class ApprovalLogEntry:
|
|
55
|
+
"""Structured log entry for HITL decisions."""
|
|
56
|
+
request_id: str
|
|
57
|
+
tool_name: str
|
|
58
|
+
decision: str
|
|
59
|
+
event: str = ...
|
|
60
|
+
agent_id: str | None = ...
|
|
61
|
+
thread_id: str | None = ...
|
|
62
|
+
additional_context: dict[str, Any] | None = ...
|
|
63
|
+
timestamp: datetime | None = ...
|
|
64
|
+
def __post_init__(self) -> None:
|
|
65
|
+
"""Initialize timestamp if not provided."""
|
|
66
|
+
|
|
67
|
+
class HitlMetadata(BaseModel):
|
|
68
|
+
"""Structured metadata payload included in agent streaming events."""
|
|
69
|
+
required: bool
|
|
70
|
+
decision: ApprovalDecisionType
|
|
71
|
+
request_id: str
|
|
72
|
+
timeout_seconds: int | None
|
|
73
|
+
timeout_at: datetime | None
|
|
74
|
+
model_config: Incomplete
|
|
75
|
+
def as_payload(self) -> dict[str, Any]:
|
|
76
|
+
"""Return a JSON-ready metadata payload."""
|
|
77
|
+
@classmethod
|
|
78
|
+
def from_decision(cls, decision: ApprovalDecision, *, required: bool = True, timeout_seconds: int | None = None, timeout_at: datetime | None = None) -> HitlMetadata:
|
|
79
|
+
"""Build metadata from an ``ApprovalDecision``.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
decision (ApprovalDecision): The approval decision to build metadata from.
|
|
83
|
+
required (bool, optional): Whether approval is required. Defaults to True.
|
|
84
|
+
timeout_seconds (int | None, optional): Timeout in seconds for the decision.
|
|
85
|
+
timeout_at (datetime | None, optional): Specific timeout datetime.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
HitlMetadata: The constructed metadata instance.
|
|
89
|
+
"""
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from gllm_core.schema import Chunk
|
|
3
|
+
from langchain_core.messages import ToolMessage
|
|
4
|
+
from langchain_core.messages.ai import UsageMetadata
|
|
5
|
+
from langchain_core.tools import BaseTool
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
__all__ = ['ToolCallResult', 'ToolStorageParams']
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class ToolCallResult:
|
|
12
|
+
"""Container for the results of a single tool call execution."""
|
|
13
|
+
messages: list[ToolMessage]
|
|
14
|
+
artifacts: list[dict[str, Any]]
|
|
15
|
+
metadata_delta: dict[str, Any]
|
|
16
|
+
references: list[Chunk]
|
|
17
|
+
step_usage: UsageMetadata | None
|
|
18
|
+
pii_mapping: dict[str, str] | None = ...
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class ToolStorageParams:
|
|
22
|
+
"""Parameters required for automatically storing tool outputs."""
|
|
23
|
+
tool: BaseTool
|
|
24
|
+
tool_output: Any
|
|
25
|
+
tool_call: dict[str, Any]
|
|
26
|
+
tool_call_id: str
|
|
27
|
+
resolved_args: dict[str, Any]
|
|
28
|
+
state: dict[str, Any]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from enum import StrEnum
|
|
3
|
+
|
|
4
|
+
__all__ = ['ModelId', 'ModelProvider']
|
|
5
|
+
|
|
6
|
+
class ModelProvider(StrEnum):
|
|
7
|
+
"""Enumeration of supported model providers for the AI agent platform."""
|
|
8
|
+
OPENAI: str
|
|
9
|
+
ANTHROPIC: str
|
|
10
|
+
AZURE_OPENAI: str
|
|
11
|
+
GOOGLE_GENAI: str
|
|
12
|
+
GROQ: str
|
|
13
|
+
TOGETHER_AI: str
|
|
14
|
+
DEEPINFRA: str
|
|
15
|
+
DEEPSEEK: str
|
|
16
|
+
OPENAI_COMPATIBLE: str
|
|
17
|
+
|
|
18
|
+
class ModelId:
|
|
19
|
+
"""Model identifier class for representing language models."""
|
|
20
|
+
provider: Incomplete
|
|
21
|
+
name: Incomplete
|
|
22
|
+
path: Incomplete
|
|
23
|
+
def __init__(self, provider: str, name: str, path: str | None = None) -> None:
|
|
24
|
+
"""Initialize a ModelId.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
provider: The model provider (e.g., 'openai', 'anthropic')
|
|
28
|
+
name: The specific model name
|
|
29
|
+
path: Optional path component for some providers
|
|
30
|
+
"""
|
|
31
|
+
@classmethod
|
|
32
|
+
def from_string(cls, model_string: str) -> ModelId:
|
|
33
|
+
"""Create a ModelId from a string representation.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
model_string: String in format 'provider:name' or 'provider/path:name'
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
ModelId instance
|
|
40
|
+
|
|
41
|
+
Raises:
|
|
42
|
+
ValueError: If the string format is invalid
|
|
43
|
+
"""
|
|
44
|
+
def __eq__(self, other: object) -> bool:
|
|
45
|
+
"""Check equality with another ModelId object.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
other (object): The object to compare with.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
bool: True if the objects are equal, False otherwise.
|
|
52
|
+
"""
|
|
53
|
+
def __hash__(self) -> int:
|
|
54
|
+
"""Return hash of the ModelId."""
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from dataclasses import dataclass, field
|
|
3
|
+
from enum import StrEnum
|
|
4
|
+
|
|
5
|
+
class StepLimitErrorType(StrEnum):
|
|
6
|
+
"""Types of step-related limit violations."""
|
|
7
|
+
STEP_LIMIT_EXCEEDED: str
|
|
8
|
+
DELEGATION_DEPTH_EXCEEDED: str
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class StepLimitConfig:
|
|
12
|
+
"""Configuration for agent step and delegation limits.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
max_steps: Maximum number of execution steps allowed per invocation.
|
|
16
|
+
Includes agent node (LLM call) and every tool call (parallel batches count per call).
|
|
17
|
+
max_delegation_depth: Maximum depth of delegation chain allowed.
|
|
18
|
+
Depth 0 means no delegation allowed.
|
|
19
|
+
"""
|
|
20
|
+
max_steps: int = field(default_factory=Incomplete)
|
|
21
|
+
max_delegation_depth: int = field(default_factory=Incomplete)
|
|
22
|
+
def __post_init__(self) -> None:
|
|
23
|
+
"""Validate configuration values and normalize range."""
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class StepLimitErrorResponse:
|
|
27
|
+
"""Structured error response for step limit violations.
|
|
28
|
+
|
|
29
|
+
Attributes:
|
|
30
|
+
error_type: The type of limit that was exceeded.
|
|
31
|
+
agent_name: Name of the agent that hit the limit.
|
|
32
|
+
current_value: Current step count or delegation depth.
|
|
33
|
+
configured_limit: The configured limit that was exceeded.
|
|
34
|
+
message: Human-readable error message.
|
|
35
|
+
delegation_chain: Full chain for delegation errors.
|
|
36
|
+
partial_result: Any output generated before hitting the limit.
|
|
37
|
+
"""
|
|
38
|
+
error_type: StepLimitErrorType
|
|
39
|
+
agent_name: str
|
|
40
|
+
current_value: int
|
|
41
|
+
configured_limit: int
|
|
42
|
+
message: str
|
|
43
|
+
delegation_chain: list[str] | None = ...
|
|
44
|
+
partial_result: str | None = ...
|
|
45
|
+
|
|
46
|
+
class StepLimitError(Exception):
|
|
47
|
+
"""Base exception for step and delegation limit violations.
|
|
48
|
+
|
|
49
|
+
Attributes:
|
|
50
|
+
error_response: Structured error response with details.
|
|
51
|
+
"""
|
|
52
|
+
error_response: Incomplete
|
|
53
|
+
def __init__(self, error_response: StepLimitErrorResponse) -> None:
|
|
54
|
+
"""Initialize with error response.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
error_response: Structured error details.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
class MaxStepsExceededError(StepLimitError):
|
|
61
|
+
"""Raised when agent exceeds configured max_steps limit."""
|
|
62
|
+
class MaxDelegationDepthExceededError(StepLimitError):
|
|
63
|
+
"""Raised when delegation would exceed max_delegation_depth limit."""
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from enum import StrEnum
|
|
3
|
+
|
|
4
|
+
__all__ = ['OBJECT_STORAGE_PREFIX', 'StorageType', 'StorageConfig']
|
|
5
|
+
|
|
6
|
+
OBJECT_STORAGE_PREFIX: str
|
|
7
|
+
|
|
8
|
+
class StorageType(StrEnum):
|
|
9
|
+
"""Supported storage types."""
|
|
10
|
+
MEMORY: str
|
|
11
|
+
OBJECT_STORAGE: str
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class StorageConfig:
|
|
15
|
+
"""Configuration for storage providers."""
|
|
16
|
+
storage_type: StorageType = ...
|
|
17
|
+
object_prefix: str = ...
|
|
18
|
+
object_use_json: bool = ...
|
|
19
|
+
@classmethod
|
|
20
|
+
def from_env(cls) -> StorageConfig:
|
|
21
|
+
"""Create StorageConfig from environment variables."""
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.agent import BaseAgent as BaseAgent, GoogleADKAgent as GoogleADKAgent, LangChainAgent as LangChainAgent, LangGraphAgent as LangGraphAgent
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from fastapi import FastAPI
|
|
5
|
+
|
|
6
|
+
logger: Incomplete
|
|
7
|
+
SENTRY_DSN: Incomplete
|
|
8
|
+
SENTRY_ENVIRONMENT: Incomplete
|
|
9
|
+
SENTRY_PROJECT: Incomplete
|
|
10
|
+
VERSION_NUMBER: Incomplete
|
|
11
|
+
BUILD_NUMBER: Incomplete
|
|
12
|
+
USE_OPENTELEMETRY: Incomplete
|
|
13
|
+
CLASSES_TO_INSTRUMENT: Incomplete
|
|
14
|
+
|
|
15
|
+
def get_all_methods(cls) -> list:
|
|
16
|
+
"""Get all methods from a class.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
cls: The class to get methods from.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
list: A list of methods.
|
|
23
|
+
"""
|
|
24
|
+
def instrument_gl_functions() -> None:
|
|
25
|
+
"""Instrument GL functions."""
|
|
26
|
+
def traces_sampler(*args) -> float:
|
|
27
|
+
"""Determine appropriate sampling rate for Sentry transactions.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
*args: Additional positional arguments
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
float: Sampling rate between 0 and 1
|
|
34
|
+
"""
|
|
35
|
+
def setup_sentry_with_open_telemetry(app: FastAPI) -> None:
|
|
36
|
+
"""Configure telemetry with both Sentry and OpenTelemetry.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
app: FastAPI application instance
|
|
40
|
+
"""
|
|
41
|
+
def setup_sentry_only() -> None:
|
|
42
|
+
"""Configure telemetry with Sentry only (no OpenTelemetry)."""
|
|
43
|
+
def setup_telemetry(app: FastAPI) -> None:
|
|
44
|
+
"""Configure and initialize telemetry based on configuration.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
app: FastAPI application instance
|
|
48
|
+
"""
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
from aip_agents.storage.base import BaseObjectStorageClient as BaseObjectStorageClient
|
|
2
|
+
from aip_agents.storage.clients.minio_client import MinioConfig as MinioConfig, MinioObjectStorage as MinioObjectStorage
|
|
3
|
+
from aip_agents.storage.config import StorageConfig as StorageConfig, StorageProviderFactory as StorageProviderFactory, StorageType as StorageType
|
|
4
|
+
from aip_agents.storage.providers.base import BaseStorageProvider as BaseStorageProvider, StorageError as StorageError
|
|
5
|
+
from aip_agents.storage.providers.memory import InMemoryStorageProvider as InMemoryStorageProvider
|
|
6
|
+
from aip_agents.storage.providers.object_storage import ObjectStorageProvider as ObjectStorageProvider
|
|
7
|
+
|
|
8
|
+
__all__ = ['BaseObjectStorageClient', 'MinioConfig', 'MinioObjectStorage', 'BaseStorageProvider', 'StorageError', 'InMemoryStorageProvider', 'ObjectStorageProvider', 'StorageConfig', 'StorageType', 'StorageProviderFactory']
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import BinaryIO
|
|
3
|
+
|
|
4
|
+
class BaseObjectStorageClient(ABC):
|
|
5
|
+
"""Abstract base class for object storage clients."""
|
|
6
|
+
@abstractmethod
|
|
7
|
+
def object_exists(self, object_key: str) -> bool:
|
|
8
|
+
"""Check if an object exists in the storage.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
object_key: The key of the object to check.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
True if the object exists, False otherwise.
|
|
15
|
+
"""
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def upload(self, object_key: str, file_stream: bytes | BinaryIO, filename: str | None = None, content_type: str | None = None, metadata: dict[str, str] | None = None) -> str:
|
|
18
|
+
"""Upload data to object storage.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
object_key: The key of the object in the storage
|
|
22
|
+
file_stream: The binary data to upload
|
|
23
|
+
filename: The name of the file
|
|
24
|
+
content_type: The content type of the file
|
|
25
|
+
metadata: Additional metadata to store with the object
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
The key of the uploaded object
|
|
29
|
+
"""
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def get(self, object_key: str) -> bytes:
|
|
32
|
+
"""Get data from object storage.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
object_key: The key of the object in the storage
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
The binary data of the object
|
|
39
|
+
"""
|
|
40
|
+
@abstractmethod
|
|
41
|
+
def delete(self, object_key: str) -> None:
|
|
42
|
+
"""Delete data from object storage.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
object_key: The key of the object in the storage
|
|
46
|
+
"""
|
|
47
|
+
@abstractmethod
|
|
48
|
+
def generate_presigned_url(self, object_key: str, expires: int = 24, response_headers: dict[str, str] | None = None) -> str:
|
|
49
|
+
"""Generate a presigned URL for accessing the object.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
object_key: The key of the object in the storage
|
|
53
|
+
expires: The number of hours the URL is valid for
|
|
54
|
+
response_headers: Additional headers to include in the response
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
The presigned URL
|
|
58
|
+
"""
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.storage.base import BaseObjectStorageClient as BaseObjectStorageClient
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import BinaryIO
|
|
5
|
+
|
|
6
|
+
S3_ERR_NO_SUCH_KEY: str
|
|
7
|
+
S3_ERR_NO_SUCH_BUCKET: str
|
|
8
|
+
S3_ERR_ACCESS_DENIED: str
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class MinioConfig:
|
|
12
|
+
"""Configuration for MinIO object storage client.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
endpoint: MinIO server endpoint URL
|
|
16
|
+
access_key: Access key for authentication
|
|
17
|
+
secret_key: Secret key for authentication
|
|
18
|
+
bucket: Bucket name to use for storage
|
|
19
|
+
secure: Whether to use HTTPS (defaults to True)
|
|
20
|
+
"""
|
|
21
|
+
endpoint: str
|
|
22
|
+
access_key: str
|
|
23
|
+
secret_key: str
|
|
24
|
+
bucket: str
|
|
25
|
+
secure: bool = ...
|
|
26
|
+
@classmethod
|
|
27
|
+
def from_env(cls) -> MinioConfig:
|
|
28
|
+
"""Create MinioConfig from environment variables.
|
|
29
|
+
|
|
30
|
+
Expected environment variables:
|
|
31
|
+
- OBJECT_STORAGE_URL
|
|
32
|
+
- OBJECT_STORAGE_USER
|
|
33
|
+
- OBJECT_STORAGE_PASSWORD
|
|
34
|
+
- OBJECT_STORAGE_BUCKET
|
|
35
|
+
- OBJECT_STORAGE_SECURE (optional, defaults to True)
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
MinioConfig instance
|
|
39
|
+
|
|
40
|
+
Raises:
|
|
41
|
+
ValueError: If required environment variables are not set
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
class MinioObjectStorage(BaseObjectStorageClient):
|
|
45
|
+
"""Implementation of ObjectStorageInterface using Minio."""
|
|
46
|
+
config: Incomplete
|
|
47
|
+
client: Incomplete
|
|
48
|
+
bucket: Incomplete
|
|
49
|
+
def __init__(self, config: MinioConfig | None = None, ensure_bucket: bool = True) -> None:
|
|
50
|
+
"""Initialize MinioObjectStorage with configuration.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
config: MinioConfig instance. If None, will attempt to load from environment variables.
|
|
54
|
+
ensure_bucket: Whether to ensure bucket exists during initialization (optional). Defaults to True.
|
|
55
|
+
|
|
56
|
+
Raises:
|
|
57
|
+
ValueError: If configuration is invalid or incomplete
|
|
58
|
+
"""
|
|
59
|
+
def upload(self, object_key: str, file_stream: bytes | BinaryIO, filename: str | None = None, content_type: str | None = None, metadata: dict[str, str] | None = None) -> str:
|
|
60
|
+
"""Upload data to Minio object storage.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
object_key: The key to store the object under
|
|
64
|
+
file_stream: The data to upload (bytes or file-like object)
|
|
65
|
+
filename: The filename of the data (optional)
|
|
66
|
+
content_type: The content type of the data (optional)
|
|
67
|
+
metadata: Additional metadata to store with the object (optional)
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
The object key of the uploaded data
|
|
71
|
+
|
|
72
|
+
Raises:
|
|
73
|
+
ValueError: If the file stream is empty or invalid
|
|
74
|
+
ConnectionError: If there's an issue connecting to Minio
|
|
75
|
+
Exception: For other unexpected errors during upload
|
|
76
|
+
"""
|
|
77
|
+
def get(self, object_key: str) -> bytes:
|
|
78
|
+
"""Get data from Minio object storage.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
object_key: The key of the object to retrieve
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
The object data as bytes
|
|
85
|
+
|
|
86
|
+
Raises:
|
|
87
|
+
KeyError: If the object is not found
|
|
88
|
+
ConnectionError: If there's a network or connection issue
|
|
89
|
+
"""
|
|
90
|
+
def delete(self, object_key: str) -> None:
|
|
91
|
+
"""Delete data from Minio object storage.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
object_key: The key of the object to delete
|
|
95
|
+
|
|
96
|
+
Raises:
|
|
97
|
+
ConnectionError: If there's a network or connection issue
|
|
98
|
+
"""
|
|
99
|
+
def object_exists(self, object_key: str) -> bool:
|
|
100
|
+
"""Check if an object exists in the MinIO bucket.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
object_key: The key of the object to check.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
True if the object exists, False otherwise.
|
|
107
|
+
|
|
108
|
+
Raises:
|
|
109
|
+
ConnectionError: If there's a network or connection issue (excluding not found errors)
|
|
110
|
+
"""
|
|
111
|
+
def list_objects(self, prefix: str = '') -> list[str]:
|
|
112
|
+
"""List objects in the bucket with optional prefix filter.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
prefix: Optional prefix to filter objects
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
List of object keys
|
|
119
|
+
|
|
120
|
+
Raises:
|
|
121
|
+
ConnectionError: If there's an issue listing objects
|
|
122
|
+
"""
|
|
123
|
+
def generate_presigned_url(self, object_key: str, expires: int = 24, response_headers: dict[str, str] | None = None) -> str:
|
|
124
|
+
"""Generate a presigned URL for accessing the object.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
object_key: The key of the object
|
|
128
|
+
expires: Expiration time in hours (defaults to 24)
|
|
129
|
+
response_headers: Additional response headers (optional)
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
A presigned URL
|
|
133
|
+
|
|
134
|
+
Raises:
|
|
135
|
+
ValueError: If expiration time is not positive
|
|
136
|
+
ConnectionError: If there's an issue generating the URL
|
|
137
|
+
"""
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from aip_agents.schema.storage import OBJECT_STORAGE_PREFIX as OBJECT_STORAGE_PREFIX, StorageConfig as StorageConfig, StorageType as StorageType
|
|
2
|
+
from aip_agents.storage.base import BaseObjectStorageClient
|
|
3
|
+
from aip_agents.storage.providers.base import BaseStorageProvider
|
|
4
|
+
|
|
5
|
+
__all__ = ['OBJECT_STORAGE_PREFIX', 'StorageConfig', 'StorageType', 'StorageProviderFactory']
|
|
6
|
+
|
|
7
|
+
class StorageProviderFactory:
|
|
8
|
+
"""Factory for creating storage providers based on configuration."""
|
|
9
|
+
@staticmethod
|
|
10
|
+
def create(config: StorageConfig, object_storage_client: BaseObjectStorageClient | None = None) -> BaseStorageProvider:
|
|
11
|
+
"""Create storage provider based on configuration.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
config (StorageConfig): Storage configuration object.
|
|
15
|
+
object_storage_client (BaseObjectStorageClient | None, optional): Optional object storage client for object storage type.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
BaseStorageProvider: The created storage provider instance.
|
|
19
|
+
"""
|
|
20
|
+
@staticmethod
|
|
21
|
+
def create_from_env(object_storage_client: BaseObjectStorageClient | None = None) -> BaseStorageProvider:
|
|
22
|
+
"""Create storage provider from environment variables.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
object_storage_client (BaseObjectStorageClient | None, optional): Optional object storage client for object storage type.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
BaseStorageProvider: The created storage provider instance.
|
|
29
|
+
"""
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
from aip_agents.storage.providers.base import BaseStorageProvider as BaseStorageProvider, StorageError as StorageError
|
|
2
|
+
from aip_agents.storage.providers.memory import InMemoryStorageProvider as InMemoryStorageProvider
|
|
3
|
+
from aip_agents.storage.providers.object_storage import ObjectStorageProvider as ObjectStorageProvider
|
|
4
|
+
|
|
5
|
+
__all__ = ['BaseStorageProvider', 'StorageError', 'InMemoryStorageProvider', 'ObjectStorageProvider']
|