aip-agents-binary 0.5.20__py3-none-manylinux_2_31_x86_64.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__.py +65 -0
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.py +1086 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.py +27 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.py +970 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.py +2942 -0
- aip_agents/agent/base_langgraph_agent.pyi +232 -0
- aip_agents/agent/google_adk_agent.py +926 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.py +6 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
- aip_agents/agent/langgraph_react_agent.py +2514 -0
- aip_agents/agent/langgraph_react_agent.pyi +126 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.py +23 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +142 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/demo_memory_recall.py +401 -0
- aip_agents/examples/demo_memory_recall.pyi +58 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -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.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -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.py +251 -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.py +57 -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.py +80 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_bosa_twitter.py +41 -0
- aip_agents/examples/hello_world_langgraph_bosa_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.py +46 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.py +114 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/hitl_demo.pyi +67 -0
- aip_agents/examples/mcp_configs/configs.py +63 -0
- aip_agents/examples/mcp_servers/common.py +76 -0
- aip_agents/examples/mcp_servers/mcp_name.py +29 -0
- aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
- aip_agents/examples/mcp_servers/mcp_time.py +10 -0
- aip_agents/examples/pii_demo_langgraph_client.py +69 -0
- aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.py +126 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/executor/agent_executor.py +473 -0
- aip_agents/executor/base.py +48 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.py +14 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.py +369 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.py +193 -0
- aip_agents/mcp/client/connection_manager.pyi +48 -0
- aip_agents/mcp/client/google_adk/__init__.py +11 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.py +381 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.py +359 -0
- aip_agents/mcp/client/persistent_session.pyi +113 -0
- aip_agents/mcp/client/session_pool.py +351 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.py +215 -0
- aip_agents/mcp/client/transports.pyi +123 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.py +717 -0
- aip_agents/memory/adapters/base_adapter.pyi +150 -0
- aip_agents/memory/adapters/mem0.py +84 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.py +17 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.py +88 -0
- aip_agents/middleware/base.pyi +71 -0
- aip_agents/middleware/manager.py +128 -0
- aip_agents/middleware/manager.pyi +80 -0
- aip_agents/middleware/todolist.py +274 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/schema/__init__.py +69 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.py +56 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.py +111 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.py +37 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.py +97 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.py +151 -0
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.py +33 -0
- aip_agents/tools/__init__.pyi +13 -0
- aip_agents/tools/bosa_tools.py +105 -0
- aip_agents/tools/bosa_tools.pyi +37 -0
- aip_agents/tools/browser_use/__init__.py +82 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.py +103 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.py +198 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.py +119 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.py +76 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.py +317 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.py +813 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.py +78 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.py +26 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +257 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +86 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.py +165 -0
- aip_agents/tools/constants.pyi +135 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.py +351 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/memory_search/__init__.py +22 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.py +200 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.py +258 -0
- aip_agents/tools/memory_search/mem0.pyi +19 -0
- aip_agents/tools/memory_search/schema.py +48 -0
- aip_agents/tools/memory_search/schema.pyi +15 -0
- aip_agents/tools/memory_search_tool.py +26 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.py +70 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.py +79 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.py +1757 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.py +502 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.py +176 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.py +231 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.py +128 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +967 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.py +358 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.py +25 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.py +397 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.py +207 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.py +831 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.py +156 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- aip_agents_binary-0.5.20.dist-info/METADATA +681 -0
- aip_agents_binary-0.5.20.dist-info/RECORD +546 -0
- aip_agents_binary-0.5.20.dist-info/WHEEL +5 -0
- aip_agents_binary-0.5.20.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Tool that generates sample data with automatic output storage.
|
|
2
|
+
|
|
3
|
+
This tool demonstrates the tool output management system by generating
|
|
4
|
+
data that can be referenced by other tools.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import random
|
|
11
|
+
from typing import Any, Literal
|
|
12
|
+
|
|
13
|
+
from langchain_core.tools import BaseTool
|
|
14
|
+
from pydantic import BaseModel, Field
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class DataInput(BaseModel):
|
|
18
|
+
"""Input schema for data generation."""
|
|
19
|
+
|
|
20
|
+
data_type: Literal["sales", "scores", "growth"] = Field(
|
|
21
|
+
default="sales",
|
|
22
|
+
description="Type of data to generate",
|
|
23
|
+
)
|
|
24
|
+
size: int = Field(
|
|
25
|
+
default=5,
|
|
26
|
+
description="Number of data points",
|
|
27
|
+
ge=1,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class DataGeneratorTool(BaseTool):
|
|
32
|
+
"""Tool that generates sample datasets with automatic output storage."""
|
|
33
|
+
|
|
34
|
+
name: str = "data_generator"
|
|
35
|
+
description: str = "Generate sample datasets (sales, scores, growth data)"
|
|
36
|
+
args_schema: type[BaseModel] = DataInput
|
|
37
|
+
store_final_output: bool = True # Enable automatic storage
|
|
38
|
+
|
|
39
|
+
def _run(
|
|
40
|
+
self,
|
|
41
|
+
data_type: str = "sales",
|
|
42
|
+
size: int = 5,
|
|
43
|
+
**kwargs,
|
|
44
|
+
) -> dict[str, Any]:
|
|
45
|
+
"""Generate a sample dataset.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
data_type: Type of data to generate
|
|
49
|
+
size: Number of data points
|
|
50
|
+
**kwargs: Additional arguments including tool output context
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
Dictionary containing the generated data
|
|
54
|
+
"""
|
|
55
|
+
if data_type == "sales":
|
|
56
|
+
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
|
57
|
+
return {
|
|
58
|
+
"title": "Monthly Sales Data",
|
|
59
|
+
"labels": months[:size],
|
|
60
|
+
"values": [random.randint(1000, 5000) for _ in range(size)],
|
|
61
|
+
"units": "dollars",
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
elif data_type == "scores":
|
|
65
|
+
students = [f"Student {i + 1}" for i in range(size)]
|
|
66
|
+
return {
|
|
67
|
+
"title": "Student Test Scores",
|
|
68
|
+
"labels": students,
|
|
69
|
+
"values": [random.randint(60, 100) for _ in range(size)],
|
|
70
|
+
"units": "points",
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
else: # growth
|
|
74
|
+
quarters = [f"Q{i + 1}" for i in range(size)]
|
|
75
|
+
base = 1000
|
|
76
|
+
values = []
|
|
77
|
+
for _ in range(size):
|
|
78
|
+
base *= random.uniform(1.05, 1.25) # Growth factor
|
|
79
|
+
values.append(int(base))
|
|
80
|
+
return {
|
|
81
|
+
"title": "Quarterly Growth",
|
|
82
|
+
"labels": quarters,
|
|
83
|
+
"values": values,
|
|
84
|
+
"units": "units",
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async def _arun(
|
|
88
|
+
self,
|
|
89
|
+
data_type: str = "sales",
|
|
90
|
+
size: int = 5,
|
|
91
|
+
**kwargs,
|
|
92
|
+
) -> dict[str, Any]:
|
|
93
|
+
"""Async version of _run.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
data_type (str, optional): Type of data to generate. Defaults to "sales".
|
|
97
|
+
size (int, optional): Number of data points. Defaults to 5.
|
|
98
|
+
**kwargs: Additional arguments including tool output context.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
dict[str, Any]: Dictionary containing the generated data.
|
|
102
|
+
"""
|
|
103
|
+
return self._run(data_type, size, **kwargs)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from langchain_core.tools import BaseTool
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
from typing import Literal
|
|
4
|
+
|
|
5
|
+
class DataInput(BaseModel):
|
|
6
|
+
"""Input schema for data generation."""
|
|
7
|
+
data_type: Literal['sales', 'scores', 'growth']
|
|
8
|
+
size: int
|
|
9
|
+
|
|
10
|
+
class DataGeneratorTool(BaseTool):
|
|
11
|
+
"""Tool that generates sample datasets with automatic output storage."""
|
|
12
|
+
name: str
|
|
13
|
+
description: str
|
|
14
|
+
args_schema: type[BaseModel]
|
|
15
|
+
store_final_output: bool
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"""Tool that creates visualizations from data with automatic output storage.
|
|
2
|
+
|
|
3
|
+
This tool demonstrates the tool output management system by creating
|
|
4
|
+
visual charts from data (including referenced data from other tools).
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import io
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from langchain_core.tools import BaseTool
|
|
14
|
+
from langgraph.types import Command
|
|
15
|
+
from pydantic import BaseModel, Field
|
|
16
|
+
|
|
17
|
+
from aip_agents.a2a.types import MimeType
|
|
18
|
+
from aip_agents.utils.artifact_helpers import create_artifact_command
|
|
19
|
+
|
|
20
|
+
# Optional PIL import for image generation
|
|
21
|
+
try:
|
|
22
|
+
from PIL import Image, ImageDraw # type: ignore
|
|
23
|
+
|
|
24
|
+
PIL_AVAILABLE = True
|
|
25
|
+
except ImportError:
|
|
26
|
+
PIL_AVAILABLE = False
|
|
27
|
+
Image = None
|
|
28
|
+
ImageDraw = None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ChartInput(BaseModel):
|
|
32
|
+
"""Input schema for chart generation."""
|
|
33
|
+
|
|
34
|
+
data_source: Any = Field(
|
|
35
|
+
description="Data to visualize (can be a reference like $tool_output.xyz)",
|
|
36
|
+
)
|
|
37
|
+
chart_type: str = Field(
|
|
38
|
+
default="bar",
|
|
39
|
+
description="Type of chart to generate (bar or line).",
|
|
40
|
+
pattern="^(bar|line)$",
|
|
41
|
+
)
|
|
42
|
+
title: str = Field(
|
|
43
|
+
default="Chart",
|
|
44
|
+
description="Title for the visualization",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class DataVisualizerTool(BaseTool):
|
|
49
|
+
"""Tool that creates visualizations with automatic output storage."""
|
|
50
|
+
|
|
51
|
+
name: str = "data_visualizer"
|
|
52
|
+
description: str = "Create visual charts from data (supports tool output references)"
|
|
53
|
+
args_schema: type[BaseModel] = ChartInput
|
|
54
|
+
|
|
55
|
+
def _run(
|
|
56
|
+
self,
|
|
57
|
+
data_source: Any,
|
|
58
|
+
chart_type: str = "bar",
|
|
59
|
+
title: str = "Chart",
|
|
60
|
+
**kwargs,
|
|
61
|
+
) -> Command:
|
|
62
|
+
"""Create a visualization from data.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
data_source: Data to visualize (can be a reference)
|
|
66
|
+
chart_type: Type of chart (bar or line)
|
|
67
|
+
title: Chart title
|
|
68
|
+
**kwargs: Additional arguments including tool output context
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
Command with visualization artifact and metadata
|
|
72
|
+
"""
|
|
73
|
+
try:
|
|
74
|
+
# Extract chartable data
|
|
75
|
+
chart_data = self._extract_chart_data(data_source)
|
|
76
|
+
if not chart_data:
|
|
77
|
+
return Command(
|
|
78
|
+
update={
|
|
79
|
+
"result": f"❌ Cannot create {chart_type} chart: No valid data found",
|
|
80
|
+
"metadata": {"error": "No valid data found"},
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Generate the image
|
|
85
|
+
image_bytes = self._create_chart_image(chart_data, chart_type, title)
|
|
86
|
+
|
|
87
|
+
# Create artifact with proper encoding
|
|
88
|
+
return create_artifact_command(
|
|
89
|
+
result=f"✅ Created {chart_type} chart '{title}' with {len(chart_data['values'])} data points",
|
|
90
|
+
artifact_data=image_bytes,
|
|
91
|
+
artifact_name=f"{title.lower().replace(' ', '_')}_{chart_type}.png",
|
|
92
|
+
artifact_description=f"{chart_type.capitalize()} chart: {title}",
|
|
93
|
+
mime_type=MimeType.IMAGE_PNG,
|
|
94
|
+
metadata_update={
|
|
95
|
+
"visualization": {
|
|
96
|
+
"success": True,
|
|
97
|
+
"chart_type": chart_type,
|
|
98
|
+
"title": title,
|
|
99
|
+
"data_points": len(chart_data["values"]),
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
except Exception as e:
|
|
105
|
+
return Command(
|
|
106
|
+
update={"result": f"❌ Error creating visualization: {str(e)}", "metadata": {"error": str(e)}}
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
async def _arun(
|
|
110
|
+
self,
|
|
111
|
+
data_source: Any,
|
|
112
|
+
chart_type: str = "bar",
|
|
113
|
+
title: str = "Chart",
|
|
114
|
+
**kwargs,
|
|
115
|
+
) -> Command:
|
|
116
|
+
"""Async version of _run.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
data_source (Any): Data to visualize (can be a reference).
|
|
120
|
+
chart_type (str, optional): Type of chart (bar or line). Defaults to "bar".
|
|
121
|
+
title (str, optional): Chart title. Defaults to "Chart".
|
|
122
|
+
**kwargs: Additional arguments including tool output context.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Command: Command with visualization artifact and metadata.
|
|
126
|
+
"""
|
|
127
|
+
return self._run(data_source, chart_type, title, **kwargs)
|
|
128
|
+
|
|
129
|
+
def _extract_chart_data(self, data_source: Any) -> dict[str, Any]:
|
|
130
|
+
"""Extract chartable data from various formats.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
data_source (Any): Data source to extract chartable data from.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
dict[str, Any]: Dictionary containing labels and values for charting.
|
|
137
|
+
"""
|
|
138
|
+
if isinstance(data_source, dict):
|
|
139
|
+
# Handle dict with values
|
|
140
|
+
if "values" in data_source:
|
|
141
|
+
return {
|
|
142
|
+
"values": data_source["values"][:10], # Limit to 10 points
|
|
143
|
+
"labels": data_source.get("labels", [f"Point {i + 1}" for i in range(len(data_source["values"]))]),
|
|
144
|
+
}
|
|
145
|
+
# Handle dict with numbers
|
|
146
|
+
numeric_items = [(str(k), float(v)) for k, v in data_source.items() if isinstance(v, int | float)][:10]
|
|
147
|
+
if numeric_items:
|
|
148
|
+
return {
|
|
149
|
+
"labels": [k for k, v in numeric_items],
|
|
150
|
+
"values": [v for k, v in numeric_items],
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
elif isinstance(data_source, list | tuple):
|
|
154
|
+
# Handle numeric lists
|
|
155
|
+
if all(isinstance(x, int | float) for x in data_source):
|
|
156
|
+
return {
|
|
157
|
+
"values": data_source[:10],
|
|
158
|
+
"labels": [f"Point {i + 1}" for i in range(len(data_source[:10]))],
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
# Fallback for strings - character frequency
|
|
162
|
+
elif isinstance(data_source, str):
|
|
163
|
+
char_counts = {}
|
|
164
|
+
for c in data_source[:100]: # Limit input size
|
|
165
|
+
if c.isalnum():
|
|
166
|
+
char_counts[c] = char_counts.get(c, 0) + 1
|
|
167
|
+
if char_counts:
|
|
168
|
+
items = sorted(char_counts.items(), key=lambda x: x[1], reverse=True)[:10]
|
|
169
|
+
return {
|
|
170
|
+
"labels": [k for k, v in items],
|
|
171
|
+
"values": [v for k, v in items],
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return {}
|
|
175
|
+
|
|
176
|
+
def _create_chart_image(
|
|
177
|
+
self,
|
|
178
|
+
chart_data: dict[str, Any],
|
|
179
|
+
chart_type: str,
|
|
180
|
+
title: str,
|
|
181
|
+
) -> bytes:
|
|
182
|
+
"""Create a chart image using PIL.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
chart_data (dict[str, Any]): Data to visualize containing labels and values.
|
|
186
|
+
chart_type (str): Type of chart to create.
|
|
187
|
+
title (str): Title for the chart.
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
bytes: Image data as PNG bytes.
|
|
191
|
+
"""
|
|
192
|
+
if not PIL_AVAILABLE:
|
|
193
|
+
# Fallback to text representation
|
|
194
|
+
return self._create_text_chart(chart_data, chart_type, title)
|
|
195
|
+
|
|
196
|
+
# Canvas setup
|
|
197
|
+
width, height = 400, 300
|
|
198
|
+
image = Image.new("RGB", (width, height), "white")
|
|
199
|
+
draw = ImageDraw.Draw(image)
|
|
200
|
+
|
|
201
|
+
# Draw title
|
|
202
|
+
draw.text((10, 10), title[:40], fill="black")
|
|
203
|
+
|
|
204
|
+
# Chart area
|
|
205
|
+
chart_x, chart_y = 40, 40
|
|
206
|
+
chart_width = width - 60
|
|
207
|
+
chart_height = height - 80
|
|
208
|
+
|
|
209
|
+
values = chart_data.get("values", [])
|
|
210
|
+
labels = chart_data.get("labels", [])
|
|
211
|
+
|
|
212
|
+
if not values:
|
|
213
|
+
draw.text((chart_x, chart_y + 50), "No data to visualize", fill="red")
|
|
214
|
+
buf = io.BytesIO()
|
|
215
|
+
image.save(buf, format="PNG")
|
|
216
|
+
return buf.getvalue()
|
|
217
|
+
|
|
218
|
+
# Normalize values
|
|
219
|
+
max_val = max(values)
|
|
220
|
+
min_val = min(values)
|
|
221
|
+
val_range = max_val - min_val if max_val != min_val else 1
|
|
222
|
+
|
|
223
|
+
if chart_type == "bar":
|
|
224
|
+
# Bar chart
|
|
225
|
+
bar_width = chart_width // len(values)
|
|
226
|
+
for i, (label, value) in enumerate(zip(labels, values, strict=False)):
|
|
227
|
+
x = chart_x + i * bar_width
|
|
228
|
+
normalized_height = ((value - min_val) / val_range) * chart_height
|
|
229
|
+
y = chart_y + chart_height - normalized_height
|
|
230
|
+
|
|
231
|
+
# Draw bar
|
|
232
|
+
draw.rectangle(
|
|
233
|
+
[x + 2, y, x + bar_width - 2, chart_y + chart_height],
|
|
234
|
+
fill="#4C78A8",
|
|
235
|
+
outline="black",
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# Draw label
|
|
239
|
+
label_text = str(label)[:8]
|
|
240
|
+
draw.text(
|
|
241
|
+
(x + 2, chart_y + chart_height + 5),
|
|
242
|
+
label_text,
|
|
243
|
+
fill="black",
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
else: # line chart
|
|
247
|
+
# Calculate points
|
|
248
|
+
points = []
|
|
249
|
+
step = chart_width / (len(values) - 1) if len(values) > 1 else chart_width
|
|
250
|
+
for i, value in enumerate(values):
|
|
251
|
+
x = chart_x + i * step
|
|
252
|
+
normalized_height = ((value - min_val) / val_range) * chart_height
|
|
253
|
+
y = chart_y + chart_height - normalized_height
|
|
254
|
+
points.append((x, y))
|
|
255
|
+
|
|
256
|
+
# Draw lines
|
|
257
|
+
MIN_POINTS_FOR_LINE = 2
|
|
258
|
+
if len(points) >= MIN_POINTS_FOR_LINE:
|
|
259
|
+
draw.line(points, fill="#F58518", width=2)
|
|
260
|
+
|
|
261
|
+
# Draw points
|
|
262
|
+
for x, y in points:
|
|
263
|
+
draw.ellipse(
|
|
264
|
+
[x - 3, y - 3, x + 3, y + 3],
|
|
265
|
+
fill="#F58518",
|
|
266
|
+
outline="black",
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
# Draw value
|
|
270
|
+
draw.text((x - 10, y - 15), str(round(values[points.index((x, y))], 1)), fill="black")
|
|
271
|
+
|
|
272
|
+
# Save to bytes
|
|
273
|
+
buf = io.BytesIO()
|
|
274
|
+
image.save(buf, format="PNG")
|
|
275
|
+
return buf.getvalue()
|
|
276
|
+
|
|
277
|
+
def _create_text_chart(
|
|
278
|
+
self,
|
|
279
|
+
chart_data: dict[str, Any],
|
|
280
|
+
chart_type: str,
|
|
281
|
+
title: str,
|
|
282
|
+
) -> bytes:
|
|
283
|
+
"""Fallback text-based chart when PIL is not available.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
chart_data (dict[str, Any]): Data to visualize containing labels and values.
|
|
287
|
+
chart_type (str): Type of chart to create.
|
|
288
|
+
title (str): Title for the chart.
|
|
289
|
+
|
|
290
|
+
Returns:
|
|
291
|
+
bytes: Text chart data encoded as UTF-8 bytes.
|
|
292
|
+
"""
|
|
293
|
+
values = chart_data.get("values", [])
|
|
294
|
+
labels = chart_data.get("labels", [])
|
|
295
|
+
|
|
296
|
+
lines = [
|
|
297
|
+
f"=== {title} ===",
|
|
298
|
+
f"Chart Type: {chart_type}",
|
|
299
|
+
f"Data Points: {len(values)}",
|
|
300
|
+
"",
|
|
301
|
+
]
|
|
302
|
+
|
|
303
|
+
if values:
|
|
304
|
+
max_val = max(values)
|
|
305
|
+
for label, value in zip(labels, values, strict=False):
|
|
306
|
+
bar_length = int((value / max_val) * 20) if max_val > 0 else 0
|
|
307
|
+
bar = "█" * bar_length
|
|
308
|
+
lines.append(f"{label[:10]:10} |{bar:20}| {value}")
|
|
309
|
+
else:
|
|
310
|
+
lines.append("No data to display")
|
|
311
|
+
|
|
312
|
+
return "\n".join(lines).encode("utf-8")
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from aip_agents.a2a.types import MimeType as MimeType
|
|
2
|
+
from aip_agents.utils.artifact_helpers import create_artifact_command as create_artifact_command
|
|
3
|
+
from langchain_core.tools import BaseTool
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
PIL_AVAILABLE: bool
|
|
8
|
+
|
|
9
|
+
class ChartInput(BaseModel):
|
|
10
|
+
"""Input schema for chart generation."""
|
|
11
|
+
data_source: Any
|
|
12
|
+
chart_type: str
|
|
13
|
+
title: str
|
|
14
|
+
|
|
15
|
+
class DataVisualizerTool(BaseTool):
|
|
16
|
+
"""Tool that creates visualizations with automatic output storage."""
|
|
17
|
+
name: str
|
|
18
|
+
description: str
|
|
19
|
+
args_schema: type[BaseModel]
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""Image artifact tool for demonstrating artifact generation.
|
|
2
|
+
|
|
3
|
+
This tool generates simple images and returns them as artifacts to demonstrate
|
|
4
|
+
the standardized artifact format for binary data.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import io
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from langchain_core.tools import BaseTool
|
|
14
|
+
from pydantic import BaseModel, Field
|
|
15
|
+
|
|
16
|
+
from aip_agents.a2a.types import MimeType
|
|
17
|
+
from aip_agents.utils.artifact_helpers import create_artifact_response, create_error_response
|
|
18
|
+
|
|
19
|
+
# Optional PIL import for image generation
|
|
20
|
+
try:
|
|
21
|
+
from PIL import Image, ImageDraw, ImageFont # type: ignore
|
|
22
|
+
|
|
23
|
+
PIL_AVAILABLE = True
|
|
24
|
+
except ImportError:
|
|
25
|
+
PIL_AVAILABLE = False
|
|
26
|
+
Image = None
|
|
27
|
+
ImageDraw = None
|
|
28
|
+
ImageFont = None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ImageArtifactInput(BaseModel):
|
|
32
|
+
"""Input schema for image artifact tool."""
|
|
33
|
+
|
|
34
|
+
width: int = Field(default=400, description="Width of the image in pixels", ge=100, le=1000)
|
|
35
|
+
height: int = Field(default=300, description="Height of the image in pixels", ge=100, le=1000)
|
|
36
|
+
color: str = Field(default="blue", description="Primary color for the image")
|
|
37
|
+
text: str = Field(default="Sample Image", description="Text to display on the image")
|
|
38
|
+
image_name: str = Field(default="generated_image", description="Name for the generated image")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class ImageArtifactTool(BaseTool):
|
|
42
|
+
"""Tool that generates simple images with artifact support.
|
|
43
|
+
|
|
44
|
+
This tool demonstrates the standardized artifact format for binary data by:
|
|
45
|
+
1. Generating a simple image using PIL
|
|
46
|
+
2. Providing a confirmation message for the agent
|
|
47
|
+
3. Creating an image file artifact for the user
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
name: str = "image_generator"
|
|
51
|
+
description: str = "Generate simple images with text and colors"
|
|
52
|
+
args_schema: type[BaseModel] = ImageArtifactInput
|
|
53
|
+
|
|
54
|
+
def _run(
|
|
55
|
+
self,
|
|
56
|
+
width: int = 400,
|
|
57
|
+
height: int = 300,
|
|
58
|
+
color: str = "blue",
|
|
59
|
+
text: str = "Sample Image",
|
|
60
|
+
image_name: str = "generated_image",
|
|
61
|
+
) -> dict[str, Any]:
|
|
62
|
+
"""Generate an image synchronously.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
width (int, optional): Width of the image in pixels. Defaults to 400.
|
|
66
|
+
height (int, optional): Height of the image in pixels. Defaults to 300.
|
|
67
|
+
color (str, optional): Primary color for the image. Defaults to "blue".
|
|
68
|
+
text (str, optional): Text to display on the image. Defaults to "Sample Image".
|
|
69
|
+
image_name (str, optional): Name for the generated image. Defaults to "generated_image".
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
dict[str, Any]: Response containing artifact data and metadata.
|
|
73
|
+
"""
|
|
74
|
+
if not PIL_AVAILABLE:
|
|
75
|
+
return create_error_response("PIL (Pillow) library is not installed. Cannot generate images.")
|
|
76
|
+
|
|
77
|
+
# Create image
|
|
78
|
+
image = Image.new("RGB", (width, height), color=color)
|
|
79
|
+
draw = ImageDraw.Draw(image)
|
|
80
|
+
|
|
81
|
+
# Try to use a default font, fall back to basic font if not available
|
|
82
|
+
try:
|
|
83
|
+
font = ImageFont.load_default()
|
|
84
|
+
except Exception:
|
|
85
|
+
font = None
|
|
86
|
+
|
|
87
|
+
# Calculate text position (center)
|
|
88
|
+
if font:
|
|
89
|
+
bbox = draw.textbbox((0, 0), text, font=font)
|
|
90
|
+
text_width = bbox[2] - bbox[0]
|
|
91
|
+
text_height = bbox[3] - bbox[1]
|
|
92
|
+
else:
|
|
93
|
+
# Rough estimation for basic font
|
|
94
|
+
text_width = len(text) * 6
|
|
95
|
+
text_height = 11
|
|
96
|
+
|
|
97
|
+
x = (width - text_width) // 2
|
|
98
|
+
y = (height - text_height) // 2
|
|
99
|
+
|
|
100
|
+
# Draw text
|
|
101
|
+
draw.text((x, y), text, fill="white", font=font)
|
|
102
|
+
|
|
103
|
+
# Convert to bytes
|
|
104
|
+
img_buffer = io.BytesIO()
|
|
105
|
+
image.save(img_buffer, format="PNG")
|
|
106
|
+
img_bytes = img_buffer.getvalue()
|
|
107
|
+
|
|
108
|
+
return create_artifact_response(
|
|
109
|
+
result=f"I have generated a {width}x{height} {color} image with the text '{text}'.",
|
|
110
|
+
artifact_data=img_bytes,
|
|
111
|
+
artifact_name=f"{image_name}.png",
|
|
112
|
+
artifact_description=f"Generated {width}x{height} {color} image with text: {text}",
|
|
113
|
+
mime_type=MimeType.IMAGE_PNG,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
async def _arun(
|
|
117
|
+
self,
|
|
118
|
+
width: int = 400,
|
|
119
|
+
height: int = 300,
|
|
120
|
+
color: str = "blue",
|
|
121
|
+
text: str = "Sample Image",
|
|
122
|
+
image_name: str = "generated_image",
|
|
123
|
+
) -> dict[str, Any]:
|
|
124
|
+
"""Generate an image asynchronously.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
width (int, optional): Width of the image in pixels. Defaults to 400.
|
|
128
|
+
height (int, optional): Height of the image in pixels. Defaults to 300.
|
|
129
|
+
color (str, optional): Primary color for the image. Defaults to "blue".
|
|
130
|
+
text (str, optional): Text to display on the image. Defaults to "Sample Image".
|
|
131
|
+
image_name (str, optional): Name for the generated image. Defaults to "generated_image".
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
dict[str, Any]: Response containing artifact data and metadata.
|
|
135
|
+
"""
|
|
136
|
+
return self._run(width, height, color, text, image_name)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from aip_agents.a2a.types import MimeType as MimeType
|
|
2
|
+
from aip_agents.utils.artifact_helpers import create_artifact_response as create_artifact_response, create_error_response as create_error_response
|
|
3
|
+
from langchain_core.tools import BaseTool
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
|
|
6
|
+
PIL_AVAILABLE: bool
|
|
7
|
+
|
|
8
|
+
class ImageArtifactInput(BaseModel):
|
|
9
|
+
"""Input schema for image artifact tool."""
|
|
10
|
+
width: int
|
|
11
|
+
height: int
|
|
12
|
+
color: str
|
|
13
|
+
text: str
|
|
14
|
+
image_name: str
|
|
15
|
+
|
|
16
|
+
class ImageArtifactTool(BaseTool):
|
|
17
|
+
"""Tool that generates simple images with artifact support.
|
|
18
|
+
|
|
19
|
+
This tool demonstrates the standardized artifact format for binary data by:
|
|
20
|
+
1. Generating a simple image using PIL
|
|
21
|
+
2. Providing a confirmation message for the agent
|
|
22
|
+
3. Creating an image file artifact for the user
|
|
23
|
+
"""
|
|
24
|
+
name: str
|
|
25
|
+
description: str
|
|
26
|
+
args_schema: type[BaseModel]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""LangChain-specific arithmetic tools for GLLM agent examples."""
|
|
2
|
+
|
|
3
|
+
from langchain_core.tools import tool
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# Decorate the plain function to create a LangChain Tool
|
|
7
|
+
@tool
|
|
8
|
+
def add_numbers(a: int, b: int) -> str:
|
|
9
|
+
"""Adds two numbers and returns the result as a string.
|
|
10
|
+
|
|
11
|
+
This is a self-contained LangChain tool.
|
|
12
|
+
For example:
|
|
13
|
+
add_numbers(a=5, b=3)
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
a (int): First number to add.
|
|
17
|
+
b (int): Second number to add.
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
str: Sum of the two numbers as a string.
|
|
21
|
+
"""
|
|
22
|
+
try:
|
|
23
|
+
result = a + b
|
|
24
|
+
return str(result)
|
|
25
|
+
except Exception as e:
|
|
26
|
+
return f"Error: Could not add numbers. Reason: {str(e)}"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from langchain_core.tools import tool
|
|
2
|
+
|
|
3
|
+
@tool
|
|
4
|
+
def add_numbers(a: int, b: int) -> str:
|
|
5
|
+
"""Adds two numbers and returns the result as a string.
|
|
6
|
+
|
|
7
|
+
This is a self-contained LangChain tool.
|
|
8
|
+
For example:
|
|
9
|
+
add_numbers(a=5, b=3)
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
a (int): First number to add.
|
|
13
|
+
b (int): Second number to add.
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
str: Sum of the two numbers as a string.
|
|
17
|
+
"""
|