langchain 0.3.26__py3-none-any.whl → 0.4.0.dev0__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.
- langchain/__init__.py +110 -96
- langchain/_api/__init__.py +2 -2
- langchain/_api/deprecation.py +3 -3
- langchain/_api/module_import.py +51 -46
- langchain/_api/path.py +1 -1
- langchain/adapters/openai.py +8 -8
- langchain/agents/__init__.py +15 -12
- langchain/agents/agent.py +174 -151
- langchain/agents/agent_iterator.py +50 -26
- langchain/agents/agent_toolkits/__init__.py +7 -6
- langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
- langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
- langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
- langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
- langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
- langchain/agents/agent_toolkits/csv/__init__.py +4 -2
- langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
- langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
- langchain/agents/agent_toolkits/github/toolkit.py +9 -9
- langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
- langchain/agents/agent_toolkits/json/base.py +1 -1
- langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
- langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
- langchain/agents/agent_toolkits/openapi/base.py +1 -1
- langchain/agents/agent_toolkits/openapi/planner.py +2 -2
- langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
- langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
- langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
- langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
- langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
- langchain/agents/agent_toolkits/powerbi/base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
- langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/python/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
- langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/sql/prompt.py +1 -1
- langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/vectorstore/base.py +4 -2
- langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
- langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
- langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
- langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
- langchain/agents/agent_types.py +6 -6
- langchain/agents/chat/base.py +8 -12
- langchain/agents/chat/output_parser.py +9 -6
- langchain/agents/chat/prompt.py +3 -4
- langchain/agents/conversational/base.py +11 -5
- langchain/agents/conversational/output_parser.py +4 -2
- langchain/agents/conversational/prompt.py +2 -3
- langchain/agents/conversational_chat/base.py +9 -5
- langchain/agents/conversational_chat/output_parser.py +9 -11
- langchain/agents/conversational_chat/prompt.py +5 -6
- langchain/agents/format_scratchpad/__init__.py +3 -3
- langchain/agents/format_scratchpad/log_to_messages.py +1 -1
- langchain/agents/format_scratchpad/openai_functions.py +8 -6
- langchain/agents/format_scratchpad/tools.py +5 -3
- langchain/agents/format_scratchpad/xml.py +33 -2
- langchain/agents/initialize.py +17 -9
- langchain/agents/json_chat/base.py +19 -18
- langchain/agents/json_chat/prompt.py +2 -3
- langchain/agents/load_tools.py +2 -1
- langchain/agents/loading.py +28 -18
- langchain/agents/mrkl/base.py +11 -4
- langchain/agents/mrkl/output_parser.py +17 -13
- langchain/agents/mrkl/prompt.py +1 -2
- langchain/agents/openai_assistant/base.py +81 -71
- langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +2 -0
- langchain/agents/openai_functions_agent/base.py +47 -37
- langchain/agents/openai_functions_multi_agent/base.py +40 -27
- langchain/agents/openai_tools/base.py +9 -8
- langchain/agents/output_parsers/__init__.py +3 -3
- langchain/agents/output_parsers/json.py +8 -6
- langchain/agents/output_parsers/openai_functions.py +24 -9
- langchain/agents/output_parsers/openai_tools.py +16 -4
- langchain/agents/output_parsers/react_json_single_input.py +13 -5
- langchain/agents/output_parsers/react_single_input.py +18 -11
- langchain/agents/output_parsers/self_ask.py +5 -2
- langchain/agents/output_parsers/tools.py +32 -13
- langchain/agents/output_parsers/xml.py +102 -28
- langchain/agents/react/agent.py +5 -4
- langchain/agents/react/base.py +26 -17
- langchain/agents/react/output_parser.py +7 -6
- langchain/agents/react/textworld_prompt.py +0 -1
- langchain/agents/react/wiki_prompt.py +14 -15
- langchain/agents/schema.py +5 -2
- langchain/agents/self_ask_with_search/base.py +23 -15
- langchain/agents/self_ask_with_search/prompt.py +0 -1
- langchain/agents/structured_chat/base.py +19 -11
- langchain/agents/structured_chat/output_parser.py +29 -18
- langchain/agents/structured_chat/prompt.py +3 -4
- langchain/agents/tool_calling_agent/base.py +8 -6
- langchain/agents/tools.py +5 -2
- langchain/agents/utils.py +2 -3
- langchain/agents/xml/base.py +12 -6
- langchain/agents/xml/prompt.py +1 -2
- langchain/cache.py +12 -12
- langchain/callbacks/__init__.py +11 -11
- langchain/callbacks/aim_callback.py +2 -2
- langchain/callbacks/argilla_callback.py +1 -1
- langchain/callbacks/arize_callback.py +1 -1
- langchain/callbacks/arthur_callback.py +1 -1
- langchain/callbacks/base.py +7 -7
- langchain/callbacks/clearml_callback.py +1 -1
- langchain/callbacks/comet_ml_callback.py +1 -1
- langchain/callbacks/confident_callback.py +1 -1
- langchain/callbacks/context_callback.py +1 -1
- langchain/callbacks/flyte_callback.py +1 -1
- langchain/callbacks/human.py +2 -2
- langchain/callbacks/infino_callback.py +1 -1
- langchain/callbacks/labelstudio_callback.py +1 -1
- langchain/callbacks/llmonitor_callback.py +1 -1
- langchain/callbacks/manager.py +5 -5
- langchain/callbacks/mlflow_callback.py +2 -2
- langchain/callbacks/openai_info.py +1 -1
- langchain/callbacks/promptlayer_callback.py +1 -1
- langchain/callbacks/sagemaker_callback.py +1 -1
- langchain/callbacks/streaming_aiter.py +17 -3
- langchain/callbacks/streaming_aiter_final_only.py +16 -5
- langchain/callbacks/streaming_stdout_final_only.py +10 -3
- langchain/callbacks/streamlit/__init__.py +3 -2
- langchain/callbacks/streamlit/mutable_expander.py +1 -1
- langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
- langchain/callbacks/tracers/__init__.py +1 -1
- langchain/callbacks/tracers/comet.py +1 -1
- langchain/callbacks/tracers/evaluation.py +1 -1
- langchain/callbacks/tracers/log_stream.py +1 -1
- langchain/callbacks/tracers/logging.py +12 -1
- langchain/callbacks/tracers/stdout.py +1 -1
- langchain/callbacks/trubrics_callback.py +1 -1
- langchain/callbacks/utils.py +4 -4
- langchain/callbacks/wandb_callback.py +1 -1
- langchain/callbacks/whylabs_callback.py +1 -1
- langchain/chains/api/base.py +41 -23
- langchain/chains/api/news_docs.py +1 -2
- langchain/chains/api/open_meteo_docs.py +1 -2
- langchain/chains/api/openapi/requests_chain.py +1 -1
- langchain/chains/api/openapi/response_chain.py +1 -1
- langchain/chains/api/podcast_docs.py +1 -2
- langchain/chains/api/prompt.py +1 -2
- langchain/chains/api/tmdb_docs.py +1 -2
- langchain/chains/base.py +96 -56
- langchain/chains/chat_vector_db/prompts.py +2 -3
- langchain/chains/combine_documents/__init__.py +1 -1
- langchain/chains/combine_documents/base.py +30 -11
- langchain/chains/combine_documents/map_reduce.py +41 -30
- langchain/chains/combine_documents/map_rerank.py +39 -24
- langchain/chains/combine_documents/reduce.py +48 -26
- langchain/chains/combine_documents/refine.py +27 -17
- langchain/chains/combine_documents/stuff.py +24 -13
- langchain/chains/constitutional_ai/base.py +11 -4
- langchain/chains/constitutional_ai/principles.py +22 -25
- langchain/chains/constitutional_ai/prompts.py +25 -28
- langchain/chains/conversation/base.py +9 -4
- langchain/chains/conversation/memory.py +5 -5
- langchain/chains/conversation/prompt.py +5 -5
- langchain/chains/conversational_retrieval/base.py +108 -79
- langchain/chains/conversational_retrieval/prompts.py +2 -3
- langchain/chains/elasticsearch_database/base.py +10 -10
- langchain/chains/elasticsearch_database/prompts.py +2 -3
- langchain/chains/ernie_functions/__init__.py +2 -2
- langchain/chains/example_generator.py +3 -1
- langchain/chains/flare/base.py +28 -12
- langchain/chains/flare/prompts.py +2 -0
- langchain/chains/graph_qa/cypher.py +2 -2
- langchain/chains/graph_qa/falkordb.py +1 -1
- langchain/chains/graph_qa/gremlin.py +1 -1
- langchain/chains/graph_qa/neptune_sparql.py +1 -1
- langchain/chains/graph_qa/prompts.py +2 -2
- langchain/chains/history_aware_retriever.py +2 -1
- langchain/chains/hyde/base.py +6 -5
- langchain/chains/hyde/prompts.py +5 -6
- langchain/chains/llm.py +82 -61
- langchain/chains/llm_bash/__init__.py +3 -2
- langchain/chains/llm_checker/base.py +19 -6
- langchain/chains/llm_checker/prompt.py +3 -4
- langchain/chains/llm_math/base.py +25 -10
- langchain/chains/llm_math/prompt.py +1 -2
- langchain/chains/llm_summarization_checker/base.py +22 -7
- langchain/chains/llm_symbolic_math/__init__.py +3 -2
- langchain/chains/loading.py +155 -97
- langchain/chains/mapreduce.py +4 -3
- langchain/chains/moderation.py +11 -9
- langchain/chains/natbot/base.py +11 -9
- langchain/chains/natbot/crawler.py +102 -76
- langchain/chains/natbot/prompt.py +2 -3
- langchain/chains/openai_functions/__init__.py +7 -7
- langchain/chains/openai_functions/base.py +15 -10
- langchain/chains/openai_functions/citation_fuzzy_match.py +21 -11
- langchain/chains/openai_functions/extraction.py +19 -19
- langchain/chains/openai_functions/openapi.py +39 -35
- langchain/chains/openai_functions/qa_with_structure.py +22 -15
- langchain/chains/openai_functions/tagging.py +4 -4
- langchain/chains/openai_tools/extraction.py +7 -8
- langchain/chains/qa_generation/base.py +8 -3
- langchain/chains/qa_generation/prompt.py +5 -5
- langchain/chains/qa_with_sources/base.py +17 -6
- langchain/chains/qa_with_sources/loading.py +16 -8
- langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
- langchain/chains/qa_with_sources/refine_prompts.py +0 -1
- langchain/chains/qa_with_sources/retrieval.py +15 -6
- langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
- langchain/chains/qa_with_sources/vector_db.py +21 -8
- langchain/chains/query_constructor/base.py +37 -34
- langchain/chains/query_constructor/ir.py +4 -4
- langchain/chains/query_constructor/parser.py +101 -34
- langchain/chains/query_constructor/prompt.py +5 -6
- langchain/chains/question_answering/chain.py +21 -10
- langchain/chains/question_answering/map_reduce_prompt.py +14 -14
- langchain/chains/question_answering/map_rerank_prompt.py +3 -3
- langchain/chains/question_answering/refine_prompts.py +2 -5
- langchain/chains/question_answering/stuff_prompt.py +5 -5
- langchain/chains/retrieval.py +1 -3
- langchain/chains/retrieval_qa/base.py +38 -27
- langchain/chains/retrieval_qa/prompt.py +1 -2
- langchain/chains/router/__init__.py +3 -3
- langchain/chains/router/base.py +38 -22
- langchain/chains/router/embedding_router.py +15 -8
- langchain/chains/router/llm_router.py +23 -20
- langchain/chains/router/multi_prompt.py +5 -2
- langchain/chains/router/multi_retrieval_qa.py +28 -5
- langchain/chains/sequential.py +30 -18
- langchain/chains/sql_database/prompt.py +14 -16
- langchain/chains/sql_database/query.py +7 -5
- langchain/chains/structured_output/__init__.py +1 -1
- langchain/chains/structured_output/base.py +77 -67
- langchain/chains/summarize/chain.py +11 -5
- langchain/chains/summarize/map_reduce_prompt.py +0 -1
- langchain/chains/summarize/stuff_prompt.py +0 -1
- langchain/chains/transform.py +9 -6
- langchain/chat_loaders/facebook_messenger.py +1 -1
- langchain/chat_loaders/langsmith.py +1 -1
- langchain/chat_loaders/utils.py +3 -3
- langchain/chat_models/__init__.py +20 -19
- langchain/chat_models/anthropic.py +1 -1
- langchain/chat_models/azureml_endpoint.py +1 -1
- langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
- langchain/chat_models/base.py +213 -139
- langchain/chat_models/bedrock.py +1 -1
- langchain/chat_models/fake.py +1 -1
- langchain/chat_models/meta.py +1 -1
- langchain/chat_models/pai_eas_endpoint.py +1 -1
- langchain/chat_models/promptlayer_openai.py +1 -1
- langchain/chat_models/volcengine_maas.py +1 -1
- langchain/docstore/base.py +1 -1
- langchain/document_loaders/__init__.py +9 -9
- langchain/document_loaders/airbyte.py +3 -3
- langchain/document_loaders/assemblyai.py +1 -1
- langchain/document_loaders/azure_blob_storage_container.py +1 -1
- langchain/document_loaders/azure_blob_storage_file.py +1 -1
- langchain/document_loaders/baiducloud_bos_file.py +1 -1
- langchain/document_loaders/base.py +1 -1
- langchain/document_loaders/blob_loaders/__init__.py +1 -1
- langchain/document_loaders/blob_loaders/schema.py +1 -4
- langchain/document_loaders/blockchain.py +1 -1
- langchain/document_loaders/chatgpt.py +1 -1
- langchain/document_loaders/college_confidential.py +1 -1
- langchain/document_loaders/confluence.py +1 -1
- langchain/document_loaders/email.py +1 -1
- langchain/document_loaders/facebook_chat.py +1 -1
- langchain/document_loaders/markdown.py +1 -1
- langchain/document_loaders/notebook.py +1 -1
- langchain/document_loaders/org_mode.py +1 -1
- langchain/document_loaders/parsers/__init__.py +1 -1
- langchain/document_loaders/parsers/docai.py +1 -1
- langchain/document_loaders/parsers/generic.py +1 -1
- langchain/document_loaders/parsers/html/__init__.py +1 -1
- langchain/document_loaders/parsers/html/bs4.py +1 -1
- langchain/document_loaders/parsers/language/cobol.py +1 -1
- langchain/document_loaders/parsers/language/python.py +1 -1
- langchain/document_loaders/parsers/msword.py +1 -1
- langchain/document_loaders/parsers/pdf.py +5 -5
- langchain/document_loaders/parsers/registry.py +1 -1
- langchain/document_loaders/pdf.py +8 -8
- langchain/document_loaders/powerpoint.py +1 -1
- langchain/document_loaders/pyspark_dataframe.py +1 -1
- langchain/document_loaders/telegram.py +2 -2
- langchain/document_loaders/tencent_cos_directory.py +1 -1
- langchain/document_loaders/unstructured.py +5 -5
- langchain/document_loaders/url_playwright.py +1 -1
- langchain/document_loaders/whatsapp_chat.py +1 -1
- langchain/document_loaders/youtube.py +2 -2
- langchain/document_transformers/__init__.py +3 -3
- langchain/document_transformers/beautiful_soup_transformer.py +1 -1
- langchain/document_transformers/doctran_text_extract.py +1 -1
- langchain/document_transformers/doctran_text_qa.py +1 -1
- langchain/document_transformers/doctran_text_translate.py +1 -1
- langchain/document_transformers/embeddings_redundant_filter.py +3 -3
- langchain/document_transformers/google_translate.py +1 -1
- langchain/document_transformers/html2text.py +1 -1
- langchain/document_transformers/nuclia_text_transform.py +1 -1
- langchain/embeddings/__init__.py +5 -5
- langchain/embeddings/base.py +35 -24
- langchain/embeddings/cache.py +37 -32
- langchain/embeddings/fake.py +1 -1
- langchain/embeddings/huggingface.py +2 -2
- langchain/evaluation/__init__.py +22 -22
- langchain/evaluation/agents/trajectory_eval_chain.py +26 -25
- langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
- langchain/evaluation/comparison/__init__.py +1 -1
- langchain/evaluation/comparison/eval_chain.py +21 -13
- langchain/evaluation/comparison/prompt.py +1 -2
- langchain/evaluation/criteria/__init__.py +1 -1
- langchain/evaluation/criteria/eval_chain.py +23 -11
- langchain/evaluation/criteria/prompt.py +2 -3
- langchain/evaluation/embedding_distance/base.py +34 -20
- langchain/evaluation/exact_match/base.py +14 -1
- langchain/evaluation/loading.py +16 -11
- langchain/evaluation/parsing/base.py +20 -4
- langchain/evaluation/parsing/json_distance.py +24 -10
- langchain/evaluation/parsing/json_schema.py +13 -12
- langchain/evaluation/qa/__init__.py +1 -1
- langchain/evaluation/qa/eval_chain.py +20 -5
- langchain/evaluation/qa/eval_prompt.py +7 -8
- langchain/evaluation/qa/generate_chain.py +4 -1
- langchain/evaluation/qa/generate_prompt.py +2 -4
- langchain/evaluation/regex_match/base.py +9 -1
- langchain/evaluation/schema.py +38 -30
- langchain/evaluation/scoring/__init__.py +1 -1
- langchain/evaluation/scoring/eval_chain.py +23 -15
- langchain/evaluation/scoring/prompt.py +0 -1
- langchain/evaluation/string_distance/base.py +20 -9
- langchain/globals.py +12 -11
- langchain/graphs/__init__.py +6 -6
- langchain/graphs/graph_document.py +1 -1
- langchain/graphs/networkx_graph.py +2 -2
- langchain/hub.py +9 -11
- langchain/indexes/__init__.py +3 -3
- langchain/indexes/_sql_record_manager.py +63 -46
- langchain/indexes/prompts/entity_extraction.py +1 -2
- langchain/indexes/prompts/entity_summarization.py +1 -2
- langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
- langchain/indexes/vectorstore.py +35 -19
- langchain/llms/__init__.py +13 -13
- langchain/llms/ai21.py +1 -1
- langchain/llms/azureml_endpoint.py +4 -4
- langchain/llms/base.py +15 -7
- langchain/llms/bedrock.py +1 -1
- langchain/llms/cloudflare_workersai.py +1 -1
- langchain/llms/gradient_ai.py +1 -1
- langchain/llms/loading.py +1 -1
- langchain/llms/openai.py +1 -1
- langchain/llms/sagemaker_endpoint.py +1 -1
- langchain/load/dump.py +1 -1
- langchain/load/load.py +1 -1
- langchain/load/serializable.py +3 -3
- langchain/memory/__init__.py +3 -3
- langchain/memory/buffer.py +14 -7
- langchain/memory/buffer_window.py +2 -0
- langchain/memory/chat_memory.py +14 -8
- langchain/memory/chat_message_histories/__init__.py +1 -1
- langchain/memory/chat_message_histories/astradb.py +1 -1
- langchain/memory/chat_message_histories/cassandra.py +1 -1
- langchain/memory/chat_message_histories/cosmos_db.py +1 -1
- langchain/memory/chat_message_histories/dynamodb.py +1 -1
- langchain/memory/chat_message_histories/elasticsearch.py +1 -1
- langchain/memory/chat_message_histories/file.py +1 -1
- langchain/memory/chat_message_histories/firestore.py +1 -1
- langchain/memory/chat_message_histories/momento.py +1 -1
- langchain/memory/chat_message_histories/mongodb.py +1 -1
- langchain/memory/chat_message_histories/neo4j.py +1 -1
- langchain/memory/chat_message_histories/postgres.py +1 -1
- langchain/memory/chat_message_histories/redis.py +1 -1
- langchain/memory/chat_message_histories/rocksetdb.py +1 -1
- langchain/memory/chat_message_histories/singlestoredb.py +1 -1
- langchain/memory/chat_message_histories/streamlit.py +1 -1
- langchain/memory/chat_message_histories/upstash_redis.py +1 -1
- langchain/memory/chat_message_histories/xata.py +1 -1
- langchain/memory/chat_message_histories/zep.py +1 -1
- langchain/memory/combined.py +14 -13
- langchain/memory/entity.py +131 -61
- langchain/memory/prompt.py +10 -11
- langchain/memory/readonly.py +0 -2
- langchain/memory/simple.py +4 -3
- langchain/memory/summary.py +43 -11
- langchain/memory/summary_buffer.py +20 -8
- langchain/memory/token_buffer.py +2 -0
- langchain/memory/utils.py +3 -2
- langchain/memory/vectorstore.py +12 -5
- langchain/memory/vectorstore_token_buffer_memory.py +5 -5
- langchain/model_laboratory.py +12 -11
- langchain/output_parsers/__init__.py +4 -4
- langchain/output_parsers/boolean.py +7 -4
- langchain/output_parsers/combining.py +14 -7
- langchain/output_parsers/datetime.py +32 -31
- langchain/output_parsers/enum.py +10 -4
- langchain/output_parsers/fix.py +60 -53
- langchain/output_parsers/format_instructions.py +6 -8
- langchain/output_parsers/json.py +2 -2
- langchain/output_parsers/list.py +2 -2
- langchain/output_parsers/loading.py +9 -9
- langchain/output_parsers/openai_functions.py +3 -3
- langchain/output_parsers/openai_tools.py +1 -1
- langchain/output_parsers/pandas_dataframe.py +59 -48
- langchain/output_parsers/prompts.py +1 -2
- langchain/output_parsers/rail_parser.py +1 -1
- langchain/output_parsers/regex.py +9 -8
- langchain/output_parsers/regex_dict.py +7 -10
- langchain/output_parsers/retry.py +99 -80
- langchain/output_parsers/structured.py +21 -6
- langchain/output_parsers/yaml.py +19 -11
- langchain/prompts/__init__.py +5 -3
- langchain/prompts/base.py +5 -5
- langchain/prompts/chat.py +8 -8
- langchain/prompts/example_selector/__init__.py +3 -1
- langchain/prompts/example_selector/semantic_similarity.py +2 -2
- langchain/prompts/few_shot.py +1 -1
- langchain/prompts/loading.py +3 -3
- langchain/prompts/prompt.py +1 -1
- langchain/pydantic_v1/__init__.py +1 -1
- langchain/retrievers/__init__.py +5 -5
- langchain/retrievers/bedrock.py +2 -2
- langchain/retrievers/bm25.py +1 -1
- langchain/retrievers/contextual_compression.py +14 -8
- langchain/retrievers/docarray.py +1 -1
- langchain/retrievers/document_compressors/__init__.py +5 -4
- langchain/retrievers/document_compressors/base.py +12 -6
- langchain/retrievers/document_compressors/chain_extract.py +5 -3
- langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
- langchain/retrievers/document_compressors/chain_filter.py +9 -9
- langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
- langchain/retrievers/document_compressors/cohere_rerank.py +17 -15
- langchain/retrievers/document_compressors/cross_encoder_rerank.py +2 -0
- langchain/retrievers/document_compressors/embeddings_filter.py +24 -17
- langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
- langchain/retrievers/document_compressors/listwise_rerank.py +8 -5
- langchain/retrievers/ensemble.py +30 -27
- langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
- langchain/retrievers/google_vertex_ai_search.py +2 -2
- langchain/retrievers/kendra.py +10 -10
- langchain/retrievers/llama_index.py +1 -1
- langchain/retrievers/merger_retriever.py +11 -11
- langchain/retrievers/milvus.py +1 -1
- langchain/retrievers/multi_query.py +35 -27
- langchain/retrievers/multi_vector.py +24 -9
- langchain/retrievers/parent_document_retriever.py +33 -9
- langchain/retrievers/re_phraser.py +6 -5
- langchain/retrievers/self_query/base.py +157 -127
- langchain/retrievers/time_weighted_retriever.py +21 -7
- langchain/retrievers/zilliz.py +1 -1
- langchain/runnables/hub.py +12 -0
- langchain/runnables/openai_functions.py +12 -2
- langchain/schema/__init__.py +23 -23
- langchain/schema/cache.py +1 -1
- langchain/schema/callbacks/base.py +7 -7
- langchain/schema/callbacks/manager.py +19 -19
- langchain/schema/callbacks/tracers/base.py +1 -1
- langchain/schema/callbacks/tracers/evaluation.py +1 -1
- langchain/schema/callbacks/tracers/langchain.py +1 -1
- langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
- langchain/schema/callbacks/tracers/log_stream.py +1 -1
- langchain/schema/callbacks/tracers/schemas.py +8 -8
- langchain/schema/callbacks/tracers/stdout.py +3 -3
- langchain/schema/document.py +1 -1
- langchain/schema/language_model.py +2 -2
- langchain/schema/messages.py +12 -12
- langchain/schema/output.py +3 -3
- langchain/schema/output_parser.py +3 -3
- langchain/schema/runnable/__init__.py +3 -3
- langchain/schema/runnable/base.py +9 -9
- langchain/schema/runnable/config.py +5 -5
- langchain/schema/runnable/configurable.py +1 -1
- langchain/schema/runnable/history.py +1 -1
- langchain/schema/runnable/passthrough.py +1 -1
- langchain/schema/runnable/utils.py +16 -16
- langchain/schema/vectorstore.py +1 -1
- langchain/smith/__init__.py +2 -1
- langchain/smith/evaluation/__init__.py +2 -2
- langchain/smith/evaluation/config.py +9 -23
- langchain/smith/evaluation/name_generation.py +3 -3
- langchain/smith/evaluation/progress.py +22 -4
- langchain/smith/evaluation/runner_utils.py +416 -247
- langchain/smith/evaluation/string_run_evaluator.py +102 -68
- langchain/storage/__init__.py +2 -2
- langchain/storage/_lc_store.py +4 -2
- langchain/storage/encoder_backed.py +7 -2
- langchain/storage/file_system.py +19 -16
- langchain/storage/in_memory.py +1 -1
- langchain/storage/upstash_redis.py +1 -1
- langchain/text_splitter.py +15 -15
- langchain/tools/__init__.py +28 -26
- langchain/tools/ainetwork/app.py +1 -1
- langchain/tools/ainetwork/base.py +1 -1
- langchain/tools/ainetwork/owner.py +1 -1
- langchain/tools/ainetwork/rule.py +1 -1
- langchain/tools/ainetwork/transfer.py +1 -1
- langchain/tools/ainetwork/value.py +1 -1
- langchain/tools/amadeus/closest_airport.py +1 -1
- langchain/tools/amadeus/flight_search.py +1 -1
- langchain/tools/azure_cognitive_services/__init__.py +1 -1
- langchain/tools/base.py +4 -4
- langchain/tools/bearly/tool.py +1 -1
- langchain/tools/bing_search/__init__.py +1 -1
- langchain/tools/bing_search/tool.py +1 -1
- langchain/tools/dataforseo_api_search/__init__.py +1 -1
- langchain/tools/dataforseo_api_search/tool.py +1 -1
- langchain/tools/ddg_search/tool.py +1 -1
- langchain/tools/e2b_data_analysis/tool.py +2 -2
- langchain/tools/edenai/__init__.py +1 -1
- langchain/tools/file_management/__init__.py +1 -1
- langchain/tools/file_management/copy.py +1 -1
- langchain/tools/file_management/delete.py +1 -1
- langchain/tools/gmail/__init__.py +2 -2
- langchain/tools/gmail/get_message.py +1 -1
- langchain/tools/gmail/search.py +1 -1
- langchain/tools/gmail/send_message.py +1 -1
- langchain/tools/google_finance/__init__.py +1 -1
- langchain/tools/google_finance/tool.py +1 -1
- langchain/tools/google_scholar/__init__.py +1 -1
- langchain/tools/google_scholar/tool.py +1 -1
- langchain/tools/google_search/__init__.py +1 -1
- langchain/tools/google_search/tool.py +1 -1
- langchain/tools/google_serper/__init__.py +1 -1
- langchain/tools/google_serper/tool.py +1 -1
- langchain/tools/google_trends/__init__.py +1 -1
- langchain/tools/google_trends/tool.py +1 -1
- langchain/tools/jira/tool.py +20 -1
- langchain/tools/json/tool.py +25 -3
- langchain/tools/memorize/tool.py +1 -1
- langchain/tools/multion/__init__.py +1 -1
- langchain/tools/multion/update_session.py +1 -1
- langchain/tools/office365/__init__.py +2 -2
- langchain/tools/office365/events_search.py +1 -1
- langchain/tools/office365/messages_search.py +1 -1
- langchain/tools/office365/send_event.py +1 -1
- langchain/tools/office365/send_message.py +1 -1
- langchain/tools/openapi/utils/api_models.py +6 -6
- langchain/tools/playwright/__init__.py +5 -5
- langchain/tools/playwright/click.py +1 -1
- langchain/tools/playwright/extract_hyperlinks.py +1 -1
- langchain/tools/playwright/get_elements.py +1 -1
- langchain/tools/playwright/navigate.py +1 -1
- langchain/tools/plugin.py +2 -2
- langchain/tools/powerbi/tool.py +1 -1
- langchain/tools/python/__init__.py +3 -2
- langchain/tools/reddit_search/tool.py +1 -1
- langchain/tools/render.py +2 -2
- langchain/tools/requests/tool.py +2 -2
- langchain/tools/searchapi/tool.py +1 -1
- langchain/tools/searx_search/tool.py +1 -1
- langchain/tools/slack/get_message.py +1 -1
- langchain/tools/spark_sql/tool.py +1 -1
- langchain/tools/sql_database/tool.py +1 -1
- langchain/tools/tavily_search/__init__.py +1 -1
- langchain/tools/tavily_search/tool.py +1 -1
- langchain/tools/zapier/__init__.py +1 -1
- langchain/tools/zapier/tool.py +24 -2
- langchain/utilities/__init__.py +4 -4
- langchain/utilities/arcee.py +4 -4
- langchain/utilities/clickup.py +4 -4
- langchain/utilities/dalle_image_generator.py +1 -1
- langchain/utilities/dataforseo_api_search.py +1 -1
- langchain/utilities/opaqueprompts.py +1 -1
- langchain/utilities/reddit_search.py +1 -1
- langchain/utilities/sql_database.py +1 -1
- langchain/utilities/tavily_search.py +1 -1
- langchain/utilities/vertexai.py +2 -2
- langchain/utils/__init__.py +1 -1
- langchain/utils/aiter.py +1 -1
- langchain/utils/html.py +3 -3
- langchain/utils/input.py +1 -1
- langchain/utils/iter.py +1 -1
- langchain/utils/json_schema.py +1 -3
- langchain/utils/strings.py +1 -1
- langchain/utils/utils.py +6 -6
- langchain/vectorstores/__init__.py +5 -5
- langchain/vectorstores/alibabacloud_opensearch.py +1 -1
- langchain/vectorstores/azure_cosmos_db.py +1 -1
- langchain/vectorstores/clickhouse.py +1 -1
- langchain/vectorstores/elastic_vector_search.py +1 -1
- langchain/vectorstores/elasticsearch.py +2 -2
- langchain/vectorstores/myscale.py +1 -1
- langchain/vectorstores/neo4j_vector.py +1 -1
- langchain/vectorstores/pgembedding.py +1 -1
- langchain/vectorstores/qdrant.py +1 -1
- langchain/vectorstores/redis/__init__.py +1 -1
- langchain/vectorstores/redis/base.py +1 -1
- langchain/vectorstores/redis/filters.py +4 -4
- langchain/vectorstores/redis/schema.py +6 -6
- langchain/vectorstores/sklearn.py +2 -2
- langchain/vectorstores/starrocks.py +1 -1
- langchain/vectorstores/utils.py +1 -1
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/METADATA +4 -14
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/RECORD +590 -591
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/WHEEL +1 -1
- langchain/smith/evaluation/utils.py +0 -0
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/entry_points.txt +0 -0
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/licenses/LICENSE +0 -0
langchain/agents/agent.py
CHANGED
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import builtins
|
|
7
|
+
import contextlib
|
|
7
8
|
import json
|
|
8
9
|
import logging
|
|
9
10
|
import time
|
|
@@ -41,7 +42,7 @@ from langchain_core.runnables.utils import AddableDict
|
|
|
41
42
|
from langchain_core.tools import BaseTool
|
|
42
43
|
from langchain_core.utils.input import get_color_mapping
|
|
43
44
|
from pydantic import BaseModel, ConfigDict, model_validator
|
|
44
|
-
from typing_extensions import Self
|
|
45
|
+
from typing_extensions import Self, override
|
|
45
46
|
|
|
46
47
|
from langchain._api.deprecation import AGENT_DEPRECATION_WARNING
|
|
47
48
|
from langchain.agents.agent_iterator import AgentExecutorIterator
|
|
@@ -63,6 +64,7 @@ class BaseSingleActionAgent(BaseModel):
|
|
|
63
64
|
return ["output"]
|
|
64
65
|
|
|
65
66
|
def get_allowed_tools(self) -> Optional[list[str]]:
|
|
67
|
+
"""Get allowed tools."""
|
|
66
68
|
return None
|
|
67
69
|
|
|
68
70
|
@abstractmethod
|
|
@@ -114,8 +116,8 @@ class BaseSingleActionAgent(BaseModel):
|
|
|
114
116
|
def return_stopped_response(
|
|
115
117
|
self,
|
|
116
118
|
early_stopping_method: str,
|
|
117
|
-
intermediate_steps: list[tuple[AgentAction, str]],
|
|
118
|
-
**
|
|
119
|
+
intermediate_steps: list[tuple[AgentAction, str]], # noqa: ARG002
|
|
120
|
+
**_: Any,
|
|
119
121
|
) -> AgentFinish:
|
|
120
122
|
"""Return response when agent has been stopped due to max iterations.
|
|
121
123
|
|
|
@@ -123,7 +125,6 @@ class BaseSingleActionAgent(BaseModel):
|
|
|
123
125
|
early_stopping_method: Method to use for early stopping.
|
|
124
126
|
intermediate_steps: Steps the LLM has taken to date,
|
|
125
127
|
along with observations.
|
|
126
|
-
**kwargs: User inputs.
|
|
127
128
|
|
|
128
129
|
Returns:
|
|
129
130
|
AgentFinish: Agent finish object.
|
|
@@ -134,12 +135,11 @@ class BaseSingleActionAgent(BaseModel):
|
|
|
134
135
|
if early_stopping_method == "force":
|
|
135
136
|
# `force` just returns a constant string
|
|
136
137
|
return AgentFinish(
|
|
137
|
-
{"output": "Agent stopped due to iteration limit or time limit."},
|
|
138
|
-
|
|
139
|
-
else:
|
|
140
|
-
raise ValueError(
|
|
141
|
-
f"Got unsupported early_stopping_method `{early_stopping_method}`"
|
|
138
|
+
{"output": "Agent stopped due to iteration limit or time limit."},
|
|
139
|
+
"",
|
|
142
140
|
)
|
|
141
|
+
msg = f"Got unsupported early_stopping_method `{early_stopping_method}`"
|
|
142
|
+
raise ValueError(msg)
|
|
143
143
|
|
|
144
144
|
@classmethod
|
|
145
145
|
def from_llm_and_tools(
|
|
@@ -167,6 +167,7 @@ class BaseSingleActionAgent(BaseModel):
|
|
|
167
167
|
"""Return Identifier of an agent type."""
|
|
168
168
|
raise NotImplementedError
|
|
169
169
|
|
|
170
|
+
@override
|
|
170
171
|
def dict(self, **kwargs: Any) -> builtins.dict:
|
|
171
172
|
"""Return dictionary representation of agent.
|
|
172
173
|
|
|
@@ -195,12 +196,10 @@ class BaseSingleActionAgent(BaseModel):
|
|
|
195
196
|
|
|
196
197
|
# If working with agent executor
|
|
197
198
|
agent.agent.save(file_path="path/agent.yaml")
|
|
199
|
+
|
|
198
200
|
"""
|
|
199
201
|
# Convert file to Path object.
|
|
200
|
-
if isinstance(file_path, str)
|
|
201
|
-
save_path = Path(file_path)
|
|
202
|
-
else:
|
|
203
|
-
save_path = file_path
|
|
202
|
+
save_path = Path(file_path) if isinstance(file_path, str) else file_path
|
|
204
203
|
|
|
205
204
|
directory_path = save_path.parent
|
|
206
205
|
directory_path.mkdir(parents=True, exist_ok=True)
|
|
@@ -208,16 +207,18 @@ class BaseSingleActionAgent(BaseModel):
|
|
|
208
207
|
# Fetch dictionary to save
|
|
209
208
|
agent_dict = self.dict()
|
|
210
209
|
if "_type" not in agent_dict:
|
|
211
|
-
|
|
210
|
+
msg = f"Agent {self} does not support saving"
|
|
211
|
+
raise NotImplementedError(msg)
|
|
212
212
|
|
|
213
213
|
if save_path.suffix == ".json":
|
|
214
|
-
with open(
|
|
214
|
+
with save_path.open("w") as f:
|
|
215
215
|
json.dump(agent_dict, f, indent=4)
|
|
216
216
|
elif save_path.suffix.endswith((".yaml", ".yml")):
|
|
217
|
-
with open(
|
|
217
|
+
with save_path.open("w") as f:
|
|
218
218
|
yaml.dump(agent_dict, f, default_flow_style=False)
|
|
219
219
|
else:
|
|
220
|
-
|
|
220
|
+
msg = f"{save_path} must be json or yaml"
|
|
221
|
+
raise ValueError(msg)
|
|
221
222
|
|
|
222
223
|
def tool_run_logging_kwargs(self) -> builtins.dict:
|
|
223
224
|
"""Return logging kwargs for tool run."""
|
|
@@ -289,8 +290,8 @@ class BaseMultiActionAgent(BaseModel):
|
|
|
289
290
|
def return_stopped_response(
|
|
290
291
|
self,
|
|
291
292
|
early_stopping_method: str,
|
|
292
|
-
intermediate_steps: list[tuple[AgentAction, str]],
|
|
293
|
-
**
|
|
293
|
+
intermediate_steps: list[tuple[AgentAction, str]], # noqa: ARG002
|
|
294
|
+
**_: Any,
|
|
294
295
|
) -> AgentFinish:
|
|
295
296
|
"""Return response when agent has been stopped due to max iterations.
|
|
296
297
|
|
|
@@ -298,7 +299,6 @@ class BaseMultiActionAgent(BaseModel):
|
|
|
298
299
|
early_stopping_method: Method to use for early stopping.
|
|
299
300
|
intermediate_steps: Steps the LLM has taken to date,
|
|
300
301
|
along with observations.
|
|
301
|
-
**kwargs: User inputs.
|
|
302
302
|
|
|
303
303
|
Returns:
|
|
304
304
|
AgentFinish: Agent finish object.
|
|
@@ -309,23 +309,20 @@ class BaseMultiActionAgent(BaseModel):
|
|
|
309
309
|
if early_stopping_method == "force":
|
|
310
310
|
# `force` just returns a constant string
|
|
311
311
|
return AgentFinish({"output": "Agent stopped due to max iterations."}, "")
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
f"Got unsupported early_stopping_method `{early_stopping_method}`"
|
|
315
|
-
)
|
|
312
|
+
msg = f"Got unsupported early_stopping_method `{early_stopping_method}`"
|
|
313
|
+
raise ValueError(msg)
|
|
316
314
|
|
|
317
315
|
@property
|
|
318
316
|
def _agent_type(self) -> str:
|
|
319
317
|
"""Return Identifier of an agent type."""
|
|
320
318
|
raise NotImplementedError
|
|
321
319
|
|
|
320
|
+
@override
|
|
322
321
|
def dict(self, **kwargs: Any) -> builtins.dict:
|
|
323
322
|
"""Return dictionary representation of agent."""
|
|
324
323
|
_dict = super().model_dump()
|
|
325
|
-
|
|
324
|
+
with contextlib.suppress(NotImplementedError):
|
|
326
325
|
_dict["_type"] = str(self._agent_type)
|
|
327
|
-
except NotImplementedError:
|
|
328
|
-
pass
|
|
329
326
|
return _dict
|
|
330
327
|
|
|
331
328
|
def save(self, file_path: Union[Path, str]) -> None:
|
|
@@ -343,29 +340,29 @@ class BaseMultiActionAgent(BaseModel):
|
|
|
343
340
|
|
|
344
341
|
# If working with agent executor
|
|
345
342
|
agent.agent.save(file_path="path/agent.yaml")
|
|
343
|
+
|
|
346
344
|
"""
|
|
347
345
|
# Convert file to Path object.
|
|
348
|
-
if isinstance(file_path, str)
|
|
349
|
-
save_path = Path(file_path)
|
|
350
|
-
else:
|
|
351
|
-
save_path = file_path
|
|
346
|
+
save_path = Path(file_path) if isinstance(file_path, str) else file_path
|
|
352
347
|
|
|
353
348
|
# Fetch dictionary to save
|
|
354
349
|
agent_dict = self.dict()
|
|
355
350
|
if "_type" not in agent_dict:
|
|
356
|
-
|
|
351
|
+
msg = f"Agent {self} does not support saving."
|
|
352
|
+
raise NotImplementedError(msg)
|
|
357
353
|
|
|
358
354
|
directory_path = save_path.parent
|
|
359
355
|
directory_path.mkdir(parents=True, exist_ok=True)
|
|
360
356
|
|
|
361
357
|
if save_path.suffix == ".json":
|
|
362
|
-
with open(
|
|
358
|
+
with save_path.open("w") as f:
|
|
363
359
|
json.dump(agent_dict, f, indent=4)
|
|
364
360
|
elif save_path.suffix.endswith((".yaml", ".yml")):
|
|
365
|
-
with open(
|
|
361
|
+
with save_path.open("w") as f:
|
|
366
362
|
yaml.dump(agent_dict, f, default_flow_style=False)
|
|
367
363
|
else:
|
|
368
|
-
|
|
364
|
+
msg = f"{save_path} must be json or yaml"
|
|
365
|
+
raise ValueError(msg)
|
|
369
366
|
|
|
370
367
|
def tool_run_logging_kwargs(self) -> builtins.dict:
|
|
371
368
|
"""Return logging kwargs for tool run."""
|
|
@@ -382,7 +379,7 @@ class AgentOutputParser(BaseOutputParser[Union[AgentAction, AgentFinish]]):
|
|
|
382
379
|
|
|
383
380
|
|
|
384
381
|
class MultiActionAgentOutputParser(
|
|
385
|
-
BaseOutputParser[Union[list[AgentAction], AgentFinish]]
|
|
382
|
+
BaseOutputParser[Union[list[AgentAction], AgentFinish]],
|
|
386
383
|
):
|
|
387
384
|
"""Base class for parsing agent output into agent actions/finish.
|
|
388
385
|
|
|
@@ -449,7 +446,7 @@ class RunnableAgent(BaseSingleActionAgent):
|
|
|
449
446
|
Returns:
|
|
450
447
|
Action specifying what tool to use.
|
|
451
448
|
"""
|
|
452
|
-
inputs = {**kwargs,
|
|
449
|
+
inputs = {**kwargs, "intermediate_steps": intermediate_steps}
|
|
453
450
|
final_output: Any = None
|
|
454
451
|
if self.stream_runnable:
|
|
455
452
|
# Use streaming to make sure that the underlying LLM is invoked in a
|
|
@@ -488,7 +485,7 @@ class RunnableAgent(BaseSingleActionAgent):
|
|
|
488
485
|
Returns:
|
|
489
486
|
Action specifying what tool to use.
|
|
490
487
|
"""
|
|
491
|
-
inputs = {**kwargs,
|
|
488
|
+
inputs = {**kwargs, "intermediate_steps": intermediate_steps}
|
|
492
489
|
final_output: Any = None
|
|
493
490
|
if self.stream_runnable:
|
|
494
491
|
# Use streaming to make sure that the underlying LLM is invoked in a
|
|
@@ -498,7 +495,8 @@ class RunnableAgent(BaseSingleActionAgent):
|
|
|
498
495
|
# Because the response from the plan is not a generator, we need to
|
|
499
496
|
# accumulate the output into final output and return that.
|
|
500
497
|
async for chunk in self.runnable.astream(
|
|
501
|
-
inputs,
|
|
498
|
+
inputs,
|
|
499
|
+
config={"callbacks": callbacks},
|
|
502
500
|
):
|
|
503
501
|
if final_output is None:
|
|
504
502
|
final_output = chunk
|
|
@@ -506,7 +504,8 @@ class RunnableAgent(BaseSingleActionAgent):
|
|
|
506
504
|
final_output += chunk
|
|
507
505
|
else:
|
|
508
506
|
final_output = await self.runnable.ainvoke(
|
|
509
|
-
inputs,
|
|
507
|
+
inputs,
|
|
508
|
+
config={"callbacks": callbacks},
|
|
510
509
|
)
|
|
511
510
|
return final_output
|
|
512
511
|
|
|
@@ -565,7 +564,7 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
|
|
|
565
564
|
Returns:
|
|
566
565
|
Action specifying what tool to use.
|
|
567
566
|
"""
|
|
568
|
-
inputs = {**kwargs,
|
|
567
|
+
inputs = {**kwargs, "intermediate_steps": intermediate_steps}
|
|
569
568
|
final_output: Any = None
|
|
570
569
|
if self.stream_runnable:
|
|
571
570
|
# Use streaming to make sure that the underlying LLM is invoked in a
|
|
@@ -604,7 +603,7 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
|
|
|
604
603
|
Returns:
|
|
605
604
|
Action specifying what tool to use.
|
|
606
605
|
"""
|
|
607
|
-
inputs = {**kwargs,
|
|
606
|
+
inputs = {**kwargs, "intermediate_steps": intermediate_steps}
|
|
608
607
|
final_output: Any = None
|
|
609
608
|
if self.stream_runnable:
|
|
610
609
|
# Use streaming to make sure that the underlying LLM is invoked in a
|
|
@@ -614,7 +613,8 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
|
|
|
614
613
|
# Because the response from the plan is not a generator, we need to
|
|
615
614
|
# accumulate the output into final output and return that.
|
|
616
615
|
async for chunk in self.runnable.astream(
|
|
617
|
-
inputs,
|
|
616
|
+
inputs,
|
|
617
|
+
config={"callbacks": callbacks},
|
|
618
618
|
):
|
|
619
619
|
if final_output is None:
|
|
620
620
|
final_output = chunk
|
|
@@ -622,7 +622,8 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
|
|
|
622
622
|
final_output += chunk
|
|
623
623
|
else:
|
|
624
624
|
final_output = await self.runnable.ainvoke(
|
|
625
|
-
inputs,
|
|
625
|
+
inputs,
|
|
626
|
+
config={"callbacks": callbacks},
|
|
626
627
|
)
|
|
627
628
|
|
|
628
629
|
return final_output
|
|
@@ -652,6 +653,7 @@ class LLMSingleActionAgent(BaseSingleActionAgent):
|
|
|
652
653
|
"""
|
|
653
654
|
return list(set(self.llm_chain.input_keys) - {"intermediate_steps"})
|
|
654
655
|
|
|
656
|
+
@override
|
|
655
657
|
def dict(self, **kwargs: Any) -> builtins.dict:
|
|
656
658
|
"""Return dictionary representation of agent."""
|
|
657
659
|
_dict = super().dict()
|
|
@@ -736,6 +738,7 @@ class Agent(BaseSingleActionAgent):
|
|
|
736
738
|
allowed_tools: Optional[list[str]] = None
|
|
737
739
|
"""Allowed tools for the agent. If None, all tools are allowed."""
|
|
738
740
|
|
|
741
|
+
@override
|
|
739
742
|
def dict(self, **kwargs: Any) -> builtins.dict:
|
|
740
743
|
"""Return dictionary representation of agent."""
|
|
741
744
|
_dict = super().dict()
|
|
@@ -751,17 +754,6 @@ class Agent(BaseSingleActionAgent):
|
|
|
751
754
|
"""Return values of the agent."""
|
|
752
755
|
return ["output"]
|
|
753
756
|
|
|
754
|
-
def _fix_text(self, text: str) -> str:
|
|
755
|
-
"""Fix the text.
|
|
756
|
-
|
|
757
|
-
Args:
|
|
758
|
-
text: Text to fix.
|
|
759
|
-
|
|
760
|
-
Returns:
|
|
761
|
-
str: Fixed text.
|
|
762
|
-
"""
|
|
763
|
-
raise ValueError("fix_text not implemented for this agent.")
|
|
764
|
-
|
|
765
757
|
@property
|
|
766
758
|
def _stop(self) -> list[str]:
|
|
767
759
|
return [
|
|
@@ -770,7 +762,8 @@ class Agent(BaseSingleActionAgent):
|
|
|
770
762
|
]
|
|
771
763
|
|
|
772
764
|
def _construct_scratchpad(
|
|
773
|
-
self,
|
|
765
|
+
self,
|
|
766
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
774
767
|
) -> Union[str, list[BaseMessage]]:
|
|
775
768
|
"""Construct the scratchpad that lets the agent continue its thought process."""
|
|
776
769
|
thoughts = ""
|
|
@@ -819,11 +812,12 @@ class Agent(BaseSingleActionAgent):
|
|
|
819
812
|
"""
|
|
820
813
|
full_inputs = self.get_full_inputs(intermediate_steps, **kwargs)
|
|
821
814
|
full_output = await self.llm_chain.apredict(callbacks=callbacks, **full_inputs)
|
|
822
|
-
|
|
823
|
-
return agent_output
|
|
815
|
+
return await self.output_parser.aparse(full_output)
|
|
824
816
|
|
|
825
817
|
def get_full_inputs(
|
|
826
|
-
self,
|
|
818
|
+
self,
|
|
819
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
820
|
+
**kwargs: Any,
|
|
827
821
|
) -> builtins.dict[str, Any]:
|
|
828
822
|
"""Create the full inputs for the LLMChain from intermediate steps.
|
|
829
823
|
|
|
@@ -837,8 +831,7 @@ class Agent(BaseSingleActionAgent):
|
|
|
837
831
|
"""
|
|
838
832
|
thoughts = self._construct_scratchpad(intermediate_steps)
|
|
839
833
|
new_inputs = {"agent_scratchpad": thoughts, "stop": self._stop}
|
|
840
|
-
|
|
841
|
-
return full_inputs
|
|
834
|
+
return {**kwargs, **new_inputs}
|
|
842
835
|
|
|
843
836
|
@property
|
|
844
837
|
def input_keys(self) -> list[str]:
|
|
@@ -866,7 +859,7 @@ class Agent(BaseSingleActionAgent):
|
|
|
866
859
|
if "agent_scratchpad" not in prompt.input_variables:
|
|
867
860
|
logger.warning(
|
|
868
861
|
"`agent_scratchpad` should be a variable in prompt.input_variables."
|
|
869
|
-
" Did not find it, so adding it at the end."
|
|
862
|
+
" Did not find it, so adding it at the end.",
|
|
870
863
|
)
|
|
871
864
|
prompt.input_variables.append("agent_scratchpad")
|
|
872
865
|
if isinstance(prompt, PromptTemplate):
|
|
@@ -874,7 +867,8 @@ class Agent(BaseSingleActionAgent):
|
|
|
874
867
|
elif isinstance(prompt, FewShotPromptTemplate):
|
|
875
868
|
prompt.suffix += "\n{agent_scratchpad}"
|
|
876
869
|
else:
|
|
877
|
-
|
|
870
|
+
msg = f"Got unexpected prompt type {type(prompt)}"
|
|
871
|
+
raise ValueError(msg)
|
|
878
872
|
return self
|
|
879
873
|
|
|
880
874
|
@property
|
|
@@ -907,8 +901,6 @@ class Agent(BaseSingleActionAgent):
|
|
|
907
901
|
tools: Tools to use.
|
|
908
902
|
"""
|
|
909
903
|
|
|
910
|
-
pass
|
|
911
|
-
|
|
912
904
|
@classmethod
|
|
913
905
|
@abstractmethod
|
|
914
906
|
def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
|
|
@@ -973,9 +965,10 @@ class Agent(BaseSingleActionAgent):
|
|
|
973
965
|
if early_stopping_method == "force":
|
|
974
966
|
# `force` just returns a constant string
|
|
975
967
|
return AgentFinish(
|
|
976
|
-
{"output": "Agent stopped due to iteration limit or time limit."},
|
|
968
|
+
{"output": "Agent stopped due to iteration limit or time limit."},
|
|
969
|
+
"",
|
|
977
970
|
)
|
|
978
|
-
|
|
971
|
+
if early_stopping_method == "generate":
|
|
979
972
|
# Generate does one final forward pass
|
|
980
973
|
thoughts = ""
|
|
981
974
|
for action, observation in intermediate_steps:
|
|
@@ -995,15 +988,14 @@ class Agent(BaseSingleActionAgent):
|
|
|
995
988
|
if isinstance(parsed_output, AgentFinish):
|
|
996
989
|
# If we can extract, we send the correct stuff
|
|
997
990
|
return parsed_output
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
)
|
|
991
|
+
# If we can extract, but the tool is not the final tool,
|
|
992
|
+
# we just return the full output
|
|
993
|
+
return AgentFinish({"output": full_output}, full_output)
|
|
994
|
+
msg = (
|
|
995
|
+
"early_stopping_method should be one of `force` or `generate`, "
|
|
996
|
+
f"got {early_stopping_method}"
|
|
997
|
+
)
|
|
998
|
+
raise ValueError(msg)
|
|
1007
999
|
|
|
1008
1000
|
def tool_run_logging_kwargs(self) -> builtins.dict:
|
|
1009
1001
|
"""Return logging kwargs for tool run."""
|
|
@@ -1021,6 +1013,7 @@ class ExceptionTool(BaseTool):
|
|
|
1021
1013
|
description: str = "Exception tool"
|
|
1022
1014
|
"""Description of the tool."""
|
|
1023
1015
|
|
|
1016
|
+
@override
|
|
1024
1017
|
def _run(
|
|
1025
1018
|
self,
|
|
1026
1019
|
query: str,
|
|
@@ -1028,6 +1021,7 @@ class ExceptionTool(BaseTool):
|
|
|
1028
1021
|
) -> str:
|
|
1029
1022
|
return query
|
|
1030
1023
|
|
|
1024
|
+
@override
|
|
1031
1025
|
async def _arun(
|
|
1032
1026
|
self,
|
|
1033
1027
|
query: str,
|
|
@@ -1082,7 +1076,8 @@ class AgentExecutor(Chain):
|
|
|
1082
1076
|
as an observation.
|
|
1083
1077
|
"""
|
|
1084
1078
|
trim_intermediate_steps: Union[
|
|
1085
|
-
int,
|
|
1079
|
+
int,
|
|
1080
|
+
Callable[[list[tuple[AgentAction, str]]], list[tuple[AgentAction, str]]],
|
|
1086
1081
|
] = -1
|
|
1087
1082
|
"""How to trim the intermediate steps before returning them.
|
|
1088
1083
|
Defaults to -1, which means no trimming.
|
|
@@ -1130,12 +1125,14 @@ class AgentExecutor(Chain):
|
|
|
1130
1125
|
agent = self.agent
|
|
1131
1126
|
tools = self.tools
|
|
1132
1127
|
allowed_tools = agent.get_allowed_tools() # type: ignore[union-attr]
|
|
1133
|
-
if allowed_tools is not None
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
)
|
|
1128
|
+
if allowed_tools is not None and set(allowed_tools) != {
|
|
1129
|
+
tool.name for tool in tools
|
|
1130
|
+
}:
|
|
1131
|
+
msg = (
|
|
1132
|
+
f"Allowed tools ({allowed_tools}) different than "
|
|
1133
|
+
f"provided tools ({[tool.name for tool in tools]})"
|
|
1134
|
+
)
|
|
1135
|
+
raise ValueError(msg)
|
|
1139
1136
|
return self
|
|
1140
1137
|
|
|
1141
1138
|
@model_validator(mode="before")
|
|
@@ -1161,11 +1158,13 @@ class AgentExecutor(Chain):
|
|
|
1161
1158
|
stream_runnable = values.pop("stream_runnable", True)
|
|
1162
1159
|
if multi_action:
|
|
1163
1160
|
values["agent"] = RunnableMultiActionAgent(
|
|
1164
|
-
runnable=agent,
|
|
1161
|
+
runnable=agent,
|
|
1162
|
+
stream_runnable=stream_runnable,
|
|
1165
1163
|
)
|
|
1166
1164
|
else:
|
|
1167
1165
|
values["agent"] = RunnableAgent(
|
|
1168
|
-
runnable=agent,
|
|
1166
|
+
runnable=agent,
|
|
1167
|
+
stream_runnable=stream_runnable,
|
|
1169
1168
|
)
|
|
1170
1169
|
return values
|
|
1171
1170
|
|
|
@@ -1180,10 +1179,10 @@ class AgentExecutor(Chain):
|
|
|
1180
1179
|
to reflect the changes made in the root_validator.
|
|
1181
1180
|
"""
|
|
1182
1181
|
if isinstance(self.agent, Runnable):
|
|
1183
|
-
return cast(RunnableAgentType, self.agent)
|
|
1184
|
-
|
|
1185
|
-
return self.agent
|
|
1182
|
+
return cast("RunnableAgentType", self.agent)
|
|
1183
|
+
return self.agent
|
|
1186
1184
|
|
|
1185
|
+
@override
|
|
1187
1186
|
def save(self, file_path: Union[Path, str]) -> None:
|
|
1188
1187
|
"""Raise error - saving not supported for Agent Executors.
|
|
1189
1188
|
|
|
@@ -1193,11 +1192,12 @@ class AgentExecutor(Chain):
|
|
|
1193
1192
|
Raises:
|
|
1194
1193
|
ValueError: Saving not supported for agent executors.
|
|
1195
1194
|
"""
|
|
1196
|
-
|
|
1195
|
+
msg = (
|
|
1197
1196
|
"Saving not supported for agent executors. "
|
|
1198
1197
|
"If you are trying to save the agent, please use the "
|
|
1199
1198
|
"`.save_agent(...)`"
|
|
1200
1199
|
)
|
|
1200
|
+
raise ValueError(msg)
|
|
1201
1201
|
|
|
1202
1202
|
def save_agent(self, file_path: Union[Path, str]) -> None:
|
|
1203
1203
|
"""Save the underlying agent.
|
|
@@ -1213,7 +1213,7 @@ class AgentExecutor(Chain):
|
|
|
1213
1213
|
callbacks: Callbacks = None,
|
|
1214
1214
|
*,
|
|
1215
1215
|
include_run_info: bool = False,
|
|
1216
|
-
async_: bool = False, # arg kept for backwards compat, but ignored
|
|
1216
|
+
async_: bool = False, # noqa: ARG002 arg kept for backwards compat, but ignored
|
|
1217
1217
|
) -> AgentExecutorIterator:
|
|
1218
1218
|
"""Enables iteration over steps taken to reach final output.
|
|
1219
1219
|
|
|
@@ -1249,9 +1249,8 @@ class AgentExecutor(Chain):
|
|
|
1249
1249
|
:meta private:
|
|
1250
1250
|
"""
|
|
1251
1251
|
if self.return_intermediate_steps:
|
|
1252
|
-
return self._action_agent.return_values
|
|
1253
|
-
|
|
1254
|
-
return self._action_agent.return_values
|
|
1252
|
+
return [*self._action_agent.return_values, "intermediate_steps"]
|
|
1253
|
+
return self._action_agent.return_values
|
|
1255
1254
|
|
|
1256
1255
|
def lookup_tool(self, name: str) -> BaseTool:
|
|
1257
1256
|
"""Lookup tool by name.
|
|
@@ -1267,13 +1266,7 @@ class AgentExecutor(Chain):
|
|
|
1267
1266
|
def _should_continue(self, iterations: int, time_elapsed: float) -> bool:
|
|
1268
1267
|
if self.max_iterations is not None and iterations >= self.max_iterations:
|
|
1269
1268
|
return False
|
|
1270
|
-
|
|
1271
|
-
self.max_execution_time is not None
|
|
1272
|
-
and time_elapsed >= self.max_execution_time
|
|
1273
|
-
):
|
|
1274
|
-
return False
|
|
1275
|
-
|
|
1276
|
-
return True
|
|
1269
|
+
return self.max_execution_time is None or time_elapsed < self.max_execution_time
|
|
1277
1270
|
|
|
1278
1271
|
def _return(
|
|
1279
1272
|
self,
|
|
@@ -1296,7 +1289,9 @@ class AgentExecutor(Chain):
|
|
|
1296
1289
|
) -> dict[str, Any]:
|
|
1297
1290
|
if run_manager:
|
|
1298
1291
|
await run_manager.on_agent_finish(
|
|
1299
|
-
output,
|
|
1292
|
+
output,
|
|
1293
|
+
color="green",
|
|
1294
|
+
verbose=self.verbose,
|
|
1300
1295
|
)
|
|
1301
1296
|
final_output = output.return_values
|
|
1302
1297
|
if self.return_intermediate_steps:
|
|
@@ -1304,15 +1299,15 @@ class AgentExecutor(Chain):
|
|
|
1304
1299
|
return final_output
|
|
1305
1300
|
|
|
1306
1301
|
def _consume_next_step(
|
|
1307
|
-
self,
|
|
1302
|
+
self,
|
|
1303
|
+
values: NextStepOutput,
|
|
1308
1304
|
) -> Union[AgentFinish, list[tuple[AgentAction, str]]]:
|
|
1309
1305
|
if isinstance(values[-1], AgentFinish):
|
|
1310
|
-
|
|
1306
|
+
if len(values) != 1:
|
|
1307
|
+
msg = "Expected a single AgentFinish output, but got multiple values."
|
|
1308
|
+
raise ValueError(msg)
|
|
1311
1309
|
return values[-1]
|
|
1312
|
-
|
|
1313
|
-
return [
|
|
1314
|
-
(a.action, a.observation) for a in values if isinstance(a, AgentStep)
|
|
1315
|
-
]
|
|
1310
|
+
return [(a.action, a.observation) for a in values if isinstance(a, AgentStep)]
|
|
1316
1311
|
|
|
1317
1312
|
def _take_next_step(
|
|
1318
1313
|
self,
|
|
@@ -1323,16 +1318,15 @@ class AgentExecutor(Chain):
|
|
|
1323
1318
|
run_manager: Optional[CallbackManagerForChainRun] = None,
|
|
1324
1319
|
) -> Union[AgentFinish, list[tuple[AgentAction, str]]]:
|
|
1325
1320
|
return self._consume_next_step(
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
for a in self._iter_next_step(
|
|
1321
|
+
list(
|
|
1322
|
+
self._iter_next_step(
|
|
1329
1323
|
name_to_tool_map,
|
|
1330
1324
|
color_mapping,
|
|
1331
1325
|
inputs,
|
|
1332
1326
|
intermediate_steps,
|
|
1333
1327
|
run_manager,
|
|
1334
|
-
)
|
|
1335
|
-
|
|
1328
|
+
),
|
|
1329
|
+
),
|
|
1336
1330
|
)
|
|
1337
1331
|
|
|
1338
1332
|
def _iter_next_step(
|
|
@@ -1362,12 +1356,13 @@ class AgentExecutor(Chain):
|
|
|
1362
1356
|
else:
|
|
1363
1357
|
raise_error = False
|
|
1364
1358
|
if raise_error:
|
|
1365
|
-
|
|
1359
|
+
msg = (
|
|
1366
1360
|
"An output parsing error occurred. "
|
|
1367
1361
|
"In order to pass this error back to the agent and have it try "
|
|
1368
1362
|
"again, pass `handle_parsing_errors=True` to the AgentExecutor. "
|
|
1369
|
-
f"This is the error: {
|
|
1363
|
+
f"This is the error: {e!s}"
|
|
1370
1364
|
)
|
|
1365
|
+
raise ValueError(msg) from e
|
|
1371
1366
|
text = str(e)
|
|
1372
1367
|
if isinstance(self.handle_parsing_errors, bool):
|
|
1373
1368
|
if e.send_to_llm:
|
|
@@ -1380,7 +1375,8 @@ class AgentExecutor(Chain):
|
|
|
1380
1375
|
elif callable(self.handle_parsing_errors):
|
|
1381
1376
|
observation = self.handle_parsing_errors(e)
|
|
1382
1377
|
else:
|
|
1383
|
-
|
|
1378
|
+
msg = "Got unexpected type of `handle_parsing_errors`"
|
|
1379
|
+
raise ValueError(msg) from e # noqa: TRY004
|
|
1384
1380
|
output = AgentAction("_Exception", observation, text)
|
|
1385
1381
|
if run_manager:
|
|
1386
1382
|
run_manager.on_agent_action(output, color="green")
|
|
@@ -1401,15 +1397,15 @@ class AgentExecutor(Chain):
|
|
|
1401
1397
|
return
|
|
1402
1398
|
|
|
1403
1399
|
actions: list[AgentAction]
|
|
1404
|
-
if isinstance(output, AgentAction)
|
|
1405
|
-
actions = [output]
|
|
1406
|
-
else:
|
|
1407
|
-
actions = output
|
|
1400
|
+
actions = [output] if isinstance(output, AgentAction) else output
|
|
1408
1401
|
for agent_action in actions:
|
|
1409
1402
|
yield agent_action
|
|
1410
1403
|
for agent_action in actions:
|
|
1411
1404
|
yield self._perform_agent_action(
|
|
1412
|
-
name_to_tool_map,
|
|
1405
|
+
name_to_tool_map,
|
|
1406
|
+
color_mapping,
|
|
1407
|
+
agent_action,
|
|
1408
|
+
run_manager,
|
|
1413
1409
|
)
|
|
1414
1410
|
|
|
1415
1411
|
def _perform_agent_action(
|
|
@@ -1469,7 +1465,7 @@ class AgentExecutor(Chain):
|
|
|
1469
1465
|
intermediate_steps,
|
|
1470
1466
|
run_manager,
|
|
1471
1467
|
)
|
|
1472
|
-
]
|
|
1468
|
+
],
|
|
1473
1469
|
)
|
|
1474
1470
|
|
|
1475
1471
|
async def _aiter_next_step(
|
|
@@ -1499,12 +1495,13 @@ class AgentExecutor(Chain):
|
|
|
1499
1495
|
else:
|
|
1500
1496
|
raise_error = False
|
|
1501
1497
|
if raise_error:
|
|
1502
|
-
|
|
1498
|
+
msg = (
|
|
1503
1499
|
"An output parsing error occurred. "
|
|
1504
1500
|
"In order to pass this error back to the agent and have it try "
|
|
1505
1501
|
"again, pass `handle_parsing_errors=True` to the AgentExecutor. "
|
|
1506
|
-
f"This is the error: {
|
|
1502
|
+
f"This is the error: {e!s}"
|
|
1507
1503
|
)
|
|
1504
|
+
raise ValueError(msg) from e
|
|
1508
1505
|
text = str(e)
|
|
1509
1506
|
if isinstance(self.handle_parsing_errors, bool):
|
|
1510
1507
|
if e.send_to_llm:
|
|
@@ -1517,7 +1514,8 @@ class AgentExecutor(Chain):
|
|
|
1517
1514
|
elif callable(self.handle_parsing_errors):
|
|
1518
1515
|
observation = self.handle_parsing_errors(e)
|
|
1519
1516
|
else:
|
|
1520
|
-
|
|
1517
|
+
msg = "Got unexpected type of `handle_parsing_errors`"
|
|
1518
|
+
raise ValueError(msg) from e # noqa: TRY004
|
|
1521
1519
|
output = AgentAction("_Exception", observation, text)
|
|
1522
1520
|
tool_run_kwargs = self._action_agent.tool_run_logging_kwargs()
|
|
1523
1521
|
observation = await ExceptionTool().arun(
|
|
@@ -1536,10 +1534,7 @@ class AgentExecutor(Chain):
|
|
|
1536
1534
|
return
|
|
1537
1535
|
|
|
1538
1536
|
actions: list[AgentAction]
|
|
1539
|
-
if isinstance(output, AgentAction)
|
|
1540
|
-
actions = [output]
|
|
1541
|
-
else:
|
|
1542
|
-
actions = output
|
|
1537
|
+
actions = [output] if isinstance(output, AgentAction) else output
|
|
1543
1538
|
for agent_action in actions:
|
|
1544
1539
|
yield agent_action
|
|
1545
1540
|
|
|
@@ -1547,7 +1542,10 @@ class AgentExecutor(Chain):
|
|
|
1547
1542
|
result = await asyncio.gather(
|
|
1548
1543
|
*[
|
|
1549
1544
|
self._aperform_agent_action(
|
|
1550
|
-
name_to_tool_map,
|
|
1545
|
+
name_to_tool_map,
|
|
1546
|
+
color_mapping,
|
|
1547
|
+
agent_action,
|
|
1548
|
+
run_manager,
|
|
1551
1549
|
)
|
|
1552
1550
|
for agent_action in actions
|
|
1553
1551
|
],
|
|
@@ -1566,7 +1564,9 @@ class AgentExecutor(Chain):
|
|
|
1566
1564
|
) -> AgentStep:
|
|
1567
1565
|
if run_manager:
|
|
1568
1566
|
await run_manager.on_agent_action(
|
|
1569
|
-
agent_action,
|
|
1567
|
+
agent_action,
|
|
1568
|
+
verbose=self.verbose,
|
|
1569
|
+
color="green",
|
|
1570
1570
|
)
|
|
1571
1571
|
# Otherwise we lookup the tool
|
|
1572
1572
|
if agent_action.tool in name_to_tool_map:
|
|
@@ -1608,7 +1608,8 @@ class AgentExecutor(Chain):
|
|
|
1608
1608
|
name_to_tool_map = {tool.name: tool for tool in self.tools}
|
|
1609
1609
|
# We construct a mapping from each tool to a color, used for logging.
|
|
1610
1610
|
color_mapping = get_color_mapping(
|
|
1611
|
-
[tool.name for tool in self.tools],
|
|
1611
|
+
[tool.name for tool in self.tools],
|
|
1612
|
+
excluded_colors=["green", "red"],
|
|
1612
1613
|
)
|
|
1613
1614
|
intermediate_steps: list[tuple[AgentAction, str]] = []
|
|
1614
1615
|
# Let's start tracking the number of iterations and time elapsed
|
|
@@ -1626,7 +1627,9 @@ class AgentExecutor(Chain):
|
|
|
1626
1627
|
)
|
|
1627
1628
|
if isinstance(next_step_output, AgentFinish):
|
|
1628
1629
|
return self._return(
|
|
1629
|
-
next_step_output,
|
|
1630
|
+
next_step_output,
|
|
1631
|
+
intermediate_steps,
|
|
1632
|
+
run_manager=run_manager,
|
|
1630
1633
|
)
|
|
1631
1634
|
|
|
1632
1635
|
intermediate_steps.extend(next_step_output)
|
|
@@ -1636,12 +1639,16 @@ class AgentExecutor(Chain):
|
|
|
1636
1639
|
tool_return = self._get_tool_return(next_step_action)
|
|
1637
1640
|
if tool_return is not None:
|
|
1638
1641
|
return self._return(
|
|
1639
|
-
tool_return,
|
|
1642
|
+
tool_return,
|
|
1643
|
+
intermediate_steps,
|
|
1644
|
+
run_manager=run_manager,
|
|
1640
1645
|
)
|
|
1641
1646
|
iterations += 1
|
|
1642
1647
|
time_elapsed = time.time() - start_time
|
|
1643
1648
|
output = self._action_agent.return_stopped_response(
|
|
1644
|
-
self.early_stopping_method,
|
|
1649
|
+
self.early_stopping_method,
|
|
1650
|
+
intermediate_steps,
|
|
1651
|
+
**inputs,
|
|
1645
1652
|
)
|
|
1646
1653
|
return self._return(output, intermediate_steps, run_manager=run_manager)
|
|
1647
1654
|
|
|
@@ -1655,7 +1662,8 @@ class AgentExecutor(Chain):
|
|
|
1655
1662
|
name_to_tool_map = {tool.name: tool for tool in self.tools}
|
|
1656
1663
|
# We construct a mapping from each tool to a color, used for logging.
|
|
1657
1664
|
color_mapping = get_color_mapping(
|
|
1658
|
-
[tool.name for tool in self.tools],
|
|
1665
|
+
[tool.name for tool in self.tools],
|
|
1666
|
+
excluded_colors=["green"],
|
|
1659
1667
|
)
|
|
1660
1668
|
intermediate_steps: list[tuple[AgentAction, str]] = []
|
|
1661
1669
|
# Let's start tracking the number of iterations and time elapsed
|
|
@@ -1687,28 +1695,39 @@ class AgentExecutor(Chain):
|
|
|
1687
1695
|
tool_return = self._get_tool_return(next_step_action)
|
|
1688
1696
|
if tool_return is not None:
|
|
1689
1697
|
return await self._areturn(
|
|
1690
|
-
tool_return,
|
|
1698
|
+
tool_return,
|
|
1699
|
+
intermediate_steps,
|
|
1700
|
+
run_manager=run_manager,
|
|
1691
1701
|
)
|
|
1692
1702
|
|
|
1693
1703
|
iterations += 1
|
|
1694
1704
|
time_elapsed = time.time() - start_time
|
|
1695
1705
|
output = self._action_agent.return_stopped_response(
|
|
1696
|
-
self.early_stopping_method,
|
|
1706
|
+
self.early_stopping_method,
|
|
1707
|
+
intermediate_steps,
|
|
1708
|
+
**inputs,
|
|
1697
1709
|
)
|
|
1698
1710
|
return await self._areturn(
|
|
1699
|
-
output,
|
|
1711
|
+
output,
|
|
1712
|
+
intermediate_steps,
|
|
1713
|
+
run_manager=run_manager,
|
|
1700
1714
|
)
|
|
1701
1715
|
except (TimeoutError, asyncio.TimeoutError):
|
|
1702
1716
|
# stop early when interrupted by the async timeout
|
|
1703
1717
|
output = self._action_agent.return_stopped_response(
|
|
1704
|
-
self.early_stopping_method,
|
|
1718
|
+
self.early_stopping_method,
|
|
1719
|
+
intermediate_steps,
|
|
1720
|
+
**inputs,
|
|
1705
1721
|
)
|
|
1706
1722
|
return await self._areturn(
|
|
1707
|
-
output,
|
|
1723
|
+
output,
|
|
1724
|
+
intermediate_steps,
|
|
1725
|
+
run_manager=run_manager,
|
|
1708
1726
|
)
|
|
1709
1727
|
|
|
1710
1728
|
def _get_tool_return(
|
|
1711
|
-
self,
|
|
1729
|
+
self,
|
|
1730
|
+
next_step_output: tuple[AgentAction, str],
|
|
1712
1731
|
) -> Optional[AgentFinish]:
|
|
1713
1732
|
"""Check if the tool is a returning tool."""
|
|
1714
1733
|
agent_action, observation = next_step_output
|
|
@@ -1717,27 +1736,30 @@ class AgentExecutor(Chain):
|
|
|
1717
1736
|
if len(self._action_agent.return_values) > 0:
|
|
1718
1737
|
return_value_key = self._action_agent.return_values[0]
|
|
1719
1738
|
# Invalid tools won't be in the map, so we return False.
|
|
1720
|
-
if
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1739
|
+
if (
|
|
1740
|
+
agent_action.tool in name_to_tool_map
|
|
1741
|
+
and name_to_tool_map[agent_action.tool].return_direct
|
|
1742
|
+
):
|
|
1743
|
+
return AgentFinish(
|
|
1744
|
+
{return_value_key: observation},
|
|
1745
|
+
"",
|
|
1746
|
+
)
|
|
1726
1747
|
return None
|
|
1727
1748
|
|
|
1728
1749
|
def _prepare_intermediate_steps(
|
|
1729
|
-
self,
|
|
1750
|
+
self,
|
|
1751
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
1730
1752
|
) -> list[tuple[AgentAction, str]]:
|
|
1731
1753
|
if (
|
|
1732
1754
|
isinstance(self.trim_intermediate_steps, int)
|
|
1733
1755
|
and self.trim_intermediate_steps > 0
|
|
1734
1756
|
):
|
|
1735
1757
|
return intermediate_steps[-self.trim_intermediate_steps :]
|
|
1736
|
-
|
|
1758
|
+
if callable(self.trim_intermediate_steps):
|
|
1737
1759
|
return self.trim_intermediate_steps(intermediate_steps)
|
|
1738
|
-
|
|
1739
|
-
return intermediate_steps
|
|
1760
|
+
return intermediate_steps
|
|
1740
1761
|
|
|
1762
|
+
@override
|
|
1741
1763
|
def stream(
|
|
1742
1764
|
self,
|
|
1743
1765
|
input: Union[dict[str, Any], Any],
|
|
@@ -1768,6 +1790,7 @@ class AgentExecutor(Chain):
|
|
|
1768
1790
|
)
|
|
1769
1791
|
yield from iterator
|
|
1770
1792
|
|
|
1793
|
+
@override
|
|
1771
1794
|
async def astream(
|
|
1772
1795
|
self,
|
|
1773
1796
|
input: Union[dict[str, Any], Any],
|