langchain 0.3.26__py3-none-any.whl → 0.3.27__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.
Potentially problematic release.
This version of langchain might be problematic. Click here for more details.
- 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 +160 -133
- langchain/agents/agent_iterator.py +31 -14
- 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 +2 -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 +6 -12
- langchain/agents/chat/output_parser.py +9 -6
- langchain/agents/chat/prompt.py +3 -4
- langchain/agents/conversational/base.py +9 -5
- langchain/agents/conversational/output_parser.py +4 -2
- langchain/agents/conversational/prompt.py +2 -3
- langchain/agents/conversational_chat/base.py +7 -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 +16 -8
- langchain/agents/json_chat/base.py +18 -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 +9 -4
- langchain/agents/mrkl/output_parser.py +17 -13
- langchain/agents/mrkl/prompt.py +1 -2
- langchain/agents/openai_assistant/base.py +80 -70
- langchain/agents/openai_functions_agent/base.py +46 -37
- langchain/agents/openai_functions_multi_agent/base.py +39 -26
- langchain/agents/openai_tools/base.py +8 -8
- langchain/agents/output_parsers/__init__.py +3 -3
- langchain/agents/output_parsers/json.py +6 -6
- langchain/agents/output_parsers/openai_functions.py +15 -7
- langchain/agents/output_parsers/openai_tools.py +9 -4
- langchain/agents/output_parsers/react_json_single_input.py +10 -5
- langchain/agents/output_parsers/react_single_input.py +15 -11
- langchain/agents/output_parsers/self_ask.py +3 -2
- langchain/agents/output_parsers/tools.py +18 -13
- langchain/agents/output_parsers/xml.py +99 -28
- langchain/agents/react/agent.py +4 -4
- langchain/agents/react/base.py +22 -17
- langchain/agents/react/output_parser.py +5 -6
- langchain/agents/react/textworld_prompt.py +0 -1
- langchain/agents/react/wiki_prompt.py +14 -15
- langchain/agents/schema.py +3 -2
- langchain/agents/self_ask_with_search/base.py +19 -15
- langchain/agents/self_ask_with_search/prompt.py +0 -1
- langchain/agents/structured_chat/base.py +14 -11
- langchain/agents/structured_chat/output_parser.py +16 -18
- langchain/agents/structured_chat/prompt.py +3 -4
- langchain/agents/tool_calling_agent/base.py +7 -6
- langchain/agents/tools.py +2 -2
- langchain/agents/utils.py +2 -3
- langchain/agents/xml/base.py +5 -5
- 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 +4 -1
- langchain/callbacks/streaming_aiter_final_only.py +5 -3
- langchain/callbacks/streaming_stdout_final_only.py +5 -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 +1 -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 +36 -22
- 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 +88 -54
- langchain/chains/chat_vector_db/prompts.py +2 -3
- langchain/chains/combine_documents/__init__.py +1 -1
- langchain/chains/combine_documents/base.py +23 -10
- langchain/chains/combine_documents/map_reduce.py +38 -30
- langchain/chains/combine_documents/map_rerank.py +33 -20
- langchain/chains/combine_documents/reduce.py +47 -26
- langchain/chains/combine_documents/refine.py +26 -17
- langchain/chains/combine_documents/stuff.py +19 -12
- langchain/chains/constitutional_ai/base.py +4 -4
- langchain/chains/constitutional_ai/principles.py +22 -25
- langchain/chains/constitutional_ai/prompts.py +25 -28
- langchain/chains/conversation/base.py +5 -3
- langchain/chains/conversation/memory.py +5 -5
- langchain/chains/conversation/prompt.py +5 -5
- langchain/chains/conversational_retrieval/base.py +41 -20
- langchain/chains/conversational_retrieval/prompts.py +2 -3
- langchain/chains/elasticsearch_database/base.py +8 -9
- 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 +26 -12
- 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 +77 -61
- langchain/chains/llm_bash/__init__.py +2 -1
- langchain/chains/llm_checker/base.py +7 -5
- langchain/chains/llm_checker/prompt.py +3 -4
- langchain/chains/llm_math/base.py +16 -9
- langchain/chains/llm_math/prompt.py +1 -2
- langchain/chains/llm_summarization_checker/base.py +9 -6
- langchain/chains/llm_symbolic_math/__init__.py +2 -1
- langchain/chains/loading.py +151 -95
- langchain/chains/mapreduce.py +4 -3
- langchain/chains/moderation.py +8 -9
- langchain/chains/natbot/base.py +8 -8
- langchain/chains/natbot/crawler.py +73 -76
- langchain/chains/natbot/prompt.py +2 -3
- langchain/chains/openai_functions/__init__.py +7 -7
- langchain/chains/openai_functions/base.py +13 -10
- langchain/chains/openai_functions/citation_fuzzy_match.py +12 -11
- langchain/chains/openai_functions/extraction.py +19 -19
- langchain/chains/openai_functions/openapi.py +35 -35
- langchain/chains/openai_functions/qa_with_structure.py +19 -12
- langchain/chains/openai_functions/tagging.py +2 -4
- langchain/chains/openai_tools/extraction.py +7 -8
- langchain/chains/qa_generation/base.py +4 -3
- langchain/chains/qa_generation/prompt.py +5 -5
- langchain/chains/qa_with_sources/base.py +14 -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 +14 -5
- langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
- langchain/chains/qa_with_sources/vector_db.py +17 -6
- langchain/chains/query_constructor/base.py +34 -33
- langchain/chains/query_constructor/ir.py +4 -4
- langchain/chains/query_constructor/parser.py +37 -32
- 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 +34 -27
- langchain/chains/retrieval_qa/prompt.py +1 -2
- langchain/chains/router/__init__.py +3 -3
- langchain/chains/router/base.py +24 -20
- langchain/chains/router/embedding_router.py +12 -8
- langchain/chains/router/llm_router.py +17 -16
- langchain/chains/router/multi_prompt.py +2 -2
- langchain/chains/router/multi_retrieval_qa.py +10 -5
- langchain/chains/sequential.py +30 -18
- langchain/chains/sql_database/prompt.py +14 -16
- langchain/chains/sql_database/query.py +6 -5
- langchain/chains/structured_output/__init__.py +1 -1
- langchain/chains/structured_output/base.py +75 -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 +5 -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 +160 -123
- 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/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 +33 -24
- langchain/embeddings/cache.py +36 -31
- 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 +23 -23
- langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
- langchain/evaluation/comparison/__init__.py +1 -1
- langchain/evaluation/comparison/eval_chain.py +20 -13
- langchain/evaluation/comparison/prompt.py +1 -2
- langchain/evaluation/criteria/__init__.py +1 -1
- langchain/evaluation/criteria/eval_chain.py +20 -11
- langchain/evaluation/criteria/prompt.py +2 -3
- langchain/evaluation/embedding_distance/base.py +23 -20
- langchain/evaluation/loading.py +15 -11
- langchain/evaluation/parsing/base.py +4 -1
- langchain/evaluation/parsing/json_distance.py +5 -2
- langchain/evaluation/parsing/json_schema.py +12 -8
- langchain/evaluation/qa/__init__.py +1 -1
- langchain/evaluation/qa/eval_chain.py +12 -5
- langchain/evaluation/qa/eval_prompt.py +7 -8
- langchain/evaluation/qa/generate_chain.py +2 -1
- langchain/evaluation/qa/generate_prompt.py +2 -4
- langchain/evaluation/schema.py +38 -30
- langchain/evaluation/scoring/__init__.py +1 -1
- langchain/evaluation/scoring/eval_chain.py +22 -15
- langchain/evaluation/scoring/prompt.py +0 -1
- langchain/evaluation/string_distance/base.py +14 -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 +9 -7
- 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 +13 -12
- langchain/memory/entity.py +84 -61
- langchain/memory/prompt.py +10 -11
- langchain/memory/readonly.py +0 -2
- langchain/memory/simple.py +1 -3
- langchain/memory/summary.py +13 -11
- langchain/memory/summary_buffer.py +17 -8
- 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 +10 -5
- langchain/output_parsers/datetime.py +32 -31
- langchain/output_parsers/enum.py +5 -3
- langchain/output_parsers/fix.py +52 -52
- 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 +43 -47
- langchain/output_parsers/prompts.py +1 -2
- langchain/output_parsers/rail_parser.py +1 -1
- langchain/output_parsers/regex.py +7 -8
- langchain/output_parsers/regex_dict.py +7 -10
- langchain/output_parsers/retry.py +77 -78
- langchain/output_parsers/structured.py +11 -6
- langchain/output_parsers/yaml.py +15 -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/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 +2 -2
- 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 +15 -15
- langchain/retrievers/document_compressors/embeddings_filter.py +21 -17
- langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
- langchain/retrievers/document_compressors/listwise_rerank.py +7 -5
- langchain/retrievers/ensemble.py +28 -25
- 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 +32 -26
- langchain/retrievers/multi_vector.py +20 -8
- langchain/retrievers/parent_document_retriever.py +18 -9
- langchain/retrievers/re_phraser.py +6 -5
- langchain/retrievers/self_query/base.py +138 -127
- langchain/retrievers/time_weighted_retriever.py +18 -7
- langchain/retrievers/zilliz.py +1 -1
- langchain/runnables/openai_functions.py +6 -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 +1 -1
- langchain/smith/evaluation/__init__.py +2 -2
- langchain/smith/evaluation/config.py +10 -7
- langchain/smith/evaluation/name_generation.py +3 -3
- langchain/smith/evaluation/progress.py +11 -2
- langchain/smith/evaluation/runner_utils.py +179 -127
- langchain/smith/evaluation/string_run_evaluator.py +75 -68
- langchain/storage/__init__.py +2 -2
- langchain/storage/_lc_store.py +4 -2
- langchain/storage/encoder_backed.py +6 -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 +2 -1
- 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.3.27.dist-info}/METADATA +4 -4
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/RECORD +580 -580
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/WHEEL +1 -1
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/entry_points.txt +0 -0
- {langchain-0.3.26.dist-info → langchain-0.3.27.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
|
|
@@ -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(
|
|
@@ -197,10 +197,7 @@ class BaseSingleActionAgent(BaseModel):
|
|
|
197
197
|
agent.agent.save(file_path="path/agent.yaml")
|
|
198
198
|
"""
|
|
199
199
|
# Convert file to Path object.
|
|
200
|
-
if isinstance(file_path, str)
|
|
201
|
-
save_path = Path(file_path)
|
|
202
|
-
else:
|
|
203
|
-
save_path = file_path
|
|
200
|
+
save_path = Path(file_path) if isinstance(file_path, str) else file_path
|
|
204
201
|
|
|
205
202
|
directory_path = save_path.parent
|
|
206
203
|
directory_path.mkdir(parents=True, exist_ok=True)
|
|
@@ -208,16 +205,18 @@ class BaseSingleActionAgent(BaseModel):
|
|
|
208
205
|
# Fetch dictionary to save
|
|
209
206
|
agent_dict = self.dict()
|
|
210
207
|
if "_type" not in agent_dict:
|
|
211
|
-
|
|
208
|
+
msg = f"Agent {self} does not support saving"
|
|
209
|
+
raise NotImplementedError(msg)
|
|
212
210
|
|
|
213
211
|
if save_path.suffix == ".json":
|
|
214
|
-
with open(
|
|
212
|
+
with save_path.open("w") as f:
|
|
215
213
|
json.dump(agent_dict, f, indent=4)
|
|
216
214
|
elif save_path.suffix.endswith((".yaml", ".yml")):
|
|
217
|
-
with open(
|
|
215
|
+
with save_path.open("w") as f:
|
|
218
216
|
yaml.dump(agent_dict, f, default_flow_style=False)
|
|
219
217
|
else:
|
|
220
|
-
|
|
218
|
+
msg = f"{save_path} must be json or yaml"
|
|
219
|
+
raise ValueError(msg)
|
|
221
220
|
|
|
222
221
|
def tool_run_logging_kwargs(self) -> builtins.dict:
|
|
223
222
|
"""Return logging kwargs for tool run."""
|
|
@@ -309,10 +308,8 @@ class BaseMultiActionAgent(BaseModel):
|
|
|
309
308
|
if early_stopping_method == "force":
|
|
310
309
|
# `force` just returns a constant string
|
|
311
310
|
return AgentFinish({"output": "Agent stopped due to max iterations."}, "")
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
f"Got unsupported early_stopping_method `{early_stopping_method}`"
|
|
315
|
-
)
|
|
311
|
+
msg = f"Got unsupported early_stopping_method `{early_stopping_method}`"
|
|
312
|
+
raise ValueError(msg)
|
|
316
313
|
|
|
317
314
|
@property
|
|
318
315
|
def _agent_type(self) -> str:
|
|
@@ -322,10 +319,8 @@ class BaseMultiActionAgent(BaseModel):
|
|
|
322
319
|
def dict(self, **kwargs: Any) -> builtins.dict:
|
|
323
320
|
"""Return dictionary representation of agent."""
|
|
324
321
|
_dict = super().model_dump()
|
|
325
|
-
|
|
322
|
+
with contextlib.suppress(NotImplementedError):
|
|
326
323
|
_dict["_type"] = str(self._agent_type)
|
|
327
|
-
except NotImplementedError:
|
|
328
|
-
pass
|
|
329
324
|
return _dict
|
|
330
325
|
|
|
331
326
|
def save(self, file_path: Union[Path, str]) -> None:
|
|
@@ -345,27 +340,26 @@ class BaseMultiActionAgent(BaseModel):
|
|
|
345
340
|
agent.agent.save(file_path="path/agent.yaml")
|
|
346
341
|
"""
|
|
347
342
|
# Convert file to Path object.
|
|
348
|
-
if isinstance(file_path, str)
|
|
349
|
-
save_path = Path(file_path)
|
|
350
|
-
else:
|
|
351
|
-
save_path = file_path
|
|
343
|
+
save_path = Path(file_path) if isinstance(file_path, str) else file_path
|
|
352
344
|
|
|
353
345
|
# Fetch dictionary to save
|
|
354
346
|
agent_dict = self.dict()
|
|
355
347
|
if "_type" not in agent_dict:
|
|
356
|
-
|
|
348
|
+
msg = f"Agent {self} does not support saving."
|
|
349
|
+
raise NotImplementedError(msg)
|
|
357
350
|
|
|
358
351
|
directory_path = save_path.parent
|
|
359
352
|
directory_path.mkdir(parents=True, exist_ok=True)
|
|
360
353
|
|
|
361
354
|
if save_path.suffix == ".json":
|
|
362
|
-
with open(
|
|
355
|
+
with save_path.open("w") as f:
|
|
363
356
|
json.dump(agent_dict, f, indent=4)
|
|
364
357
|
elif save_path.suffix.endswith((".yaml", ".yml")):
|
|
365
|
-
with open(
|
|
358
|
+
with save_path.open("w") as f:
|
|
366
359
|
yaml.dump(agent_dict, f, default_flow_style=False)
|
|
367
360
|
else:
|
|
368
|
-
|
|
361
|
+
msg = f"{save_path} must be json or yaml"
|
|
362
|
+
raise ValueError(msg)
|
|
369
363
|
|
|
370
364
|
def tool_run_logging_kwargs(self) -> builtins.dict:
|
|
371
365
|
"""Return logging kwargs for tool run."""
|
|
@@ -382,7 +376,7 @@ class AgentOutputParser(BaseOutputParser[Union[AgentAction, AgentFinish]]):
|
|
|
382
376
|
|
|
383
377
|
|
|
384
378
|
class MultiActionAgentOutputParser(
|
|
385
|
-
BaseOutputParser[Union[list[AgentAction], AgentFinish]]
|
|
379
|
+
BaseOutputParser[Union[list[AgentAction], AgentFinish]],
|
|
386
380
|
):
|
|
387
381
|
"""Base class for parsing agent output into agent actions/finish.
|
|
388
382
|
|
|
@@ -449,7 +443,7 @@ class RunnableAgent(BaseSingleActionAgent):
|
|
|
449
443
|
Returns:
|
|
450
444
|
Action specifying what tool to use.
|
|
451
445
|
"""
|
|
452
|
-
inputs = {**kwargs,
|
|
446
|
+
inputs = {**kwargs, "intermediate_steps": intermediate_steps}
|
|
453
447
|
final_output: Any = None
|
|
454
448
|
if self.stream_runnable:
|
|
455
449
|
# Use streaming to make sure that the underlying LLM is invoked in a
|
|
@@ -488,7 +482,7 @@ class RunnableAgent(BaseSingleActionAgent):
|
|
|
488
482
|
Returns:
|
|
489
483
|
Action specifying what tool to use.
|
|
490
484
|
"""
|
|
491
|
-
inputs = {**kwargs,
|
|
485
|
+
inputs = {**kwargs, "intermediate_steps": intermediate_steps}
|
|
492
486
|
final_output: Any = None
|
|
493
487
|
if self.stream_runnable:
|
|
494
488
|
# Use streaming to make sure that the underlying LLM is invoked in a
|
|
@@ -498,7 +492,8 @@ class RunnableAgent(BaseSingleActionAgent):
|
|
|
498
492
|
# Because the response from the plan is not a generator, we need to
|
|
499
493
|
# accumulate the output into final output and return that.
|
|
500
494
|
async for chunk in self.runnable.astream(
|
|
501
|
-
inputs,
|
|
495
|
+
inputs,
|
|
496
|
+
config={"callbacks": callbacks},
|
|
502
497
|
):
|
|
503
498
|
if final_output is None:
|
|
504
499
|
final_output = chunk
|
|
@@ -506,7 +501,8 @@ class RunnableAgent(BaseSingleActionAgent):
|
|
|
506
501
|
final_output += chunk
|
|
507
502
|
else:
|
|
508
503
|
final_output = await self.runnable.ainvoke(
|
|
509
|
-
inputs,
|
|
504
|
+
inputs,
|
|
505
|
+
config={"callbacks": callbacks},
|
|
510
506
|
)
|
|
511
507
|
return final_output
|
|
512
508
|
|
|
@@ -565,7 +561,7 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
|
|
|
565
561
|
Returns:
|
|
566
562
|
Action specifying what tool to use.
|
|
567
563
|
"""
|
|
568
|
-
inputs = {**kwargs,
|
|
564
|
+
inputs = {**kwargs, "intermediate_steps": intermediate_steps}
|
|
569
565
|
final_output: Any = None
|
|
570
566
|
if self.stream_runnable:
|
|
571
567
|
# Use streaming to make sure that the underlying LLM is invoked in a
|
|
@@ -604,7 +600,7 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
|
|
|
604
600
|
Returns:
|
|
605
601
|
Action specifying what tool to use.
|
|
606
602
|
"""
|
|
607
|
-
inputs = {**kwargs,
|
|
603
|
+
inputs = {**kwargs, "intermediate_steps": intermediate_steps}
|
|
608
604
|
final_output: Any = None
|
|
609
605
|
if self.stream_runnable:
|
|
610
606
|
# Use streaming to make sure that the underlying LLM is invoked in a
|
|
@@ -614,7 +610,8 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
|
|
|
614
610
|
# Because the response from the plan is not a generator, we need to
|
|
615
611
|
# accumulate the output into final output and return that.
|
|
616
612
|
async for chunk in self.runnable.astream(
|
|
617
|
-
inputs,
|
|
613
|
+
inputs,
|
|
614
|
+
config={"callbacks": callbacks},
|
|
618
615
|
):
|
|
619
616
|
if final_output is None:
|
|
620
617
|
final_output = chunk
|
|
@@ -622,7 +619,8 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
|
|
|
622
619
|
final_output += chunk
|
|
623
620
|
else:
|
|
624
621
|
final_output = await self.runnable.ainvoke(
|
|
625
|
-
inputs,
|
|
622
|
+
inputs,
|
|
623
|
+
config={"callbacks": callbacks},
|
|
626
624
|
)
|
|
627
625
|
|
|
628
626
|
return final_output
|
|
@@ -760,7 +758,8 @@ class Agent(BaseSingleActionAgent):
|
|
|
760
758
|
Returns:
|
|
761
759
|
str: Fixed text.
|
|
762
760
|
"""
|
|
763
|
-
|
|
761
|
+
msg = "fix_text not implemented for this agent."
|
|
762
|
+
raise ValueError(msg)
|
|
764
763
|
|
|
765
764
|
@property
|
|
766
765
|
def _stop(self) -> list[str]:
|
|
@@ -770,7 +769,8 @@ class Agent(BaseSingleActionAgent):
|
|
|
770
769
|
]
|
|
771
770
|
|
|
772
771
|
def _construct_scratchpad(
|
|
773
|
-
self,
|
|
772
|
+
self,
|
|
773
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
774
774
|
) -> Union[str, list[BaseMessage]]:
|
|
775
775
|
"""Construct the scratchpad that lets the agent continue its thought process."""
|
|
776
776
|
thoughts = ""
|
|
@@ -819,11 +819,12 @@ class Agent(BaseSingleActionAgent):
|
|
|
819
819
|
"""
|
|
820
820
|
full_inputs = self.get_full_inputs(intermediate_steps, **kwargs)
|
|
821
821
|
full_output = await self.llm_chain.apredict(callbacks=callbacks, **full_inputs)
|
|
822
|
-
|
|
823
|
-
return agent_output
|
|
822
|
+
return await self.output_parser.aparse(full_output)
|
|
824
823
|
|
|
825
824
|
def get_full_inputs(
|
|
826
|
-
self,
|
|
825
|
+
self,
|
|
826
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
827
|
+
**kwargs: Any,
|
|
827
828
|
) -> builtins.dict[str, Any]:
|
|
828
829
|
"""Create the full inputs for the LLMChain from intermediate steps.
|
|
829
830
|
|
|
@@ -837,8 +838,7 @@ class Agent(BaseSingleActionAgent):
|
|
|
837
838
|
"""
|
|
838
839
|
thoughts = self._construct_scratchpad(intermediate_steps)
|
|
839
840
|
new_inputs = {"agent_scratchpad": thoughts, "stop": self._stop}
|
|
840
|
-
|
|
841
|
-
return full_inputs
|
|
841
|
+
return {**kwargs, **new_inputs}
|
|
842
842
|
|
|
843
843
|
@property
|
|
844
844
|
def input_keys(self) -> list[str]:
|
|
@@ -866,7 +866,7 @@ class Agent(BaseSingleActionAgent):
|
|
|
866
866
|
if "agent_scratchpad" not in prompt.input_variables:
|
|
867
867
|
logger.warning(
|
|
868
868
|
"`agent_scratchpad` should be a variable in prompt.input_variables."
|
|
869
|
-
" Did not find it, so adding it at the end."
|
|
869
|
+
" Did not find it, so adding it at the end.",
|
|
870
870
|
)
|
|
871
871
|
prompt.input_variables.append("agent_scratchpad")
|
|
872
872
|
if isinstance(prompt, PromptTemplate):
|
|
@@ -874,7 +874,8 @@ class Agent(BaseSingleActionAgent):
|
|
|
874
874
|
elif isinstance(prompt, FewShotPromptTemplate):
|
|
875
875
|
prompt.suffix += "\n{agent_scratchpad}"
|
|
876
876
|
else:
|
|
877
|
-
|
|
877
|
+
msg = f"Got unexpected prompt type {type(prompt)}"
|
|
878
|
+
raise ValueError(msg)
|
|
878
879
|
return self
|
|
879
880
|
|
|
880
881
|
@property
|
|
@@ -907,8 +908,6 @@ class Agent(BaseSingleActionAgent):
|
|
|
907
908
|
tools: Tools to use.
|
|
908
909
|
"""
|
|
909
910
|
|
|
910
|
-
pass
|
|
911
|
-
|
|
912
911
|
@classmethod
|
|
913
912
|
@abstractmethod
|
|
914
913
|
def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
|
|
@@ -973,9 +972,10 @@ class Agent(BaseSingleActionAgent):
|
|
|
973
972
|
if early_stopping_method == "force":
|
|
974
973
|
# `force` just returns a constant string
|
|
975
974
|
return AgentFinish(
|
|
976
|
-
{"output": "Agent stopped due to iteration limit or time limit."},
|
|
975
|
+
{"output": "Agent stopped due to iteration limit or time limit."},
|
|
976
|
+
"",
|
|
977
977
|
)
|
|
978
|
-
|
|
978
|
+
if early_stopping_method == "generate":
|
|
979
979
|
# Generate does one final forward pass
|
|
980
980
|
thoughts = ""
|
|
981
981
|
for action, observation in intermediate_steps:
|
|
@@ -995,15 +995,14 @@ class Agent(BaseSingleActionAgent):
|
|
|
995
995
|
if isinstance(parsed_output, AgentFinish):
|
|
996
996
|
# If we can extract, we send the correct stuff
|
|
997
997
|
return parsed_output
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
)
|
|
998
|
+
# If we can extract, but the tool is not the final tool,
|
|
999
|
+
# we just return the full output
|
|
1000
|
+
return AgentFinish({"output": full_output}, full_output)
|
|
1001
|
+
msg = (
|
|
1002
|
+
"early_stopping_method should be one of `force` or `generate`, "
|
|
1003
|
+
f"got {early_stopping_method}"
|
|
1004
|
+
)
|
|
1005
|
+
raise ValueError(msg)
|
|
1007
1006
|
|
|
1008
1007
|
def tool_run_logging_kwargs(self) -> builtins.dict:
|
|
1009
1008
|
"""Return logging kwargs for tool run."""
|
|
@@ -1082,7 +1081,8 @@ class AgentExecutor(Chain):
|
|
|
1082
1081
|
as an observation.
|
|
1083
1082
|
"""
|
|
1084
1083
|
trim_intermediate_steps: Union[
|
|
1085
|
-
int,
|
|
1084
|
+
int,
|
|
1085
|
+
Callable[[list[tuple[AgentAction, str]]], list[tuple[AgentAction, str]]],
|
|
1086
1086
|
] = -1
|
|
1087
1087
|
"""How to trim the intermediate steps before returning them.
|
|
1088
1088
|
Defaults to -1, which means no trimming.
|
|
@@ -1130,12 +1130,14 @@ class AgentExecutor(Chain):
|
|
|
1130
1130
|
agent = self.agent
|
|
1131
1131
|
tools = self.tools
|
|
1132
1132
|
allowed_tools = agent.get_allowed_tools() # type: ignore[union-attr]
|
|
1133
|
-
if allowed_tools is not None
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
)
|
|
1133
|
+
if allowed_tools is not None and set(allowed_tools) != {
|
|
1134
|
+
tool.name for tool in tools
|
|
1135
|
+
}:
|
|
1136
|
+
msg = (
|
|
1137
|
+
f"Allowed tools ({allowed_tools}) different than "
|
|
1138
|
+
f"provided tools ({[tool.name for tool in tools]})"
|
|
1139
|
+
)
|
|
1140
|
+
raise ValueError(msg)
|
|
1139
1141
|
return self
|
|
1140
1142
|
|
|
1141
1143
|
@model_validator(mode="before")
|
|
@@ -1161,11 +1163,13 @@ class AgentExecutor(Chain):
|
|
|
1161
1163
|
stream_runnable = values.pop("stream_runnable", True)
|
|
1162
1164
|
if multi_action:
|
|
1163
1165
|
values["agent"] = RunnableMultiActionAgent(
|
|
1164
|
-
runnable=agent,
|
|
1166
|
+
runnable=agent,
|
|
1167
|
+
stream_runnable=stream_runnable,
|
|
1165
1168
|
)
|
|
1166
1169
|
else:
|
|
1167
1170
|
values["agent"] = RunnableAgent(
|
|
1168
|
-
runnable=agent,
|
|
1171
|
+
runnable=agent,
|
|
1172
|
+
stream_runnable=stream_runnable,
|
|
1169
1173
|
)
|
|
1170
1174
|
return values
|
|
1171
1175
|
|
|
@@ -1181,8 +1185,7 @@ class AgentExecutor(Chain):
|
|
|
1181
1185
|
"""
|
|
1182
1186
|
if isinstance(self.agent, Runnable):
|
|
1183
1187
|
return cast(RunnableAgentType, self.agent)
|
|
1184
|
-
|
|
1185
|
-
return self.agent
|
|
1188
|
+
return self.agent
|
|
1186
1189
|
|
|
1187
1190
|
def save(self, file_path: Union[Path, str]) -> None:
|
|
1188
1191
|
"""Raise error - saving not supported for Agent Executors.
|
|
@@ -1193,11 +1196,12 @@ class AgentExecutor(Chain):
|
|
|
1193
1196
|
Raises:
|
|
1194
1197
|
ValueError: Saving not supported for agent executors.
|
|
1195
1198
|
"""
|
|
1196
|
-
|
|
1199
|
+
msg = (
|
|
1197
1200
|
"Saving not supported for agent executors. "
|
|
1198
1201
|
"If you are trying to save the agent, please use the "
|
|
1199
1202
|
"`.save_agent(...)`"
|
|
1200
1203
|
)
|
|
1204
|
+
raise ValueError(msg)
|
|
1201
1205
|
|
|
1202
1206
|
def save_agent(self, file_path: Union[Path, str]) -> None:
|
|
1203
1207
|
"""Save the underlying agent.
|
|
@@ -1249,9 +1253,8 @@ class AgentExecutor(Chain):
|
|
|
1249
1253
|
:meta private:
|
|
1250
1254
|
"""
|
|
1251
1255
|
if self.return_intermediate_steps:
|
|
1252
|
-
return self._action_agent.return_values
|
|
1253
|
-
|
|
1254
|
-
return self._action_agent.return_values
|
|
1256
|
+
return [*self._action_agent.return_values, "intermediate_steps"]
|
|
1257
|
+
return self._action_agent.return_values
|
|
1255
1258
|
|
|
1256
1259
|
def lookup_tool(self, name: str) -> BaseTool:
|
|
1257
1260
|
"""Lookup tool by name.
|
|
@@ -1267,13 +1270,7 @@ class AgentExecutor(Chain):
|
|
|
1267
1270
|
def _should_continue(self, iterations: int, time_elapsed: float) -> bool:
|
|
1268
1271
|
if self.max_iterations is not None and iterations >= self.max_iterations:
|
|
1269
1272
|
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
|
|
1273
|
+
return self.max_execution_time is None or time_elapsed < self.max_execution_time
|
|
1277
1274
|
|
|
1278
1275
|
def _return(
|
|
1279
1276
|
self,
|
|
@@ -1296,7 +1293,9 @@ class AgentExecutor(Chain):
|
|
|
1296
1293
|
) -> dict[str, Any]:
|
|
1297
1294
|
if run_manager:
|
|
1298
1295
|
await run_manager.on_agent_finish(
|
|
1299
|
-
output,
|
|
1296
|
+
output,
|
|
1297
|
+
color="green",
|
|
1298
|
+
verbose=self.verbose,
|
|
1300
1299
|
)
|
|
1301
1300
|
final_output = output.return_values
|
|
1302
1301
|
if self.return_intermediate_steps:
|
|
@@ -1304,15 +1303,15 @@ class AgentExecutor(Chain):
|
|
|
1304
1303
|
return final_output
|
|
1305
1304
|
|
|
1306
1305
|
def _consume_next_step(
|
|
1307
|
-
self,
|
|
1306
|
+
self,
|
|
1307
|
+
values: NextStepOutput,
|
|
1308
1308
|
) -> Union[AgentFinish, list[tuple[AgentAction, str]]]:
|
|
1309
1309
|
if isinstance(values[-1], AgentFinish):
|
|
1310
|
-
|
|
1310
|
+
if len(values) != 1:
|
|
1311
|
+
msg = "Expected a single AgentFinish output, but got multiple values."
|
|
1312
|
+
raise ValueError(msg)
|
|
1311
1313
|
return values[-1]
|
|
1312
|
-
|
|
1313
|
-
return [
|
|
1314
|
-
(a.action, a.observation) for a in values if isinstance(a, AgentStep)
|
|
1315
|
-
]
|
|
1314
|
+
return [(a.action, a.observation) for a in values if isinstance(a, AgentStep)]
|
|
1316
1315
|
|
|
1317
1316
|
def _take_next_step(
|
|
1318
1317
|
self,
|
|
@@ -1323,16 +1322,15 @@ class AgentExecutor(Chain):
|
|
|
1323
1322
|
run_manager: Optional[CallbackManagerForChainRun] = None,
|
|
1324
1323
|
) -> Union[AgentFinish, list[tuple[AgentAction, str]]]:
|
|
1325
1324
|
return self._consume_next_step(
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
for a in self._iter_next_step(
|
|
1325
|
+
list(
|
|
1326
|
+
self._iter_next_step(
|
|
1329
1327
|
name_to_tool_map,
|
|
1330
1328
|
color_mapping,
|
|
1331
1329
|
inputs,
|
|
1332
1330
|
intermediate_steps,
|
|
1333
1331
|
run_manager,
|
|
1334
|
-
)
|
|
1335
|
-
|
|
1332
|
+
),
|
|
1333
|
+
),
|
|
1336
1334
|
)
|
|
1337
1335
|
|
|
1338
1336
|
def _iter_next_step(
|
|
@@ -1362,12 +1360,13 @@ class AgentExecutor(Chain):
|
|
|
1362
1360
|
else:
|
|
1363
1361
|
raise_error = False
|
|
1364
1362
|
if raise_error:
|
|
1365
|
-
|
|
1363
|
+
msg = (
|
|
1366
1364
|
"An output parsing error occurred. "
|
|
1367
1365
|
"In order to pass this error back to the agent and have it try "
|
|
1368
1366
|
"again, pass `handle_parsing_errors=True` to the AgentExecutor. "
|
|
1369
|
-
f"This is the error: {
|
|
1367
|
+
f"This is the error: {e!s}"
|
|
1370
1368
|
)
|
|
1369
|
+
raise ValueError(msg) from e
|
|
1371
1370
|
text = str(e)
|
|
1372
1371
|
if isinstance(self.handle_parsing_errors, bool):
|
|
1373
1372
|
if e.send_to_llm:
|
|
@@ -1380,7 +1379,8 @@ class AgentExecutor(Chain):
|
|
|
1380
1379
|
elif callable(self.handle_parsing_errors):
|
|
1381
1380
|
observation = self.handle_parsing_errors(e)
|
|
1382
1381
|
else:
|
|
1383
|
-
|
|
1382
|
+
msg = "Got unexpected type of `handle_parsing_errors`"
|
|
1383
|
+
raise ValueError(msg) from e # noqa: TRY004
|
|
1384
1384
|
output = AgentAction("_Exception", observation, text)
|
|
1385
1385
|
if run_manager:
|
|
1386
1386
|
run_manager.on_agent_action(output, color="green")
|
|
@@ -1401,15 +1401,15 @@ class AgentExecutor(Chain):
|
|
|
1401
1401
|
return
|
|
1402
1402
|
|
|
1403
1403
|
actions: list[AgentAction]
|
|
1404
|
-
if isinstance(output, AgentAction)
|
|
1405
|
-
actions = [output]
|
|
1406
|
-
else:
|
|
1407
|
-
actions = output
|
|
1404
|
+
actions = [output] if isinstance(output, AgentAction) else output
|
|
1408
1405
|
for agent_action in actions:
|
|
1409
1406
|
yield agent_action
|
|
1410
1407
|
for agent_action in actions:
|
|
1411
1408
|
yield self._perform_agent_action(
|
|
1412
|
-
name_to_tool_map,
|
|
1409
|
+
name_to_tool_map,
|
|
1410
|
+
color_mapping,
|
|
1411
|
+
agent_action,
|
|
1412
|
+
run_manager,
|
|
1413
1413
|
)
|
|
1414
1414
|
|
|
1415
1415
|
def _perform_agent_action(
|
|
@@ -1469,7 +1469,7 @@ class AgentExecutor(Chain):
|
|
|
1469
1469
|
intermediate_steps,
|
|
1470
1470
|
run_manager,
|
|
1471
1471
|
)
|
|
1472
|
-
]
|
|
1472
|
+
],
|
|
1473
1473
|
)
|
|
1474
1474
|
|
|
1475
1475
|
async def _aiter_next_step(
|
|
@@ -1499,12 +1499,13 @@ class AgentExecutor(Chain):
|
|
|
1499
1499
|
else:
|
|
1500
1500
|
raise_error = False
|
|
1501
1501
|
if raise_error:
|
|
1502
|
-
|
|
1502
|
+
msg = (
|
|
1503
1503
|
"An output parsing error occurred. "
|
|
1504
1504
|
"In order to pass this error back to the agent and have it try "
|
|
1505
1505
|
"again, pass `handle_parsing_errors=True` to the AgentExecutor. "
|
|
1506
|
-
f"This is the error: {
|
|
1506
|
+
f"This is the error: {e!s}"
|
|
1507
1507
|
)
|
|
1508
|
+
raise ValueError(msg) from e
|
|
1508
1509
|
text = str(e)
|
|
1509
1510
|
if isinstance(self.handle_parsing_errors, bool):
|
|
1510
1511
|
if e.send_to_llm:
|
|
@@ -1517,7 +1518,8 @@ class AgentExecutor(Chain):
|
|
|
1517
1518
|
elif callable(self.handle_parsing_errors):
|
|
1518
1519
|
observation = self.handle_parsing_errors(e)
|
|
1519
1520
|
else:
|
|
1520
|
-
|
|
1521
|
+
msg = "Got unexpected type of `handle_parsing_errors`"
|
|
1522
|
+
raise ValueError(msg) from e # noqa: TRY004
|
|
1521
1523
|
output = AgentAction("_Exception", observation, text)
|
|
1522
1524
|
tool_run_kwargs = self._action_agent.tool_run_logging_kwargs()
|
|
1523
1525
|
observation = await ExceptionTool().arun(
|
|
@@ -1536,10 +1538,7 @@ class AgentExecutor(Chain):
|
|
|
1536
1538
|
return
|
|
1537
1539
|
|
|
1538
1540
|
actions: list[AgentAction]
|
|
1539
|
-
if isinstance(output, AgentAction)
|
|
1540
|
-
actions = [output]
|
|
1541
|
-
else:
|
|
1542
|
-
actions = output
|
|
1541
|
+
actions = [output] if isinstance(output, AgentAction) else output
|
|
1543
1542
|
for agent_action in actions:
|
|
1544
1543
|
yield agent_action
|
|
1545
1544
|
|
|
@@ -1547,7 +1546,10 @@ class AgentExecutor(Chain):
|
|
|
1547
1546
|
result = await asyncio.gather(
|
|
1548
1547
|
*[
|
|
1549
1548
|
self._aperform_agent_action(
|
|
1550
|
-
name_to_tool_map,
|
|
1549
|
+
name_to_tool_map,
|
|
1550
|
+
color_mapping,
|
|
1551
|
+
agent_action,
|
|
1552
|
+
run_manager,
|
|
1551
1553
|
)
|
|
1552
1554
|
for agent_action in actions
|
|
1553
1555
|
],
|
|
@@ -1566,7 +1568,9 @@ class AgentExecutor(Chain):
|
|
|
1566
1568
|
) -> AgentStep:
|
|
1567
1569
|
if run_manager:
|
|
1568
1570
|
await run_manager.on_agent_action(
|
|
1569
|
-
agent_action,
|
|
1571
|
+
agent_action,
|
|
1572
|
+
verbose=self.verbose,
|
|
1573
|
+
color="green",
|
|
1570
1574
|
)
|
|
1571
1575
|
# Otherwise we lookup the tool
|
|
1572
1576
|
if agent_action.tool in name_to_tool_map:
|
|
@@ -1608,7 +1612,8 @@ class AgentExecutor(Chain):
|
|
|
1608
1612
|
name_to_tool_map = {tool.name: tool for tool in self.tools}
|
|
1609
1613
|
# We construct a mapping from each tool to a color, used for logging.
|
|
1610
1614
|
color_mapping = get_color_mapping(
|
|
1611
|
-
[tool.name for tool in self.tools],
|
|
1615
|
+
[tool.name for tool in self.tools],
|
|
1616
|
+
excluded_colors=["green", "red"],
|
|
1612
1617
|
)
|
|
1613
1618
|
intermediate_steps: list[tuple[AgentAction, str]] = []
|
|
1614
1619
|
# Let's start tracking the number of iterations and time elapsed
|
|
@@ -1626,7 +1631,9 @@ class AgentExecutor(Chain):
|
|
|
1626
1631
|
)
|
|
1627
1632
|
if isinstance(next_step_output, AgentFinish):
|
|
1628
1633
|
return self._return(
|
|
1629
|
-
next_step_output,
|
|
1634
|
+
next_step_output,
|
|
1635
|
+
intermediate_steps,
|
|
1636
|
+
run_manager=run_manager,
|
|
1630
1637
|
)
|
|
1631
1638
|
|
|
1632
1639
|
intermediate_steps.extend(next_step_output)
|
|
@@ -1636,12 +1643,16 @@ class AgentExecutor(Chain):
|
|
|
1636
1643
|
tool_return = self._get_tool_return(next_step_action)
|
|
1637
1644
|
if tool_return is not None:
|
|
1638
1645
|
return self._return(
|
|
1639
|
-
tool_return,
|
|
1646
|
+
tool_return,
|
|
1647
|
+
intermediate_steps,
|
|
1648
|
+
run_manager=run_manager,
|
|
1640
1649
|
)
|
|
1641
1650
|
iterations += 1
|
|
1642
1651
|
time_elapsed = time.time() - start_time
|
|
1643
1652
|
output = self._action_agent.return_stopped_response(
|
|
1644
|
-
self.early_stopping_method,
|
|
1653
|
+
self.early_stopping_method,
|
|
1654
|
+
intermediate_steps,
|
|
1655
|
+
**inputs,
|
|
1645
1656
|
)
|
|
1646
1657
|
return self._return(output, intermediate_steps, run_manager=run_manager)
|
|
1647
1658
|
|
|
@@ -1655,7 +1666,8 @@ class AgentExecutor(Chain):
|
|
|
1655
1666
|
name_to_tool_map = {tool.name: tool for tool in self.tools}
|
|
1656
1667
|
# We construct a mapping from each tool to a color, used for logging.
|
|
1657
1668
|
color_mapping = get_color_mapping(
|
|
1658
|
-
[tool.name for tool in self.tools],
|
|
1669
|
+
[tool.name for tool in self.tools],
|
|
1670
|
+
excluded_colors=["green"],
|
|
1659
1671
|
)
|
|
1660
1672
|
intermediate_steps: list[tuple[AgentAction, str]] = []
|
|
1661
1673
|
# Let's start tracking the number of iterations and time elapsed
|
|
@@ -1687,28 +1699,39 @@ class AgentExecutor(Chain):
|
|
|
1687
1699
|
tool_return = self._get_tool_return(next_step_action)
|
|
1688
1700
|
if tool_return is not None:
|
|
1689
1701
|
return await self._areturn(
|
|
1690
|
-
tool_return,
|
|
1702
|
+
tool_return,
|
|
1703
|
+
intermediate_steps,
|
|
1704
|
+
run_manager=run_manager,
|
|
1691
1705
|
)
|
|
1692
1706
|
|
|
1693
1707
|
iterations += 1
|
|
1694
1708
|
time_elapsed = time.time() - start_time
|
|
1695
1709
|
output = self._action_agent.return_stopped_response(
|
|
1696
|
-
self.early_stopping_method,
|
|
1710
|
+
self.early_stopping_method,
|
|
1711
|
+
intermediate_steps,
|
|
1712
|
+
**inputs,
|
|
1697
1713
|
)
|
|
1698
1714
|
return await self._areturn(
|
|
1699
|
-
output,
|
|
1715
|
+
output,
|
|
1716
|
+
intermediate_steps,
|
|
1717
|
+
run_manager=run_manager,
|
|
1700
1718
|
)
|
|
1701
1719
|
except (TimeoutError, asyncio.TimeoutError):
|
|
1702
1720
|
# stop early when interrupted by the async timeout
|
|
1703
1721
|
output = self._action_agent.return_stopped_response(
|
|
1704
|
-
self.early_stopping_method,
|
|
1722
|
+
self.early_stopping_method,
|
|
1723
|
+
intermediate_steps,
|
|
1724
|
+
**inputs,
|
|
1705
1725
|
)
|
|
1706
1726
|
return await self._areturn(
|
|
1707
|
-
output,
|
|
1727
|
+
output,
|
|
1728
|
+
intermediate_steps,
|
|
1729
|
+
run_manager=run_manager,
|
|
1708
1730
|
)
|
|
1709
1731
|
|
|
1710
1732
|
def _get_tool_return(
|
|
1711
|
-
self,
|
|
1733
|
+
self,
|
|
1734
|
+
next_step_output: tuple[AgentAction, str],
|
|
1712
1735
|
) -> Optional[AgentFinish]:
|
|
1713
1736
|
"""Check if the tool is a returning tool."""
|
|
1714
1737
|
agent_action, observation = next_step_output
|
|
@@ -1717,27 +1740,30 @@ class AgentExecutor(Chain):
|
|
|
1717
1740
|
if len(self._action_agent.return_values) > 0:
|
|
1718
1741
|
return_value_key = self._action_agent.return_values[0]
|
|
1719
1742
|
# Invalid tools won't be in the map, so we return False.
|
|
1720
|
-
if
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1743
|
+
if (
|
|
1744
|
+
agent_action.tool in name_to_tool_map
|
|
1745
|
+
and name_to_tool_map[agent_action.tool].return_direct
|
|
1746
|
+
):
|
|
1747
|
+
return AgentFinish(
|
|
1748
|
+
{return_value_key: observation},
|
|
1749
|
+
"",
|
|
1750
|
+
)
|
|
1726
1751
|
return None
|
|
1727
1752
|
|
|
1728
1753
|
def _prepare_intermediate_steps(
|
|
1729
|
-
self,
|
|
1754
|
+
self,
|
|
1755
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
1730
1756
|
) -> list[tuple[AgentAction, str]]:
|
|
1731
1757
|
if (
|
|
1732
1758
|
isinstance(self.trim_intermediate_steps, int)
|
|
1733
1759
|
and self.trim_intermediate_steps > 0
|
|
1734
1760
|
):
|
|
1735
1761
|
return intermediate_steps[-self.trim_intermediate_steps :]
|
|
1736
|
-
|
|
1762
|
+
if callable(self.trim_intermediate_steps):
|
|
1737
1763
|
return self.trim_intermediate_steps(intermediate_steps)
|
|
1738
|
-
|
|
1739
|
-
return intermediate_steps
|
|
1764
|
+
return intermediate_steps
|
|
1740
1765
|
|
|
1766
|
+
@override
|
|
1741
1767
|
def stream(
|
|
1742
1768
|
self,
|
|
1743
1769
|
input: Union[dict[str, Any], Any],
|
|
@@ -1768,6 +1794,7 @@ class AgentExecutor(Chain):
|
|
|
1768
1794
|
)
|
|
1769
1795
|
yield from iterator
|
|
1770
1796
|
|
|
1797
|
+
@override
|
|
1771
1798
|
async def astream(
|
|
1772
1799
|
self,
|
|
1773
1800
|
input: Union[dict[str, Any], Any],
|