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
|
@@ -36,12 +36,12 @@ class VectorStoreToolkit(BaseToolkit):
|
|
|
36
36
|
VectorStoreQATool,
|
|
37
37
|
VectorStoreQAWithSourcesTool,
|
|
38
38
|
)
|
|
39
|
-
except ImportError:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
)
|
|
39
|
+
except ImportError as e:
|
|
40
|
+
msg = "You need to install langchain-community to use this toolkit."
|
|
41
|
+
raise ImportError(msg) from e
|
|
43
42
|
description = VectorStoreQATool.get_description(
|
|
44
|
-
self.vectorstore_info.name,
|
|
43
|
+
self.vectorstore_info.name,
|
|
44
|
+
self.vectorstore_info.description,
|
|
45
45
|
)
|
|
46
46
|
qa_tool = VectorStoreQATool(
|
|
47
47
|
name=self.vectorstore_info.name,
|
|
@@ -50,7 +50,8 @@ class VectorStoreToolkit(BaseToolkit):
|
|
|
50
50
|
llm=self.llm,
|
|
51
51
|
)
|
|
52
52
|
description = VectorStoreQAWithSourcesTool.get_description(
|
|
53
|
-
self.vectorstore_info.name,
|
|
53
|
+
self.vectorstore_info.name,
|
|
54
|
+
self.vectorstore_info.description,
|
|
54
55
|
)
|
|
55
56
|
qa_with_sources_tool = VectorStoreQAWithSourcesTool(
|
|
56
57
|
name=f"{self.vectorstore_info.name}_with_sources",
|
|
@@ -78,13 +79,13 @@ class VectorStoreRouterToolkit(BaseToolkit):
|
|
|
78
79
|
from langchain_community.tools.vectorstore.tool import (
|
|
79
80
|
VectorStoreQATool,
|
|
80
81
|
)
|
|
81
|
-
except ImportError:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
)
|
|
82
|
+
except ImportError as e:
|
|
83
|
+
msg = "You need to install langchain-community to use this toolkit."
|
|
84
|
+
raise ImportError(msg) from e
|
|
85
85
|
for vectorstore_info in self.vectorstores:
|
|
86
86
|
description = VectorStoreQATool.get_description(
|
|
87
|
-
vectorstore_info.name,
|
|
87
|
+
vectorstore_info.name,
|
|
88
|
+
vectorstore_info.description,
|
|
88
89
|
)
|
|
89
90
|
qa_tool = VectorStoreQATool(
|
|
90
91
|
name=vectorstore_info.name,
|
|
@@ -14,7 +14,7 @@ def __getattr__(name: str) -> Any:
|
|
|
14
14
|
|
|
15
15
|
old_path = "langchain." + here + "." + name
|
|
16
16
|
new_path = "langchain_experimental." + here + "." + name
|
|
17
|
-
|
|
17
|
+
msg = (
|
|
18
18
|
"This agent has been moved to langchain experiment. "
|
|
19
19
|
"This agent relies on python REPL tool under the hood, so to use it "
|
|
20
20
|
"safely please sandbox the python REPL. "
|
|
@@ -23,4 +23,6 @@ def __getattr__(name: str) -> Any:
|
|
|
23
23
|
"To keep using this code as is, install langchain experimental and "
|
|
24
24
|
f"update your import statement from:\n `{old_path}` to `{new_path}`."
|
|
25
25
|
)
|
|
26
|
-
|
|
26
|
+
raise ImportError(msg)
|
|
27
|
+
msg = f"{name} does not exist"
|
|
28
|
+
raise AttributeError(msg)
|
|
@@ -9,7 +9,7 @@ if TYPE_CHECKING:
|
|
|
9
9
|
# Used to consolidate logic for raising deprecation warnings and
|
|
10
10
|
# handling optional imports.
|
|
11
11
|
DEPRECATED_LOOKUP = {
|
|
12
|
-
"ZapierToolkit": "langchain_community.agent_toolkits.zapier.toolkit"
|
|
12
|
+
"ZapierToolkit": "langchain_community.agent_toolkits.zapier.toolkit",
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
_import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)
|
langchain/agents/agent_types.py
CHANGED
|
@@ -23,22 +23,22 @@ class AgentType(str, Enum):
|
|
|
23
23
|
|
|
24
24
|
REACT_DOCSTORE = "react-docstore"
|
|
25
25
|
"""A zero shot agent that does a reasoning step before acting.
|
|
26
|
-
|
|
27
|
-
This agent has access to a document store that allows it to look up
|
|
26
|
+
|
|
27
|
+
This agent has access to a document store that allows it to look up
|
|
28
28
|
relevant information to answering the question.
|
|
29
29
|
"""
|
|
30
30
|
|
|
31
31
|
SELF_ASK_WITH_SEARCH = "self-ask-with-search"
|
|
32
32
|
"""An agent that breaks down a complex question into a series of simpler questions.
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
This agent uses a search tool to look up answers to the simpler questions
|
|
35
35
|
in order to answer the original complex question.
|
|
36
36
|
"""
|
|
37
37
|
CONVERSATIONAL_REACT_DESCRIPTION = "conversational-react-description"
|
|
38
38
|
CHAT_ZERO_SHOT_REACT_DESCRIPTION = "chat-zero-shot-react-description"
|
|
39
39
|
"""A zero shot agent that does a reasoning step before acting.
|
|
40
|
-
|
|
41
|
-
This agent is designed to be used in conjunction
|
|
40
|
+
|
|
41
|
+
This agent is designed to be used in conjunction
|
|
42
42
|
"""
|
|
43
43
|
|
|
44
44
|
CHAT_CONVERSATIONAL_REACT_DESCRIPTION = "chat-conversational-react-description"
|
|
@@ -47,7 +47,7 @@ class AgentType(str, Enum):
|
|
|
47
47
|
"structured-chat-zero-shot-react-description"
|
|
48
48
|
)
|
|
49
49
|
"""An zero-shot react agent optimized for chat models.
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
This agent is capable of invoking tools that have multiple inputs.
|
|
52
52
|
"""
|
|
53
53
|
|
langchain/agents/chat/base.py
CHANGED
|
@@ -49,19 +49,20 @@ class ChatAgent(Agent):
|
|
|
49
49
|
return "Thought:"
|
|
50
50
|
|
|
51
51
|
def _construct_scratchpad(
|
|
52
|
-
self,
|
|
52
|
+
self,
|
|
53
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
53
54
|
) -> str:
|
|
54
55
|
agent_scratchpad = super()._construct_scratchpad(intermediate_steps)
|
|
55
56
|
if not isinstance(agent_scratchpad, str):
|
|
56
|
-
|
|
57
|
+
msg = "agent_scratchpad should be of type string."
|
|
58
|
+
raise ValueError(msg) # noqa: TRY004
|
|
57
59
|
if agent_scratchpad:
|
|
58
60
|
return (
|
|
59
61
|
f"This was your previous work "
|
|
60
62
|
f"(but I haven't seen any of it! I only see what "
|
|
61
63
|
f"you return as final answer):\n{agent_scratchpad}"
|
|
62
64
|
)
|
|
63
|
-
|
|
64
|
-
return agent_scratchpad
|
|
65
|
+
return agent_scratchpad
|
|
65
66
|
|
|
66
67
|
@classmethod
|
|
67
68
|
def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
|
|
@@ -106,14 +107,7 @@ class ChatAgent(Agent):
|
|
|
106
107
|
tool_strings = "\n".join([f"{tool.name}: {tool.description}" for tool in tools])
|
|
107
108
|
tool_names = ", ".join([tool.name for tool in tools])
|
|
108
109
|
format_instructions = format_instructions.format(tool_names=tool_names)
|
|
109
|
-
template = "\n\n"
|
|
110
|
-
[
|
|
111
|
-
system_message_prefix,
|
|
112
|
-
tool_strings,
|
|
113
|
-
format_instructions,
|
|
114
|
-
system_message_suffix,
|
|
115
|
-
]
|
|
116
|
-
)
|
|
110
|
+
template = f"{system_message_prefix}\n\n{tool_strings}\n\n{format_instructions}\n\n{system_message_suffix}" # noqa: E501
|
|
117
111
|
messages = [
|
|
118
112
|
SystemMessagePromptTemplate.from_template(template),
|
|
119
113
|
HumanMessagePromptTemplate.from_template(human_message),
|
|
@@ -45,24 +45,27 @@ class ChatOutputParser(AgentOutputParser):
|
|
|
45
45
|
found = self.pattern.search(text)
|
|
46
46
|
if not found:
|
|
47
47
|
# Fast fail to parse Final Answer.
|
|
48
|
-
|
|
48
|
+
msg = "action not found"
|
|
49
|
+
raise ValueError(msg)
|
|
49
50
|
action = found.group(1)
|
|
50
51
|
response = json.loads(action.strip())
|
|
51
52
|
includes_action = "action" in response
|
|
52
53
|
if includes_answer and includes_action:
|
|
53
|
-
|
|
54
|
+
msg = (
|
|
54
55
|
"Parsing LLM output produced a final answer "
|
|
55
56
|
f"and a parse-able action: {text}"
|
|
56
57
|
)
|
|
58
|
+
raise OutputParserException(msg)
|
|
57
59
|
return AgentAction(
|
|
58
|
-
response["action"],
|
|
60
|
+
response["action"],
|
|
61
|
+
response.get("action_input", {}),
|
|
62
|
+
text,
|
|
59
63
|
)
|
|
60
64
|
|
|
61
65
|
except Exception as exc:
|
|
62
66
|
if not includes_answer:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
) from exc
|
|
67
|
+
msg = f"Could not parse LLM output: {text}"
|
|
68
|
+
raise OutputParserException(msg) from exc
|
|
66
69
|
output = text.split(FINAL_ANSWER_ACTION)[-1].strip()
|
|
67
70
|
return AgentFinish({"output": output}, text)
|
|
68
71
|
|
langchain/agents/chat/prompt.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
#
|
|
2
|
-
SYSTEM_MESSAGE_PREFIX = """Answer the following questions as best you can. You have access to the following tools:"""
|
|
1
|
+
SYSTEM_MESSAGE_PREFIX = """Answer the following questions as best you can. You have access to the following tools:""" # noqa: E501
|
|
3
2
|
FORMAT_INSTRUCTIONS = """The way you use the tools is by specifying a json blob.
|
|
4
3
|
Specifically, this json should have a `action` key (with the name of the tool to use) and a `action_input` key (with the input to the tool going here).
|
|
5
4
|
|
|
@@ -25,6 +24,6 @@ $JSON_BLOB
|
|
|
25
24
|
Observation: the result of the action
|
|
26
25
|
... (this Thought/Action/Observation can repeat N times)
|
|
27
26
|
Thought: I now know the final answer
|
|
28
|
-
Final Answer: the final answer to the original input question"""
|
|
29
|
-
SYSTEM_MESSAGE_SUFFIX = """Begin! Reminder to always use the exact characters `Final Answer` when responding."""
|
|
27
|
+
Final Answer: the final answer to the original input question""" # noqa: E501
|
|
28
|
+
SYSTEM_MESSAGE_SUFFIX = """Begin! Reminder to always use the exact characters `Final Answer` when responding.""" # noqa: E501
|
|
30
29
|
HUMAN_MESSAGE = "{input}\n\n{agent_scratchpad}"
|
|
@@ -36,7 +36,9 @@ class ConversationalAgent(Agent):
|
|
|
36
36
|
|
|
37
37
|
@classmethod
|
|
38
38
|
def _get_default_output_parser(
|
|
39
|
-
cls,
|
|
39
|
+
cls,
|
|
40
|
+
ai_prefix: str = "AI",
|
|
41
|
+
**kwargs: Any,
|
|
40
42
|
) -> AgentOutputParser:
|
|
41
43
|
return ConvoOutputParser(ai_prefix=ai_prefix)
|
|
42
44
|
|
|
@@ -93,13 +95,15 @@ class ConversationalAgent(Agent):
|
|
|
93
95
|
A PromptTemplate with the template assembled from the pieces here.
|
|
94
96
|
"""
|
|
95
97
|
tool_strings = "\n".join(
|
|
96
|
-
[f"> {tool.name}: {tool.description}" for tool in tools]
|
|
98
|
+
[f"> {tool.name}: {tool.description}" for tool in tools],
|
|
97
99
|
)
|
|
98
100
|
tool_names = ", ".join([tool.name for tool in tools])
|
|
99
101
|
format_instructions = format_instructions.format(
|
|
100
|
-
tool_names=tool_names,
|
|
102
|
+
tool_names=tool_names,
|
|
103
|
+
ai_prefix=ai_prefix,
|
|
104
|
+
human_prefix=human_prefix,
|
|
101
105
|
)
|
|
102
|
-
template = "\n\n
|
|
106
|
+
template = f"{prefix}\n\n{tool_strings}\n\n{format_instructions}\n\n{suffix}"
|
|
103
107
|
if input_variables is None:
|
|
104
108
|
input_variables = ["input", "chat_history", "agent_scratchpad"]
|
|
105
109
|
return PromptTemplate(template=template, input_variables=input_variables)
|
|
@@ -161,7 +165,7 @@ class ConversationalAgent(Agent):
|
|
|
161
165
|
)
|
|
162
166
|
tool_names = [tool.name for tool in tools]
|
|
163
167
|
_output_parser = output_parser or cls._get_default_output_parser(
|
|
164
|
-
ai_prefix=ai_prefix
|
|
168
|
+
ai_prefix=ai_prefix,
|
|
165
169
|
)
|
|
166
170
|
return cls(
|
|
167
171
|
llm_chain=llm_chain,
|
|
@@ -34,12 +34,14 @@ class ConvoOutputParser(AgentOutputParser):
|
|
|
34
34
|
|
|
35
35
|
if f"{self.ai_prefix}:" in text:
|
|
36
36
|
return AgentFinish(
|
|
37
|
-
{"output": text.split(f"{self.ai_prefix}:")[-1].strip()},
|
|
37
|
+
{"output": text.split(f"{self.ai_prefix}:")[-1].strip()},
|
|
38
|
+
text,
|
|
38
39
|
)
|
|
39
40
|
regex = r"Action: (.*?)[\n]*Action Input: ([\s\S]*)"
|
|
40
41
|
match = re.search(regex, text, re.DOTALL)
|
|
41
42
|
if not match:
|
|
42
|
-
|
|
43
|
+
msg = f"Could not parse LLM output: `{text}`"
|
|
44
|
+
raise OutputParserException(msg)
|
|
43
45
|
action = match.group(1)
|
|
44
46
|
action_input = match.group(2)
|
|
45
47
|
return AgentAction(action.strip(), action_input.strip(" ").strip('"'), text)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
PREFIX = """Assistant is a large language model trained by OpenAI.
|
|
3
2
|
|
|
4
3
|
Assistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.
|
|
@@ -10,7 +9,7 @@ Overall, Assistant is a powerful tool that can help with a wide range of tasks a
|
|
|
10
9
|
TOOLS:
|
|
11
10
|
------
|
|
12
11
|
|
|
13
|
-
Assistant has access to the following tools:"""
|
|
12
|
+
Assistant has access to the following tools:""" # noqa: E501
|
|
14
13
|
FORMAT_INSTRUCTIONS = """To use a tool, please use the following format:
|
|
15
14
|
|
|
16
15
|
```
|
|
@@ -25,7 +24,7 @@ When you have a response to say to the Human, or if you do not need to use a too
|
|
|
25
24
|
```
|
|
26
25
|
Thought: Do I need to use a tool? No
|
|
27
26
|
{ai_prefix}: [your response here]
|
|
28
|
-
```"""
|
|
27
|
+
```""" # noqa: E501
|
|
29
28
|
|
|
30
29
|
SUFFIX = """Begin!
|
|
31
30
|
|
|
@@ -96,15 +96,16 @@ class ConversationalChatAgent(Agent):
|
|
|
96
96
|
A PromptTemplate.
|
|
97
97
|
"""
|
|
98
98
|
tool_strings = "\n".join(
|
|
99
|
-
[f"> {tool.name}: {tool.description}" for tool in tools]
|
|
99
|
+
[f"> {tool.name}: {tool.description}" for tool in tools],
|
|
100
100
|
)
|
|
101
101
|
tool_names = ", ".join([tool.name for tool in tools])
|
|
102
102
|
_output_parser = output_parser or cls._get_default_output_parser()
|
|
103
103
|
format_instructions = human_message.format(
|
|
104
|
-
format_instructions=_output_parser.get_format_instructions()
|
|
104
|
+
format_instructions=_output_parser.get_format_instructions(),
|
|
105
105
|
)
|
|
106
106
|
final_prompt = format_instructions.format(
|
|
107
|
-
tool_names=tool_names,
|
|
107
|
+
tool_names=tool_names,
|
|
108
|
+
tools=tool_strings,
|
|
108
109
|
)
|
|
109
110
|
if input_variables is None:
|
|
110
111
|
input_variables = ["input", "chat_history", "agent_scratchpad"]
|
|
@@ -117,14 +118,15 @@ class ConversationalChatAgent(Agent):
|
|
|
117
118
|
return ChatPromptTemplate(input_variables=input_variables, messages=messages)
|
|
118
119
|
|
|
119
120
|
def _construct_scratchpad(
|
|
120
|
-
self,
|
|
121
|
+
self,
|
|
122
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
121
123
|
) -> list[BaseMessage]:
|
|
122
124
|
"""Construct the scratchpad that lets the agent continue its thought process."""
|
|
123
125
|
thoughts: list[BaseMessage] = []
|
|
124
126
|
for action, observation in intermediate_steps:
|
|
125
127
|
thoughts.append(AIMessage(content=action.log))
|
|
126
128
|
human_message = HumanMessage(
|
|
127
|
-
content=self.template_tool_response.format(observation=observation)
|
|
129
|
+
content=self.template_tool_response.format(observation=observation),
|
|
128
130
|
)
|
|
129
131
|
thoughts.append(human_message)
|
|
130
132
|
return thoughts
|
|
@@ -39,20 +39,18 @@ class ConvoOutputParser(AgentOutputParser):
|
|
|
39
39
|
# If the action indicates a final answer, return an AgentFinish
|
|
40
40
|
if action == "Final Answer":
|
|
41
41
|
return AgentFinish({"output": action_input}, text)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
raise OutputParserException(
|
|
50
|
-
f"Missing 'action' or 'action_input' in LLM output: {text}"
|
|
51
|
-
)
|
|
42
|
+
# Otherwise, return an AgentAction with the specified action and
|
|
43
|
+
# input
|
|
44
|
+
return AgentAction(action, action_input, text)
|
|
45
|
+
# If the necessary keys aren't present in the response, raise an
|
|
46
|
+
# exception
|
|
47
|
+
msg = f"Missing 'action' or 'action_input' in LLM output: {text}"
|
|
48
|
+
raise OutputParserException(msg)
|
|
52
49
|
except Exception as e:
|
|
53
50
|
# If any other exception is raised during parsing, also raise an
|
|
54
51
|
# OutputParserException
|
|
55
|
-
|
|
52
|
+
msg = f"Could not parse LLM output: {text}"
|
|
53
|
+
raise OutputParserException(msg) from e
|
|
56
54
|
|
|
57
55
|
@property
|
|
58
56
|
def _type(self) -> str:
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
PREFIX = """Assistant is a large language model trained by OpenAI.
|
|
3
2
|
|
|
4
3
|
Assistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.
|
|
5
4
|
|
|
6
5
|
Assistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.
|
|
7
6
|
|
|
8
|
-
Overall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist."""
|
|
7
|
+
Overall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist.""" # noqa: E501
|
|
9
8
|
|
|
10
9
|
FORMAT_INSTRUCTIONS = """RESPONSE FORMAT INSTRUCTIONS
|
|
11
10
|
----------------------------
|
|
@@ -31,7 +30,7 @@ Use this if you want to respond directly to the human. Markdown code snippet for
|
|
|
31
30
|
"action": "Final Answer",
|
|
32
31
|
"action_input": string \\\\ You should put what you want to return to use here
|
|
33
32
|
}}}}
|
|
34
|
-
```"""
|
|
33
|
+
```""" # noqa: E501
|
|
35
34
|
|
|
36
35
|
SUFFIX = """TOOLS
|
|
37
36
|
------
|
|
@@ -45,13 +44,13 @@ USER'S INPUT
|
|
|
45
44
|
--------------------
|
|
46
45
|
Here is the user's input (remember to respond with a markdown code snippet of a json blob with a single action, and NOTHING else):
|
|
47
46
|
|
|
48
|
-
{{{{input}}}}"""
|
|
47
|
+
{{{{input}}}}""" # noqa: E501
|
|
49
48
|
|
|
50
|
-
TEMPLATE_TOOL_RESPONSE = """TOOL RESPONSE:
|
|
49
|
+
TEMPLATE_TOOL_RESPONSE = """TOOL RESPONSE:
|
|
51
50
|
---------------------
|
|
52
51
|
{observation}
|
|
53
52
|
|
|
54
53
|
USER'S INPUT
|
|
55
54
|
--------------------
|
|
56
55
|
|
|
57
|
-
Okay, so what is the response to my last comment? If using information obtained from the tools you must mention it explicitly without mentioning the tool names - I have forgotten all TOOL RESPONSES! Remember to respond with a markdown code snippet of a json blob with a single action, and NOTHING else."""
|
|
56
|
+
Okay, so what is the response to my last comment? If using information obtained from the tools you must mention it explicitly without mentioning the tool names - I have forgotten all TOOL RESPONSES! Remember to respond with a markdown code snippet of a json blob with a single action, and NOTHING else.""" # noqa: E501
|
|
@@ -16,10 +16,10 @@ from langchain.agents.format_scratchpad.tools import format_to_tool_messages
|
|
|
16
16
|
from langchain.agents.format_scratchpad.xml import format_xml
|
|
17
17
|
|
|
18
18
|
__all__ = [
|
|
19
|
-
"
|
|
19
|
+
"format_log_to_messages",
|
|
20
|
+
"format_log_to_str",
|
|
20
21
|
"format_to_openai_function_messages",
|
|
21
22
|
"format_to_openai_functions",
|
|
22
23
|
"format_to_tool_messages",
|
|
23
|
-
"
|
|
24
|
-
"format_log_to_messages",
|
|
24
|
+
"format_xml",
|
|
25
25
|
]
|
|
@@ -20,7 +20,7 @@ def format_log_to_messages(
|
|
|
20
20
|
for action, observation in intermediate_steps:
|
|
21
21
|
thoughts.append(AIMessage(content=action.log))
|
|
22
22
|
human_message = HumanMessage(
|
|
23
|
-
content=template_tool_response.format(observation=observation)
|
|
23
|
+
content=template_tool_response.format(observation=observation),
|
|
24
24
|
)
|
|
25
25
|
thoughts.append(human_message)
|
|
26
26
|
return thoughts
|
|
@@ -6,7 +6,8 @@ from langchain_core.messages import AIMessage, BaseMessage, FunctionMessage
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def _convert_agent_action_to_messages(
|
|
9
|
-
agent_action: AgentAction,
|
|
9
|
+
agent_action: AgentAction,
|
|
10
|
+
observation: str,
|
|
10
11
|
) -> list[BaseMessage]:
|
|
11
12
|
"""Convert an agent action to a message.
|
|
12
13
|
|
|
@@ -20,15 +21,16 @@ def _convert_agent_action_to_messages(
|
|
|
20
21
|
the original tool invocation
|
|
21
22
|
"""
|
|
22
23
|
if isinstance(agent_action, AgentActionMessageLog):
|
|
23
|
-
return
|
|
24
|
-
|
|
24
|
+
return [
|
|
25
|
+
*list(agent_action.message_log),
|
|
26
|
+
_create_function_message(agent_action, observation),
|
|
25
27
|
]
|
|
26
|
-
|
|
27
|
-
return [AIMessage(content=agent_action.log)]
|
|
28
|
+
return [AIMessage(content=agent_action.log)]
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
def _create_function_message(
|
|
31
|
-
agent_action: AgentAction,
|
|
32
|
+
agent_action: AgentAction,
|
|
33
|
+
observation: str,
|
|
32
34
|
) -> FunctionMessage:
|
|
33
35
|
"""Convert agent action and observation into a function message.
|
|
34
36
|
Args:
|
|
@@ -12,7 +12,8 @@ from langchain.agents.output_parsers.tools import ToolAgentAction
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
def _create_tool_message(
|
|
15
|
-
agent_action: ToolAgentAction,
|
|
15
|
+
agent_action: ToolAgentAction,
|
|
16
|
+
observation: str,
|
|
16
17
|
) -> ToolMessage:
|
|
17
18
|
"""Convert agent action and observation into a tool message.
|
|
18
19
|
|
|
@@ -54,8 +55,9 @@ def format_to_tool_messages(
|
|
|
54
55
|
messages = []
|
|
55
56
|
for agent_action, observation in intermediate_steps:
|
|
56
57
|
if isinstance(agent_action, ToolAgentAction):
|
|
57
|
-
new_messages =
|
|
58
|
-
|
|
58
|
+
new_messages = [
|
|
59
|
+
*list(agent_action.message_log),
|
|
60
|
+
_create_tool_message(agent_action, observation),
|
|
59
61
|
]
|
|
60
62
|
messages.extend([new for new in new_messages if new not in messages])
|
|
61
63
|
else:
|
|
@@ -1,21 +1,52 @@
|
|
|
1
|
+
from typing import Literal, Optional
|
|
2
|
+
|
|
1
3
|
from langchain_core.agents import AgentAction
|
|
2
4
|
|
|
3
5
|
|
|
6
|
+
def _escape(xml: str) -> str:
|
|
7
|
+
"""Replace XML tags with custom safe delimiters."""
|
|
8
|
+
replacements = {
|
|
9
|
+
"<tool>": "[[tool]]",
|
|
10
|
+
"</tool>": "[[/tool]]",
|
|
11
|
+
"<tool_input>": "[[tool_input]]",
|
|
12
|
+
"</tool_input>": "[[/tool_input]]",
|
|
13
|
+
"<observation>": "[[observation]]",
|
|
14
|
+
"</observation>": "[[/observation]]",
|
|
15
|
+
}
|
|
16
|
+
for orig, repl in replacements.items():
|
|
17
|
+
xml = xml.replace(orig, repl)
|
|
18
|
+
return xml
|
|
19
|
+
|
|
20
|
+
|
|
4
21
|
def format_xml(
|
|
5
22
|
intermediate_steps: list[tuple[AgentAction, str]],
|
|
23
|
+
*,
|
|
24
|
+
escape_format: Optional[Literal["minimal"]] = "minimal",
|
|
6
25
|
) -> str:
|
|
7
26
|
"""Format the intermediate steps as XML.
|
|
8
27
|
|
|
9
28
|
Args:
|
|
10
29
|
intermediate_steps: The intermediate steps.
|
|
30
|
+
escape_format: The escaping format to use. Currently only 'minimal' is
|
|
31
|
+
supported, which replaces XML tags with custom delimiters to prevent
|
|
32
|
+
conflicts.
|
|
11
33
|
|
|
12
34
|
Returns:
|
|
13
35
|
The intermediate steps as XML.
|
|
14
36
|
"""
|
|
15
37
|
log = ""
|
|
16
38
|
for action, observation in intermediate_steps:
|
|
39
|
+
if escape_format == "minimal":
|
|
40
|
+
# Escape XML tags in tool names and inputs using custom delimiters
|
|
41
|
+
tool = _escape(action.tool)
|
|
42
|
+
tool_input = _escape(str(action.tool_input))
|
|
43
|
+
observation_ = _escape(str(observation))
|
|
44
|
+
else:
|
|
45
|
+
tool = action.tool
|
|
46
|
+
tool_input = str(action.tool_input)
|
|
47
|
+
observation_ = str(observation)
|
|
17
48
|
log += (
|
|
18
|
-
f"<tool>{
|
|
19
|
-
f"</tool_input><observation>{
|
|
49
|
+
f"<tool>{tool}</tool><tool_input>{tool_input}"
|
|
50
|
+
f"</tool_input><observation>{observation_}</observation>"
|
|
20
51
|
)
|
|
21
52
|
return log
|
langchain/agents/initialize.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Load agent."""
|
|
2
2
|
|
|
3
|
+
import contextlib
|
|
3
4
|
from collections.abc import Sequence
|
|
4
5
|
from typing import Any, Optional
|
|
5
6
|
|
|
@@ -59,35 +60,42 @@ def initialize_agent(
|
|
|
59
60
|
if agent is None and agent_path is None:
|
|
60
61
|
agent = AgentType.ZERO_SHOT_REACT_DESCRIPTION
|
|
61
62
|
if agent is not None and agent_path is not None:
|
|
62
|
-
|
|
63
|
+
msg = (
|
|
63
64
|
"Both `agent` and `agent_path` are specified, "
|
|
64
65
|
"but at most only one should be."
|
|
65
66
|
)
|
|
67
|
+
raise ValueError(msg)
|
|
66
68
|
if agent is not None:
|
|
67
69
|
if agent not in AGENT_TO_CLASS:
|
|
68
|
-
|
|
70
|
+
msg = (
|
|
69
71
|
f"Got unknown agent type: {agent}. "
|
|
70
72
|
f"Valid types are: {AGENT_TO_CLASS.keys()}."
|
|
71
73
|
)
|
|
74
|
+
raise ValueError(msg)
|
|
72
75
|
tags_.append(agent.value if isinstance(agent, AgentType) else agent)
|
|
73
76
|
agent_cls = AGENT_TO_CLASS[agent]
|
|
74
77
|
agent_kwargs = agent_kwargs or {}
|
|
75
78
|
agent_obj = agent_cls.from_llm_and_tools(
|
|
76
|
-
llm,
|
|
79
|
+
llm,
|
|
80
|
+
tools,
|
|
81
|
+
callback_manager=callback_manager,
|
|
82
|
+
**agent_kwargs,
|
|
77
83
|
)
|
|
78
84
|
elif agent_path is not None:
|
|
79
85
|
agent_obj = load_agent(
|
|
80
|
-
agent_path,
|
|
86
|
+
agent_path,
|
|
87
|
+
llm=llm,
|
|
88
|
+
tools=tools,
|
|
89
|
+
callback_manager=callback_manager,
|
|
81
90
|
)
|
|
82
|
-
|
|
91
|
+
with contextlib.suppress(NotImplementedError):
|
|
83
92
|
# TODO: Add tags from the serialized object directly.
|
|
84
93
|
tags_.append(agent_obj._agent_type)
|
|
85
|
-
except NotImplementedError:
|
|
86
|
-
pass
|
|
87
94
|
else:
|
|
88
|
-
|
|
95
|
+
msg = (
|
|
89
96
|
"Somehow both `agent` and `agent_path` are None, this should never happen."
|
|
90
97
|
)
|
|
98
|
+
raise ValueError(msg)
|
|
91
99
|
return AgentExecutor.from_agent_and_tools(
|
|
92
100
|
agent=agent_obj,
|
|
93
101
|
tools=tools,
|