langchain 0.3.25__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 +7 -7
- 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 +18 -9
- 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 +47 -38
- langchain/agents/openai_functions_multi_agent/base.py +40 -27
- langchain/agents/openai_tools/base.py +8 -8
- langchain/agents/output_parsers/__init__.py +3 -3
- langchain/agents/output_parsers/json.py +7 -7
- 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 +6 -6
- 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/base.py +2 -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 +89 -55
- langchain/chains/chat_vector_db/prompts.py +2 -3
- langchain/chains/combine_documents/__init__.py +1 -1
- langchain/chains/combine_documents/base.py +24 -11
- langchain/chains/combine_documents/map_reduce.py +39 -31
- langchain/chains/combine_documents/map_rerank.py +34 -21
- 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 +6 -7
- 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 +170 -153
- 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 +117 -26
- 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 +24 -24
- langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
- langchain/evaluation/comparison/__init__.py +1 -1
- langchain/evaluation/comparison/eval_chain.py +21 -14
- langchain/evaluation/comparison/prompt.py +1 -2
- langchain/evaluation/criteria/__init__.py +1 -1
- langchain/evaluation/criteria/eval_chain.py +21 -12
- langchain/evaluation/criteria/prompt.py +2 -3
- langchain/evaluation/embedding_distance/base.py +24 -21
- 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 +13 -6
- 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 +23 -16
- langchain/evaluation/scoring/prompt.py +0 -1
- langchain/evaluation/string_distance/base.py +15 -10
- 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 +11 -8
- 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 +13 -6
- 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 +10 -9
- 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 +15 -13
- langchain/retrievers/docarray.py +1 -1
- langchain/retrievers/document_compressors/__init__.py +7 -5
- langchain/retrievers/document_compressors/base.py +13 -7
- langchain/retrievers/document_compressors/chain_extract.py +4 -5
- langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
- langchain/retrievers/document_compressors/chain_filter.py +11 -12
- langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
- langchain/retrievers/document_compressors/cohere_rerank.py +17 -19
- langchain/retrievers/document_compressors/embeddings_filter.py +23 -23
- langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
- langchain/retrievers/document_compressors/listwise_rerank.py +11 -6
- 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 -119
- langchain/retrievers/time_weighted_retriever.py +18 -7
- langchain/retrievers/zilliz.py +1 -1
- langchain/runnables/hub.py +2 -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 +3 -2
- 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 +181 -129
- 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.25.dist-info → langchain-0.3.27.dist-info}/METADATA +5 -5
- {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/RECORD +582 -582
- {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/WHEEL +1 -1
- {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/entry_points.txt +0 -0
- {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/licenses/LICENSE +0 -0
langchain/chains/loading.py
CHANGED
|
@@ -40,18 +40,20 @@ try:
|
|
|
40
40
|
except ImportError:
|
|
41
41
|
|
|
42
42
|
def load_llm(*args: Any, **kwargs: Any) -> None:
|
|
43
|
-
|
|
43
|
+
msg = (
|
|
44
44
|
"To use this load_llm functionality you must install the "
|
|
45
45
|
"langchain_community package. "
|
|
46
46
|
"You can install it with `pip install langchain_community`"
|
|
47
47
|
)
|
|
48
|
+
raise ImportError(msg)
|
|
48
49
|
|
|
49
50
|
def load_llm_from_config(*args: Any, **kwargs: Any) -> None:
|
|
50
|
-
|
|
51
|
+
msg = (
|
|
51
52
|
"To use this load_llm_from_config functionality you must install the "
|
|
52
53
|
"langchain_community package. "
|
|
53
54
|
"You can install it with `pip install langchain_community`"
|
|
54
55
|
)
|
|
56
|
+
raise ImportError(msg)
|
|
55
57
|
|
|
56
58
|
|
|
57
59
|
URL_BASE = "https://raw.githubusercontent.com/hwchase17/langchain-hub/master/chains/"
|
|
@@ -65,7 +67,8 @@ def _load_llm_chain(config: dict, **kwargs: Any) -> LLMChain:
|
|
|
65
67
|
elif "llm_path" in config:
|
|
66
68
|
llm = load_llm(config.pop("llm_path"), **kwargs)
|
|
67
69
|
else:
|
|
68
|
-
|
|
70
|
+
msg = "One of `llm` or `llm_path` must be present."
|
|
71
|
+
raise ValueError(msg)
|
|
69
72
|
|
|
70
73
|
if "prompt" in config:
|
|
71
74
|
prompt_config = config.pop("prompt")
|
|
@@ -73,7 +76,8 @@ def _load_llm_chain(config: dict, **kwargs: Any) -> LLMChain:
|
|
|
73
76
|
elif "prompt_path" in config:
|
|
74
77
|
prompt = load_prompt(config.pop("prompt_path"))
|
|
75
78
|
else:
|
|
76
|
-
|
|
79
|
+
msg = "One of `prompt` or `prompt_path` must be present."
|
|
80
|
+
raise ValueError(msg)
|
|
77
81
|
_load_output_parser(config)
|
|
78
82
|
|
|
79
83
|
return LLMChain(llm=llm, prompt=prompt, **config)
|
|
@@ -87,11 +91,13 @@ def _load_hyde_chain(config: dict, **kwargs: Any) -> HypotheticalDocumentEmbedde
|
|
|
87
91
|
elif "llm_chain_path" in config:
|
|
88
92
|
llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
|
|
89
93
|
else:
|
|
90
|
-
|
|
94
|
+
msg = "One of `llm_chain` or `llm_chain_path` must be present."
|
|
95
|
+
raise ValueError(msg)
|
|
91
96
|
if "embeddings" in kwargs:
|
|
92
97
|
embeddings = kwargs.pop("embeddings")
|
|
93
98
|
else:
|
|
94
|
-
|
|
99
|
+
msg = "`embeddings` must be present."
|
|
100
|
+
raise ValueError(msg)
|
|
95
101
|
return HypotheticalDocumentEmbedder(
|
|
96
102
|
llm_chain=llm_chain,
|
|
97
103
|
base_embeddings=embeddings,
|
|
@@ -106,10 +112,12 @@ def _load_stuff_documents_chain(config: dict, **kwargs: Any) -> StuffDocumentsCh
|
|
|
106
112
|
elif "llm_chain_path" in config:
|
|
107
113
|
llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
|
|
108
114
|
else:
|
|
109
|
-
|
|
115
|
+
msg = "One of `llm_chain` or `llm_chain_path` must be present."
|
|
116
|
+
raise ValueError(msg)
|
|
110
117
|
|
|
111
118
|
if not isinstance(llm_chain, LLMChain):
|
|
112
|
-
|
|
119
|
+
msg = f"Expected LLMChain, got {llm_chain}"
|
|
120
|
+
raise ValueError(msg) # noqa: TRY004
|
|
113
121
|
|
|
114
122
|
if "document_prompt" in config:
|
|
115
123
|
prompt_config = config.pop("document_prompt")
|
|
@@ -117,17 +125,19 @@ def _load_stuff_documents_chain(config: dict, **kwargs: Any) -> StuffDocumentsCh
|
|
|
117
125
|
elif "document_prompt_path" in config:
|
|
118
126
|
document_prompt = load_prompt(config.pop("document_prompt_path"))
|
|
119
127
|
else:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
)
|
|
128
|
+
msg = "One of `document_prompt` or `document_prompt_path` must be present."
|
|
129
|
+
raise ValueError(msg)
|
|
123
130
|
|
|
124
131
|
return StuffDocumentsChain(
|
|
125
|
-
llm_chain=llm_chain,
|
|
132
|
+
llm_chain=llm_chain,
|
|
133
|
+
document_prompt=document_prompt,
|
|
134
|
+
**config,
|
|
126
135
|
)
|
|
127
136
|
|
|
128
137
|
|
|
129
138
|
def _load_map_reduce_documents_chain(
|
|
130
|
-
config: dict,
|
|
139
|
+
config: dict,
|
|
140
|
+
**kwargs: Any,
|
|
131
141
|
) -> MapReduceDocumentsChain:
|
|
132
142
|
if "llm_chain" in config:
|
|
133
143
|
llm_chain_config = config.pop("llm_chain")
|
|
@@ -135,18 +145,22 @@ def _load_map_reduce_documents_chain(
|
|
|
135
145
|
elif "llm_chain_path" in config:
|
|
136
146
|
llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
|
|
137
147
|
else:
|
|
138
|
-
|
|
148
|
+
msg = "One of `llm_chain` or `llm_chain_path` must be present."
|
|
149
|
+
raise ValueError(msg)
|
|
139
150
|
|
|
140
151
|
if not isinstance(llm_chain, LLMChain):
|
|
141
|
-
|
|
152
|
+
msg = f"Expected LLMChain, got {llm_chain}"
|
|
153
|
+
raise ValueError(msg) # noqa: TRY004
|
|
142
154
|
|
|
143
155
|
if "reduce_documents_chain" in config:
|
|
144
156
|
reduce_documents_chain = load_chain_from_config(
|
|
145
|
-
config.pop("reduce_documents_chain"),
|
|
157
|
+
config.pop("reduce_documents_chain"),
|
|
158
|
+
**kwargs,
|
|
146
159
|
)
|
|
147
160
|
elif "reduce_documents_chain_path" in config:
|
|
148
161
|
reduce_documents_chain = load_chain(
|
|
149
|
-
config.pop("reduce_documents_chain_path"),
|
|
162
|
+
config.pop("reduce_documents_chain_path"),
|
|
163
|
+
**kwargs,
|
|
150
164
|
)
|
|
151
165
|
else:
|
|
152
166
|
reduce_documents_chain = _load_reduce_documents_chain(config, **kwargs)
|
|
@@ -165,26 +179,31 @@ def _load_reduce_documents_chain(config: dict, **kwargs: Any) -> ReduceDocuments
|
|
|
165
179
|
if "combine_documents_chain" in config:
|
|
166
180
|
combine_document_chain_config = config.pop("combine_documents_chain")
|
|
167
181
|
combine_documents_chain = load_chain_from_config(
|
|
168
|
-
combine_document_chain_config,
|
|
182
|
+
combine_document_chain_config,
|
|
183
|
+
**kwargs,
|
|
169
184
|
)
|
|
170
185
|
elif "combine_document_chain" in config:
|
|
171
186
|
combine_document_chain_config = config.pop("combine_document_chain")
|
|
172
187
|
combine_documents_chain = load_chain_from_config(
|
|
173
|
-
combine_document_chain_config,
|
|
188
|
+
combine_document_chain_config,
|
|
189
|
+
**kwargs,
|
|
174
190
|
)
|
|
175
191
|
elif "combine_documents_chain_path" in config:
|
|
176
192
|
combine_documents_chain = load_chain(
|
|
177
|
-
config.pop("combine_documents_chain_path"),
|
|
193
|
+
config.pop("combine_documents_chain_path"),
|
|
194
|
+
**kwargs,
|
|
178
195
|
)
|
|
179
196
|
elif "combine_document_chain_path" in config:
|
|
180
197
|
combine_documents_chain = load_chain(
|
|
181
|
-
config.pop("combine_document_chain_path"),
|
|
198
|
+
config.pop("combine_document_chain_path"),
|
|
199
|
+
**kwargs,
|
|
182
200
|
)
|
|
183
201
|
else:
|
|
184
|
-
|
|
202
|
+
msg = (
|
|
185
203
|
"One of `combine_documents_chain` or "
|
|
186
204
|
"`combine_documents_chain_path` must be present."
|
|
187
205
|
)
|
|
206
|
+
raise ValueError(msg)
|
|
188
207
|
|
|
189
208
|
if "collapse_documents_chain" in config:
|
|
190
209
|
collapse_document_chain_config = config.pop("collapse_documents_chain")
|
|
@@ -192,11 +211,13 @@ def _load_reduce_documents_chain(config: dict, **kwargs: Any) -> ReduceDocuments
|
|
|
192
211
|
collapse_documents_chain = None
|
|
193
212
|
else:
|
|
194
213
|
collapse_documents_chain = load_chain_from_config(
|
|
195
|
-
collapse_document_chain_config,
|
|
214
|
+
collapse_document_chain_config,
|
|
215
|
+
**kwargs,
|
|
196
216
|
)
|
|
197
217
|
elif "collapse_documents_chain_path" in config:
|
|
198
218
|
collapse_documents_chain = load_chain(
|
|
199
|
-
config.pop("collapse_documents_chain_path"),
|
|
219
|
+
config.pop("collapse_documents_chain_path"),
|
|
220
|
+
**kwargs,
|
|
200
221
|
)
|
|
201
222
|
elif "collapse_document_chain" in config:
|
|
202
223
|
collapse_document_chain_config = config.pop("collapse_document_chain")
|
|
@@ -204,11 +225,13 @@ def _load_reduce_documents_chain(config: dict, **kwargs: Any) -> ReduceDocuments
|
|
|
204
225
|
collapse_documents_chain = None
|
|
205
226
|
else:
|
|
206
227
|
collapse_documents_chain = load_chain_from_config(
|
|
207
|
-
collapse_document_chain_config,
|
|
228
|
+
collapse_document_chain_config,
|
|
229
|
+
**kwargs,
|
|
208
230
|
)
|
|
209
231
|
elif "collapse_document_chain_path" in config:
|
|
210
232
|
collapse_documents_chain = load_chain(
|
|
211
|
-
config.pop("collapse_document_chain_path"),
|
|
233
|
+
config.pop("collapse_document_chain_path"),
|
|
234
|
+
**kwargs,
|
|
212
235
|
)
|
|
213
236
|
|
|
214
237
|
return ReduceDocumentsChain(
|
|
@@ -219,33 +242,14 @@ def _load_reduce_documents_chain(config: dict, **kwargs: Any) -> ReduceDocuments
|
|
|
219
242
|
|
|
220
243
|
|
|
221
244
|
def _load_llm_bash_chain(config: dict, **kwargs: Any) -> Any:
|
|
222
|
-
from
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
# llm attribute is deprecated in favor of llm_chain, here to support old configs
|
|
231
|
-
elif "llm" in config:
|
|
232
|
-
llm_config = config.pop("llm")
|
|
233
|
-
llm = load_llm_from_config(llm_config, **kwargs)
|
|
234
|
-
# llm_path attribute is deprecated in favor of llm_chain_path,
|
|
235
|
-
# its to support old configs
|
|
236
|
-
elif "llm_path" in config:
|
|
237
|
-
llm = load_llm(config.pop("llm_path"), **kwargs)
|
|
238
|
-
else:
|
|
239
|
-
raise ValueError("One of `llm_chain` or `llm_chain_path` must be present.")
|
|
240
|
-
if "prompt" in config:
|
|
241
|
-
prompt_config = config.pop("prompt")
|
|
242
|
-
prompt = load_prompt_from_config(prompt_config)
|
|
243
|
-
elif "prompt_path" in config:
|
|
244
|
-
prompt = load_prompt(config.pop("prompt_path"))
|
|
245
|
-
if llm_chain:
|
|
246
|
-
return LLMBashChain(llm_chain=llm_chain, prompt=prompt, **config)
|
|
247
|
-
else:
|
|
248
|
-
return LLMBashChain(llm=llm, prompt=prompt, **config)
|
|
245
|
+
"""Load LLM Bash chain from config dict"""
|
|
246
|
+
msg = (
|
|
247
|
+
"LLMBash Chain is not available through LangChain anymore. "
|
|
248
|
+
"The relevant code can be found in langchain_experimental, "
|
|
249
|
+
"but it is not appropriate for production usage due to security "
|
|
250
|
+
"concerns. Please refer to langchain-experimental repository for more details."
|
|
251
|
+
)
|
|
252
|
+
raise NotImplementedError(msg)
|
|
249
253
|
|
|
250
254
|
|
|
251
255
|
def _load_llm_checker_chain(config: dict, **kwargs: Any) -> LLMCheckerChain:
|
|
@@ -255,15 +259,16 @@ def _load_llm_checker_chain(config: dict, **kwargs: Any) -> LLMCheckerChain:
|
|
|
255
259
|
elif "llm_path" in config:
|
|
256
260
|
llm = load_llm(config.pop("llm_path"), **kwargs)
|
|
257
261
|
else:
|
|
258
|
-
|
|
262
|
+
msg = "One of `llm` or `llm_path` must be present."
|
|
263
|
+
raise ValueError(msg)
|
|
259
264
|
if "create_draft_answer_prompt" in config:
|
|
260
265
|
create_draft_answer_prompt_config = config.pop("create_draft_answer_prompt")
|
|
261
266
|
create_draft_answer_prompt = load_prompt_from_config(
|
|
262
|
-
create_draft_answer_prompt_config
|
|
267
|
+
create_draft_answer_prompt_config,
|
|
263
268
|
)
|
|
264
269
|
elif "create_draft_answer_prompt_path" in config:
|
|
265
270
|
create_draft_answer_prompt = load_prompt(
|
|
266
|
-
config.pop("create_draft_answer_prompt_path")
|
|
271
|
+
config.pop("create_draft_answer_prompt_path"),
|
|
267
272
|
)
|
|
268
273
|
if "list_assertions_prompt" in config:
|
|
269
274
|
list_assertions_prompt_config = config.pop("list_assertions_prompt")
|
|
@@ -273,11 +278,11 @@ def _load_llm_checker_chain(config: dict, **kwargs: Any) -> LLMCheckerChain:
|
|
|
273
278
|
if "check_assertions_prompt" in config:
|
|
274
279
|
check_assertions_prompt_config = config.pop("check_assertions_prompt")
|
|
275
280
|
check_assertions_prompt = load_prompt_from_config(
|
|
276
|
-
check_assertions_prompt_config
|
|
281
|
+
check_assertions_prompt_config,
|
|
277
282
|
)
|
|
278
283
|
elif "check_assertions_prompt_path" in config:
|
|
279
284
|
check_assertions_prompt = load_prompt(
|
|
280
|
-
config.pop("check_assertions_prompt_path")
|
|
285
|
+
config.pop("check_assertions_prompt_path"),
|
|
281
286
|
)
|
|
282
287
|
if "revised_answer_prompt" in config:
|
|
283
288
|
revised_answer_prompt_config = config.pop("revised_answer_prompt")
|
|
@@ -310,7 +315,8 @@ def _load_llm_math_chain(config: dict, **kwargs: Any) -> LLMMathChain:
|
|
|
310
315
|
elif "llm_path" in config:
|
|
311
316
|
llm = load_llm(config.pop("llm_path"), **kwargs)
|
|
312
317
|
else:
|
|
313
|
-
|
|
318
|
+
msg = "One of `llm_chain` or `llm_chain_path` must be present."
|
|
319
|
+
raise ValueError(msg)
|
|
314
320
|
if "prompt" in config:
|
|
315
321
|
prompt_config = config.pop("prompt")
|
|
316
322
|
prompt = load_prompt_from_config(prompt_config)
|
|
@@ -318,12 +324,12 @@ def _load_llm_math_chain(config: dict, **kwargs: Any) -> LLMMathChain:
|
|
|
318
324
|
prompt = load_prompt(config.pop("prompt_path"))
|
|
319
325
|
if llm_chain:
|
|
320
326
|
return LLMMathChain(llm_chain=llm_chain, prompt=prompt, **config) # type: ignore[arg-type]
|
|
321
|
-
|
|
322
|
-
return LLMMathChain(llm=llm, prompt=prompt, **config)
|
|
327
|
+
return LLMMathChain(llm=llm, prompt=prompt, **config)
|
|
323
328
|
|
|
324
329
|
|
|
325
330
|
def _load_map_rerank_documents_chain(
|
|
326
|
-
config: dict,
|
|
331
|
+
config: dict,
|
|
332
|
+
**kwargs: Any,
|
|
327
333
|
) -> MapRerankDocumentsChain:
|
|
328
334
|
if "llm_chain" in config:
|
|
329
335
|
llm_chain_config = config.pop("llm_chain")
|
|
@@ -331,21 +337,19 @@ def _load_map_rerank_documents_chain(
|
|
|
331
337
|
elif "llm_chain_path" in config:
|
|
332
338
|
llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
|
|
333
339
|
else:
|
|
334
|
-
|
|
340
|
+
msg = "One of `llm_chain` or `llm_chain_path` must be present."
|
|
341
|
+
raise ValueError(msg)
|
|
335
342
|
return MapRerankDocumentsChain(llm_chain=llm_chain, **config) # type: ignore[arg-type]
|
|
336
343
|
|
|
337
344
|
|
|
338
345
|
def _load_pal_chain(config: dict, **kwargs: Any) -> Any:
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
else:
|
|
347
|
-
raise ValueError("One of `llm_chain` or `llm_chain_path` must be present.")
|
|
348
|
-
return PALChain(llm_chain=llm_chain, **config)
|
|
346
|
+
msg = (
|
|
347
|
+
"PALChain is not available through LangChain anymore. "
|
|
348
|
+
"The relevant code can be found in langchain_experimental, "
|
|
349
|
+
"but it is not appropriate for production usage due to security "
|
|
350
|
+
"concerns. Please refer to langchain-experimental repository for more details."
|
|
351
|
+
)
|
|
352
|
+
raise NotImplementedError(msg)
|
|
349
353
|
|
|
350
354
|
|
|
351
355
|
def _load_refine_documents_chain(config: dict, **kwargs: Any) -> RefineDocumentsChain:
|
|
@@ -355,18 +359,16 @@ def _load_refine_documents_chain(config: dict, **kwargs: Any) -> RefineDocuments
|
|
|
355
359
|
elif "initial_llm_chain_path" in config:
|
|
356
360
|
initial_llm_chain = load_chain(config.pop("initial_llm_chain_path"), **kwargs)
|
|
357
361
|
else:
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
)
|
|
362
|
+
msg = "One of `initial_llm_chain` or `initial_llm_chain_path` must be present."
|
|
363
|
+
raise ValueError(msg)
|
|
361
364
|
if "refine_llm_chain" in config:
|
|
362
365
|
refine_llm_chain_config = config.pop("refine_llm_chain")
|
|
363
366
|
refine_llm_chain = load_chain_from_config(refine_llm_chain_config, **kwargs)
|
|
364
367
|
elif "refine_llm_chain_path" in config:
|
|
365
368
|
refine_llm_chain = load_chain(config.pop("refine_llm_chain_path"), **kwargs)
|
|
366
369
|
else:
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
)
|
|
370
|
+
msg = "One of `refine_llm_chain` or `refine_llm_chain_path` must be present."
|
|
371
|
+
raise ValueError(msg)
|
|
370
372
|
if "document_prompt" in config:
|
|
371
373
|
prompt_config = config.pop("document_prompt")
|
|
372
374
|
document_prompt = load_prompt_from_config(prompt_config)
|
|
@@ -384,68 +386,62 @@ def _load_qa_with_sources_chain(config: dict, **kwargs: Any) -> QAWithSourcesCha
|
|
|
384
386
|
if "combine_documents_chain" in config:
|
|
385
387
|
combine_documents_chain_config = config.pop("combine_documents_chain")
|
|
386
388
|
combine_documents_chain = load_chain_from_config(
|
|
387
|
-
combine_documents_chain_config,
|
|
389
|
+
combine_documents_chain_config,
|
|
390
|
+
**kwargs,
|
|
388
391
|
)
|
|
389
392
|
elif "combine_documents_chain_path" in config:
|
|
390
393
|
combine_documents_chain = load_chain(
|
|
391
|
-
config.pop("combine_documents_chain_path"),
|
|
394
|
+
config.pop("combine_documents_chain_path"),
|
|
395
|
+
**kwargs,
|
|
392
396
|
)
|
|
393
397
|
else:
|
|
394
|
-
|
|
398
|
+
msg = (
|
|
395
399
|
"One of `combine_documents_chain` or "
|
|
396
400
|
"`combine_documents_chain_path` must be present."
|
|
397
401
|
)
|
|
402
|
+
raise ValueError(msg)
|
|
398
403
|
return QAWithSourcesChain(combine_documents_chain=combine_documents_chain, **config) # type: ignore[arg-type]
|
|
399
404
|
|
|
400
405
|
|
|
401
406
|
def _load_sql_database_chain(config: dict, **kwargs: Any) -> Any:
|
|
402
|
-
from
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
if "llm" in config:
|
|
413
|
-
llm_config = config.pop("llm")
|
|
414
|
-
llm = load_llm_from_config(llm_config, **kwargs)
|
|
415
|
-
elif "llm_path" in config:
|
|
416
|
-
llm = load_llm(config.pop("llm_path"), **kwargs)
|
|
417
|
-
else:
|
|
418
|
-
raise ValueError("One of `llm` or `llm_path` must be present.")
|
|
419
|
-
if "prompt" in config:
|
|
420
|
-
prompt_config = config.pop("prompt")
|
|
421
|
-
prompt = load_prompt_from_config(prompt_config)
|
|
422
|
-
else:
|
|
423
|
-
prompt = None
|
|
424
|
-
|
|
425
|
-
return SQLDatabaseChain.from_llm(llm, database, prompt=prompt, **config)
|
|
407
|
+
"""Load SQL Database chain from config dict."""
|
|
408
|
+
msg = (
|
|
409
|
+
"SQLDatabaseChain is not available through LangChain anymore. "
|
|
410
|
+
"The relevant code can be found in langchain_experimental, "
|
|
411
|
+
"but it is not appropriate for production usage due to security "
|
|
412
|
+
"concerns. Please refer to langchain-experimental repository for more details, "
|
|
413
|
+
"or refer to this tutorial for best practices: "
|
|
414
|
+
"https://python.langchain.com/docs/tutorials/sql_qa/"
|
|
415
|
+
)
|
|
416
|
+
raise NotImplementedError(msg)
|
|
426
417
|
|
|
427
418
|
|
|
428
419
|
def _load_vector_db_qa_with_sources_chain(
|
|
429
|
-
config: dict,
|
|
420
|
+
config: dict,
|
|
421
|
+
**kwargs: Any,
|
|
430
422
|
) -> VectorDBQAWithSourcesChain:
|
|
431
423
|
if "vectorstore" in kwargs:
|
|
432
424
|
vectorstore = kwargs.pop("vectorstore")
|
|
433
425
|
else:
|
|
434
|
-
|
|
426
|
+
msg = "`vectorstore` must be present."
|
|
427
|
+
raise ValueError(msg)
|
|
435
428
|
if "combine_documents_chain" in config:
|
|
436
429
|
combine_documents_chain_config = config.pop("combine_documents_chain")
|
|
437
430
|
combine_documents_chain = load_chain_from_config(
|
|
438
|
-
combine_documents_chain_config,
|
|
431
|
+
combine_documents_chain_config,
|
|
432
|
+
**kwargs,
|
|
439
433
|
)
|
|
440
434
|
elif "combine_documents_chain_path" in config:
|
|
441
435
|
combine_documents_chain = load_chain(
|
|
442
|
-
config.pop("combine_documents_chain_path"),
|
|
436
|
+
config.pop("combine_documents_chain_path"),
|
|
437
|
+
**kwargs,
|
|
443
438
|
)
|
|
444
439
|
else:
|
|
445
|
-
|
|
440
|
+
msg = (
|
|
446
441
|
"One of `combine_documents_chain` or "
|
|
447
442
|
"`combine_documents_chain_path` must be present."
|
|
448
443
|
)
|
|
444
|
+
raise ValueError(msg)
|
|
449
445
|
return VectorDBQAWithSourcesChain(
|
|
450
446
|
combine_documents_chain=combine_documents_chain, # type: ignore[arg-type]
|
|
451
447
|
vectorstore=vectorstore,
|
|
@@ -457,21 +453,25 @@ def _load_retrieval_qa(config: dict, **kwargs: Any) -> RetrievalQA:
|
|
|
457
453
|
if "retriever" in kwargs:
|
|
458
454
|
retriever = kwargs.pop("retriever")
|
|
459
455
|
else:
|
|
460
|
-
|
|
456
|
+
msg = "`retriever` must be present."
|
|
457
|
+
raise ValueError(msg)
|
|
461
458
|
if "combine_documents_chain" in config:
|
|
462
459
|
combine_documents_chain_config = config.pop("combine_documents_chain")
|
|
463
460
|
combine_documents_chain = load_chain_from_config(
|
|
464
|
-
combine_documents_chain_config,
|
|
461
|
+
combine_documents_chain_config,
|
|
462
|
+
**kwargs,
|
|
465
463
|
)
|
|
466
464
|
elif "combine_documents_chain_path" in config:
|
|
467
465
|
combine_documents_chain = load_chain(
|
|
468
|
-
config.pop("combine_documents_chain_path"),
|
|
466
|
+
config.pop("combine_documents_chain_path"),
|
|
467
|
+
**kwargs,
|
|
469
468
|
)
|
|
470
469
|
else:
|
|
471
|
-
|
|
470
|
+
msg = (
|
|
472
471
|
"One of `combine_documents_chain` or "
|
|
473
472
|
"`combine_documents_chain_path` must be present."
|
|
474
473
|
)
|
|
474
|
+
raise ValueError(msg)
|
|
475
475
|
return RetrievalQA(
|
|
476
476
|
combine_documents_chain=combine_documents_chain, # type: ignore[arg-type]
|
|
477
477
|
retriever=retriever,
|
|
@@ -480,26 +480,31 @@ def _load_retrieval_qa(config: dict, **kwargs: Any) -> RetrievalQA:
|
|
|
480
480
|
|
|
481
481
|
|
|
482
482
|
def _load_retrieval_qa_with_sources_chain(
|
|
483
|
-
config: dict,
|
|
483
|
+
config: dict,
|
|
484
|
+
**kwargs: Any,
|
|
484
485
|
) -> RetrievalQAWithSourcesChain:
|
|
485
486
|
if "retriever" in kwargs:
|
|
486
487
|
retriever = kwargs.pop("retriever")
|
|
487
488
|
else:
|
|
488
|
-
|
|
489
|
+
msg = "`retriever` must be present."
|
|
490
|
+
raise ValueError(msg)
|
|
489
491
|
if "combine_documents_chain" in config:
|
|
490
492
|
combine_documents_chain_config = config.pop("combine_documents_chain")
|
|
491
493
|
combine_documents_chain = load_chain_from_config(
|
|
492
|
-
combine_documents_chain_config,
|
|
494
|
+
combine_documents_chain_config,
|
|
495
|
+
**kwargs,
|
|
493
496
|
)
|
|
494
497
|
elif "combine_documents_chain_path" in config:
|
|
495
498
|
combine_documents_chain = load_chain(
|
|
496
|
-
config.pop("combine_documents_chain_path"),
|
|
499
|
+
config.pop("combine_documents_chain_path"),
|
|
500
|
+
**kwargs,
|
|
497
501
|
)
|
|
498
502
|
else:
|
|
499
|
-
|
|
503
|
+
msg = (
|
|
500
504
|
"One of `combine_documents_chain` or "
|
|
501
505
|
"`combine_documents_chain_path` must be present."
|
|
502
506
|
)
|
|
507
|
+
raise ValueError(msg)
|
|
503
508
|
return RetrievalQAWithSourcesChain(
|
|
504
509
|
combine_documents_chain=combine_documents_chain, # type: ignore[arg-type]
|
|
505
510
|
retriever=retriever,
|
|
@@ -511,21 +516,25 @@ def _load_vector_db_qa(config: dict, **kwargs: Any) -> VectorDBQA:
|
|
|
511
516
|
if "vectorstore" in kwargs:
|
|
512
517
|
vectorstore = kwargs.pop("vectorstore")
|
|
513
518
|
else:
|
|
514
|
-
|
|
519
|
+
msg = "`vectorstore` must be present."
|
|
520
|
+
raise ValueError(msg)
|
|
515
521
|
if "combine_documents_chain" in config:
|
|
516
522
|
combine_documents_chain_config = config.pop("combine_documents_chain")
|
|
517
523
|
combine_documents_chain = load_chain_from_config(
|
|
518
|
-
combine_documents_chain_config,
|
|
524
|
+
combine_documents_chain_config,
|
|
525
|
+
**kwargs,
|
|
519
526
|
)
|
|
520
527
|
elif "combine_documents_chain_path" in config:
|
|
521
528
|
combine_documents_chain = load_chain(
|
|
522
|
-
config.pop("combine_documents_chain_path"),
|
|
529
|
+
config.pop("combine_documents_chain_path"),
|
|
530
|
+
**kwargs,
|
|
523
531
|
)
|
|
524
532
|
else:
|
|
525
|
-
|
|
533
|
+
msg = (
|
|
526
534
|
"One of `combine_documents_chain` or "
|
|
527
535
|
"`combine_documents_chain_path` must be present."
|
|
528
536
|
)
|
|
537
|
+
raise ValueError(msg)
|
|
529
538
|
return VectorDBQA(
|
|
530
539
|
combine_documents_chain=combine_documents_chain, # type: ignore[arg-type]
|
|
531
540
|
vectorstore=vectorstore,
|
|
@@ -537,28 +546,33 @@ def _load_graph_cypher_chain(config: dict, **kwargs: Any) -> GraphCypherQAChain:
|
|
|
537
546
|
if "graph" in kwargs:
|
|
538
547
|
graph = kwargs.pop("graph")
|
|
539
548
|
else:
|
|
540
|
-
|
|
549
|
+
msg = "`graph` must be present."
|
|
550
|
+
raise ValueError(msg)
|
|
541
551
|
if "cypher_generation_chain" in config:
|
|
542
552
|
cypher_generation_chain_config = config.pop("cypher_generation_chain")
|
|
543
553
|
cypher_generation_chain = load_chain_from_config(
|
|
544
|
-
cypher_generation_chain_config,
|
|
554
|
+
cypher_generation_chain_config,
|
|
555
|
+
**kwargs,
|
|
545
556
|
)
|
|
546
557
|
else:
|
|
547
|
-
|
|
558
|
+
msg = "`cypher_generation_chain` must be present."
|
|
559
|
+
raise ValueError(msg)
|
|
548
560
|
if "qa_chain" in config:
|
|
549
561
|
qa_chain_config = config.pop("qa_chain")
|
|
550
562
|
qa_chain = load_chain_from_config(qa_chain_config, **kwargs)
|
|
551
563
|
else:
|
|
552
|
-
|
|
564
|
+
msg = "`qa_chain` must be present."
|
|
565
|
+
raise ValueError(msg)
|
|
553
566
|
|
|
554
567
|
try:
|
|
555
568
|
from langchain_community.chains.graph_qa.cypher import GraphCypherQAChain
|
|
556
|
-
except ImportError:
|
|
557
|
-
|
|
569
|
+
except ImportError as e:
|
|
570
|
+
msg = (
|
|
558
571
|
"To use this GraphCypherQAChain functionality you must install the "
|
|
559
572
|
"langchain_community package. "
|
|
560
573
|
"You can install it with `pip install langchain_community`"
|
|
561
574
|
)
|
|
575
|
+
raise ImportError(msg) from e
|
|
562
576
|
return GraphCypherQAChain(
|
|
563
577
|
graph=graph,
|
|
564
578
|
cypher_generation_chain=cypher_generation_chain,
|
|
@@ -574,22 +588,21 @@ def _load_api_chain(config: dict, **kwargs: Any) -> APIChain:
|
|
|
574
588
|
elif "api_request_chain_path" in config:
|
|
575
589
|
api_request_chain = load_chain(config.pop("api_request_chain_path"))
|
|
576
590
|
else:
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
)
|
|
591
|
+
msg = "One of `api_request_chain` or `api_request_chain_path` must be present."
|
|
592
|
+
raise ValueError(msg)
|
|
580
593
|
if "api_answer_chain" in config:
|
|
581
594
|
api_answer_chain_config = config.pop("api_answer_chain")
|
|
582
595
|
api_answer_chain = load_chain_from_config(api_answer_chain_config, **kwargs)
|
|
583
596
|
elif "api_answer_chain_path" in config:
|
|
584
597
|
api_answer_chain = load_chain(config.pop("api_answer_chain_path"), **kwargs)
|
|
585
598
|
else:
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
)
|
|
599
|
+
msg = "One of `api_answer_chain` or `api_answer_chain_path` must be present."
|
|
600
|
+
raise ValueError(msg)
|
|
589
601
|
if "requests_wrapper" in kwargs:
|
|
590
602
|
requests_wrapper = kwargs.pop("requests_wrapper")
|
|
591
603
|
else:
|
|
592
|
-
|
|
604
|
+
msg = "`requests_wrapper` must be present."
|
|
605
|
+
raise ValueError(msg)
|
|
593
606
|
return APIChain(
|
|
594
607
|
api_request_chain=api_request_chain, # type: ignore[arg-type]
|
|
595
608
|
api_answer_chain=api_answer_chain, # type: ignore[arg-type]
|
|
@@ -601,12 +614,13 @@ def _load_api_chain(config: dict, **kwargs: Any) -> APIChain:
|
|
|
601
614
|
def _load_llm_requests_chain(config: dict, **kwargs: Any) -> LLMRequestsChain:
|
|
602
615
|
try:
|
|
603
616
|
from langchain.chains.llm_requests import LLMRequestsChain
|
|
604
|
-
except ImportError:
|
|
605
|
-
|
|
617
|
+
except ImportError as e:
|
|
618
|
+
msg = (
|
|
606
619
|
"To use this LLMRequestsChain functionality you must install the "
|
|
607
620
|
"langchain package. "
|
|
608
621
|
"You can install it with `pip install langchain`"
|
|
609
622
|
)
|
|
623
|
+
raise ImportError(msg) from e
|
|
610
624
|
|
|
611
625
|
if "llm_chain" in config:
|
|
612
626
|
llm_chain_config = config.pop("llm_chain")
|
|
@@ -614,14 +628,16 @@ def _load_llm_requests_chain(config: dict, **kwargs: Any) -> LLMRequestsChain:
|
|
|
614
628
|
elif "llm_chain_path" in config:
|
|
615
629
|
llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
|
|
616
630
|
else:
|
|
617
|
-
|
|
631
|
+
msg = "One of `llm_chain` or `llm_chain_path` must be present."
|
|
632
|
+
raise ValueError(msg)
|
|
618
633
|
if "requests_wrapper" in kwargs:
|
|
619
634
|
requests_wrapper = kwargs.pop("requests_wrapper")
|
|
620
635
|
return LLMRequestsChain(
|
|
621
|
-
llm_chain=llm_chain,
|
|
636
|
+
llm_chain=llm_chain,
|
|
637
|
+
requests_wrapper=requests_wrapper,
|
|
638
|
+
**config,
|
|
622
639
|
)
|
|
623
|
-
|
|
624
|
-
return LLMRequestsChain(llm_chain=llm_chain, **config)
|
|
640
|
+
return LLMRequestsChain(llm_chain=llm_chain, **config)
|
|
625
641
|
|
|
626
642
|
|
|
627
643
|
type_to_loader_dict = {
|
|
@@ -659,11 +675,13 @@ type_to_loader_dict = {
|
|
|
659
675
|
def load_chain_from_config(config: dict, **kwargs: Any) -> Chain:
|
|
660
676
|
"""Load chain from Config Dict."""
|
|
661
677
|
if "_type" not in config:
|
|
662
|
-
|
|
678
|
+
msg = "Must specify a chain Type in config"
|
|
679
|
+
raise ValueError(msg)
|
|
663
680
|
config_type = config.pop("_type")
|
|
664
681
|
|
|
665
682
|
if config_type not in type_to_loader_dict:
|
|
666
|
-
|
|
683
|
+
msg = f"Loading {config_type} chain not supported"
|
|
684
|
+
raise ValueError(msg)
|
|
667
685
|
|
|
668
686
|
chain_loader = type_to_loader_dict[config_type]
|
|
669
687
|
return chain_loader(config, **kwargs)
|
|
@@ -680,30 +698,29 @@ def load_chain_from_config(config: dict, **kwargs: Any) -> Chain:
|
|
|
680
698
|
def load_chain(path: Union[str, Path], **kwargs: Any) -> Chain:
|
|
681
699
|
"""Unified method for loading a chain from LangChainHub or local fs."""
|
|
682
700
|
if isinstance(path, str) and path.startswith("lc://"):
|
|
683
|
-
|
|
701
|
+
msg = (
|
|
684
702
|
"Loading from the deprecated github-based Hub is no longer supported. "
|
|
685
703
|
"Please use the new LangChain Hub at https://smith.langchain.com/hub "
|
|
686
704
|
"instead."
|
|
687
705
|
)
|
|
706
|
+
raise RuntimeError(msg)
|
|
688
707
|
return _load_chain_from_file(path, **kwargs)
|
|
689
708
|
|
|
690
709
|
|
|
691
710
|
def _load_chain_from_file(file: Union[str, Path], **kwargs: Any) -> Chain:
|
|
692
711
|
"""Load chain from file."""
|
|
693
712
|
# Convert file to Path object.
|
|
694
|
-
if isinstance(file, str)
|
|
695
|
-
file_path = Path(file)
|
|
696
|
-
else:
|
|
697
|
-
file_path = file
|
|
713
|
+
file_path = Path(file) if isinstance(file, str) else file
|
|
698
714
|
# Load from either json or yaml.
|
|
699
715
|
if file_path.suffix == ".json":
|
|
700
|
-
with open(
|
|
716
|
+
with file_path.open() as f:
|
|
701
717
|
config = json.load(f)
|
|
702
718
|
elif file_path.suffix.endswith((".yaml", ".yml")):
|
|
703
|
-
with open(
|
|
719
|
+
with file_path.open() as f:
|
|
704
720
|
config = yaml.safe_load(f)
|
|
705
721
|
else:
|
|
706
|
-
|
|
722
|
+
msg = "File type must be json or yaml"
|
|
723
|
+
raise ValueError(msg)
|
|
707
724
|
|
|
708
725
|
# Override default 'verbose' and 'memory' for the chain
|
|
709
726
|
if "verbose" in kwargs:
|