aip-agents-binary 0.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aip_agents/__init__.py +66 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/base_executor.py +1125 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2ui/__init__.py +26 -0
- aip_agents/a2ui/catalog_provider.py +109 -0
- aip_agents/a2ui/examples/0.8/booking_form.json +1 -0
- aip_agents/a2ui/examples/0.8/confirmation.json +1 -0
- aip_agents/a2ui/examples/0.8/single_column_list.json +1 -0
- aip_agents/a2ui/examples/0.9/booking_form.json +1 -0
- aip_agents/a2ui/examples/0.9/confirmation.json +1 -0
- aip_agents/a2ui/examples/0.9/single_column_list.json +1 -0
- aip_agents/a2ui/middleware.py +754 -0
- aip_agents/a2ui/models.py +153 -0
- aip_agents/a2ui/public_url.py +138 -0
- aip_agents/a2ui/stream_filter.py +67 -0
- aip_agents/agent/__init__.py +72 -0
- aip_agents/agent/base_agent.py +1437 -0
- aip_agents/agent/base_langgraph_agent.py +4048 -0
- aip_agents/agent/google_adk_agent.py +932 -0
- aip_agents/agent/google_adk_constants.py +11 -0
- aip_agents/agent/graph_runtime.py +185 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langgraph_react_agent.py +3741 -0
- aip_agents/agent/model_invocation_adapter.py +346 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/tool_execution_engine.py +587 -0
- aip_agents/audio_interface/__init__.py +30 -0
- aip_agents/audio_interface/audio_agent_adapter.py +254 -0
- aip_agents/audio_interface/config.py +146 -0
- aip_agents/audio_interface/errors.py +15 -0
- aip_agents/audio_interface/livekit_audio_session.py +504 -0
- aip_agents/audio_interface/livekit_realtime_audio_session.py +142 -0
- aip_agents/audio_interface/session_factory.py +40 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/common/__init__.py +5 -0
- aip_agents/common/callable_introspection.py +17 -0
- aip_agents/constants.py +23 -0
- aip_agents/context/__init__.py +5 -0
- aip_agents/context/budget.py +237 -0
- aip_agents/context/compaction.py +339 -0
- aip_agents/context/metadata.py +169 -0
- aip_agents/context/offload.py +449 -0
- aip_agents/context/preparation.py +196 -0
- aip_agents/context/prompt.py +61 -0
- aip_agents/context/runtime.py +149 -0
- aip_agents/context/session_recall.py +69 -0
- aip_agents/context/state.py +48 -0
- aip_agents/context/utils.py +44 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/audio_livekit_session.py +116 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_server.py +141 -0
- aip_agents/examples/gl_connectors_smoke.py +148 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +104 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +77 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +80 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +91 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +83 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +131 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -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_server.py +250 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_filesystem.py +162 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_skills.py +62 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_tool_output_client.py +57 -0
- aip_agents/examples/hello_world_multi_agent_tool_output_server.py +131 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_ptc.py +49 -0
- aip_agents/examples/hello_world_ptc_custom_tools.py +83 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +100 -0
- aip_agents/examples/hello_world_tool_output_client.py +55 -0
- aip_agents/examples/hello_world_tool_output_server.py +113 -0
- aip_agents/examples/hitl_demo.py +724 -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_server.py +125 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +246 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +87 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/multiply_tool.py +43 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/integration/__init__.py +43 -0
- aip_agents/integration/agent.py +58 -0
- aip_agents/integration/guardrails.py +52 -0
- aip_agents/integration/hitl.py +71 -0
- aip_agents/integration/ptc.py +95 -0
- aip_agents/integration/skills.py +37 -0
- aip_agents/integration/storage.py +81 -0
- aip_agents/integration/version.py +103 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/client/__init__.py +60 -0
- aip_agents/mcp/client/base_mcp_client.py +377 -0
- aip_agents/mcp/client/connection_manager.py +231 -0
- aip_agents/mcp/client/errors.py +119 -0
- aip_agents/mcp/client/google_adk/__init__.py +45 -0
- aip_agents/mcp/client/google_adk/client.py +383 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/persistent_session.py +704 -0
- aip_agents/mcp/client/session_pool.py +358 -0
- aip_agents/mcp/client/transports.py +288 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/base_adapter.py +815 -0
- aip_agents/memory/adapters/mem0.py +286 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/middleware/__init__.py +65 -0
- aip_agents/middleware/backends/__init__.py +72 -0
- aip_agents/middleware/backends/in_memory.py +578 -0
- aip_agents/middleware/backends/local_disk.py +1203 -0
- aip_agents/middleware/backends/protocol.py +353 -0
- aip_agents/middleware/backends/sandbox.py +1431 -0
- aip_agents/middleware/backends/sandbox_files.py +113 -0
- aip_agents/middleware/backends/utils.py +293 -0
- aip_agents/middleware/base.py +239 -0
- aip_agents/middleware/filesystem.py +690 -0
- aip_agents/middleware/manager.py +291 -0
- aip_agents/middleware/memory.py +532 -0
- aip_agents/middleware/pii_middleware.py +192 -0
- aip_agents/middleware/schema.py +19 -0
- aip_agents/middleware/skills.py +872 -0
- aip_agents/middleware/task_delegation.py +1656 -0
- aip_agents/middleware/todolist.py +276 -0
- aip_agents/middleware/tools/__init__.py +23 -0
- aip_agents/middleware/tools/edit_file.py +70 -0
- aip_agents/middleware/tools/execute.py +428 -0
- aip_agents/middleware/tools/grep_file.py +79 -0
- aip_agents/middleware/tools/ls.py +71 -0
- aip_agents/middleware/tools/read_file.py +239 -0
- aip_agents/middleware/tools/skill_load.py +193 -0
- aip_agents/middleware/tools/skill_resource.py +338 -0
- aip_agents/middleware/tools/write_file.py +114 -0
- aip_agents/middleware/vision.py +322 -0
- aip_agents/ptc/__init__.py +87 -0
- aip_agents/ptc/custom_tools.py +511 -0
- aip_agents/ptc/custom_tools_payload.py +499 -0
- aip_agents/ptc/custom_tools_templates/__init__.py +1 -0
- aip_agents/ptc/custom_tools_templates/custom_build_function.py.template +24 -0
- aip_agents/ptc/custom_tools_templates/custom_init.py.template +26 -0
- aip_agents/ptc/custom_tools_templates/custom_invoke.py.template +149 -0
- aip_agents/ptc/custom_tools_templates/custom_registry.py.template +112 -0
- aip_agents/ptc/custom_tools_templates/custom_sources_init.py.template +7 -0
- aip_agents/ptc/custom_tools_templates/custom_wrapper.py.template +87 -0
- aip_agents/ptc/doc_gen.py +122 -0
- aip_agents/ptc/exceptions.py +57 -0
- aip_agents/ptc/executor.py +627 -0
- aip_agents/ptc/mcp/__init__.py +45 -0
- aip_agents/ptc/mcp/sandbox_bridge.py +679 -0
- aip_agents/ptc/mcp/templates/__init__.py +1 -0
- aip_agents/ptc/mcp/templates/mcp_client.py.template +240 -0
- aip_agents/ptc/naming.py +430 -0
- aip_agents/ptc/payload.py +26 -0
- aip_agents/ptc/prompt_builder.py +674 -0
- aip_agents/ptc/ptc_helper.py +16 -0
- aip_agents/ptc/sandbox_bridge.py +297 -0
- aip_agents/ptc/template_utils.py +33 -0
- aip_agents/ptc/templates/__init__.py +1 -0
- aip_agents/ptc/templates/ptc_helper.py.template +134 -0
- aip_agents/ptc/tool_def_helpers.py +101 -0
- aip_agents/ptc/tool_enrichment.py +163 -0
- aip_agents/resilience/__init__.py +10 -0
- aip_agents/resilience/base.py +46 -0
- aip_agents/resilience/tool.py +1661 -0
- aip_agents/sandbox/__init__.py +62 -0
- aip_agents/sandbox/defaults.py +220 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1-datasaur.Dockerfile +120 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1.Dockerfile +100 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2-datasaur.Dockerfile +143 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2.Dockerfile +119 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3-datasaur.Dockerfile +173 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3.Dockerfile +130 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.Dockerfile +164 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.patch_js_context.py +41 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.requirements.txt +29 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2.Dockerfile +87 -0
- aip_agents/sandbox/e2b_runtime.py +27 -0
- aip_agents/sandbox/image_registry.py +98 -0
- aip_agents/sandbox/providers/__init__.py +76 -0
- aip_agents/sandbox/providers/base.py +392 -0
- aip_agents/sandbox/providers/bedrock.py +28 -0
- aip_agents/sandbox/providers/e2b.py +230 -0
- aip_agents/sandbox/providers/opensandbox.py +163 -0
- aip_agents/sandbox/sandbox_runtime.py +967 -0
- aip_agents/sandbox/template_builder.py +240 -0
- aip_agents/sandbox/types.py +141 -0
- aip_agents/sandbox/validation.py +50 -0
- aip_agents/schema/__init__.py +106 -0
- aip_agents/schema/a2a.py +58 -0
- aip_agents/schema/agent.py +117 -0
- aip_agents/schema/artifacts.py +75 -0
- aip_agents/schema/attachments.py +425 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/langgraph.py +47 -0
- aip_agents/schema/model_id.py +103 -0
- aip_agents/schema/model_usage.py +50 -0
- aip_agents/schema/runtime_metadata.py +78 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/tool_payloads.py +68 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/sentry.py +267 -0
- aip_agents/skills/__init__.py +30 -0
- aip_agents/skills/errors.py +110 -0
- aip_agents/skills/installer.py +479 -0
- aip_agents/skills/models.py +769 -0
- aip_agents/skills/stager.py +224 -0
- aip_agents/skills/validation.py +53 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/tools/__init__.py +65 -0
- aip_agents/tools/agent_schedule_tool.py +392 -0
- aip_agents/tools/browser_use/__init__.py +83 -0
- aip_agents/tools/browser_use/action_parser.py +104 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1118 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/minio_storage.py +203 -0
- aip_agents/tools/browser_use/schemas.py +121 -0
- aip_agents/tools/browser_use/session.py +13 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/steel_session_recording.py +321 -0
- aip_agents/tools/browser_use/streaming.py +263 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/types.py +37 -0
- aip_agents/tools/code_sandbox/__init__.py +48 -0
- aip_agents/tools/code_sandbox/code_sandbox_tool.py +350 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +346 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +65 -0
- aip_agents/tools/computer_use/__init__.py +75 -0
- aip_agents/tools/computer_use/computer_use_tool.py +910 -0
- aip_agents/tools/computer_use/schemas.py +78 -0
- aip_agents/tools/computer_use/streaming.py +198 -0
- aip_agents/tools/computer_use/types.py +32 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/date_range_tool.py +554 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/execute_ptc_code.py +582 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/tool.py +518 -0
- aip_agents/tools/gl_connector_tools.py +170 -0
- aip_agents/tools/memory_search/__init__.py +29 -0
- aip_agents/tools/memory_search/base.py +213 -0
- aip_agents/tools/memory_search/mem0.py +424 -0
- aip_agents/tools/memory_search/schema.py +81 -0
- aip_agents/tools/memory_search_tool.py +34 -0
- aip_agents/tools/streaming_common.py +577 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/types/__init__.py +73 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/utils/__init__.py +91 -0
- aip_agents/utils/a2a_connector.py +1758 -0
- aip_agents/utils/artifact_helpers.py +542 -0
- aip_agents/utils/artifacts/__init__.py +20 -0
- aip_agents/utils/artifacts/tracker.py +367 -0
- aip_agents/utils/attachment_helpers.py +178 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/file_prompt_utils.py +276 -0
- aip_agents/utils/file_watchers/__init__.py +33 -0
- aip_agents/utils/file_watchers/base.py +46 -0
- aip_agents/utils/file_watchers/e2b.py +128 -0
- aip_agents/utils/file_watchers/factory.py +39 -0
- aip_agents/utils/file_watchers/ls_diff.py +88 -0
- aip_agents/utils/file_watchers/sandbox.py +66 -0
- aip_agents/utils/file_watchers/watchdog.py +97 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/formatter_llm_client.py +258 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/converter.py +399 -0
- aip_agents/utils/langgraph/delegation_context.py +22 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1329 -0
- aip_agents/utils/langgraph/tool_output_management.py +1047 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +822 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata_helper.py +363 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/pii/__init__.py +29 -0
- aip_agents/utils/pii/pii_handler.py +555 -0
- aip_agents/utils/pii/pii_helper.py +225 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/sse_chunk_transformer.py +836 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/token_usage_helper.py +531 -0
- aip_agents_binary-0.0.0.dist-info/METADATA +825 -0
- aip_agents_binary-0.0.0.dist-info/RECORD +447 -0
- aip_agents_binary-0.0.0.dist-info/WHEEL +5 -0
- aip_agents_binary-0.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
"""Private model invocation adapters for LangGraph ReAct agents."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
from collections.abc import Awaitable, Callable, Sequence
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Any, cast
|
|
9
|
+
|
|
10
|
+
from gllm_core.event import EventEmitter # type: ignore[import-untyped]
|
|
11
|
+
from langchain_core.language_models import BaseChatModel
|
|
12
|
+
from langchain_core.messages import AIMessage, BaseMessage, SystemMessage
|
|
13
|
+
from langchain_core.tools import BaseTool
|
|
14
|
+
|
|
15
|
+
from aip_agents.context.runtime import detect_context_overflow
|
|
16
|
+
from aip_agents.schema.model_id import ModelId, ModelProvider
|
|
17
|
+
from aip_agents.utils.logger import get_logger
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
BaseMessageToDict = Callable[[BaseMessage], dict[str, Any]]
|
|
23
|
+
DictToBaseMessage = Callable[[dict[str, Any]], BaseMessage]
|
|
24
|
+
ModifyModelRequestHook = Callable[[list[Any], str, dict[str, Any]], tuple[list[Any], str]]
|
|
25
|
+
CompactConversation = Callable[[list[dict[str, Any]], str], Awaitable[tuple[list[dict[str, Any]], str]]]
|
|
26
|
+
ApplyCompaction = Callable[..., Awaitable[tuple[list[dict[str, Any]], Any]]]
|
|
27
|
+
ConvertLangchainMessages = Callable[[list[BaseMessage], str], Any]
|
|
28
|
+
ConvertLmOutput = Callable[[Any], AIMessage]
|
|
29
|
+
PrepareLmInvokerTools = Callable[[Sequence[BaseTool]], list[Any]]
|
|
30
|
+
SanitizeMessages = Callable[[list[BaseMessage]], list[BaseMessage]]
|
|
31
|
+
EnsureInstructionSync = Callable[[list[BaseMessage], str], list[BaseMessage]]
|
|
32
|
+
ProviderAndModelName = Callable[[str | ModelId], tuple[str | None, str]]
|
|
33
|
+
ProviderAndModelNameForInvoker = Callable[[Any], tuple[str | None, str]]
|
|
34
|
+
PatchInvoker = Callable[[Any], None]
|
|
35
|
+
IsOpenAIReasoningModel = Callable[[str], bool]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass(slots=True)
|
|
39
|
+
class ModelInvocationRequest:
|
|
40
|
+
"""Inputs needed to invoke one ReAct model step."""
|
|
41
|
+
|
|
42
|
+
current_messages: Sequence[BaseMessage]
|
|
43
|
+
state: dict[str, Any]
|
|
44
|
+
state_with_config: dict[str, Any]
|
|
45
|
+
config: dict[str, Any] | None
|
|
46
|
+
enhanced_instruction: str
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass(slots=True)
|
|
50
|
+
class ModelInvocationResult:
|
|
51
|
+
"""Normalized output from a model invocation adapter."""
|
|
52
|
+
|
|
53
|
+
ai_message: AIMessage
|
|
54
|
+
model_provider: str | None
|
|
55
|
+
model_name: str | None
|
|
56
|
+
model_id: Any
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclass(slots=True)
|
|
60
|
+
class ModelInvocationContext:
|
|
61
|
+
"""Narrow callback surface adapters need from the ReAct agent."""
|
|
62
|
+
|
|
63
|
+
agent_name: str
|
|
64
|
+
resolved_tools: Sequence[BaseTool]
|
|
65
|
+
compaction_config: dict[str, Any] | None
|
|
66
|
+
event_emitter: EventEmitter | None
|
|
67
|
+
model_provider: str | None
|
|
68
|
+
execute_modify_model_request_hook: ModifyModelRequestHook
|
|
69
|
+
compact_conversation_with_recall: CompactConversation
|
|
70
|
+
apply_compaction: ApplyCompaction
|
|
71
|
+
base_message_to_dict: BaseMessageToDict
|
|
72
|
+
dict_to_base_message: DictToBaseMessage
|
|
73
|
+
prepare_tools_for_lm_invoker: PrepareLmInvokerTools
|
|
74
|
+
sanitize_messages: SanitizeMessages
|
|
75
|
+
ensure_instruction_sync: EnsureInstructionSync
|
|
76
|
+
convert_langchain_messages_to_gllm_messages: ConvertLangchainMessages
|
|
77
|
+
convert_lm_output_to_langchain_message: ConvertLmOutput
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dataclass(slots=True)
|
|
81
|
+
class LMInvokerRuntimePolicy:
|
|
82
|
+
"""Provider-specific runtime patch policy for LM invoker execution."""
|
|
83
|
+
|
|
84
|
+
provider_and_model_name: ProviderAndModelName
|
|
85
|
+
provider_and_model_name_for_invoker: ProviderAndModelNameForInvoker
|
|
86
|
+
is_openai_reasoning_model: IsOpenAIReasoningModel
|
|
87
|
+
patch_openai_reasoning_thinking_extraction: PatchInvoker
|
|
88
|
+
patch_anthropic_cache_usage: PatchInvoker
|
|
89
|
+
|
|
90
|
+
def apply_to_built_invoker(self, model: str | ModelId, lm_invoker: Any) -> None:
|
|
91
|
+
"""Apply runtime patches to an invoker built from a model identifier."""
|
|
92
|
+
provider, model_name = self.provider_and_model_name(model)
|
|
93
|
+
self._apply(provider, model_name, lm_invoker)
|
|
94
|
+
|
|
95
|
+
def apply_to_provided_invoker(self, lm_invoker: Any) -> None:
|
|
96
|
+
"""Apply runtime patches to a caller-provided invoker instance."""
|
|
97
|
+
provider, model_name = self.provider_and_model_name_for_invoker(lm_invoker)
|
|
98
|
+
self._apply(provider, model_name, lm_invoker)
|
|
99
|
+
|
|
100
|
+
def _apply(self, provider: str | None, model_name: str, lm_invoker: Any) -> None:
|
|
101
|
+
if provider == ModelProvider.OPENAI and self.is_openai_reasoning_model(model_name):
|
|
102
|
+
self.patch_openai_reasoning_thinking_extraction(lm_invoker)
|
|
103
|
+
if provider == ModelProvider.ANTHROPIC:
|
|
104
|
+
self.patch_anthropic_cache_usage(lm_invoker)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class LMInvokerModelInvocationAdapter:
|
|
108
|
+
"""Invoke the existing gllm-inference LM invoker path."""
|
|
109
|
+
|
|
110
|
+
def __init__(self, context: ModelInvocationContext, lm_invoker: Any):
|
|
111
|
+
"""Initialize the adapter with the shared context and invoker instance."""
|
|
112
|
+
self._context = context
|
|
113
|
+
self._lm_invoker = lm_invoker
|
|
114
|
+
|
|
115
|
+
async def invoke(self, request: ModelInvocationRequest) -> ModelInvocationResult:
|
|
116
|
+
"""Invoke the LM invoker and return a normalized result."""
|
|
117
|
+
modified_messages, enhanced_instruction = self._context.execute_modify_model_request_hook(
|
|
118
|
+
list(request.current_messages),
|
|
119
|
+
request.enhanced_instruction,
|
|
120
|
+
request.state_with_config,
|
|
121
|
+
)
|
|
122
|
+
base_messages = cast("list[BaseMessage]", modified_messages)
|
|
123
|
+
|
|
124
|
+
if self._context.compaction_config is not None:
|
|
125
|
+
message_dicts = [self._context.base_message_to_dict(message) for message in base_messages]
|
|
126
|
+
compacted_conversation, enhanced_instruction = await self._context.compact_conversation_with_recall(
|
|
127
|
+
message_dicts,
|
|
128
|
+
enhanced_instruction,
|
|
129
|
+
)
|
|
130
|
+
if compacted_conversation != message_dicts:
|
|
131
|
+
base_messages = [self._context.dict_to_base_message(message) for message in compacted_conversation]
|
|
132
|
+
|
|
133
|
+
messages = self._context.convert_langchain_messages_to_gllm_messages(
|
|
134
|
+
self._context.sanitize_messages(list(base_messages)),
|
|
135
|
+
enhanced_instruction,
|
|
136
|
+
)
|
|
137
|
+
effective_event_emitter = request.state.get("event_emitter") or self._context.event_emitter
|
|
138
|
+
|
|
139
|
+
if self._context.resolved_tools:
|
|
140
|
+
self._lm_invoker.set_tools(self._context.prepare_tools_for_lm_invoker(self._context.resolved_tools))
|
|
141
|
+
|
|
142
|
+
lm_output = await self._invoke(messages, effective_event_emitter, base_messages, enhanced_instruction)
|
|
143
|
+
ai_message = self._context.convert_lm_output_to_langchain_message(lm_output)
|
|
144
|
+
return ModelInvocationResult(
|
|
145
|
+
ai_message=ai_message,
|
|
146
|
+
model_provider=_clean_string(getattr(self._lm_invoker, "model_provider", None)),
|
|
147
|
+
model_name=_clean_string(getattr(self._lm_invoker, "model_name", None)),
|
|
148
|
+
model_id=getattr(self._lm_invoker, "model_id", None),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
async def _invoke(
|
|
152
|
+
self,
|
|
153
|
+
messages: Any,
|
|
154
|
+
event_emitter: EventEmitter | None,
|
|
155
|
+
modified_messages: list[BaseMessage],
|
|
156
|
+
enhanced_instruction: str,
|
|
157
|
+
) -> Any:
|
|
158
|
+
start_time = time.perf_counter()
|
|
159
|
+
logger.info(
|
|
160
|
+
"Agent '%s': LLM invoke start (tools=%d)",
|
|
161
|
+
self._context.agent_name,
|
|
162
|
+
len(self._context.resolved_tools),
|
|
163
|
+
)
|
|
164
|
+
total_chars = sum(len(str(getattr(message, "content", ""))) for message in messages)
|
|
165
|
+
logger.info("Prompt size: %d messages, %d chars", len(messages), total_chars)
|
|
166
|
+
|
|
167
|
+
try:
|
|
168
|
+
lm_output = await self._lm_invoker.invoke(
|
|
169
|
+
messages=messages,
|
|
170
|
+
event_emitter=event_emitter,
|
|
171
|
+
)
|
|
172
|
+
except Exception as exc:
|
|
173
|
+
if not detect_context_overflow(exc) or self._context.compaction_config is None:
|
|
174
|
+
raise
|
|
175
|
+
logger.info(
|
|
176
|
+
"Agent '%s': context overflow detected, retrying with compacted messages.",
|
|
177
|
+
self._context.agent_name,
|
|
178
|
+
)
|
|
179
|
+
message_dicts = [self._context.base_message_to_dict(message) for message in modified_messages]
|
|
180
|
+
compacted_dicts, _retry_prep = await self._context.apply_compaction(
|
|
181
|
+
message_dicts,
|
|
182
|
+
provider_overflow=True,
|
|
183
|
+
)
|
|
184
|
+
retry_messages = self._context.convert_langchain_messages_to_gllm_messages(
|
|
185
|
+
self._context.sanitize_messages(
|
|
186
|
+
[self._context.dict_to_base_message(message) for message in compacted_dicts]
|
|
187
|
+
),
|
|
188
|
+
enhanced_instruction,
|
|
189
|
+
)
|
|
190
|
+
lm_output = await self._lm_invoker.invoke(
|
|
191
|
+
messages=retry_messages,
|
|
192
|
+
event_emitter=event_emitter,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
logger.info(
|
|
196
|
+
"Agent '%s': LLM invoke finished in %.3fs", self._context.agent_name, time.perf_counter() - start_time
|
|
197
|
+
)
|
|
198
|
+
return lm_output
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class LangChainModelInvocationAdapter:
|
|
202
|
+
"""Invoke the existing LangChain BaseChatModel path."""
|
|
203
|
+
|
|
204
|
+
def __init__(self, context: ModelInvocationContext, model: BaseChatModel):
|
|
205
|
+
"""Initialize the adapter with the shared context and chat model."""
|
|
206
|
+
self._context = context
|
|
207
|
+
self._model = model
|
|
208
|
+
|
|
209
|
+
async def invoke(self, request: ModelInvocationRequest) -> ModelInvocationResult:
|
|
210
|
+
"""Invoke the LangChain chat model and return a normalized result."""
|
|
211
|
+
langchain_prompt: list[BaseMessage] = [SystemMessage(content=request.enhanced_instruction)] + list(
|
|
212
|
+
request.current_messages
|
|
213
|
+
)
|
|
214
|
+
langchain_prompt, enhanced_instruction = self._context.execute_modify_model_request_hook(
|
|
215
|
+
langchain_prompt,
|
|
216
|
+
request.enhanced_instruction,
|
|
217
|
+
request.state_with_config,
|
|
218
|
+
)
|
|
219
|
+
langchain_prompt = self._context.ensure_instruction_sync(
|
|
220
|
+
cast("list[BaseMessage]", langchain_prompt),
|
|
221
|
+
enhanced_instruction,
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
if self._context.compaction_config is not None:
|
|
225
|
+
langchain_prompt = await self._compact_prompt(langchain_prompt, enhanced_instruction)
|
|
226
|
+
|
|
227
|
+
model_with_tools = (
|
|
228
|
+
self._model.bind_tools(self._context.resolved_tools) if self._context.resolved_tools else self._model
|
|
229
|
+
)
|
|
230
|
+
ai_message = await self._invoke(model_with_tools, langchain_prompt, request.config)
|
|
231
|
+
return ModelInvocationResult(
|
|
232
|
+
ai_message=ai_message,
|
|
233
|
+
model_provider=_langchain_model_provider(self._model) or self._context.model_provider,
|
|
234
|
+
model_name=_langchain_model_name(self._model),
|
|
235
|
+
model_id=_langchain_model_id(self._model),
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
async def _compact_prompt(
|
|
239
|
+
self, langchain_prompt: list[BaseMessage], enhanced_instruction: str
|
|
240
|
+
) -> list[BaseMessage]:
|
|
241
|
+
conversation_messages = [message for message in langchain_prompt if not isinstance(message, SystemMessage)]
|
|
242
|
+
message_dicts = [self._context.base_message_to_dict(message) for message in conversation_messages]
|
|
243
|
+
system_content = langchain_prompt[0].content if langchain_prompt else enhanced_instruction
|
|
244
|
+
|
|
245
|
+
compacted_conversation, system_content = await self._context.compact_conversation_with_recall(
|
|
246
|
+
message_dicts,
|
|
247
|
+
str(system_content),
|
|
248
|
+
)
|
|
249
|
+
if compacted_conversation != message_dicts:
|
|
250
|
+
return [SystemMessage(content=system_content)] + [
|
|
251
|
+
self._context.dict_to_base_message(message) for message in compacted_conversation
|
|
252
|
+
]
|
|
253
|
+
|
|
254
|
+
langchain_prompt[0] = SystemMessage(content=system_content)
|
|
255
|
+
return langchain_prompt
|
|
256
|
+
|
|
257
|
+
async def _invoke(
|
|
258
|
+
self,
|
|
259
|
+
model_with_tools: BaseChatModel,
|
|
260
|
+
langchain_prompt: list[BaseMessage],
|
|
261
|
+
config: dict[str, Any] | None,
|
|
262
|
+
) -> AIMessage:
|
|
263
|
+
start_time = time.perf_counter()
|
|
264
|
+
logger.info(
|
|
265
|
+
"Agent '%s': LangChain model invoke start (tools=%d)",
|
|
266
|
+
self._context.agent_name,
|
|
267
|
+
len(self._context.resolved_tools),
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
try:
|
|
271
|
+
ai_message = await model_with_tools.ainvoke(langchain_prompt, config)
|
|
272
|
+
except Exception as exc:
|
|
273
|
+
if not detect_context_overflow(exc) or self._context.compaction_config is None:
|
|
274
|
+
raise
|
|
275
|
+
logger.info(
|
|
276
|
+
"Agent '%s': context overflow detected, retrying with compacted messages.",
|
|
277
|
+
self._context.agent_name,
|
|
278
|
+
)
|
|
279
|
+
conversation_messages = [message for message in langchain_prompt if not isinstance(message, SystemMessage)]
|
|
280
|
+
message_dicts = [self._context.base_message_to_dict(message) for message in conversation_messages]
|
|
281
|
+
compacted_dicts, _retry_prep = await self._context.apply_compaction(
|
|
282
|
+
message_dicts,
|
|
283
|
+
provider_overflow=True,
|
|
284
|
+
)
|
|
285
|
+
retry_prompt = [langchain_prompt[0]] + [
|
|
286
|
+
self._context.dict_to_base_message(message) for message in compacted_dicts
|
|
287
|
+
]
|
|
288
|
+
ai_message = await model_with_tools.ainvoke(retry_prompt, config)
|
|
289
|
+
|
|
290
|
+
logger.info(
|
|
291
|
+
"Agent '%s': LangChain model invoke finished in %.3fs",
|
|
292
|
+
self._context.agent_name,
|
|
293
|
+
time.perf_counter() - start_time,
|
|
294
|
+
)
|
|
295
|
+
return ai_message
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def _clean_string(value: Any) -> str | None:
|
|
299
|
+
return value.strip() or None if isinstance(value, str) else None
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def _langchain_model_provider(model: BaseChatModel) -> str | None:
|
|
303
|
+
provider = _clean_string(getattr(model, "model_provider", None))
|
|
304
|
+
if provider:
|
|
305
|
+
return provider
|
|
306
|
+
|
|
307
|
+
model_id = getattr(model, "model_id", None)
|
|
308
|
+
if isinstance(model_id, ModelId):
|
|
309
|
+
return _clean_string(model_id.provider) # pragma: no cover
|
|
310
|
+
if isinstance(model_id, str) and "/" in model_id:
|
|
311
|
+
return _clean_string(model_id.split("/", 1)[0]) # pragma: no cover
|
|
312
|
+
|
|
313
|
+
module_and_name = f"{type(model).__module__}.{type(model).__name__}".lower()
|
|
314
|
+
if "azure" in module_and_name and "openai" in module_and_name:
|
|
315
|
+
return ModelProvider.AZURE_OPENAI # pragma: no cover
|
|
316
|
+
if "openai" in module_and_name:
|
|
317
|
+
return ModelProvider.OPENAI # pragma: no cover
|
|
318
|
+
if "anthropic" in module_and_name:
|
|
319
|
+
return ModelProvider.ANTHROPIC # pragma: no cover
|
|
320
|
+
if "google" in module_and_name or "gemini" in module_and_name:
|
|
321
|
+
return ModelProvider.GOOGLE_GENAI # pragma: no cover
|
|
322
|
+
return None
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def _langchain_model_name(model: BaseChatModel) -> str | None:
|
|
326
|
+
model_name = _clean_string(getattr(model, "model_name", None) or getattr(model, "model", None))
|
|
327
|
+
if model_name:
|
|
328
|
+
return model_name
|
|
329
|
+
|
|
330
|
+
model_id = getattr(model, "model_id", None)
|
|
331
|
+
if isinstance(model_id, ModelId):
|
|
332
|
+
return _clean_string(model_id.name) # pragma: no cover
|
|
333
|
+
if isinstance(model_id, str):
|
|
334
|
+
if "/" in model_id: # pragma: no cover
|
|
335
|
+
return _clean_string(model_id.rsplit("/", 1)[-1]) # pragma: no cover
|
|
336
|
+
if ":" in model_id: # pragma: no cover
|
|
337
|
+
return _clean_string(model_id.rsplit(":", 1)[-1]) # pragma: no cover
|
|
338
|
+
return _clean_string(model_id) # pragma: no cover
|
|
339
|
+
return None
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def _langchain_model_id(model: BaseChatModel) -> Any:
|
|
343
|
+
model_id = getattr(model, "model_id", None)
|
|
344
|
+
if isinstance(model_id, ModelId | str):
|
|
345
|
+
return model_id # pragma: no cover
|
|
346
|
+
return None
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Utilities for constructing agent system instructions.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from aip_agents.utils.constants import DefaultTimezone
|
|
10
|
+
from aip_agents.utils.datetime import get_timezone_aware_now
|
|
11
|
+
|
|
12
|
+
__all__ = ["get_current_date_context", "DefaultTimezone"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_current_date_context(timezone: str = DefaultTimezone.JAKARTA) -> str:
|
|
16
|
+
"""Generate current date context for system prompts.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
timezone: IANA timezone name for date formatting.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
Formatted date context string for inclusion in system prompts.
|
|
23
|
+
"""
|
|
24
|
+
now, timezone_label, used_fallback = get_timezone_aware_now(timezone)
|
|
25
|
+
display_timezone = "UTC" if used_fallback else timezone_label
|
|
26
|
+
current_date = now.strftime("%Y-%m-%d")
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
f"Very important: The user's timezone is {display_timezone}. "
|
|
30
|
+
f"The current date is {current_date}\n\n"
|
|
31
|
+
"Any dates before this are in the past, and any dates after this are in the future. "
|
|
32
|
+
"When the user asks for the 'latest', 'most recent', 'today's', etc. don't assume\n"
|
|
33
|
+
"your knowledge is up to date."
|
|
34
|
+
)
|