aip-agents-binary 0.5.25b1__py3-none-macosx_13_0_arm64.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 +2948 -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 +2596 -0
- aip_agents/agent/langgraph_react_agent.pyi +131 -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_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_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/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__.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 +362 -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 +228 -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 +96 -0
- aip_agents/middleware/base.pyi +75 -0
- aip_agents/middleware/manager.py +150 -0
- aip_agents/middleware/manager.pyi +84 -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 +53 -0
- aip_agents/tools/__init__.pyi +9 -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 +306 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -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 +177 -0
- aip_agents/tools/constants.pyi +138 -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 +383 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.py +119 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -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.25b1.dist-info/METADATA +681 -0
- aip_agents_binary-0.5.25b1.dist-info/RECORD +566 -0
- aip_agents_binary-0.5.25b1.dist-info/WHEEL +5 -0
- aip_agents_binary-0.5.25b1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"""Tool to read and extract content from Excel files using gllm_docproc.
|
|
2
|
+
|
|
3
|
+
This tool uses the gllm_docproc loader pipeline to extract content from Excel files,
|
|
4
|
+
providing a consistent interface with other document reader tools (PDF, DOCX).
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Douglas Raevan Faisal (douglas.raevan.faisal@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import zipfile
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
from gllm_docproc.loader.xlsx import OpenpyxlLoader
|
|
15
|
+
except ImportError as exc:
|
|
16
|
+
OpenpyxlLoader = None # type: ignore[assignment]
|
|
17
|
+
_DOCPROC_IMPORT_ERROR: Exception | None = exc
|
|
18
|
+
else:
|
|
19
|
+
_DOCPROC_IMPORT_ERROR = None
|
|
20
|
+
|
|
21
|
+
from aip_agents.tools.document_loader.base_reader import DOCPROC_MISSING_MESSAGE, BaseDocumentReaderTool
|
|
22
|
+
from aip_agents.utils.logger import get_logger
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ExcelReaderTool(BaseDocumentReaderTool):
|
|
28
|
+
"""Tool to read and extract content from Excel files.
|
|
29
|
+
|
|
30
|
+
This tool reads Excel files (.xlsx, .xlsm) and extracts their content using
|
|
31
|
+
the gllm_docproc loader pipeline. The content is formatted as Markdown tables
|
|
32
|
+
for easy readability.
|
|
33
|
+
|
|
34
|
+
Features:
|
|
35
|
+
- Supports .xlsx and .xlsm formats
|
|
36
|
+
- Extracts all sheets or specific sheets
|
|
37
|
+
- Formats output as Markdown tables
|
|
38
|
+
- Configurable row limits and file size limits
|
|
39
|
+
|
|
40
|
+
Examples:
|
|
41
|
+
>>> tool = ExcelReaderTool()
|
|
42
|
+
>>> result = tool._run("/tmp/data.xlsx")
|
|
43
|
+
>>> print(result)
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
name: str = "excel_reader_tool"
|
|
47
|
+
description: str = (
|
|
48
|
+
"Read an Excel file and extract its content as Markdown tables. "
|
|
49
|
+
"Input should be the path to the Excel file (.xlsx or .xlsm format). "
|
|
50
|
+
"Each sheet will be formatted as a Markdown table with the sheet name as a header."
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def _setup_loader(self) -> None:
|
|
54
|
+
"""Set up the XLSX loader for the pipeline.
|
|
55
|
+
|
|
56
|
+
This method initializes the OpenpyxlLoader which handles extraction
|
|
57
|
+
of content from Excel files and formatting as Markdown tables.
|
|
58
|
+
"""
|
|
59
|
+
if OpenpyxlLoader is None:
|
|
60
|
+
logger.warning(DOCPROC_MISSING_MESSAGE)
|
|
61
|
+
if _DOCPROC_IMPORT_ERROR is not None:
|
|
62
|
+
logger.debug("gllm_docproc import failed: %s", _DOCPROC_IMPORT_ERROR)
|
|
63
|
+
return
|
|
64
|
+
self.loader.add_loader(OpenpyxlLoader())
|
|
65
|
+
|
|
66
|
+
def _run_with_batching(self, file_path: str, batch_size: int) -> str:
|
|
67
|
+
"""Run without batching until Excel splitting is implemented.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
file_path: Path to the Excel file to be processed
|
|
71
|
+
batch_size: Number of sheets to include in each batch (not used currently)
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
Extracted text content from the document
|
|
75
|
+
"""
|
|
76
|
+
# TODO: implement Excel batching with real splits before enabling batching flow.
|
|
77
|
+
return self._run_standard(file_path)
|
|
78
|
+
|
|
79
|
+
def _split_file(self, file_path: str, batch_size: int) -> list[str]:
|
|
80
|
+
"""Split Excel file for batch processing.
|
|
81
|
+
|
|
82
|
+
Note: This is a placeholder implementation. Excel batching by sheets
|
|
83
|
+
could be implemented in the future, but for now we process the entire
|
|
84
|
+
file at once as Excel files are typically smaller than PDFs.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
file_path: Path to the Excel file to be split
|
|
88
|
+
batch_size: Number of sheets to include in each split file (not used currently)
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
List containing the original file path (no splitting performed)
|
|
92
|
+
"""
|
|
93
|
+
# Placeholder implementation - Excel batching not implemented
|
|
94
|
+
# Excel files are typically smaller and batching by sheets would require
|
|
95
|
+
# more complex logic to split workbooks
|
|
96
|
+
logger.info(f"Excel batching not implemented, processing entire file: {file_path}")
|
|
97
|
+
return [file_path]
|
|
98
|
+
|
|
99
|
+
def _validate_excel_file(self, file_path: str) -> str | None:
|
|
100
|
+
"""Validate Excel file and check for potential issues.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
file_path: Path to the Excel file
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
Error message if validation fails, None if successful
|
|
107
|
+
"""
|
|
108
|
+
path = Path(file_path)
|
|
109
|
+
|
|
110
|
+
# Check file extension
|
|
111
|
+
if path.suffix.lower() not in [".xlsx", ".xlsm"]:
|
|
112
|
+
return f"Invalid file extension: {path.suffix}. Only .xlsx and .xlsm files are supported."
|
|
113
|
+
|
|
114
|
+
# Check for macro-enabled files and warn
|
|
115
|
+
if path.suffix.lower() == ".xlsm":
|
|
116
|
+
logger.warning(f"Macro-enabled file detected: {file_path}")
|
|
117
|
+
# Check if file actually contains macros
|
|
118
|
+
try:
|
|
119
|
+
with zipfile.ZipFile(file_path, "r") as zip_file:
|
|
120
|
+
if "xl/vbaProject.bin" in zip_file.namelist():
|
|
121
|
+
logger.warning(
|
|
122
|
+
f"VBA macros found in {file_path}. "
|
|
123
|
+
f"Macros will not be executed; only data will be extracted."
|
|
124
|
+
)
|
|
125
|
+
except Exception as e:
|
|
126
|
+
logger.debug(f"Could not check for macros: {e}")
|
|
127
|
+
|
|
128
|
+
return None
|
|
129
|
+
|
|
130
|
+
def _run_standard(self, file_path: str) -> str:
|
|
131
|
+
"""Override standard processing to add Excel-specific error handling.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
file_path: Path to the Excel file to be read
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
Extracted text content from the document
|
|
138
|
+
"""
|
|
139
|
+
# Validate Excel file
|
|
140
|
+
validation_error = self._validate_excel_file(file_path)
|
|
141
|
+
if validation_error:
|
|
142
|
+
return f"Validation Error: {validation_error}"
|
|
143
|
+
|
|
144
|
+
try:
|
|
145
|
+
return self._process_single_file(file_path)
|
|
146
|
+
|
|
147
|
+
except PermissionError:
|
|
148
|
+
return f"Error: Permission denied accessing file: {file_path}"
|
|
149
|
+
|
|
150
|
+
except zipfile.BadZipFile:
|
|
151
|
+
return (
|
|
152
|
+
"Error: File appears to be corrupted or is not a valid Excel format. "
|
|
153
|
+
"Please check the file and try again."
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
except Exception as e:
|
|
157
|
+
error_msg = str(e).lower()
|
|
158
|
+
|
|
159
|
+
# Check for specific Excel errors
|
|
160
|
+
if "password" in error_msg or "encrypted" in error_msg:
|
|
161
|
+
return "Error: File is password-protected or encrypted. Please provide an unprotected file."
|
|
162
|
+
|
|
163
|
+
elif "invalid" in error_msg or "corrupt" in error_msg:
|
|
164
|
+
return "Error: File appears to be corrupted or invalid Excel format. Please verify the file integrity."
|
|
165
|
+
|
|
166
|
+
elif "not supported" in error_msg or "unsupported" in error_msg:
|
|
167
|
+
return f"Error: File contains unsupported features: {str(e)}"
|
|
168
|
+
|
|
169
|
+
else:
|
|
170
|
+
logger.exception(f"Unexpected error processing Excel file: {file_path}")
|
|
171
|
+
return f"Error processing Excel file: {str(e)}"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.tools.document_loader.base_reader import BaseDocumentReaderTool as BaseDocumentReaderTool, DOCPROC_MISSING_MESSAGE as DOCPROC_MISSING_MESSAGE
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
|
|
5
|
+
logger: Incomplete
|
|
6
|
+
|
|
7
|
+
class ExcelReaderTool(BaseDocumentReaderTool):
|
|
8
|
+
'''Tool to read and extract content from Excel files.
|
|
9
|
+
|
|
10
|
+
This tool reads Excel files (.xlsx, .xlsm) and extracts their content using
|
|
11
|
+
the gllm_docproc loader pipeline. The content is formatted as Markdown tables
|
|
12
|
+
for easy readability.
|
|
13
|
+
|
|
14
|
+
Features:
|
|
15
|
+
- Supports .xlsx and .xlsm formats
|
|
16
|
+
- Extracts all sheets or specific sheets
|
|
17
|
+
- Formats output as Markdown tables
|
|
18
|
+
- Configurable row limits and file size limits
|
|
19
|
+
|
|
20
|
+
Examples:
|
|
21
|
+
>>> tool = ExcelReaderTool()
|
|
22
|
+
>>> result = tool._run("/tmp/data.xlsx")
|
|
23
|
+
>>> print(result)
|
|
24
|
+
'''
|
|
25
|
+
name: str
|
|
26
|
+
description: str
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""Tool to read and extract text from PDF files.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
5
|
+
|
|
6
|
+
References:
|
|
7
|
+
https://github.com/GDP-ADMIN/gdplabs-exploration/blob/ai-agent-app/backend/aip_agents/tools/
|
|
8
|
+
reader/pdf_reader_tool.py
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
from gllm_docproc.loader.pdf import PDFPlumberLoader, PyMuPDFLoader
|
|
13
|
+
except ImportError as exc:
|
|
14
|
+
PDFPlumberLoader = None # type: ignore[assignment]
|
|
15
|
+
PyMuPDFLoader = None # type: ignore[assignment]
|
|
16
|
+
_DOCPROC_IMPORT_ERROR: Exception | None = exc
|
|
17
|
+
else:
|
|
18
|
+
_DOCPROC_IMPORT_ERROR = None
|
|
19
|
+
|
|
20
|
+
from aip_agents.tools.document_loader.base_reader import DOCPROC_MISSING_MESSAGE, BaseDocumentReaderTool
|
|
21
|
+
from aip_agents.tools.document_loader.pdf_splitter import PDFSplitter
|
|
22
|
+
from aip_agents.utils.logger import get_logger
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class PDFReaderTool(BaseDocumentReaderTool):
|
|
28
|
+
"""Tool to read and extract text from PDF files."""
|
|
29
|
+
|
|
30
|
+
name: str = "pdf_reader_tool"
|
|
31
|
+
description: str = "Read a PDF file and extract its text content. Input should be the path to the PDF file."
|
|
32
|
+
|
|
33
|
+
def _setup_loader(self):
|
|
34
|
+
if PDFPlumberLoader is None or PyMuPDFLoader is None:
|
|
35
|
+
logger.warning(DOCPROC_MISSING_MESSAGE)
|
|
36
|
+
if _DOCPROC_IMPORT_ERROR is not None:
|
|
37
|
+
logger.debug("gllm_docproc import failed: %s", _DOCPROC_IMPORT_ERROR)
|
|
38
|
+
return
|
|
39
|
+
self.loader.add_loader(PyMuPDFLoader())
|
|
40
|
+
self.loader.add_loader(PDFPlumberLoader())
|
|
41
|
+
|
|
42
|
+
def _split_file(self, file_path: str, batch_size: int) -> list[str]:
|
|
43
|
+
"""Split PDF file into temporary files for batch processing.
|
|
44
|
+
|
|
45
|
+
This method uses PDFSplitter.split_by_pages to split the PDF into
|
|
46
|
+
temporary files containing the specified number of pages per batch.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
file_path: Path to the PDF file to be split
|
|
50
|
+
batch_size: Number of pages to include in each split file (1-10)
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
List of temporary file paths containing the split content
|
|
54
|
+
|
|
55
|
+
Raises:
|
|
56
|
+
FileNotFoundError: If the input PDF file doesn't exist
|
|
57
|
+
ValueError: If batch_size is invalid or PDF processing fails
|
|
58
|
+
RuntimeError: For other unexpected errors during PDF splitting
|
|
59
|
+
"""
|
|
60
|
+
logger.info(f"Splitting PDF file '{file_path}' with batch_size={batch_size}")
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
# Use PDFSplitter utility to split the PDF by pages
|
|
64
|
+
temp_files = PDFSplitter.split_by_pages(file_path, batch_size)
|
|
65
|
+
|
|
66
|
+
logger.info(f"Successfully split PDF into {len(temp_files)} batch files")
|
|
67
|
+
logger.debug(f"Created temporary files: {temp_files}")
|
|
68
|
+
|
|
69
|
+
return temp_files
|
|
70
|
+
|
|
71
|
+
except FileNotFoundError:
|
|
72
|
+
logger.error(f"PDF file not found: {file_path}")
|
|
73
|
+
raise
|
|
74
|
+
except ValueError as e:
|
|
75
|
+
logger.error(f"Invalid parameters or corrupted PDF: {str(e)}")
|
|
76
|
+
raise
|
|
77
|
+
except Exception as e:
|
|
78
|
+
logger.error(f"Unexpected error splitting PDF '{file_path}': {str(e)}")
|
|
79
|
+
raise RuntimeError(f"Failed to split PDF file: {str(e)}") from e
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.tools.document_loader.base_reader import BaseDocumentReaderTool as BaseDocumentReaderTool, DOCPROC_MISSING_MESSAGE as DOCPROC_MISSING_MESSAGE
|
|
3
|
+
from aip_agents.tools.document_loader.pdf_splitter import PDFSplitter as PDFSplitter
|
|
4
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
5
|
+
|
|
6
|
+
logger: Incomplete
|
|
7
|
+
|
|
8
|
+
class PDFReaderTool(BaseDocumentReaderTool):
|
|
9
|
+
"""Tool to read and extract text from PDF files."""
|
|
10
|
+
name: str
|
|
11
|
+
description: str
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"""PDF splitting utility for batching optimization.
|
|
2
|
+
|
|
3
|
+
Authors
|
|
4
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import tempfile
|
|
9
|
+
|
|
10
|
+
from PyPDF2 import PdfReader, PdfWriter
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PDFSplitter:
|
|
14
|
+
"""Utility class for splitting PDF files into page-based temporary files."""
|
|
15
|
+
|
|
16
|
+
@staticmethod
|
|
17
|
+
def split_by_pages(file_path: str, batch_size: int) -> list[str]:
|
|
18
|
+
"""Split PDF into temporary files containing batch_size pages each.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
file_path: Path to the PDF file to split
|
|
22
|
+
batch_size: Number of pages to include in each batch (1-10)
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
List of temporary file paths containing the split PDF batches
|
|
26
|
+
|
|
27
|
+
Raises:
|
|
28
|
+
FileNotFoundError: If the input PDF file doesn't exist
|
|
29
|
+
ValueError: If batch_size is invalid or PDF is corrupted
|
|
30
|
+
Exception: For other PDF processing errors
|
|
31
|
+
"""
|
|
32
|
+
PDFSplitter._validate_inputs(file_path, batch_size)
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
reader = PdfReader(file_path)
|
|
36
|
+
PDFSplitter._validate_pdf_content(reader, file_path)
|
|
37
|
+
|
|
38
|
+
temp_files = []
|
|
39
|
+
|
|
40
|
+
# Split PDF into batches
|
|
41
|
+
for i in range(0, len(reader.pages), batch_size):
|
|
42
|
+
batch_number = i // batch_size + 1
|
|
43
|
+
temp_path = PDFSplitter._create_batch_file(reader, i, batch_size, batch_number, temp_files)
|
|
44
|
+
temp_files.append(temp_path)
|
|
45
|
+
|
|
46
|
+
return temp_files
|
|
47
|
+
|
|
48
|
+
except Exception as e:
|
|
49
|
+
# Handle corrupted or invalid PDF files
|
|
50
|
+
if "temp_files" in locals():
|
|
51
|
+
PDFSplitter._cleanup_temp_files(temp_files)
|
|
52
|
+
|
|
53
|
+
if isinstance(e, FileNotFoundError | ValueError):
|
|
54
|
+
raise
|
|
55
|
+
else:
|
|
56
|
+
raise ValueError(f"Error processing PDF file {file_path}: {str(e)}") from e
|
|
57
|
+
|
|
58
|
+
@staticmethod
|
|
59
|
+
def _validate_inputs(file_path: str, batch_size: int) -> None:
|
|
60
|
+
"""Validate input parameters.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
file_path: Path to the PDF file to validate
|
|
64
|
+
batch_size: Batch size to validate
|
|
65
|
+
|
|
66
|
+
Raises:
|
|
67
|
+
FileNotFoundError: If the input PDF file doesn't exist
|
|
68
|
+
ValueError: If batch_size is invalid
|
|
69
|
+
"""
|
|
70
|
+
if not os.path.exists(file_path):
|
|
71
|
+
raise FileNotFoundError(f"PDF file not found: {file_path}")
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
def _validate_pdf_content(reader: PdfReader, file_path: str) -> None:
|
|
75
|
+
"""Validate PDF content has pages.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
reader: PdfReader instance to validate
|
|
79
|
+
file_path: Path to the PDF file for error messages
|
|
80
|
+
|
|
81
|
+
Raises:
|
|
82
|
+
ValueError: If PDF has no pages
|
|
83
|
+
"""
|
|
84
|
+
if len(reader.pages) == 0:
|
|
85
|
+
raise ValueError(f"PDF file has no pages: {file_path}")
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def _create_batch_file(
|
|
89
|
+
reader: PdfReader,
|
|
90
|
+
start_page: int,
|
|
91
|
+
batch_size: int,
|
|
92
|
+
batch_number: int,
|
|
93
|
+
temp_files: list[str],
|
|
94
|
+
) -> str:
|
|
95
|
+
"""Create a temporary file containing a batch of PDF pages.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
reader: PdfReader instance containing the source pages
|
|
99
|
+
start_page: Starting page index for this batch
|
|
100
|
+
batch_size: Number of pages to include in the batch
|
|
101
|
+
batch_number: Batch number for file naming
|
|
102
|
+
temp_files: List of existing temp files for cleanup on error
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Path to the created temporary file
|
|
106
|
+
|
|
107
|
+
Raises:
|
|
108
|
+
ValueError: If page processing or file writing fails
|
|
109
|
+
"""
|
|
110
|
+
writer = PdfWriter()
|
|
111
|
+
|
|
112
|
+
# Add pages to this batch
|
|
113
|
+
batch_end = min(start_page + batch_size, len(reader.pages))
|
|
114
|
+
for j in range(start_page, batch_end):
|
|
115
|
+
try:
|
|
116
|
+
writer.add_page(reader.pages[j])
|
|
117
|
+
except Exception as e:
|
|
118
|
+
# Clean up any created temp files before re-raising
|
|
119
|
+
PDFSplitter._cleanup_temp_files(temp_files)
|
|
120
|
+
raise ValueError(f"Error processing page {j + 1}: {str(e)}") from e
|
|
121
|
+
|
|
122
|
+
# Create and write temporary file
|
|
123
|
+
return PDFSplitter._write_batch_to_temp_file(writer, batch_number, temp_files)
|
|
124
|
+
|
|
125
|
+
@staticmethod
|
|
126
|
+
def _write_batch_to_temp_file(writer: PdfWriter, batch_number: int, temp_files: list[str]) -> str:
|
|
127
|
+
"""Write a PDF batch to a temporary file.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
writer: PdfWriter instance containing the batch pages
|
|
131
|
+
batch_number: Batch number for file naming
|
|
132
|
+
temp_files: List of existing temp files for cleanup on error
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
Path to the created temporary file
|
|
136
|
+
|
|
137
|
+
Raises:
|
|
138
|
+
ValueError: If file writing fails
|
|
139
|
+
"""
|
|
140
|
+
# Create temporary file with proper naming
|
|
141
|
+
temp_fd, temp_path = tempfile.mkstemp(suffix=f"_batch_{batch_number}.pdf", prefix="pdf_split_")
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
with os.fdopen(temp_fd, "wb") as temp_file:
|
|
145
|
+
writer.write(temp_file)
|
|
146
|
+
return temp_path
|
|
147
|
+
except Exception as e:
|
|
148
|
+
# Close the file descriptor if write fails
|
|
149
|
+
try:
|
|
150
|
+
os.close(temp_fd)
|
|
151
|
+
except OSError:
|
|
152
|
+
pass
|
|
153
|
+
# Clean up any created temp files
|
|
154
|
+
PDFSplitter._cleanup_temp_files(temp_files)
|
|
155
|
+
raise ValueError(f"Error writing batch {batch_number}: {str(e)}") from e
|
|
156
|
+
|
|
157
|
+
@staticmethod
|
|
158
|
+
def _cleanup_temp_files(temp_files: list[str]) -> None:
|
|
159
|
+
"""Clean up temporary files.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
temp_files: List of temporary file paths to clean up
|
|
163
|
+
"""
|
|
164
|
+
for temp_file in temp_files:
|
|
165
|
+
try:
|
|
166
|
+
if os.path.exists(temp_file):
|
|
167
|
+
os.unlink(temp_file)
|
|
168
|
+
except OSError:
|
|
169
|
+
pass
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class PDFSplitter:
|
|
2
|
+
"""Utility class for splitting PDF files into page-based temporary files."""
|
|
3
|
+
@staticmethod
|
|
4
|
+
def split_by_pages(file_path: str, batch_size: int) -> list[str]:
|
|
5
|
+
"""Split PDF into temporary files containing batch_size pages each.
|
|
6
|
+
|
|
7
|
+
Args:
|
|
8
|
+
file_path: Path to the PDF file to split
|
|
9
|
+
batch_size: Number of pages to include in each batch (1-10)
|
|
10
|
+
|
|
11
|
+
Returns:
|
|
12
|
+
List of temporary file paths containing the split PDF batches
|
|
13
|
+
|
|
14
|
+
Raises:
|
|
15
|
+
FileNotFoundError: If the input PDF file doesn't exist
|
|
16
|
+
ValueError: If batch_size is invalid or PDF is corrupted
|
|
17
|
+
Exception: For other PDF processing errors
|
|
18
|
+
"""
|