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
|
@@ -112,7 +112,8 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
112
112
|
"""Return the results of the map steps in the output."""
|
|
113
113
|
|
|
114
114
|
def get_output_schema(
|
|
115
|
-
self,
|
|
115
|
+
self,
|
|
116
|
+
config: Optional[RunnableConfig] = None,
|
|
116
117
|
) -> type[BaseModel]:
|
|
117
118
|
if self.return_intermediate_steps:
|
|
118
119
|
return create_model(
|
|
@@ -133,7 +134,7 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
133
134
|
"""
|
|
134
135
|
_output_keys = super().output_keys
|
|
135
136
|
if self.return_intermediate_steps:
|
|
136
|
-
_output_keys = _output_keys
|
|
137
|
+
_output_keys = [*_output_keys, "intermediate_steps"]
|
|
137
138
|
return _output_keys
|
|
138
139
|
|
|
139
140
|
model_config = ConfigDict(
|
|
@@ -147,11 +148,12 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
147
148
|
"""For backwards compatibility."""
|
|
148
149
|
if "combine_document_chain" in values:
|
|
149
150
|
if "reduce_documents_chain" in values:
|
|
150
|
-
|
|
151
|
+
msg = (
|
|
151
152
|
"Both `reduce_documents_chain` and `combine_document_chain` "
|
|
152
153
|
"cannot be provided at the same time. `combine_document_chain` "
|
|
153
154
|
"is deprecated, please only provide `reduce_documents_chain`"
|
|
154
155
|
)
|
|
156
|
+
raise ValueError(msg)
|
|
155
157
|
combine_chain = values["combine_document_chain"]
|
|
156
158
|
collapse_chain = values.get("collapse_document_chain")
|
|
157
159
|
reduce_chain = ReduceDocumentsChain(
|
|
@@ -160,8 +162,7 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
160
162
|
)
|
|
161
163
|
values["reduce_documents_chain"] = reduce_chain
|
|
162
164
|
del values["combine_document_chain"]
|
|
163
|
-
|
|
164
|
-
del values["collapse_document_chain"]
|
|
165
|
+
values.pop("collapse_document_chain", None)
|
|
165
166
|
|
|
166
167
|
return values
|
|
167
168
|
|
|
@@ -179,23 +180,25 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
179
180
|
def get_default_document_variable_name(cls, values: dict) -> Any:
|
|
180
181
|
"""Get default document variable name, if not provided."""
|
|
181
182
|
if "llm_chain" not in values:
|
|
182
|
-
|
|
183
|
+
msg = "llm_chain must be provided"
|
|
184
|
+
raise ValueError(msg)
|
|
183
185
|
|
|
184
186
|
llm_chain_variables = values["llm_chain"].prompt.input_variables
|
|
185
187
|
if "document_variable_name" not in values:
|
|
186
188
|
if len(llm_chain_variables) == 1:
|
|
187
189
|
values["document_variable_name"] = llm_chain_variables[0]
|
|
188
190
|
else:
|
|
189
|
-
|
|
191
|
+
msg = (
|
|
190
192
|
"document_variable_name must be provided if there are "
|
|
191
193
|
"multiple llm_chain input_variables"
|
|
192
194
|
)
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
195
|
+
raise ValueError(msg)
|
|
196
|
+
elif values["document_variable_name"] not in llm_chain_variables:
|
|
197
|
+
msg = (
|
|
198
|
+
f"document_variable_name {values['document_variable_name']} was "
|
|
199
|
+
f"not found in llm_chain input_variables: {llm_chain_variables}"
|
|
200
|
+
)
|
|
201
|
+
raise ValueError(msg)
|
|
199
202
|
return values
|
|
200
203
|
|
|
201
204
|
@property
|
|
@@ -204,26 +207,25 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
204
207
|
if isinstance(self.reduce_documents_chain, ReduceDocumentsChain):
|
|
205
208
|
if self.reduce_documents_chain.collapse_documents_chain:
|
|
206
209
|
return self.reduce_documents_chain.collapse_documents_chain
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
)
|
|
210
|
+
return self.reduce_documents_chain.combine_documents_chain
|
|
211
|
+
msg = (
|
|
212
|
+
f"`reduce_documents_chain` is of type "
|
|
213
|
+
f"{type(self.reduce_documents_chain)} so it does not have "
|
|
214
|
+
f"this attribute."
|
|
215
|
+
)
|
|
216
|
+
raise ValueError(msg)
|
|
215
217
|
|
|
216
218
|
@property
|
|
217
219
|
def combine_document_chain(self) -> BaseCombineDocumentsChain:
|
|
218
220
|
"""Kept for backward compatibility."""
|
|
219
221
|
if isinstance(self.reduce_documents_chain, ReduceDocumentsChain):
|
|
220
222
|
return self.reduce_documents_chain.combine_documents_chain
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
223
|
+
msg = (
|
|
224
|
+
f"`reduce_documents_chain` is of type "
|
|
225
|
+
f"{type(self.reduce_documents_chain)} so it does not have "
|
|
226
|
+
f"this attribute."
|
|
227
|
+
)
|
|
228
|
+
raise ValueError(msg)
|
|
227
229
|
|
|
228
230
|
def combine_docs(
|
|
229
231
|
self,
|
|
@@ -249,7 +251,10 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
249
251
|
for i, r in enumerate(map_results)
|
|
250
252
|
]
|
|
251
253
|
result, extra_return_dict = self.reduce_documents_chain.combine_docs(
|
|
252
|
-
result_docs,
|
|
254
|
+
result_docs,
|
|
255
|
+
token_max=token_max,
|
|
256
|
+
callbacks=callbacks,
|
|
257
|
+
**kwargs,
|
|
253
258
|
)
|
|
254
259
|
if self.return_intermediate_steps:
|
|
255
260
|
intermediate_steps = [r[question_result_key] for r in map_results]
|
|
@@ -270,7 +275,7 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
270
275
|
"""
|
|
271
276
|
map_results = await self.llm_chain.aapply(
|
|
272
277
|
# FYI - this is parallelized and so it is fast.
|
|
273
|
-
[{
|
|
278
|
+
[{self.document_variable_name: d.page_content, **kwargs} for d in docs],
|
|
274
279
|
callbacks=callbacks,
|
|
275
280
|
)
|
|
276
281
|
question_result_key = self.llm_chain.output_key
|
|
@@ -280,7 +285,10 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
280
285
|
for i, r in enumerate(map_results)
|
|
281
286
|
]
|
|
282
287
|
result, extra_return_dict = await self.reduce_documents_chain.acombine_docs(
|
|
283
|
-
result_docs,
|
|
288
|
+
result_docs,
|
|
289
|
+
token_max=token_max,
|
|
290
|
+
callbacks=callbacks,
|
|
291
|
+
**kwargs,
|
|
284
292
|
)
|
|
285
293
|
if self.return_intermediate_steps:
|
|
286
294
|
intermediate_steps = [r[question_result_key] for r in map_results]
|
|
@@ -24,7 +24,7 @@ from langchain.output_parsers.regex import RegexParser
|
|
|
24
24
|
message=(
|
|
25
25
|
"This class is deprecated. Please see the migration guide here for "
|
|
26
26
|
"a recommended replacement: "
|
|
27
|
-
"https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain/"
|
|
27
|
+
"https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain/"
|
|
28
28
|
),
|
|
29
29
|
)
|
|
30
30
|
class MapRerankDocumentsChain(BaseCombineDocumentsChain):
|
|
@@ -92,7 +92,8 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
|
|
|
92
92
|
)
|
|
93
93
|
|
|
94
94
|
def get_output_schema(
|
|
95
|
-
self,
|
|
95
|
+
self,
|
|
96
|
+
config: Optional[RunnableConfig] = None,
|
|
96
97
|
) -> type[BaseModel]:
|
|
97
98
|
schema: dict[str, Any] = {
|
|
98
99
|
self.output_key: (str, None),
|
|
@@ -100,7 +101,7 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
|
|
|
100
101
|
if self.return_intermediate_steps:
|
|
101
102
|
schema["intermediate_steps"] = (list[str], None)
|
|
102
103
|
if self.metadata_keys:
|
|
103
|
-
schema.update(
|
|
104
|
+
schema.update(dict.fromkeys(self.metadata_keys, (Any, None)))
|
|
104
105
|
|
|
105
106
|
return create_model("MapRerankOutput", **schema)
|
|
106
107
|
|
|
@@ -112,7 +113,7 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
|
|
|
112
113
|
"""
|
|
113
114
|
_output_keys = super().output_keys
|
|
114
115
|
if self.return_intermediate_steps:
|
|
115
|
-
_output_keys = _output_keys
|
|
116
|
+
_output_keys = [*_output_keys, "intermediate_steps"]
|
|
116
117
|
if self.metadata_keys is not None:
|
|
117
118
|
_output_keys += self.metadata_keys
|
|
118
119
|
return _output_keys
|
|
@@ -122,21 +123,24 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
|
|
|
122
123
|
"""Validate that the combine chain outputs a dictionary."""
|
|
123
124
|
output_parser = self.llm_chain.prompt.output_parser
|
|
124
125
|
if not isinstance(output_parser, RegexParser):
|
|
125
|
-
|
|
126
|
+
msg = (
|
|
126
127
|
"Output parser of llm_chain should be a RegexParser,"
|
|
127
128
|
f" got {output_parser}"
|
|
128
129
|
)
|
|
130
|
+
raise ValueError(msg) # noqa: TRY004
|
|
129
131
|
output_keys = output_parser.output_keys
|
|
130
132
|
if self.rank_key not in output_keys:
|
|
131
|
-
|
|
133
|
+
msg = (
|
|
132
134
|
f"Got {self.rank_key} as key to rank on, but did not find "
|
|
133
135
|
f"it in the llm_chain output keys ({output_keys})"
|
|
134
136
|
)
|
|
137
|
+
raise ValueError(msg)
|
|
135
138
|
if self.answer_key not in output_keys:
|
|
136
|
-
|
|
139
|
+
msg = (
|
|
137
140
|
f"Got {self.answer_key} as key to return, but did not find "
|
|
138
141
|
f"it in the llm_chain output keys ({output_keys})"
|
|
139
142
|
)
|
|
143
|
+
raise ValueError(msg)
|
|
140
144
|
return self
|
|
141
145
|
|
|
142
146
|
@model_validator(mode="before")
|
|
@@ -144,27 +148,32 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
|
|
|
144
148
|
def get_default_document_variable_name(cls, values: dict) -> Any:
|
|
145
149
|
"""Get default document variable name, if not provided."""
|
|
146
150
|
if "llm_chain" not in values:
|
|
147
|
-
|
|
151
|
+
msg = "llm_chain must be provided"
|
|
152
|
+
raise ValueError(msg)
|
|
148
153
|
|
|
149
154
|
llm_chain_variables = values["llm_chain"].prompt.input_variables
|
|
150
155
|
if "document_variable_name" not in values:
|
|
151
156
|
if len(llm_chain_variables) == 1:
|
|
152
157
|
values["document_variable_name"] = llm_chain_variables[0]
|
|
153
158
|
else:
|
|
154
|
-
|
|
159
|
+
msg = (
|
|
155
160
|
"document_variable_name must be provided if there are "
|
|
156
161
|
"multiple llm_chain input_variables"
|
|
157
162
|
)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
163
|
+
raise ValueError(msg)
|
|
164
|
+
elif values["document_variable_name"] not in llm_chain_variables:
|
|
165
|
+
msg = (
|
|
166
|
+
f"document_variable_name {values['document_variable_name']} was "
|
|
167
|
+
f"not found in llm_chain input_variables: {llm_chain_variables}"
|
|
168
|
+
)
|
|
169
|
+
raise ValueError(msg)
|
|
164
170
|
return values
|
|
165
171
|
|
|
166
172
|
def combine_docs(
|
|
167
|
-
self,
|
|
173
|
+
self,
|
|
174
|
+
docs: list[Document],
|
|
175
|
+
callbacks: Callbacks = None,
|
|
176
|
+
**kwargs: Any,
|
|
168
177
|
) -> tuple[str, dict]:
|
|
169
178
|
"""Combine documents in a map rerank manner.
|
|
170
179
|
|
|
@@ -182,13 +191,16 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
|
|
|
182
191
|
"""
|
|
183
192
|
results = self.llm_chain.apply_and_parse(
|
|
184
193
|
# FYI - this is parallelized and so it is fast.
|
|
185
|
-
[{
|
|
194
|
+
[{self.document_variable_name: d.page_content, **kwargs} for d in docs],
|
|
186
195
|
callbacks=callbacks,
|
|
187
196
|
)
|
|
188
197
|
return self._process_results(docs, results)
|
|
189
198
|
|
|
190
199
|
async def acombine_docs(
|
|
191
|
-
self,
|
|
200
|
+
self,
|
|
201
|
+
docs: list[Document],
|
|
202
|
+
callbacks: Callbacks = None,
|
|
203
|
+
**kwargs: Any,
|
|
192
204
|
) -> tuple[str, dict]:
|
|
193
205
|
"""Combine documents in a map rerank manner.
|
|
194
206
|
|
|
@@ -206,7 +218,7 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
|
|
|
206
218
|
"""
|
|
207
219
|
results = await self.llm_chain.aapply_and_parse(
|
|
208
220
|
# FYI - this is parallelized and so it is fast.
|
|
209
|
-
[{
|
|
221
|
+
[{self.document_variable_name: d.page_content, **kwargs} for d in docs],
|
|
210
222
|
callbacks=callbacks,
|
|
211
223
|
)
|
|
212
224
|
return self._process_results(docs, results)
|
|
@@ -218,7 +230,8 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
|
|
|
218
230
|
) -> tuple[str, dict]:
|
|
219
231
|
typed_results = cast(list[dict], results)
|
|
220
232
|
sorted_res = sorted(
|
|
221
|
-
zip(typed_results, docs),
|
|
233
|
+
zip(typed_results, docs),
|
|
234
|
+
key=lambda x: -int(x[0][self.rank_key]),
|
|
222
235
|
)
|
|
223
236
|
output, document = sorted_res[0]
|
|
224
237
|
extra_info = {}
|
|
@@ -27,7 +27,10 @@ class AsyncCombineDocsProtocol(Protocol):
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
def split_list_of_docs(
|
|
30
|
-
docs: list[Document],
|
|
30
|
+
docs: list[Document],
|
|
31
|
+
length_func: Callable,
|
|
32
|
+
token_max: int,
|
|
33
|
+
**kwargs: Any,
|
|
31
34
|
) -> list[list[Document]]:
|
|
32
35
|
"""Split Documents into subsets that each meet a cumulative length constraint.
|
|
33
36
|
|
|
@@ -48,10 +51,11 @@ def split_list_of_docs(
|
|
|
48
51
|
_num_tokens = length_func(_sub_result_docs, **kwargs)
|
|
49
52
|
if _num_tokens > token_max:
|
|
50
53
|
if len(_sub_result_docs) == 1:
|
|
51
|
-
|
|
54
|
+
msg = (
|
|
52
55
|
"A single document was longer than the context length,"
|
|
53
56
|
" we cannot handle this."
|
|
54
57
|
)
|
|
58
|
+
raise ValueError(msg)
|
|
55
59
|
new_result_doc_list.append(_sub_result_docs[:-1])
|
|
56
60
|
_sub_result_docs = _sub_result_docs[-1:]
|
|
57
61
|
new_result_doc_list.append(_sub_result_docs)
|
|
@@ -224,8 +228,7 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
224
228
|
def _collapse_chain(self) -> BaseCombineDocumentsChain:
|
|
225
229
|
if self.collapse_documents_chain is not None:
|
|
226
230
|
return self.collapse_documents_chain
|
|
227
|
-
|
|
228
|
-
return self.combine_documents_chain
|
|
231
|
+
return self.combine_documents_chain
|
|
229
232
|
|
|
230
233
|
def combine_docs(
|
|
231
234
|
self,
|
|
@@ -250,10 +253,15 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
250
253
|
element returned is a dictionary of other keys to return.
|
|
251
254
|
"""
|
|
252
255
|
result_docs, extra_return_dict = self._collapse(
|
|
253
|
-
docs,
|
|
256
|
+
docs,
|
|
257
|
+
token_max=token_max,
|
|
258
|
+
callbacks=callbacks,
|
|
259
|
+
**kwargs,
|
|
254
260
|
)
|
|
255
261
|
return self.combine_documents_chain.combine_docs(
|
|
256
|
-
docs=result_docs,
|
|
262
|
+
docs=result_docs,
|
|
263
|
+
callbacks=callbacks,
|
|
264
|
+
**kwargs,
|
|
257
265
|
)
|
|
258
266
|
|
|
259
267
|
async def acombine_docs(
|
|
@@ -279,10 +287,15 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
279
287
|
element returned is a dictionary of other keys to return.
|
|
280
288
|
"""
|
|
281
289
|
result_docs, extra_return_dict = await self._acollapse(
|
|
282
|
-
docs,
|
|
290
|
+
docs,
|
|
291
|
+
token_max=token_max,
|
|
292
|
+
callbacks=callbacks,
|
|
293
|
+
**kwargs,
|
|
283
294
|
)
|
|
284
295
|
return await self.combine_documents_chain.acombine_docs(
|
|
285
|
-
docs=result_docs,
|
|
296
|
+
docs=result_docs,
|
|
297
|
+
callbacks=callbacks,
|
|
298
|
+
**kwargs,
|
|
286
299
|
)
|
|
287
300
|
|
|
288
301
|
def _collapse(
|
|
@@ -298,26 +311,30 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
298
311
|
|
|
299
312
|
def _collapse_docs_func(docs: list[Document], **kwargs: Any) -> str:
|
|
300
313
|
return self._collapse_chain.run(
|
|
301
|
-
input_documents=docs,
|
|
314
|
+
input_documents=docs,
|
|
315
|
+
callbacks=callbacks,
|
|
316
|
+
**kwargs,
|
|
302
317
|
)
|
|
303
318
|
|
|
304
319
|
_token_max = token_max or self.token_max
|
|
305
320
|
retries: int = 0
|
|
306
321
|
while num_tokens is not None and num_tokens > _token_max:
|
|
307
322
|
new_result_doc_list = split_list_of_docs(
|
|
308
|
-
result_docs,
|
|
323
|
+
result_docs,
|
|
324
|
+
length_func,
|
|
325
|
+
_token_max,
|
|
326
|
+
**kwargs,
|
|
309
327
|
)
|
|
310
|
-
result_docs = [
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
328
|
+
result_docs = [
|
|
329
|
+
collapse_docs(docs_, _collapse_docs_func, **kwargs)
|
|
330
|
+
for docs_ in new_result_doc_list
|
|
331
|
+
]
|
|
314
332
|
num_tokens = length_func(result_docs, **kwargs)
|
|
315
333
|
retries += 1
|
|
316
334
|
if self.collapse_max_retries and retries == self.collapse_max_retries:
|
|
317
|
-
|
|
318
|
-
f"Exceed {self.collapse_max_retries} tries to \
|
|
335
|
+
msg = f"Exceed {self.collapse_max_retries} tries to \
|
|
319
336
|
collapse document to {_token_max} tokens."
|
|
320
|
-
)
|
|
337
|
+
raise ValueError(msg)
|
|
321
338
|
return result_docs, {}
|
|
322
339
|
|
|
323
340
|
async def _acollapse(
|
|
@@ -333,26 +350,30 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
|
|
|
333
350
|
|
|
334
351
|
async def _collapse_docs_func(docs: list[Document], **kwargs: Any) -> str:
|
|
335
352
|
return await self._collapse_chain.arun(
|
|
336
|
-
input_documents=docs,
|
|
353
|
+
input_documents=docs,
|
|
354
|
+
callbacks=callbacks,
|
|
355
|
+
**kwargs,
|
|
337
356
|
)
|
|
338
357
|
|
|
339
358
|
_token_max = token_max or self.token_max
|
|
340
359
|
retries: int = 0
|
|
341
360
|
while num_tokens is not None and num_tokens > _token_max:
|
|
342
361
|
new_result_doc_list = split_list_of_docs(
|
|
343
|
-
result_docs,
|
|
362
|
+
result_docs,
|
|
363
|
+
length_func,
|
|
364
|
+
_token_max,
|
|
365
|
+
**kwargs,
|
|
344
366
|
)
|
|
345
|
-
result_docs = [
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
367
|
+
result_docs = [
|
|
368
|
+
await acollapse_docs(docs_, _collapse_docs_func, **kwargs)
|
|
369
|
+
for docs_ in new_result_doc_list
|
|
370
|
+
]
|
|
349
371
|
num_tokens = length_func(result_docs, **kwargs)
|
|
350
372
|
retries += 1
|
|
351
373
|
if self.collapse_max_retries and retries == self.collapse_max_retries:
|
|
352
|
-
|
|
353
|
-
f"Exceed {self.collapse_max_retries} tries to \
|
|
374
|
+
msg = f"Exceed {self.collapse_max_retries} tries to \
|
|
354
375
|
collapse document to {_token_max} tokens."
|
|
355
|
-
)
|
|
376
|
+
raise ValueError(msg)
|
|
356
377
|
return result_docs, {}
|
|
357
378
|
|
|
358
379
|
@property
|
|
@@ -27,7 +27,7 @@ def _get_default_document_prompt() -> PromptTemplate:
|
|
|
27
27
|
message=(
|
|
28
28
|
"This class is deprecated. Please see the migration guide here for "
|
|
29
29
|
"a recommended replacement: "
|
|
30
|
-
"https://python.langchain.com/docs/versions/migrating_chains/refine_docs_chain/"
|
|
30
|
+
"https://python.langchain.com/docs/versions/migrating_chains/refine_docs_chain/"
|
|
31
31
|
),
|
|
32
32
|
)
|
|
33
33
|
class RefineDocumentsChain(BaseCombineDocumentsChain):
|
|
@@ -91,7 +91,7 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
|
|
|
91
91
|
initial_response_name: str
|
|
92
92
|
"""The variable name to format the initial response in when refining."""
|
|
93
93
|
document_prompt: BasePromptTemplate = Field(
|
|
94
|
-
default_factory=_get_default_document_prompt
|
|
94
|
+
default_factory=_get_default_document_prompt,
|
|
95
95
|
)
|
|
96
96
|
"""Prompt to use to format each document, gets passed to `format_document`."""
|
|
97
97
|
return_intermediate_steps: bool = False
|
|
@@ -105,7 +105,7 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
|
|
|
105
105
|
"""
|
|
106
106
|
_output_keys = super().output_keys
|
|
107
107
|
if self.return_intermediate_steps:
|
|
108
|
-
_output_keys = _output_keys
|
|
108
|
+
_output_keys = [*_output_keys, "intermediate_steps"]
|
|
109
109
|
return _output_keys
|
|
110
110
|
|
|
111
111
|
model_config = ConfigDict(
|
|
@@ -127,27 +127,32 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
|
|
|
127
127
|
def get_default_document_variable_name(cls, values: dict) -> Any:
|
|
128
128
|
"""Get default document variable name, if not provided."""
|
|
129
129
|
if "initial_llm_chain" not in values:
|
|
130
|
-
|
|
130
|
+
msg = "initial_llm_chain must be provided"
|
|
131
|
+
raise ValueError(msg)
|
|
131
132
|
|
|
132
133
|
llm_chain_variables = values["initial_llm_chain"].prompt.input_variables
|
|
133
134
|
if "document_variable_name" not in values:
|
|
134
135
|
if len(llm_chain_variables) == 1:
|
|
135
136
|
values["document_variable_name"] = llm_chain_variables[0]
|
|
136
137
|
else:
|
|
137
|
-
|
|
138
|
+
msg = (
|
|
138
139
|
"document_variable_name must be provided if there are "
|
|
139
140
|
"multiple llm_chain input_variables"
|
|
140
141
|
)
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
142
|
+
raise ValueError(msg)
|
|
143
|
+
elif values["document_variable_name"] not in llm_chain_variables:
|
|
144
|
+
msg = (
|
|
145
|
+
f"document_variable_name {values['document_variable_name']} was "
|
|
146
|
+
f"not found in llm_chain input_variables: {llm_chain_variables}"
|
|
147
|
+
)
|
|
148
|
+
raise ValueError(msg)
|
|
147
149
|
return values
|
|
148
150
|
|
|
149
151
|
def combine_docs(
|
|
150
|
-
self,
|
|
152
|
+
self,
|
|
153
|
+
docs: list[Document],
|
|
154
|
+
callbacks: Callbacks = None,
|
|
155
|
+
**kwargs: Any,
|
|
151
156
|
) -> tuple[str, dict]:
|
|
152
157
|
"""Combine by mapping first chain over all, then stuffing into final chain.
|
|
153
158
|
|
|
@@ -172,7 +177,10 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
|
|
|
172
177
|
return self._construct_result(refine_steps, res)
|
|
173
178
|
|
|
174
179
|
async def acombine_docs(
|
|
175
|
-
self,
|
|
180
|
+
self,
|
|
181
|
+
docs: list[Document],
|
|
182
|
+
callbacks: Callbacks = None,
|
|
183
|
+
**kwargs: Any,
|
|
176
184
|
) -> tuple[str, dict]:
|
|
177
185
|
"""Async combine by mapping a first chain over all, then stuffing
|
|
178
186
|
into a final chain.
|
|
@@ -211,16 +219,17 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
|
|
|
211
219
|
}
|
|
212
220
|
|
|
213
221
|
def _construct_initial_inputs(
|
|
214
|
-
self,
|
|
222
|
+
self,
|
|
223
|
+
docs: list[Document],
|
|
224
|
+
**kwargs: Any,
|
|
215
225
|
) -> dict[str, Any]:
|
|
216
226
|
base_info = {"page_content": docs[0].page_content}
|
|
217
227
|
base_info.update(docs[0].metadata)
|
|
218
228
|
document_info = {k: base_info[k] for k in self.document_prompt.input_variables}
|
|
219
229
|
base_inputs: dict = {
|
|
220
|
-
self.document_variable_name: self.document_prompt.format(**document_info)
|
|
230
|
+
self.document_variable_name: self.document_prompt.format(**document_info),
|
|
221
231
|
}
|
|
222
|
-
|
|
223
|
-
return inputs
|
|
232
|
+
return {**base_inputs, **kwargs}
|
|
224
233
|
|
|
225
234
|
@property
|
|
226
235
|
def _chain_type(self) -> str:
|
|
@@ -88,7 +88,7 @@ def create_stuff_documents_chain(
|
|
|
88
88
|
|
|
89
89
|
return (
|
|
90
90
|
RunnablePassthrough.assign(**{document_variable_name: format_docs}).with_config(
|
|
91
|
-
run_name="format_inputs"
|
|
91
|
+
run_name="format_inputs",
|
|
92
92
|
)
|
|
93
93
|
| prompt
|
|
94
94
|
| llm
|
|
@@ -102,7 +102,7 @@ def create_stuff_documents_chain(
|
|
|
102
102
|
message=(
|
|
103
103
|
"This class is deprecated. Use the `create_stuff_documents_chain` constructor "
|
|
104
104
|
"instead. See migration guide here: "
|
|
105
|
-
"https://python.langchain.com/docs/versions/migrating_chains/stuff_docs_chain/"
|
|
105
|
+
"https://python.langchain.com/docs/versions/migrating_chains/stuff_docs_chain/"
|
|
106
106
|
),
|
|
107
107
|
)
|
|
108
108
|
class StuffDocumentsChain(BaseCombineDocumentsChain):
|
|
@@ -147,7 +147,7 @@ class StuffDocumentsChain(BaseCombineDocumentsChain):
|
|
|
147
147
|
"""LLM chain which is called with the formatted document string,
|
|
148
148
|
along with any other inputs."""
|
|
149
149
|
document_prompt: BasePromptTemplate = Field(
|
|
150
|
-
default_factory=lambda: DEFAULT_DOCUMENT_PROMPT
|
|
150
|
+
default_factory=lambda: DEFAULT_DOCUMENT_PROMPT,
|
|
151
151
|
)
|
|
152
152
|
"""Prompt to use to format each document, gets passed to `format_document`."""
|
|
153
153
|
document_variable_name: str
|
|
@@ -175,16 +175,17 @@ class StuffDocumentsChain(BaseCombineDocumentsChain):
|
|
|
175
175
|
if len(llm_chain_variables) == 1:
|
|
176
176
|
values["document_variable_name"] = llm_chain_variables[0]
|
|
177
177
|
else:
|
|
178
|
-
|
|
178
|
+
msg = (
|
|
179
179
|
"document_variable_name must be provided if there are "
|
|
180
180
|
"multiple llm_chain_variables"
|
|
181
181
|
)
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
182
|
+
raise ValueError(msg)
|
|
183
|
+
elif values["document_variable_name"] not in llm_chain_variables:
|
|
184
|
+
msg = (
|
|
185
|
+
f"document_variable_name {values['document_variable_name']} was "
|
|
186
|
+
f"not found in llm_chain input_variables: {llm_chain_variables}"
|
|
187
|
+
)
|
|
188
|
+
raise ValueError(msg)
|
|
188
189
|
return values
|
|
189
190
|
|
|
190
191
|
@property
|
|
@@ -241,7 +242,10 @@ class StuffDocumentsChain(BaseCombineDocumentsChain):
|
|
|
241
242
|
return self.llm_chain._get_num_tokens(prompt)
|
|
242
243
|
|
|
243
244
|
def combine_docs(
|
|
244
|
-
self,
|
|
245
|
+
self,
|
|
246
|
+
docs: list[Document],
|
|
247
|
+
callbacks: Callbacks = None,
|
|
248
|
+
**kwargs: Any,
|
|
245
249
|
) -> tuple[str, dict]:
|
|
246
250
|
"""Stuff all documents into one prompt and pass to LLM.
|
|
247
251
|
|
|
@@ -259,7 +263,10 @@ class StuffDocumentsChain(BaseCombineDocumentsChain):
|
|
|
259
263
|
return self.llm_chain.predict(callbacks=callbacks, **inputs), {}
|
|
260
264
|
|
|
261
265
|
async def acombine_docs(
|
|
262
|
-
self,
|
|
266
|
+
self,
|
|
267
|
+
docs: list[Document],
|
|
268
|
+
callbacks: Callbacks = None,
|
|
269
|
+
**kwargs: Any,
|
|
263
270
|
) -> tuple[str, dict]:
|
|
264
271
|
"""Async stuff all documents into one prompt and pass to LLM.
|
|
265
272
|
|
|
@@ -19,7 +19,7 @@ from langchain.chains.llm import LLMChain
|
|
|
19
19
|
message=(
|
|
20
20
|
"This class is deprecated and will be removed in langchain 1.0. "
|
|
21
21
|
"See API reference for replacement: "
|
|
22
|
-
"https://api.python.langchain.com/en/latest/chains/langchain.chains.constitutional_ai.base.ConstitutionalChain.html"
|
|
22
|
+
"https://api.python.langchain.com/en/latest/chains/langchain.chains.constitutional_ai.base.ConstitutionalChain.html"
|
|
23
23
|
),
|
|
24
24
|
removal="1.0",
|
|
25
25
|
)
|
|
@@ -197,12 +197,12 @@ class ConstitutionalChain(Chain):
|
|
|
197
197
|
|
|
198
198
|
@classmethod
|
|
199
199
|
def get_principles(
|
|
200
|
-
cls,
|
|
200
|
+
cls,
|
|
201
|
+
names: Optional[list[str]] = None,
|
|
201
202
|
) -> list[ConstitutionalPrinciple]:
|
|
202
203
|
if names is None:
|
|
203
204
|
return list(PRINCIPLES.values())
|
|
204
|
-
|
|
205
|
-
return [PRINCIPLES[name] for name in names]
|
|
205
|
+
return [PRINCIPLES[name] for name in names]
|
|
206
206
|
|
|
207
207
|
@classmethod
|
|
208
208
|
def from_llm(
|