langchain 0.3.26__py3-none-any.whl → 0.4.0.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- langchain/__init__.py +110 -96
- langchain/_api/__init__.py +2 -2
- langchain/_api/deprecation.py +3 -3
- langchain/_api/module_import.py +51 -46
- langchain/_api/path.py +1 -1
- langchain/adapters/openai.py +8 -8
- langchain/agents/__init__.py +15 -12
- langchain/agents/agent.py +174 -151
- langchain/agents/agent_iterator.py +50 -26
- langchain/agents/agent_toolkits/__init__.py +7 -6
- langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
- langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
- langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
- langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
- langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
- langchain/agents/agent_toolkits/csv/__init__.py +4 -2
- langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
- langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
- langchain/agents/agent_toolkits/github/toolkit.py +9 -9
- langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
- langchain/agents/agent_toolkits/json/base.py +1 -1
- langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
- langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
- langchain/agents/agent_toolkits/openapi/base.py +1 -1
- langchain/agents/agent_toolkits/openapi/planner.py +2 -2
- langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
- langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
- langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
- langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
- langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
- langchain/agents/agent_toolkits/powerbi/base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
- langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/python/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
- langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/sql/prompt.py +1 -1
- langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/vectorstore/base.py +4 -2
- langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
- langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
- langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
- langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
- langchain/agents/agent_types.py +6 -6
- langchain/agents/chat/base.py +8 -12
- langchain/agents/chat/output_parser.py +9 -6
- langchain/agents/chat/prompt.py +3 -4
- langchain/agents/conversational/base.py +11 -5
- langchain/agents/conversational/output_parser.py +4 -2
- langchain/agents/conversational/prompt.py +2 -3
- langchain/agents/conversational_chat/base.py +9 -5
- langchain/agents/conversational_chat/output_parser.py +9 -11
- langchain/agents/conversational_chat/prompt.py +5 -6
- langchain/agents/format_scratchpad/__init__.py +3 -3
- langchain/agents/format_scratchpad/log_to_messages.py +1 -1
- langchain/agents/format_scratchpad/openai_functions.py +8 -6
- langchain/agents/format_scratchpad/tools.py +5 -3
- langchain/agents/format_scratchpad/xml.py +33 -2
- langchain/agents/initialize.py +17 -9
- langchain/agents/json_chat/base.py +19 -18
- langchain/agents/json_chat/prompt.py +2 -3
- langchain/agents/load_tools.py +2 -1
- langchain/agents/loading.py +28 -18
- langchain/agents/mrkl/base.py +11 -4
- langchain/agents/mrkl/output_parser.py +17 -13
- langchain/agents/mrkl/prompt.py +1 -2
- langchain/agents/openai_assistant/base.py +81 -71
- langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +2 -0
- langchain/agents/openai_functions_agent/base.py +47 -37
- langchain/agents/openai_functions_multi_agent/base.py +40 -27
- langchain/agents/openai_tools/base.py +9 -8
- langchain/agents/output_parsers/__init__.py +3 -3
- langchain/agents/output_parsers/json.py +8 -6
- langchain/agents/output_parsers/openai_functions.py +24 -9
- langchain/agents/output_parsers/openai_tools.py +16 -4
- langchain/agents/output_parsers/react_json_single_input.py +13 -5
- langchain/agents/output_parsers/react_single_input.py +18 -11
- langchain/agents/output_parsers/self_ask.py +5 -2
- langchain/agents/output_parsers/tools.py +32 -13
- langchain/agents/output_parsers/xml.py +102 -28
- langchain/agents/react/agent.py +5 -4
- langchain/agents/react/base.py +26 -17
- langchain/agents/react/output_parser.py +7 -6
- langchain/agents/react/textworld_prompt.py +0 -1
- langchain/agents/react/wiki_prompt.py +14 -15
- langchain/agents/schema.py +5 -2
- langchain/agents/self_ask_with_search/base.py +23 -15
- langchain/agents/self_ask_with_search/prompt.py +0 -1
- langchain/agents/structured_chat/base.py +19 -11
- langchain/agents/structured_chat/output_parser.py +29 -18
- langchain/agents/structured_chat/prompt.py +3 -4
- langchain/agents/tool_calling_agent/base.py +8 -6
- langchain/agents/tools.py +5 -2
- langchain/agents/utils.py +2 -3
- langchain/agents/xml/base.py +12 -6
- langchain/agents/xml/prompt.py +1 -2
- langchain/cache.py +12 -12
- langchain/callbacks/__init__.py +11 -11
- langchain/callbacks/aim_callback.py +2 -2
- langchain/callbacks/argilla_callback.py +1 -1
- langchain/callbacks/arize_callback.py +1 -1
- langchain/callbacks/arthur_callback.py +1 -1
- langchain/callbacks/base.py +7 -7
- langchain/callbacks/clearml_callback.py +1 -1
- langchain/callbacks/comet_ml_callback.py +1 -1
- langchain/callbacks/confident_callback.py +1 -1
- langchain/callbacks/context_callback.py +1 -1
- langchain/callbacks/flyte_callback.py +1 -1
- langchain/callbacks/human.py +2 -2
- langchain/callbacks/infino_callback.py +1 -1
- langchain/callbacks/labelstudio_callback.py +1 -1
- langchain/callbacks/llmonitor_callback.py +1 -1
- langchain/callbacks/manager.py +5 -5
- langchain/callbacks/mlflow_callback.py +2 -2
- langchain/callbacks/openai_info.py +1 -1
- langchain/callbacks/promptlayer_callback.py +1 -1
- langchain/callbacks/sagemaker_callback.py +1 -1
- langchain/callbacks/streaming_aiter.py +17 -3
- langchain/callbacks/streaming_aiter_final_only.py +16 -5
- langchain/callbacks/streaming_stdout_final_only.py +10 -3
- langchain/callbacks/streamlit/__init__.py +3 -2
- langchain/callbacks/streamlit/mutable_expander.py +1 -1
- langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
- langchain/callbacks/tracers/__init__.py +1 -1
- langchain/callbacks/tracers/comet.py +1 -1
- langchain/callbacks/tracers/evaluation.py +1 -1
- langchain/callbacks/tracers/log_stream.py +1 -1
- langchain/callbacks/tracers/logging.py +12 -1
- langchain/callbacks/tracers/stdout.py +1 -1
- langchain/callbacks/trubrics_callback.py +1 -1
- langchain/callbacks/utils.py +4 -4
- langchain/callbacks/wandb_callback.py +1 -1
- langchain/callbacks/whylabs_callback.py +1 -1
- langchain/chains/api/base.py +41 -23
- langchain/chains/api/news_docs.py +1 -2
- langchain/chains/api/open_meteo_docs.py +1 -2
- langchain/chains/api/openapi/requests_chain.py +1 -1
- langchain/chains/api/openapi/response_chain.py +1 -1
- langchain/chains/api/podcast_docs.py +1 -2
- langchain/chains/api/prompt.py +1 -2
- langchain/chains/api/tmdb_docs.py +1 -2
- langchain/chains/base.py +96 -56
- langchain/chains/chat_vector_db/prompts.py +2 -3
- langchain/chains/combine_documents/__init__.py +1 -1
- langchain/chains/combine_documents/base.py +30 -11
- langchain/chains/combine_documents/map_reduce.py +41 -30
- langchain/chains/combine_documents/map_rerank.py +39 -24
- langchain/chains/combine_documents/reduce.py +48 -26
- langchain/chains/combine_documents/refine.py +27 -17
- langchain/chains/combine_documents/stuff.py +24 -13
- langchain/chains/constitutional_ai/base.py +11 -4
- langchain/chains/constitutional_ai/principles.py +22 -25
- langchain/chains/constitutional_ai/prompts.py +25 -28
- langchain/chains/conversation/base.py +9 -4
- langchain/chains/conversation/memory.py +5 -5
- langchain/chains/conversation/prompt.py +5 -5
- langchain/chains/conversational_retrieval/base.py +108 -79
- langchain/chains/conversational_retrieval/prompts.py +2 -3
- langchain/chains/elasticsearch_database/base.py +10 -10
- langchain/chains/elasticsearch_database/prompts.py +2 -3
- langchain/chains/ernie_functions/__init__.py +2 -2
- langchain/chains/example_generator.py +3 -1
- langchain/chains/flare/base.py +28 -12
- langchain/chains/flare/prompts.py +2 -0
- langchain/chains/graph_qa/cypher.py +2 -2
- langchain/chains/graph_qa/falkordb.py +1 -1
- langchain/chains/graph_qa/gremlin.py +1 -1
- langchain/chains/graph_qa/neptune_sparql.py +1 -1
- langchain/chains/graph_qa/prompts.py +2 -2
- langchain/chains/history_aware_retriever.py +2 -1
- langchain/chains/hyde/base.py +6 -5
- langchain/chains/hyde/prompts.py +5 -6
- langchain/chains/llm.py +82 -61
- langchain/chains/llm_bash/__init__.py +3 -2
- langchain/chains/llm_checker/base.py +19 -6
- langchain/chains/llm_checker/prompt.py +3 -4
- langchain/chains/llm_math/base.py +25 -10
- langchain/chains/llm_math/prompt.py +1 -2
- langchain/chains/llm_summarization_checker/base.py +22 -7
- langchain/chains/llm_symbolic_math/__init__.py +3 -2
- langchain/chains/loading.py +155 -97
- langchain/chains/mapreduce.py +4 -3
- langchain/chains/moderation.py +11 -9
- langchain/chains/natbot/base.py +11 -9
- langchain/chains/natbot/crawler.py +102 -76
- langchain/chains/natbot/prompt.py +2 -3
- langchain/chains/openai_functions/__init__.py +7 -7
- langchain/chains/openai_functions/base.py +15 -10
- langchain/chains/openai_functions/citation_fuzzy_match.py +21 -11
- langchain/chains/openai_functions/extraction.py +19 -19
- langchain/chains/openai_functions/openapi.py +39 -35
- langchain/chains/openai_functions/qa_with_structure.py +22 -15
- langchain/chains/openai_functions/tagging.py +4 -4
- langchain/chains/openai_tools/extraction.py +7 -8
- langchain/chains/qa_generation/base.py +8 -3
- langchain/chains/qa_generation/prompt.py +5 -5
- langchain/chains/qa_with_sources/base.py +17 -6
- langchain/chains/qa_with_sources/loading.py +16 -8
- langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
- langchain/chains/qa_with_sources/refine_prompts.py +0 -1
- langchain/chains/qa_with_sources/retrieval.py +15 -6
- langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
- langchain/chains/qa_with_sources/vector_db.py +21 -8
- langchain/chains/query_constructor/base.py +37 -34
- langchain/chains/query_constructor/ir.py +4 -4
- langchain/chains/query_constructor/parser.py +101 -34
- langchain/chains/query_constructor/prompt.py +5 -6
- langchain/chains/question_answering/chain.py +21 -10
- langchain/chains/question_answering/map_reduce_prompt.py +14 -14
- langchain/chains/question_answering/map_rerank_prompt.py +3 -3
- langchain/chains/question_answering/refine_prompts.py +2 -5
- langchain/chains/question_answering/stuff_prompt.py +5 -5
- langchain/chains/retrieval.py +1 -3
- langchain/chains/retrieval_qa/base.py +38 -27
- langchain/chains/retrieval_qa/prompt.py +1 -2
- langchain/chains/router/__init__.py +3 -3
- langchain/chains/router/base.py +38 -22
- langchain/chains/router/embedding_router.py +15 -8
- langchain/chains/router/llm_router.py +23 -20
- langchain/chains/router/multi_prompt.py +5 -2
- langchain/chains/router/multi_retrieval_qa.py +28 -5
- langchain/chains/sequential.py +30 -18
- langchain/chains/sql_database/prompt.py +14 -16
- langchain/chains/sql_database/query.py +7 -5
- langchain/chains/structured_output/__init__.py +1 -1
- langchain/chains/structured_output/base.py +77 -67
- langchain/chains/summarize/chain.py +11 -5
- langchain/chains/summarize/map_reduce_prompt.py +0 -1
- langchain/chains/summarize/stuff_prompt.py +0 -1
- langchain/chains/transform.py +9 -6
- langchain/chat_loaders/facebook_messenger.py +1 -1
- langchain/chat_loaders/langsmith.py +1 -1
- langchain/chat_loaders/utils.py +3 -3
- langchain/chat_models/__init__.py +20 -19
- langchain/chat_models/anthropic.py +1 -1
- langchain/chat_models/azureml_endpoint.py +1 -1
- langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
- langchain/chat_models/base.py +213 -139
- langchain/chat_models/bedrock.py +1 -1
- langchain/chat_models/fake.py +1 -1
- langchain/chat_models/meta.py +1 -1
- langchain/chat_models/pai_eas_endpoint.py +1 -1
- langchain/chat_models/promptlayer_openai.py +1 -1
- langchain/chat_models/volcengine_maas.py +1 -1
- langchain/docstore/base.py +1 -1
- langchain/document_loaders/__init__.py +9 -9
- langchain/document_loaders/airbyte.py +3 -3
- langchain/document_loaders/assemblyai.py +1 -1
- langchain/document_loaders/azure_blob_storage_container.py +1 -1
- langchain/document_loaders/azure_blob_storage_file.py +1 -1
- langchain/document_loaders/baiducloud_bos_file.py +1 -1
- langchain/document_loaders/base.py +1 -1
- langchain/document_loaders/blob_loaders/__init__.py +1 -1
- langchain/document_loaders/blob_loaders/schema.py +1 -4
- langchain/document_loaders/blockchain.py +1 -1
- langchain/document_loaders/chatgpt.py +1 -1
- langchain/document_loaders/college_confidential.py +1 -1
- langchain/document_loaders/confluence.py +1 -1
- langchain/document_loaders/email.py +1 -1
- langchain/document_loaders/facebook_chat.py +1 -1
- langchain/document_loaders/markdown.py +1 -1
- langchain/document_loaders/notebook.py +1 -1
- langchain/document_loaders/org_mode.py +1 -1
- langchain/document_loaders/parsers/__init__.py +1 -1
- langchain/document_loaders/parsers/docai.py +1 -1
- langchain/document_loaders/parsers/generic.py +1 -1
- langchain/document_loaders/parsers/html/__init__.py +1 -1
- langchain/document_loaders/parsers/html/bs4.py +1 -1
- langchain/document_loaders/parsers/language/cobol.py +1 -1
- langchain/document_loaders/parsers/language/python.py +1 -1
- langchain/document_loaders/parsers/msword.py +1 -1
- langchain/document_loaders/parsers/pdf.py +5 -5
- langchain/document_loaders/parsers/registry.py +1 -1
- langchain/document_loaders/pdf.py +8 -8
- langchain/document_loaders/powerpoint.py +1 -1
- langchain/document_loaders/pyspark_dataframe.py +1 -1
- langchain/document_loaders/telegram.py +2 -2
- langchain/document_loaders/tencent_cos_directory.py +1 -1
- langchain/document_loaders/unstructured.py +5 -5
- langchain/document_loaders/url_playwright.py +1 -1
- langchain/document_loaders/whatsapp_chat.py +1 -1
- langchain/document_loaders/youtube.py +2 -2
- langchain/document_transformers/__init__.py +3 -3
- langchain/document_transformers/beautiful_soup_transformer.py +1 -1
- langchain/document_transformers/doctran_text_extract.py +1 -1
- langchain/document_transformers/doctran_text_qa.py +1 -1
- langchain/document_transformers/doctran_text_translate.py +1 -1
- langchain/document_transformers/embeddings_redundant_filter.py +3 -3
- langchain/document_transformers/google_translate.py +1 -1
- langchain/document_transformers/html2text.py +1 -1
- langchain/document_transformers/nuclia_text_transform.py +1 -1
- langchain/embeddings/__init__.py +5 -5
- langchain/embeddings/base.py +35 -24
- langchain/embeddings/cache.py +37 -32
- langchain/embeddings/fake.py +1 -1
- langchain/embeddings/huggingface.py +2 -2
- langchain/evaluation/__init__.py +22 -22
- langchain/evaluation/agents/trajectory_eval_chain.py +26 -25
- langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
- langchain/evaluation/comparison/__init__.py +1 -1
- langchain/evaluation/comparison/eval_chain.py +21 -13
- langchain/evaluation/comparison/prompt.py +1 -2
- langchain/evaluation/criteria/__init__.py +1 -1
- langchain/evaluation/criteria/eval_chain.py +23 -11
- langchain/evaluation/criteria/prompt.py +2 -3
- langchain/evaluation/embedding_distance/base.py +34 -20
- langchain/evaluation/exact_match/base.py +14 -1
- langchain/evaluation/loading.py +16 -11
- langchain/evaluation/parsing/base.py +20 -4
- langchain/evaluation/parsing/json_distance.py +24 -10
- langchain/evaluation/parsing/json_schema.py +13 -12
- langchain/evaluation/qa/__init__.py +1 -1
- langchain/evaluation/qa/eval_chain.py +20 -5
- langchain/evaluation/qa/eval_prompt.py +7 -8
- langchain/evaluation/qa/generate_chain.py +4 -1
- langchain/evaluation/qa/generate_prompt.py +2 -4
- langchain/evaluation/regex_match/base.py +9 -1
- langchain/evaluation/schema.py +38 -30
- langchain/evaluation/scoring/__init__.py +1 -1
- langchain/evaluation/scoring/eval_chain.py +23 -15
- langchain/evaluation/scoring/prompt.py +0 -1
- langchain/evaluation/string_distance/base.py +20 -9
- langchain/globals.py +12 -11
- langchain/graphs/__init__.py +6 -6
- langchain/graphs/graph_document.py +1 -1
- langchain/graphs/networkx_graph.py +2 -2
- langchain/hub.py +9 -11
- langchain/indexes/__init__.py +3 -3
- langchain/indexes/_sql_record_manager.py +63 -46
- langchain/indexes/prompts/entity_extraction.py +1 -2
- langchain/indexes/prompts/entity_summarization.py +1 -2
- langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
- langchain/indexes/vectorstore.py +35 -19
- langchain/llms/__init__.py +13 -13
- langchain/llms/ai21.py +1 -1
- langchain/llms/azureml_endpoint.py +4 -4
- langchain/llms/base.py +15 -7
- langchain/llms/bedrock.py +1 -1
- langchain/llms/cloudflare_workersai.py +1 -1
- langchain/llms/gradient_ai.py +1 -1
- langchain/llms/loading.py +1 -1
- langchain/llms/openai.py +1 -1
- langchain/llms/sagemaker_endpoint.py +1 -1
- langchain/load/dump.py +1 -1
- langchain/load/load.py +1 -1
- langchain/load/serializable.py +3 -3
- langchain/memory/__init__.py +3 -3
- langchain/memory/buffer.py +14 -7
- langchain/memory/buffer_window.py +2 -0
- langchain/memory/chat_memory.py +14 -8
- langchain/memory/chat_message_histories/__init__.py +1 -1
- langchain/memory/chat_message_histories/astradb.py +1 -1
- langchain/memory/chat_message_histories/cassandra.py +1 -1
- langchain/memory/chat_message_histories/cosmos_db.py +1 -1
- langchain/memory/chat_message_histories/dynamodb.py +1 -1
- langchain/memory/chat_message_histories/elasticsearch.py +1 -1
- langchain/memory/chat_message_histories/file.py +1 -1
- langchain/memory/chat_message_histories/firestore.py +1 -1
- langchain/memory/chat_message_histories/momento.py +1 -1
- langchain/memory/chat_message_histories/mongodb.py +1 -1
- langchain/memory/chat_message_histories/neo4j.py +1 -1
- langchain/memory/chat_message_histories/postgres.py +1 -1
- langchain/memory/chat_message_histories/redis.py +1 -1
- langchain/memory/chat_message_histories/rocksetdb.py +1 -1
- langchain/memory/chat_message_histories/singlestoredb.py +1 -1
- langchain/memory/chat_message_histories/streamlit.py +1 -1
- langchain/memory/chat_message_histories/upstash_redis.py +1 -1
- langchain/memory/chat_message_histories/xata.py +1 -1
- langchain/memory/chat_message_histories/zep.py +1 -1
- langchain/memory/combined.py +14 -13
- langchain/memory/entity.py +131 -61
- langchain/memory/prompt.py +10 -11
- langchain/memory/readonly.py +0 -2
- langchain/memory/simple.py +4 -3
- langchain/memory/summary.py +43 -11
- langchain/memory/summary_buffer.py +20 -8
- langchain/memory/token_buffer.py +2 -0
- langchain/memory/utils.py +3 -2
- langchain/memory/vectorstore.py +12 -5
- langchain/memory/vectorstore_token_buffer_memory.py +5 -5
- langchain/model_laboratory.py +12 -11
- langchain/output_parsers/__init__.py +4 -4
- langchain/output_parsers/boolean.py +7 -4
- langchain/output_parsers/combining.py +14 -7
- langchain/output_parsers/datetime.py +32 -31
- langchain/output_parsers/enum.py +10 -4
- langchain/output_parsers/fix.py +60 -53
- langchain/output_parsers/format_instructions.py +6 -8
- langchain/output_parsers/json.py +2 -2
- langchain/output_parsers/list.py +2 -2
- langchain/output_parsers/loading.py +9 -9
- langchain/output_parsers/openai_functions.py +3 -3
- langchain/output_parsers/openai_tools.py +1 -1
- langchain/output_parsers/pandas_dataframe.py +59 -48
- langchain/output_parsers/prompts.py +1 -2
- langchain/output_parsers/rail_parser.py +1 -1
- langchain/output_parsers/regex.py +9 -8
- langchain/output_parsers/regex_dict.py +7 -10
- langchain/output_parsers/retry.py +99 -80
- langchain/output_parsers/structured.py +21 -6
- langchain/output_parsers/yaml.py +19 -11
- langchain/prompts/__init__.py +5 -3
- langchain/prompts/base.py +5 -5
- langchain/prompts/chat.py +8 -8
- langchain/prompts/example_selector/__init__.py +3 -1
- langchain/prompts/example_selector/semantic_similarity.py +2 -2
- langchain/prompts/few_shot.py +1 -1
- langchain/prompts/loading.py +3 -3
- langchain/prompts/prompt.py +1 -1
- langchain/pydantic_v1/__init__.py +1 -1
- langchain/retrievers/__init__.py +5 -5
- langchain/retrievers/bedrock.py +2 -2
- langchain/retrievers/bm25.py +1 -1
- langchain/retrievers/contextual_compression.py +14 -8
- langchain/retrievers/docarray.py +1 -1
- langchain/retrievers/document_compressors/__init__.py +5 -4
- langchain/retrievers/document_compressors/base.py +12 -6
- langchain/retrievers/document_compressors/chain_extract.py +5 -3
- langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
- langchain/retrievers/document_compressors/chain_filter.py +9 -9
- langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
- langchain/retrievers/document_compressors/cohere_rerank.py +17 -15
- langchain/retrievers/document_compressors/cross_encoder_rerank.py +2 -0
- langchain/retrievers/document_compressors/embeddings_filter.py +24 -17
- langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
- langchain/retrievers/document_compressors/listwise_rerank.py +8 -5
- langchain/retrievers/ensemble.py +30 -27
- langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
- langchain/retrievers/google_vertex_ai_search.py +2 -2
- langchain/retrievers/kendra.py +10 -10
- langchain/retrievers/llama_index.py +1 -1
- langchain/retrievers/merger_retriever.py +11 -11
- langchain/retrievers/milvus.py +1 -1
- langchain/retrievers/multi_query.py +35 -27
- langchain/retrievers/multi_vector.py +24 -9
- langchain/retrievers/parent_document_retriever.py +33 -9
- langchain/retrievers/re_phraser.py +6 -5
- langchain/retrievers/self_query/base.py +157 -127
- langchain/retrievers/time_weighted_retriever.py +21 -7
- langchain/retrievers/zilliz.py +1 -1
- langchain/runnables/hub.py +12 -0
- langchain/runnables/openai_functions.py +12 -2
- langchain/schema/__init__.py +23 -23
- langchain/schema/cache.py +1 -1
- langchain/schema/callbacks/base.py +7 -7
- langchain/schema/callbacks/manager.py +19 -19
- langchain/schema/callbacks/tracers/base.py +1 -1
- langchain/schema/callbacks/tracers/evaluation.py +1 -1
- langchain/schema/callbacks/tracers/langchain.py +1 -1
- langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
- langchain/schema/callbacks/tracers/log_stream.py +1 -1
- langchain/schema/callbacks/tracers/schemas.py +8 -8
- langchain/schema/callbacks/tracers/stdout.py +3 -3
- langchain/schema/document.py +1 -1
- langchain/schema/language_model.py +2 -2
- langchain/schema/messages.py +12 -12
- langchain/schema/output.py +3 -3
- langchain/schema/output_parser.py +3 -3
- langchain/schema/runnable/__init__.py +3 -3
- langchain/schema/runnable/base.py +9 -9
- langchain/schema/runnable/config.py +5 -5
- langchain/schema/runnable/configurable.py +1 -1
- langchain/schema/runnable/history.py +1 -1
- langchain/schema/runnable/passthrough.py +1 -1
- langchain/schema/runnable/utils.py +16 -16
- langchain/schema/vectorstore.py +1 -1
- langchain/smith/__init__.py +2 -1
- langchain/smith/evaluation/__init__.py +2 -2
- langchain/smith/evaluation/config.py +9 -23
- langchain/smith/evaluation/name_generation.py +3 -3
- langchain/smith/evaluation/progress.py +22 -4
- langchain/smith/evaluation/runner_utils.py +416 -247
- langchain/smith/evaluation/string_run_evaluator.py +102 -68
- langchain/storage/__init__.py +2 -2
- langchain/storage/_lc_store.py +4 -2
- langchain/storage/encoder_backed.py +7 -2
- langchain/storage/file_system.py +19 -16
- langchain/storage/in_memory.py +1 -1
- langchain/storage/upstash_redis.py +1 -1
- langchain/text_splitter.py +15 -15
- langchain/tools/__init__.py +28 -26
- langchain/tools/ainetwork/app.py +1 -1
- langchain/tools/ainetwork/base.py +1 -1
- langchain/tools/ainetwork/owner.py +1 -1
- langchain/tools/ainetwork/rule.py +1 -1
- langchain/tools/ainetwork/transfer.py +1 -1
- langchain/tools/ainetwork/value.py +1 -1
- langchain/tools/amadeus/closest_airport.py +1 -1
- langchain/tools/amadeus/flight_search.py +1 -1
- langchain/tools/azure_cognitive_services/__init__.py +1 -1
- langchain/tools/base.py +4 -4
- langchain/tools/bearly/tool.py +1 -1
- langchain/tools/bing_search/__init__.py +1 -1
- langchain/tools/bing_search/tool.py +1 -1
- langchain/tools/dataforseo_api_search/__init__.py +1 -1
- langchain/tools/dataforseo_api_search/tool.py +1 -1
- langchain/tools/ddg_search/tool.py +1 -1
- langchain/tools/e2b_data_analysis/tool.py +2 -2
- langchain/tools/edenai/__init__.py +1 -1
- langchain/tools/file_management/__init__.py +1 -1
- langchain/tools/file_management/copy.py +1 -1
- langchain/tools/file_management/delete.py +1 -1
- langchain/tools/gmail/__init__.py +2 -2
- langchain/tools/gmail/get_message.py +1 -1
- langchain/tools/gmail/search.py +1 -1
- langchain/tools/gmail/send_message.py +1 -1
- langchain/tools/google_finance/__init__.py +1 -1
- langchain/tools/google_finance/tool.py +1 -1
- langchain/tools/google_scholar/__init__.py +1 -1
- langchain/tools/google_scholar/tool.py +1 -1
- langchain/tools/google_search/__init__.py +1 -1
- langchain/tools/google_search/tool.py +1 -1
- langchain/tools/google_serper/__init__.py +1 -1
- langchain/tools/google_serper/tool.py +1 -1
- langchain/tools/google_trends/__init__.py +1 -1
- langchain/tools/google_trends/tool.py +1 -1
- langchain/tools/jira/tool.py +20 -1
- langchain/tools/json/tool.py +25 -3
- langchain/tools/memorize/tool.py +1 -1
- langchain/tools/multion/__init__.py +1 -1
- langchain/tools/multion/update_session.py +1 -1
- langchain/tools/office365/__init__.py +2 -2
- langchain/tools/office365/events_search.py +1 -1
- langchain/tools/office365/messages_search.py +1 -1
- langchain/tools/office365/send_event.py +1 -1
- langchain/tools/office365/send_message.py +1 -1
- langchain/tools/openapi/utils/api_models.py +6 -6
- langchain/tools/playwright/__init__.py +5 -5
- langchain/tools/playwright/click.py +1 -1
- langchain/tools/playwright/extract_hyperlinks.py +1 -1
- langchain/tools/playwright/get_elements.py +1 -1
- langchain/tools/playwright/navigate.py +1 -1
- langchain/tools/plugin.py +2 -2
- langchain/tools/powerbi/tool.py +1 -1
- langchain/tools/python/__init__.py +3 -2
- langchain/tools/reddit_search/tool.py +1 -1
- langchain/tools/render.py +2 -2
- langchain/tools/requests/tool.py +2 -2
- langchain/tools/searchapi/tool.py +1 -1
- langchain/tools/searx_search/tool.py +1 -1
- langchain/tools/slack/get_message.py +1 -1
- langchain/tools/spark_sql/tool.py +1 -1
- langchain/tools/sql_database/tool.py +1 -1
- langchain/tools/tavily_search/__init__.py +1 -1
- langchain/tools/tavily_search/tool.py +1 -1
- langchain/tools/zapier/__init__.py +1 -1
- langchain/tools/zapier/tool.py +24 -2
- langchain/utilities/__init__.py +4 -4
- langchain/utilities/arcee.py +4 -4
- langchain/utilities/clickup.py +4 -4
- langchain/utilities/dalle_image_generator.py +1 -1
- langchain/utilities/dataforseo_api_search.py +1 -1
- langchain/utilities/opaqueprompts.py +1 -1
- langchain/utilities/reddit_search.py +1 -1
- langchain/utilities/sql_database.py +1 -1
- langchain/utilities/tavily_search.py +1 -1
- langchain/utilities/vertexai.py +2 -2
- langchain/utils/__init__.py +1 -1
- langchain/utils/aiter.py +1 -1
- langchain/utils/html.py +3 -3
- langchain/utils/input.py +1 -1
- langchain/utils/iter.py +1 -1
- langchain/utils/json_schema.py +1 -3
- langchain/utils/strings.py +1 -1
- langchain/utils/utils.py +6 -6
- langchain/vectorstores/__init__.py +5 -5
- langchain/vectorstores/alibabacloud_opensearch.py +1 -1
- langchain/vectorstores/azure_cosmos_db.py +1 -1
- langchain/vectorstores/clickhouse.py +1 -1
- langchain/vectorstores/elastic_vector_search.py +1 -1
- langchain/vectorstores/elasticsearch.py +2 -2
- langchain/vectorstores/myscale.py +1 -1
- langchain/vectorstores/neo4j_vector.py +1 -1
- langchain/vectorstores/pgembedding.py +1 -1
- langchain/vectorstores/qdrant.py +1 -1
- langchain/vectorstores/redis/__init__.py +1 -1
- langchain/vectorstores/redis/base.py +1 -1
- langchain/vectorstores/redis/filters.py +4 -4
- langchain/vectorstores/redis/schema.py +6 -6
- langchain/vectorstores/sklearn.py +2 -2
- langchain/vectorstores/starrocks.py +1 -1
- langchain/vectorstores/utils.py +1 -1
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/METADATA +4 -14
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/RECORD +590 -591
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/WHEEL +1 -1
- langchain/smith/evaluation/utils.py +0 -0
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/entry_points.txt +0 -0
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/licenses/LICENSE +0 -0
|
@@ -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
|
-
"SQLDatabaseToolkit": "langchain_community.agent_toolkits.sql.toolkit"
|
|
12
|
+
"SQLDatabaseToolkit": "langchain_community.agent_toolkits.sql.toolkit",
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
_import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)
|
|
@@ -35,7 +35,7 @@ def create_vectorstore_agent(
|
|
|
35
35
|
toolkit: VectorStoreToolkit,
|
|
36
36
|
callback_manager: Optional[BaseCallbackManager] = None,
|
|
37
37
|
prefix: str = PREFIX,
|
|
38
|
-
verbose: bool = False,
|
|
38
|
+
verbose: bool = False, # noqa: FBT001,FBT002
|
|
39
39
|
agent_executor_kwargs: Optional[dict[str, Any]] = None,
|
|
40
40
|
**kwargs: Any,
|
|
41
41
|
) -> AgentExecutor:
|
|
@@ -90,6 +90,7 @@ def create_vectorstore_agent(
|
|
|
90
90
|
|
|
91
91
|
Returns:
|
|
92
92
|
AgentExecutor: Returns a callable AgentExecutor object. Either you can call it or use run method with the query to get the response
|
|
93
|
+
|
|
93
94
|
""" # noqa: E501
|
|
94
95
|
tools = toolkit.get_tools()
|
|
95
96
|
prompt = ZeroShotAgent.create_prompt(tools, prefix=prefix)
|
|
@@ -128,7 +129,7 @@ def create_vectorstore_router_agent(
|
|
|
128
129
|
toolkit: VectorStoreRouterToolkit,
|
|
129
130
|
callback_manager: Optional[BaseCallbackManager] = None,
|
|
130
131
|
prefix: str = ROUTER_PREFIX,
|
|
131
|
-
verbose: bool = False,
|
|
132
|
+
verbose: bool = False, # noqa: FBT001,FBT002
|
|
132
133
|
agent_executor_kwargs: Optional[dict[str, Any]] = None,
|
|
133
134
|
**kwargs: Any,
|
|
134
135
|
) -> AgentExecutor:
|
|
@@ -198,6 +199,7 @@ def create_vectorstore_router_agent(
|
|
|
198
199
|
|
|
199
200
|
Returns:
|
|
200
201
|
AgentExecutor: Returns a callable AgentExecutor object. Either you can call it or use run method with the query to get the response.
|
|
202
|
+
|
|
201
203
|
""" # noqa: E501
|
|
202
204
|
tools = toolkit.get_tools()
|
|
203
205
|
prompt = ZeroShotAgent.create_prompt(tools, prefix=prefix)
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
|
-
|
|
3
1
|
PREFIX = """You are an agent designed to answer questions about sets of documents.
|
|
4
2
|
You have access to tools for interacting with the documents, and the inputs to the tools are questions.
|
|
5
3
|
Sometimes, you will be asked to provide sources for your questions, in which case you should use the appropriate tool to do so.
|
|
6
4
|
If the question does not seem relevant to any of the tools provided, just return "I don't know" as the answer.
|
|
7
|
-
"""
|
|
5
|
+
""" # noqa: E501
|
|
8
6
|
|
|
9
7
|
ROUTER_PREFIX = """You are an agent designed to answer questions.
|
|
10
8
|
You have access to tools for interacting with different sources, and the inputs to the tools are questions.
|
|
11
9
|
Your main task is to decide which of the tools is relevant for answering question at hand.
|
|
12
10
|
For complex questions, you can break the question down into sub questions and use tools to answers the sub questions.
|
|
13
|
-
"""
|
|
11
|
+
""" # noqa: E501
|
|
@@ -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
|
@@ -13,6 +13,7 @@ from langchain_core.prompts.chat import (
|
|
|
13
13
|
)
|
|
14
14
|
from langchain_core.tools import BaseTool
|
|
15
15
|
from pydantic import Field
|
|
16
|
+
from typing_extensions import override
|
|
16
17
|
|
|
17
18
|
from langchain._api.deprecation import AGENT_DEPRECATION_WARNING
|
|
18
19
|
from langchain.agents.agent import Agent, AgentOutputParser
|
|
@@ -49,21 +50,23 @@ class ChatAgent(Agent):
|
|
|
49
50
|
return "Thought:"
|
|
50
51
|
|
|
51
52
|
def _construct_scratchpad(
|
|
52
|
-
self,
|
|
53
|
+
self,
|
|
54
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
53
55
|
) -> str:
|
|
54
56
|
agent_scratchpad = super()._construct_scratchpad(intermediate_steps)
|
|
55
57
|
if not isinstance(agent_scratchpad, str):
|
|
56
|
-
|
|
58
|
+
msg = "agent_scratchpad should be of type string."
|
|
59
|
+
raise ValueError(msg) # noqa: TRY004
|
|
57
60
|
if agent_scratchpad:
|
|
58
61
|
return (
|
|
59
62
|
f"This was your previous work "
|
|
60
63
|
f"(but I haven't seen any of it! I only see what "
|
|
61
64
|
f"you return as final answer):\n{agent_scratchpad}"
|
|
62
65
|
)
|
|
63
|
-
|
|
64
|
-
return agent_scratchpad
|
|
66
|
+
return agent_scratchpad
|
|
65
67
|
|
|
66
68
|
@classmethod
|
|
69
|
+
@override
|
|
67
70
|
def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
|
|
68
71
|
return ChatOutputParser()
|
|
69
72
|
|
|
@@ -106,14 +109,7 @@ class ChatAgent(Agent):
|
|
|
106
109
|
tool_strings = "\n".join([f"{tool.name}: {tool.description}" for tool in tools])
|
|
107
110
|
tool_names = ", ".join([tool.name for tool in tools])
|
|
108
111
|
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
|
-
)
|
|
112
|
+
template = f"{system_message_prefix}\n\n{tool_strings}\n\n{format_instructions}\n\n{system_message_suffix}" # noqa: E501
|
|
117
113
|
messages = [
|
|
118
114
|
SystemMessagePromptTemplate.from_template(template),
|
|
119
115
|
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}"
|
|
@@ -11,6 +11,7 @@ from langchain_core.language_models import BaseLanguageModel
|
|
|
11
11
|
from langchain_core.prompts import PromptTemplate
|
|
12
12
|
from langchain_core.tools import BaseTool
|
|
13
13
|
from pydantic import Field
|
|
14
|
+
from typing_extensions import override
|
|
14
15
|
|
|
15
16
|
from langchain._api.deprecation import AGENT_DEPRECATION_WARNING
|
|
16
17
|
from langchain.agents.agent import Agent, AgentOutputParser
|
|
@@ -35,8 +36,11 @@ class ConversationalAgent(Agent):
|
|
|
35
36
|
"""Output parser for the agent."""
|
|
36
37
|
|
|
37
38
|
@classmethod
|
|
39
|
+
@override
|
|
38
40
|
def _get_default_output_parser(
|
|
39
|
-
cls,
|
|
41
|
+
cls,
|
|
42
|
+
ai_prefix: str = "AI",
|
|
43
|
+
**kwargs: Any,
|
|
40
44
|
) -> AgentOutputParser:
|
|
41
45
|
return ConvoOutputParser(ai_prefix=ai_prefix)
|
|
42
46
|
|
|
@@ -93,13 +97,15 @@ class ConversationalAgent(Agent):
|
|
|
93
97
|
A PromptTemplate with the template assembled from the pieces here.
|
|
94
98
|
"""
|
|
95
99
|
tool_strings = "\n".join(
|
|
96
|
-
[f"> {tool.name}: {tool.description}" for tool in tools]
|
|
100
|
+
[f"> {tool.name}: {tool.description}" for tool in tools],
|
|
97
101
|
)
|
|
98
102
|
tool_names = ", ".join([tool.name for tool in tools])
|
|
99
103
|
format_instructions = format_instructions.format(
|
|
100
|
-
tool_names=tool_names,
|
|
104
|
+
tool_names=tool_names,
|
|
105
|
+
ai_prefix=ai_prefix,
|
|
106
|
+
human_prefix=human_prefix,
|
|
101
107
|
)
|
|
102
|
-
template = "\n\n
|
|
108
|
+
template = f"{prefix}\n\n{tool_strings}\n\n{format_instructions}\n\n{suffix}"
|
|
103
109
|
if input_variables is None:
|
|
104
110
|
input_variables = ["input", "chat_history", "agent_scratchpad"]
|
|
105
111
|
return PromptTemplate(template=template, input_variables=input_variables)
|
|
@@ -161,7 +167,7 @@ class ConversationalAgent(Agent):
|
|
|
161
167
|
)
|
|
162
168
|
tool_names = [tool.name for tool in tools]
|
|
163
169
|
_output_parser = output_parser or cls._get_default_output_parser(
|
|
164
|
-
ai_prefix=ai_prefix
|
|
170
|
+
ai_prefix=ai_prefix,
|
|
165
171
|
)
|
|
166
172
|
return cls(
|
|
167
173
|
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
|
|
|
@@ -20,6 +20,7 @@ from langchain_core.prompts.chat import (
|
|
|
20
20
|
)
|
|
21
21
|
from langchain_core.tools import BaseTool
|
|
22
22
|
from pydantic import Field
|
|
23
|
+
from typing_extensions import override
|
|
23
24
|
|
|
24
25
|
from langchain.agents.agent import Agent, AgentOutputParser
|
|
25
26
|
from langchain.agents.conversational_chat.output_parser import ConvoOutputParser
|
|
@@ -42,6 +43,7 @@ class ConversationalChatAgent(Agent):
|
|
|
42
43
|
"""Template for the tool response."""
|
|
43
44
|
|
|
44
45
|
@classmethod
|
|
46
|
+
@override
|
|
45
47
|
def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
|
|
46
48
|
return ConvoOutputParser()
|
|
47
49
|
|
|
@@ -96,15 +98,16 @@ class ConversationalChatAgent(Agent):
|
|
|
96
98
|
A PromptTemplate.
|
|
97
99
|
"""
|
|
98
100
|
tool_strings = "\n".join(
|
|
99
|
-
[f"> {tool.name}: {tool.description}" for tool in tools]
|
|
101
|
+
[f"> {tool.name}: {tool.description}" for tool in tools],
|
|
100
102
|
)
|
|
101
103
|
tool_names = ", ".join([tool.name for tool in tools])
|
|
102
104
|
_output_parser = output_parser or cls._get_default_output_parser()
|
|
103
105
|
format_instructions = human_message.format(
|
|
104
|
-
format_instructions=_output_parser.get_format_instructions()
|
|
106
|
+
format_instructions=_output_parser.get_format_instructions(),
|
|
105
107
|
)
|
|
106
108
|
final_prompt = format_instructions.format(
|
|
107
|
-
tool_names=tool_names,
|
|
109
|
+
tool_names=tool_names,
|
|
110
|
+
tools=tool_strings,
|
|
108
111
|
)
|
|
109
112
|
if input_variables is None:
|
|
110
113
|
input_variables = ["input", "chat_history", "agent_scratchpad"]
|
|
@@ -117,14 +120,15 @@ class ConversationalChatAgent(Agent):
|
|
|
117
120
|
return ChatPromptTemplate(input_variables=input_variables, messages=messages)
|
|
118
121
|
|
|
119
122
|
def _construct_scratchpad(
|
|
120
|
-
self,
|
|
123
|
+
self,
|
|
124
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
121
125
|
) -> list[BaseMessage]:
|
|
122
126
|
"""Construct the scratchpad that lets the agent continue its thought process."""
|
|
123
127
|
thoughts: list[BaseMessage] = []
|
|
124
128
|
for action, observation in intermediate_steps:
|
|
125
129
|
thoughts.append(AIMessage(content=action.log))
|
|
126
130
|
human_message = HumanMessage(
|
|
127
|
-
content=self.template_tool_response.format(observation=observation)
|
|
131
|
+
content=self.template_tool_response.format(observation=observation),
|
|
128
132
|
)
|
|
129
133
|
thoughts.append(human_message)
|
|
130
134
|
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
|