langchain 0.3.26__py3-none-any.whl → 0.4.0.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- langchain/__init__.py +110 -96
- langchain/_api/__init__.py +2 -2
- langchain/_api/deprecation.py +3 -3
- langchain/_api/module_import.py +51 -46
- langchain/_api/path.py +1 -1
- langchain/adapters/openai.py +8 -8
- langchain/agents/__init__.py +15 -12
- langchain/agents/agent.py +174 -151
- langchain/agents/agent_iterator.py +50 -26
- langchain/agents/agent_toolkits/__init__.py +7 -6
- langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
- langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
- langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
- langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
- langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
- langchain/agents/agent_toolkits/csv/__init__.py +4 -2
- langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
- langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
- langchain/agents/agent_toolkits/github/toolkit.py +9 -9
- langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
- langchain/agents/agent_toolkits/json/base.py +1 -1
- langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
- langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
- langchain/agents/agent_toolkits/openapi/base.py +1 -1
- langchain/agents/agent_toolkits/openapi/planner.py +2 -2
- langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
- langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
- langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
- langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
- langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
- langchain/agents/agent_toolkits/powerbi/base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
- langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/python/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
- langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/sql/prompt.py +1 -1
- langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/vectorstore/base.py +4 -2
- langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
- langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
- langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
- langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
- langchain/agents/agent_types.py +6 -6
- langchain/agents/chat/base.py +8 -12
- langchain/agents/chat/output_parser.py +9 -6
- langchain/agents/chat/prompt.py +3 -4
- langchain/agents/conversational/base.py +11 -5
- langchain/agents/conversational/output_parser.py +4 -2
- langchain/agents/conversational/prompt.py +2 -3
- langchain/agents/conversational_chat/base.py +9 -5
- langchain/agents/conversational_chat/output_parser.py +9 -11
- langchain/agents/conversational_chat/prompt.py +5 -6
- langchain/agents/format_scratchpad/__init__.py +3 -3
- langchain/agents/format_scratchpad/log_to_messages.py +1 -1
- langchain/agents/format_scratchpad/openai_functions.py +8 -6
- langchain/agents/format_scratchpad/tools.py +5 -3
- langchain/agents/format_scratchpad/xml.py +33 -2
- langchain/agents/initialize.py +17 -9
- langchain/agents/json_chat/base.py +19 -18
- langchain/agents/json_chat/prompt.py +2 -3
- langchain/agents/load_tools.py +2 -1
- langchain/agents/loading.py +28 -18
- langchain/agents/mrkl/base.py +11 -4
- langchain/agents/mrkl/output_parser.py +17 -13
- langchain/agents/mrkl/prompt.py +1 -2
- langchain/agents/openai_assistant/base.py +81 -71
- langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +2 -0
- langchain/agents/openai_functions_agent/base.py +47 -37
- langchain/agents/openai_functions_multi_agent/base.py +40 -27
- langchain/agents/openai_tools/base.py +9 -8
- langchain/agents/output_parsers/__init__.py +3 -3
- langchain/agents/output_parsers/json.py +8 -6
- langchain/agents/output_parsers/openai_functions.py +24 -9
- langchain/agents/output_parsers/openai_tools.py +16 -4
- langchain/agents/output_parsers/react_json_single_input.py +13 -5
- langchain/agents/output_parsers/react_single_input.py +18 -11
- langchain/agents/output_parsers/self_ask.py +5 -2
- langchain/agents/output_parsers/tools.py +32 -13
- langchain/agents/output_parsers/xml.py +102 -28
- langchain/agents/react/agent.py +5 -4
- langchain/agents/react/base.py +26 -17
- langchain/agents/react/output_parser.py +7 -6
- langchain/agents/react/textworld_prompt.py +0 -1
- langchain/agents/react/wiki_prompt.py +14 -15
- langchain/agents/schema.py +5 -2
- langchain/agents/self_ask_with_search/base.py +23 -15
- langchain/agents/self_ask_with_search/prompt.py +0 -1
- langchain/agents/structured_chat/base.py +19 -11
- langchain/agents/structured_chat/output_parser.py +29 -18
- langchain/agents/structured_chat/prompt.py +3 -4
- langchain/agents/tool_calling_agent/base.py +8 -6
- langchain/agents/tools.py +5 -2
- langchain/agents/utils.py +2 -3
- langchain/agents/xml/base.py +12 -6
- langchain/agents/xml/prompt.py +1 -2
- langchain/cache.py +12 -12
- langchain/callbacks/__init__.py +11 -11
- langchain/callbacks/aim_callback.py +2 -2
- langchain/callbacks/argilla_callback.py +1 -1
- langchain/callbacks/arize_callback.py +1 -1
- langchain/callbacks/arthur_callback.py +1 -1
- langchain/callbacks/base.py +7 -7
- langchain/callbacks/clearml_callback.py +1 -1
- langchain/callbacks/comet_ml_callback.py +1 -1
- langchain/callbacks/confident_callback.py +1 -1
- langchain/callbacks/context_callback.py +1 -1
- langchain/callbacks/flyte_callback.py +1 -1
- langchain/callbacks/human.py +2 -2
- langchain/callbacks/infino_callback.py +1 -1
- langchain/callbacks/labelstudio_callback.py +1 -1
- langchain/callbacks/llmonitor_callback.py +1 -1
- langchain/callbacks/manager.py +5 -5
- langchain/callbacks/mlflow_callback.py +2 -2
- langchain/callbacks/openai_info.py +1 -1
- langchain/callbacks/promptlayer_callback.py +1 -1
- langchain/callbacks/sagemaker_callback.py +1 -1
- langchain/callbacks/streaming_aiter.py +17 -3
- langchain/callbacks/streaming_aiter_final_only.py +16 -5
- langchain/callbacks/streaming_stdout_final_only.py +10 -3
- langchain/callbacks/streamlit/__init__.py +3 -2
- langchain/callbacks/streamlit/mutable_expander.py +1 -1
- langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
- langchain/callbacks/tracers/__init__.py +1 -1
- langchain/callbacks/tracers/comet.py +1 -1
- langchain/callbacks/tracers/evaluation.py +1 -1
- langchain/callbacks/tracers/log_stream.py +1 -1
- langchain/callbacks/tracers/logging.py +12 -1
- langchain/callbacks/tracers/stdout.py +1 -1
- langchain/callbacks/trubrics_callback.py +1 -1
- langchain/callbacks/utils.py +4 -4
- langchain/callbacks/wandb_callback.py +1 -1
- langchain/callbacks/whylabs_callback.py +1 -1
- langchain/chains/api/base.py +41 -23
- langchain/chains/api/news_docs.py +1 -2
- langchain/chains/api/open_meteo_docs.py +1 -2
- langchain/chains/api/openapi/requests_chain.py +1 -1
- langchain/chains/api/openapi/response_chain.py +1 -1
- langchain/chains/api/podcast_docs.py +1 -2
- langchain/chains/api/prompt.py +1 -2
- langchain/chains/api/tmdb_docs.py +1 -2
- langchain/chains/base.py +96 -56
- langchain/chains/chat_vector_db/prompts.py +2 -3
- langchain/chains/combine_documents/__init__.py +1 -1
- langchain/chains/combine_documents/base.py +30 -11
- langchain/chains/combine_documents/map_reduce.py +41 -30
- langchain/chains/combine_documents/map_rerank.py +39 -24
- langchain/chains/combine_documents/reduce.py +48 -26
- langchain/chains/combine_documents/refine.py +27 -17
- langchain/chains/combine_documents/stuff.py +24 -13
- langchain/chains/constitutional_ai/base.py +11 -4
- langchain/chains/constitutional_ai/principles.py +22 -25
- langchain/chains/constitutional_ai/prompts.py +25 -28
- langchain/chains/conversation/base.py +9 -4
- langchain/chains/conversation/memory.py +5 -5
- langchain/chains/conversation/prompt.py +5 -5
- langchain/chains/conversational_retrieval/base.py +108 -79
- langchain/chains/conversational_retrieval/prompts.py +2 -3
- langchain/chains/elasticsearch_database/base.py +10 -10
- langchain/chains/elasticsearch_database/prompts.py +2 -3
- langchain/chains/ernie_functions/__init__.py +2 -2
- langchain/chains/example_generator.py +3 -1
- langchain/chains/flare/base.py +28 -12
- langchain/chains/flare/prompts.py +2 -0
- langchain/chains/graph_qa/cypher.py +2 -2
- langchain/chains/graph_qa/falkordb.py +1 -1
- langchain/chains/graph_qa/gremlin.py +1 -1
- langchain/chains/graph_qa/neptune_sparql.py +1 -1
- langchain/chains/graph_qa/prompts.py +2 -2
- langchain/chains/history_aware_retriever.py +2 -1
- langchain/chains/hyde/base.py +6 -5
- langchain/chains/hyde/prompts.py +5 -6
- langchain/chains/llm.py +82 -61
- langchain/chains/llm_bash/__init__.py +3 -2
- langchain/chains/llm_checker/base.py +19 -6
- langchain/chains/llm_checker/prompt.py +3 -4
- langchain/chains/llm_math/base.py +25 -10
- langchain/chains/llm_math/prompt.py +1 -2
- langchain/chains/llm_summarization_checker/base.py +22 -7
- langchain/chains/llm_symbolic_math/__init__.py +3 -2
- langchain/chains/loading.py +155 -97
- langchain/chains/mapreduce.py +4 -3
- langchain/chains/moderation.py +11 -9
- langchain/chains/natbot/base.py +11 -9
- langchain/chains/natbot/crawler.py +102 -76
- langchain/chains/natbot/prompt.py +2 -3
- langchain/chains/openai_functions/__init__.py +7 -7
- langchain/chains/openai_functions/base.py +15 -10
- langchain/chains/openai_functions/citation_fuzzy_match.py +21 -11
- langchain/chains/openai_functions/extraction.py +19 -19
- langchain/chains/openai_functions/openapi.py +39 -35
- langchain/chains/openai_functions/qa_with_structure.py +22 -15
- langchain/chains/openai_functions/tagging.py +4 -4
- langchain/chains/openai_tools/extraction.py +7 -8
- langchain/chains/qa_generation/base.py +8 -3
- langchain/chains/qa_generation/prompt.py +5 -5
- langchain/chains/qa_with_sources/base.py +17 -6
- langchain/chains/qa_with_sources/loading.py +16 -8
- langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
- langchain/chains/qa_with_sources/refine_prompts.py +0 -1
- langchain/chains/qa_with_sources/retrieval.py +15 -6
- langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
- langchain/chains/qa_with_sources/vector_db.py +21 -8
- langchain/chains/query_constructor/base.py +37 -34
- langchain/chains/query_constructor/ir.py +4 -4
- langchain/chains/query_constructor/parser.py +101 -34
- langchain/chains/query_constructor/prompt.py +5 -6
- langchain/chains/question_answering/chain.py +21 -10
- langchain/chains/question_answering/map_reduce_prompt.py +14 -14
- langchain/chains/question_answering/map_rerank_prompt.py +3 -3
- langchain/chains/question_answering/refine_prompts.py +2 -5
- langchain/chains/question_answering/stuff_prompt.py +5 -5
- langchain/chains/retrieval.py +1 -3
- langchain/chains/retrieval_qa/base.py +38 -27
- langchain/chains/retrieval_qa/prompt.py +1 -2
- langchain/chains/router/__init__.py +3 -3
- langchain/chains/router/base.py +38 -22
- langchain/chains/router/embedding_router.py +15 -8
- langchain/chains/router/llm_router.py +23 -20
- langchain/chains/router/multi_prompt.py +5 -2
- langchain/chains/router/multi_retrieval_qa.py +28 -5
- langchain/chains/sequential.py +30 -18
- langchain/chains/sql_database/prompt.py +14 -16
- langchain/chains/sql_database/query.py +7 -5
- langchain/chains/structured_output/__init__.py +1 -1
- langchain/chains/structured_output/base.py +77 -67
- langchain/chains/summarize/chain.py +11 -5
- langchain/chains/summarize/map_reduce_prompt.py +0 -1
- langchain/chains/summarize/stuff_prompt.py +0 -1
- langchain/chains/transform.py +9 -6
- langchain/chat_loaders/facebook_messenger.py +1 -1
- langchain/chat_loaders/langsmith.py +1 -1
- langchain/chat_loaders/utils.py +3 -3
- langchain/chat_models/__init__.py +20 -19
- langchain/chat_models/anthropic.py +1 -1
- langchain/chat_models/azureml_endpoint.py +1 -1
- langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
- langchain/chat_models/base.py +213 -139
- langchain/chat_models/bedrock.py +1 -1
- langchain/chat_models/fake.py +1 -1
- langchain/chat_models/meta.py +1 -1
- langchain/chat_models/pai_eas_endpoint.py +1 -1
- langchain/chat_models/promptlayer_openai.py +1 -1
- langchain/chat_models/volcengine_maas.py +1 -1
- langchain/docstore/base.py +1 -1
- langchain/document_loaders/__init__.py +9 -9
- langchain/document_loaders/airbyte.py +3 -3
- langchain/document_loaders/assemblyai.py +1 -1
- langchain/document_loaders/azure_blob_storage_container.py +1 -1
- langchain/document_loaders/azure_blob_storage_file.py +1 -1
- langchain/document_loaders/baiducloud_bos_file.py +1 -1
- langchain/document_loaders/base.py +1 -1
- langchain/document_loaders/blob_loaders/__init__.py +1 -1
- langchain/document_loaders/blob_loaders/schema.py +1 -4
- langchain/document_loaders/blockchain.py +1 -1
- langchain/document_loaders/chatgpt.py +1 -1
- langchain/document_loaders/college_confidential.py +1 -1
- langchain/document_loaders/confluence.py +1 -1
- langchain/document_loaders/email.py +1 -1
- langchain/document_loaders/facebook_chat.py +1 -1
- langchain/document_loaders/markdown.py +1 -1
- langchain/document_loaders/notebook.py +1 -1
- langchain/document_loaders/org_mode.py +1 -1
- langchain/document_loaders/parsers/__init__.py +1 -1
- langchain/document_loaders/parsers/docai.py +1 -1
- langchain/document_loaders/parsers/generic.py +1 -1
- langchain/document_loaders/parsers/html/__init__.py +1 -1
- langchain/document_loaders/parsers/html/bs4.py +1 -1
- langchain/document_loaders/parsers/language/cobol.py +1 -1
- langchain/document_loaders/parsers/language/python.py +1 -1
- langchain/document_loaders/parsers/msword.py +1 -1
- langchain/document_loaders/parsers/pdf.py +5 -5
- langchain/document_loaders/parsers/registry.py +1 -1
- langchain/document_loaders/pdf.py +8 -8
- langchain/document_loaders/powerpoint.py +1 -1
- langchain/document_loaders/pyspark_dataframe.py +1 -1
- langchain/document_loaders/telegram.py +2 -2
- langchain/document_loaders/tencent_cos_directory.py +1 -1
- langchain/document_loaders/unstructured.py +5 -5
- langchain/document_loaders/url_playwright.py +1 -1
- langchain/document_loaders/whatsapp_chat.py +1 -1
- langchain/document_loaders/youtube.py +2 -2
- langchain/document_transformers/__init__.py +3 -3
- langchain/document_transformers/beautiful_soup_transformer.py +1 -1
- langchain/document_transformers/doctran_text_extract.py +1 -1
- langchain/document_transformers/doctran_text_qa.py +1 -1
- langchain/document_transformers/doctran_text_translate.py +1 -1
- langchain/document_transformers/embeddings_redundant_filter.py +3 -3
- langchain/document_transformers/google_translate.py +1 -1
- langchain/document_transformers/html2text.py +1 -1
- langchain/document_transformers/nuclia_text_transform.py +1 -1
- langchain/embeddings/__init__.py +5 -5
- langchain/embeddings/base.py +35 -24
- langchain/embeddings/cache.py +37 -32
- langchain/embeddings/fake.py +1 -1
- langchain/embeddings/huggingface.py +2 -2
- langchain/evaluation/__init__.py +22 -22
- langchain/evaluation/agents/trajectory_eval_chain.py +26 -25
- langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
- langchain/evaluation/comparison/__init__.py +1 -1
- langchain/evaluation/comparison/eval_chain.py +21 -13
- langchain/evaluation/comparison/prompt.py +1 -2
- langchain/evaluation/criteria/__init__.py +1 -1
- langchain/evaluation/criteria/eval_chain.py +23 -11
- langchain/evaluation/criteria/prompt.py +2 -3
- langchain/evaluation/embedding_distance/base.py +34 -20
- langchain/evaluation/exact_match/base.py +14 -1
- langchain/evaluation/loading.py +16 -11
- langchain/evaluation/parsing/base.py +20 -4
- langchain/evaluation/parsing/json_distance.py +24 -10
- langchain/evaluation/parsing/json_schema.py +13 -12
- langchain/evaluation/qa/__init__.py +1 -1
- langchain/evaluation/qa/eval_chain.py +20 -5
- langchain/evaluation/qa/eval_prompt.py +7 -8
- langchain/evaluation/qa/generate_chain.py +4 -1
- langchain/evaluation/qa/generate_prompt.py +2 -4
- langchain/evaluation/regex_match/base.py +9 -1
- langchain/evaluation/schema.py +38 -30
- langchain/evaluation/scoring/__init__.py +1 -1
- langchain/evaluation/scoring/eval_chain.py +23 -15
- langchain/evaluation/scoring/prompt.py +0 -1
- langchain/evaluation/string_distance/base.py +20 -9
- langchain/globals.py +12 -11
- langchain/graphs/__init__.py +6 -6
- langchain/graphs/graph_document.py +1 -1
- langchain/graphs/networkx_graph.py +2 -2
- langchain/hub.py +9 -11
- langchain/indexes/__init__.py +3 -3
- langchain/indexes/_sql_record_manager.py +63 -46
- langchain/indexes/prompts/entity_extraction.py +1 -2
- langchain/indexes/prompts/entity_summarization.py +1 -2
- langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
- langchain/indexes/vectorstore.py +35 -19
- langchain/llms/__init__.py +13 -13
- langchain/llms/ai21.py +1 -1
- langchain/llms/azureml_endpoint.py +4 -4
- langchain/llms/base.py +15 -7
- langchain/llms/bedrock.py +1 -1
- langchain/llms/cloudflare_workersai.py +1 -1
- langchain/llms/gradient_ai.py +1 -1
- langchain/llms/loading.py +1 -1
- langchain/llms/openai.py +1 -1
- langchain/llms/sagemaker_endpoint.py +1 -1
- langchain/load/dump.py +1 -1
- langchain/load/load.py +1 -1
- langchain/load/serializable.py +3 -3
- langchain/memory/__init__.py +3 -3
- langchain/memory/buffer.py +14 -7
- langchain/memory/buffer_window.py +2 -0
- langchain/memory/chat_memory.py +14 -8
- langchain/memory/chat_message_histories/__init__.py +1 -1
- langchain/memory/chat_message_histories/astradb.py +1 -1
- langchain/memory/chat_message_histories/cassandra.py +1 -1
- langchain/memory/chat_message_histories/cosmos_db.py +1 -1
- langchain/memory/chat_message_histories/dynamodb.py +1 -1
- langchain/memory/chat_message_histories/elasticsearch.py +1 -1
- langchain/memory/chat_message_histories/file.py +1 -1
- langchain/memory/chat_message_histories/firestore.py +1 -1
- langchain/memory/chat_message_histories/momento.py +1 -1
- langchain/memory/chat_message_histories/mongodb.py +1 -1
- langchain/memory/chat_message_histories/neo4j.py +1 -1
- langchain/memory/chat_message_histories/postgres.py +1 -1
- langchain/memory/chat_message_histories/redis.py +1 -1
- langchain/memory/chat_message_histories/rocksetdb.py +1 -1
- langchain/memory/chat_message_histories/singlestoredb.py +1 -1
- langchain/memory/chat_message_histories/streamlit.py +1 -1
- langchain/memory/chat_message_histories/upstash_redis.py +1 -1
- langchain/memory/chat_message_histories/xata.py +1 -1
- langchain/memory/chat_message_histories/zep.py +1 -1
- langchain/memory/combined.py +14 -13
- langchain/memory/entity.py +131 -61
- langchain/memory/prompt.py +10 -11
- langchain/memory/readonly.py +0 -2
- langchain/memory/simple.py +4 -3
- langchain/memory/summary.py +43 -11
- langchain/memory/summary_buffer.py +20 -8
- langchain/memory/token_buffer.py +2 -0
- langchain/memory/utils.py +3 -2
- langchain/memory/vectorstore.py +12 -5
- langchain/memory/vectorstore_token_buffer_memory.py +5 -5
- langchain/model_laboratory.py +12 -11
- langchain/output_parsers/__init__.py +4 -4
- langchain/output_parsers/boolean.py +7 -4
- langchain/output_parsers/combining.py +14 -7
- langchain/output_parsers/datetime.py +32 -31
- langchain/output_parsers/enum.py +10 -4
- langchain/output_parsers/fix.py +60 -53
- langchain/output_parsers/format_instructions.py +6 -8
- langchain/output_parsers/json.py +2 -2
- langchain/output_parsers/list.py +2 -2
- langchain/output_parsers/loading.py +9 -9
- langchain/output_parsers/openai_functions.py +3 -3
- langchain/output_parsers/openai_tools.py +1 -1
- langchain/output_parsers/pandas_dataframe.py +59 -48
- langchain/output_parsers/prompts.py +1 -2
- langchain/output_parsers/rail_parser.py +1 -1
- langchain/output_parsers/regex.py +9 -8
- langchain/output_parsers/regex_dict.py +7 -10
- langchain/output_parsers/retry.py +99 -80
- langchain/output_parsers/structured.py +21 -6
- langchain/output_parsers/yaml.py +19 -11
- langchain/prompts/__init__.py +5 -3
- langchain/prompts/base.py +5 -5
- langchain/prompts/chat.py +8 -8
- langchain/prompts/example_selector/__init__.py +3 -1
- langchain/prompts/example_selector/semantic_similarity.py +2 -2
- langchain/prompts/few_shot.py +1 -1
- langchain/prompts/loading.py +3 -3
- langchain/prompts/prompt.py +1 -1
- langchain/pydantic_v1/__init__.py +1 -1
- langchain/retrievers/__init__.py +5 -5
- langchain/retrievers/bedrock.py +2 -2
- langchain/retrievers/bm25.py +1 -1
- langchain/retrievers/contextual_compression.py +14 -8
- langchain/retrievers/docarray.py +1 -1
- langchain/retrievers/document_compressors/__init__.py +5 -4
- langchain/retrievers/document_compressors/base.py +12 -6
- langchain/retrievers/document_compressors/chain_extract.py +5 -3
- langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
- langchain/retrievers/document_compressors/chain_filter.py +9 -9
- langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
- langchain/retrievers/document_compressors/cohere_rerank.py +17 -15
- langchain/retrievers/document_compressors/cross_encoder_rerank.py +2 -0
- langchain/retrievers/document_compressors/embeddings_filter.py +24 -17
- langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
- langchain/retrievers/document_compressors/listwise_rerank.py +8 -5
- langchain/retrievers/ensemble.py +30 -27
- langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
- langchain/retrievers/google_vertex_ai_search.py +2 -2
- langchain/retrievers/kendra.py +10 -10
- langchain/retrievers/llama_index.py +1 -1
- langchain/retrievers/merger_retriever.py +11 -11
- langchain/retrievers/milvus.py +1 -1
- langchain/retrievers/multi_query.py +35 -27
- langchain/retrievers/multi_vector.py +24 -9
- langchain/retrievers/parent_document_retriever.py +33 -9
- langchain/retrievers/re_phraser.py +6 -5
- langchain/retrievers/self_query/base.py +157 -127
- langchain/retrievers/time_weighted_retriever.py +21 -7
- langchain/retrievers/zilliz.py +1 -1
- langchain/runnables/hub.py +12 -0
- langchain/runnables/openai_functions.py +12 -2
- langchain/schema/__init__.py +23 -23
- langchain/schema/cache.py +1 -1
- langchain/schema/callbacks/base.py +7 -7
- langchain/schema/callbacks/manager.py +19 -19
- langchain/schema/callbacks/tracers/base.py +1 -1
- langchain/schema/callbacks/tracers/evaluation.py +1 -1
- langchain/schema/callbacks/tracers/langchain.py +1 -1
- langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
- langchain/schema/callbacks/tracers/log_stream.py +1 -1
- langchain/schema/callbacks/tracers/schemas.py +8 -8
- langchain/schema/callbacks/tracers/stdout.py +3 -3
- langchain/schema/document.py +1 -1
- langchain/schema/language_model.py +2 -2
- langchain/schema/messages.py +12 -12
- langchain/schema/output.py +3 -3
- langchain/schema/output_parser.py +3 -3
- langchain/schema/runnable/__init__.py +3 -3
- langchain/schema/runnable/base.py +9 -9
- langchain/schema/runnable/config.py +5 -5
- langchain/schema/runnable/configurable.py +1 -1
- langchain/schema/runnable/history.py +1 -1
- langchain/schema/runnable/passthrough.py +1 -1
- langchain/schema/runnable/utils.py +16 -16
- langchain/schema/vectorstore.py +1 -1
- langchain/smith/__init__.py +2 -1
- langchain/smith/evaluation/__init__.py +2 -2
- langchain/smith/evaluation/config.py +9 -23
- langchain/smith/evaluation/name_generation.py +3 -3
- langchain/smith/evaluation/progress.py +22 -4
- langchain/smith/evaluation/runner_utils.py +416 -247
- langchain/smith/evaluation/string_run_evaluator.py +102 -68
- langchain/storage/__init__.py +2 -2
- langchain/storage/_lc_store.py +4 -2
- langchain/storage/encoder_backed.py +7 -2
- langchain/storage/file_system.py +19 -16
- langchain/storage/in_memory.py +1 -1
- langchain/storage/upstash_redis.py +1 -1
- langchain/text_splitter.py +15 -15
- langchain/tools/__init__.py +28 -26
- langchain/tools/ainetwork/app.py +1 -1
- langchain/tools/ainetwork/base.py +1 -1
- langchain/tools/ainetwork/owner.py +1 -1
- langchain/tools/ainetwork/rule.py +1 -1
- langchain/tools/ainetwork/transfer.py +1 -1
- langchain/tools/ainetwork/value.py +1 -1
- langchain/tools/amadeus/closest_airport.py +1 -1
- langchain/tools/amadeus/flight_search.py +1 -1
- langchain/tools/azure_cognitive_services/__init__.py +1 -1
- langchain/tools/base.py +4 -4
- langchain/tools/bearly/tool.py +1 -1
- langchain/tools/bing_search/__init__.py +1 -1
- langchain/tools/bing_search/tool.py +1 -1
- langchain/tools/dataforseo_api_search/__init__.py +1 -1
- langchain/tools/dataforseo_api_search/tool.py +1 -1
- langchain/tools/ddg_search/tool.py +1 -1
- langchain/tools/e2b_data_analysis/tool.py +2 -2
- langchain/tools/edenai/__init__.py +1 -1
- langchain/tools/file_management/__init__.py +1 -1
- langchain/tools/file_management/copy.py +1 -1
- langchain/tools/file_management/delete.py +1 -1
- langchain/tools/gmail/__init__.py +2 -2
- langchain/tools/gmail/get_message.py +1 -1
- langchain/tools/gmail/search.py +1 -1
- langchain/tools/gmail/send_message.py +1 -1
- langchain/tools/google_finance/__init__.py +1 -1
- langchain/tools/google_finance/tool.py +1 -1
- langchain/tools/google_scholar/__init__.py +1 -1
- langchain/tools/google_scholar/tool.py +1 -1
- langchain/tools/google_search/__init__.py +1 -1
- langchain/tools/google_search/tool.py +1 -1
- langchain/tools/google_serper/__init__.py +1 -1
- langchain/tools/google_serper/tool.py +1 -1
- langchain/tools/google_trends/__init__.py +1 -1
- langchain/tools/google_trends/tool.py +1 -1
- langchain/tools/jira/tool.py +20 -1
- langchain/tools/json/tool.py +25 -3
- langchain/tools/memorize/tool.py +1 -1
- langchain/tools/multion/__init__.py +1 -1
- langchain/tools/multion/update_session.py +1 -1
- langchain/tools/office365/__init__.py +2 -2
- langchain/tools/office365/events_search.py +1 -1
- langchain/tools/office365/messages_search.py +1 -1
- langchain/tools/office365/send_event.py +1 -1
- langchain/tools/office365/send_message.py +1 -1
- langchain/tools/openapi/utils/api_models.py +6 -6
- langchain/tools/playwright/__init__.py +5 -5
- langchain/tools/playwright/click.py +1 -1
- langchain/tools/playwright/extract_hyperlinks.py +1 -1
- langchain/tools/playwright/get_elements.py +1 -1
- langchain/tools/playwright/navigate.py +1 -1
- langchain/tools/plugin.py +2 -2
- langchain/tools/powerbi/tool.py +1 -1
- langchain/tools/python/__init__.py +3 -2
- langchain/tools/reddit_search/tool.py +1 -1
- langchain/tools/render.py +2 -2
- langchain/tools/requests/tool.py +2 -2
- langchain/tools/searchapi/tool.py +1 -1
- langchain/tools/searx_search/tool.py +1 -1
- langchain/tools/slack/get_message.py +1 -1
- langchain/tools/spark_sql/tool.py +1 -1
- langchain/tools/sql_database/tool.py +1 -1
- langchain/tools/tavily_search/__init__.py +1 -1
- langchain/tools/tavily_search/tool.py +1 -1
- langchain/tools/zapier/__init__.py +1 -1
- langchain/tools/zapier/tool.py +24 -2
- langchain/utilities/__init__.py +4 -4
- langchain/utilities/arcee.py +4 -4
- langchain/utilities/clickup.py +4 -4
- langchain/utilities/dalle_image_generator.py +1 -1
- langchain/utilities/dataforseo_api_search.py +1 -1
- langchain/utilities/opaqueprompts.py +1 -1
- langchain/utilities/reddit_search.py +1 -1
- langchain/utilities/sql_database.py +1 -1
- langchain/utilities/tavily_search.py +1 -1
- langchain/utilities/vertexai.py +2 -2
- langchain/utils/__init__.py +1 -1
- langchain/utils/aiter.py +1 -1
- langchain/utils/html.py +3 -3
- langchain/utils/input.py +1 -1
- langchain/utils/iter.py +1 -1
- langchain/utils/json_schema.py +1 -3
- langchain/utils/strings.py +1 -1
- langchain/utils/utils.py +6 -6
- langchain/vectorstores/__init__.py +5 -5
- langchain/vectorstores/alibabacloud_opensearch.py +1 -1
- langchain/vectorstores/azure_cosmos_db.py +1 -1
- langchain/vectorstores/clickhouse.py +1 -1
- langchain/vectorstores/elastic_vector_search.py +1 -1
- langchain/vectorstores/elasticsearch.py +2 -2
- langchain/vectorstores/myscale.py +1 -1
- langchain/vectorstores/neo4j_vector.py +1 -1
- langchain/vectorstores/pgembedding.py +1 -1
- langchain/vectorstores/qdrant.py +1 -1
- langchain/vectorstores/redis/__init__.py +1 -1
- langchain/vectorstores/redis/base.py +1 -1
- langchain/vectorstores/redis/filters.py +4 -4
- langchain/vectorstores/redis/schema.py +6 -6
- langchain/vectorstores/sklearn.py +2 -2
- langchain/vectorstores/starrocks.py +1 -1
- langchain/vectorstores/utils.py +1 -1
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/METADATA +4 -14
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/RECORD +590 -591
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/WHEEL +1 -1
- langchain/smith/evaluation/utils.py +0 -0
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/entry_points.txt +0 -0
- {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/licenses/LICENSE +0 -0
langchain/chains/base.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Base interface that all chains should implement."""
|
|
2
2
|
|
|
3
3
|
import builtins
|
|
4
|
+
import contextlib
|
|
4
5
|
import inspect
|
|
5
6
|
import json
|
|
6
7
|
import logging
|
|
@@ -35,6 +36,7 @@ from pydantic import (
|
|
|
35
36
|
field_validator,
|
|
36
37
|
model_validator,
|
|
37
38
|
)
|
|
39
|
+
from typing_extensions import override
|
|
38
40
|
|
|
39
41
|
from langchain.schema import RUN_KEY
|
|
40
42
|
|
|
@@ -106,18 +108,26 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
106
108
|
arbitrary_types_allowed=True,
|
|
107
109
|
)
|
|
108
110
|
|
|
111
|
+
@override
|
|
109
112
|
def get_input_schema(
|
|
110
|
-
self,
|
|
113
|
+
self,
|
|
114
|
+
config: Optional[RunnableConfig] = None,
|
|
111
115
|
) -> type[BaseModel]:
|
|
112
116
|
# This is correct, but pydantic typings/mypy don't think so.
|
|
113
|
-
return create_model("ChainInput", **
|
|
117
|
+
return create_model("ChainInput", **dict.fromkeys(self.input_keys, (Any, None)))
|
|
114
118
|
|
|
119
|
+
@override
|
|
115
120
|
def get_output_schema(
|
|
116
|
-
self,
|
|
121
|
+
self,
|
|
122
|
+
config: Optional[RunnableConfig] = None,
|
|
117
123
|
) -> type[BaseModel]:
|
|
118
124
|
# This is correct, but pydantic typings/mypy don't think so.
|
|
119
|
-
return create_model(
|
|
125
|
+
return create_model(
|
|
126
|
+
"ChainOutput",
|
|
127
|
+
**dict.fromkeys(self.output_keys, (Any, None)),
|
|
128
|
+
)
|
|
120
129
|
|
|
130
|
+
@override
|
|
121
131
|
def invoke(
|
|
122
132
|
self,
|
|
123
133
|
input: dict[str, Any],
|
|
@@ -160,17 +170,20 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
160
170
|
)
|
|
161
171
|
|
|
162
172
|
final_outputs: dict[str, Any] = self.prep_outputs(
|
|
163
|
-
inputs,
|
|
173
|
+
inputs,
|
|
174
|
+
outputs,
|
|
175
|
+
return_only_outputs,
|
|
164
176
|
)
|
|
165
177
|
except BaseException as e:
|
|
166
178
|
run_manager.on_chain_error(e)
|
|
167
|
-
raise
|
|
179
|
+
raise
|
|
168
180
|
run_manager.on_chain_end(outputs)
|
|
169
181
|
|
|
170
182
|
if include_run_info:
|
|
171
183
|
final_outputs[RUN_KEY] = RunInfo(run_id=run_manager.run_id)
|
|
172
184
|
return final_outputs
|
|
173
185
|
|
|
186
|
+
@override
|
|
174
187
|
async def ainvoke(
|
|
175
188
|
self,
|
|
176
189
|
input: dict[str, Any],
|
|
@@ -211,11 +224,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
211
224
|
else await self._acall(inputs)
|
|
212
225
|
)
|
|
213
226
|
final_outputs: dict[str, Any] = await self.aprep_outputs(
|
|
214
|
-
inputs,
|
|
227
|
+
inputs,
|
|
228
|
+
outputs,
|
|
229
|
+
return_only_outputs,
|
|
215
230
|
)
|
|
216
231
|
except BaseException as e:
|
|
217
232
|
await run_manager.on_chain_error(e)
|
|
218
|
-
raise
|
|
233
|
+
raise
|
|
219
234
|
await run_manager.on_chain_end(outputs)
|
|
220
235
|
|
|
221
236
|
if include_run_info:
|
|
@@ -224,7 +239,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
224
239
|
|
|
225
240
|
@property
|
|
226
241
|
def _chain_type(self) -> str:
|
|
227
|
-
|
|
242
|
+
msg = "Saving not supported for this chain type."
|
|
243
|
+
raise NotImplementedError(msg)
|
|
228
244
|
|
|
229
245
|
@model_validator(mode="before")
|
|
230
246
|
@classmethod
|
|
@@ -232,29 +248,33 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
232
248
|
"""Raise deprecation warning if callback_manager is used."""
|
|
233
249
|
if values.get("callback_manager") is not None:
|
|
234
250
|
if values.get("callbacks") is not None:
|
|
235
|
-
|
|
251
|
+
msg = (
|
|
236
252
|
"Cannot specify both callback_manager and callbacks. "
|
|
237
253
|
"callback_manager is deprecated, callbacks is the preferred "
|
|
238
254
|
"parameter to pass in."
|
|
239
255
|
)
|
|
256
|
+
raise ValueError(msg)
|
|
240
257
|
warnings.warn(
|
|
241
258
|
"callback_manager is deprecated. Please use callbacks instead.",
|
|
242
259
|
DeprecationWarning,
|
|
260
|
+
stacklevel=4,
|
|
243
261
|
)
|
|
244
262
|
values["callbacks"] = values.pop("callback_manager", None)
|
|
245
263
|
return values
|
|
246
264
|
|
|
247
265
|
@field_validator("verbose", mode="before")
|
|
248
266
|
@classmethod
|
|
249
|
-
def set_verbose(
|
|
267
|
+
def set_verbose(
|
|
268
|
+
cls,
|
|
269
|
+
verbose: Optional[bool], # noqa: FBT001
|
|
270
|
+
) -> bool:
|
|
250
271
|
"""Set the chain verbosity.
|
|
251
272
|
|
|
252
273
|
Defaults to the global setting if not specified by the user.
|
|
253
274
|
"""
|
|
254
275
|
if verbose is None:
|
|
255
276
|
return _get_verbosity()
|
|
256
|
-
|
|
257
|
-
return verbose
|
|
277
|
+
return verbose
|
|
258
278
|
|
|
259
279
|
@property
|
|
260
280
|
@abstractmethod
|
|
@@ -275,21 +295,24 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
275
295
|
# only one is not set, we can still figure out which key it is.
|
|
276
296
|
_input_keys = _input_keys.difference(self.memory.memory_variables)
|
|
277
297
|
if len(_input_keys) != 1:
|
|
278
|
-
|
|
298
|
+
msg = (
|
|
279
299
|
f"A single string input was passed in, but this chain expects "
|
|
280
300
|
f"multiple inputs ({_input_keys}). When a chain expects "
|
|
281
301
|
f"multiple inputs, please call it by passing in a dictionary, "
|
|
282
302
|
"eg `chain({'foo': 1, 'bar': 2})`"
|
|
283
303
|
)
|
|
304
|
+
raise ValueError(msg)
|
|
284
305
|
|
|
285
306
|
missing_keys = set(self.input_keys).difference(inputs)
|
|
286
307
|
if missing_keys:
|
|
287
|
-
|
|
308
|
+
msg = f"Missing some input keys: {missing_keys}"
|
|
309
|
+
raise ValueError(msg)
|
|
288
310
|
|
|
289
311
|
def _validate_outputs(self, outputs: dict[str, Any]) -> None:
|
|
290
312
|
missing_keys = set(self.output_keys).difference(outputs)
|
|
291
313
|
if missing_keys:
|
|
292
|
-
|
|
314
|
+
msg = f"Missing some output keys: {missing_keys}"
|
|
315
|
+
raise ValueError(msg)
|
|
293
316
|
|
|
294
317
|
@abstractmethod
|
|
295
318
|
def _call(
|
|
@@ -336,14 +359,17 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
336
359
|
`Chain.output_keys`.
|
|
337
360
|
"""
|
|
338
361
|
return await run_in_executor(
|
|
339
|
-
None,
|
|
362
|
+
None,
|
|
363
|
+
self._call,
|
|
364
|
+
inputs,
|
|
365
|
+
run_manager.get_sync() if run_manager else None,
|
|
340
366
|
)
|
|
341
367
|
|
|
342
368
|
@deprecated("0.1.0", alternative="invoke", removal="1.0")
|
|
343
369
|
def __call__(
|
|
344
370
|
self,
|
|
345
371
|
inputs: Union[dict[str, Any], Any],
|
|
346
|
-
return_only_outputs: bool = False,
|
|
372
|
+
return_only_outputs: bool = False, # noqa: FBT001,FBT002
|
|
347
373
|
callbacks: Callbacks = None,
|
|
348
374
|
*,
|
|
349
375
|
tags: Optional[list[str]] = None,
|
|
@@ -385,7 +411,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
385
411
|
|
|
386
412
|
return self.invoke(
|
|
387
413
|
inputs,
|
|
388
|
-
cast(RunnableConfig, {k: v for k, v in config.items() if v is not None}),
|
|
414
|
+
cast("RunnableConfig", {k: v for k, v in config.items() if v is not None}),
|
|
389
415
|
return_only_outputs=return_only_outputs,
|
|
390
416
|
include_run_info=include_run_info,
|
|
391
417
|
)
|
|
@@ -394,7 +420,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
394
420
|
async def acall(
|
|
395
421
|
self,
|
|
396
422
|
inputs: Union[dict[str, Any], Any],
|
|
397
|
-
return_only_outputs: bool = False,
|
|
423
|
+
return_only_outputs: bool = False, # noqa: FBT001,FBT002
|
|
398
424
|
callbacks: Callbacks = None,
|
|
399
425
|
*,
|
|
400
426
|
tags: Optional[list[str]] = None,
|
|
@@ -435,7 +461,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
435
461
|
}
|
|
436
462
|
return await self.ainvoke(
|
|
437
463
|
inputs,
|
|
438
|
-
cast(RunnableConfig, {k: v for k, v in config.items() if k is not None}),
|
|
464
|
+
cast("RunnableConfig", {k: v for k, v in config.items() if k is not None}),
|
|
439
465
|
return_only_outputs=return_only_outputs,
|
|
440
466
|
include_run_info=include_run_info,
|
|
441
467
|
)
|
|
@@ -444,7 +470,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
444
470
|
self,
|
|
445
471
|
inputs: dict[str, str],
|
|
446
472
|
outputs: dict[str, str],
|
|
447
|
-
return_only_outputs: bool = False,
|
|
473
|
+
return_only_outputs: bool = False, # noqa: FBT001,FBT002
|
|
448
474
|
) -> dict[str, str]:
|
|
449
475
|
"""Validate and prepare chain outputs, and save info about this run to memory.
|
|
450
476
|
|
|
@@ -463,14 +489,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
463
489
|
self.memory.save_context(inputs, outputs)
|
|
464
490
|
if return_only_outputs:
|
|
465
491
|
return outputs
|
|
466
|
-
|
|
467
|
-
return {**inputs, **outputs}
|
|
492
|
+
return {**inputs, **outputs}
|
|
468
493
|
|
|
469
494
|
async def aprep_outputs(
|
|
470
495
|
self,
|
|
471
496
|
inputs: dict[str, str],
|
|
472
497
|
outputs: dict[str, str],
|
|
473
|
-
return_only_outputs: bool = False,
|
|
498
|
+
return_only_outputs: bool = False, # noqa: FBT001,FBT002
|
|
474
499
|
) -> dict[str, str]:
|
|
475
500
|
"""Validate and prepare chain outputs, and save info about this run to memory.
|
|
476
501
|
|
|
@@ -489,8 +514,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
489
514
|
await self.memory.asave_context(inputs, outputs)
|
|
490
515
|
if return_only_outputs:
|
|
491
516
|
return outputs
|
|
492
|
-
|
|
493
|
-
return {**inputs, **outputs}
|
|
517
|
+
return {**inputs, **outputs}
|
|
494
518
|
|
|
495
519
|
def prep_inputs(self, inputs: Union[dict[str, Any], Any]) -> dict[str, str]:
|
|
496
520
|
"""Prepare chain inputs, including adding inputs from memory.
|
|
@@ -510,7 +534,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
510
534
|
# If there are multiple input keys, but some get set by memory so that
|
|
511
535
|
# only one is not set, we can still figure out which key it is.
|
|
512
536
|
_input_keys = _input_keys.difference(self.memory.memory_variables)
|
|
513
|
-
inputs = {
|
|
537
|
+
inputs = {next(iter(_input_keys)): inputs}
|
|
514
538
|
if self.memory is not None:
|
|
515
539
|
external_context = self.memory.load_memory_variables(inputs)
|
|
516
540
|
inputs = dict(inputs, **external_context)
|
|
@@ -534,7 +558,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
534
558
|
# If there are multiple input keys, but some get set by memory so that
|
|
535
559
|
# only one is not set, we can still figure out which key it is.
|
|
536
560
|
_input_keys = _input_keys.difference(self.memory.memory_variables)
|
|
537
|
-
inputs = {
|
|
561
|
+
inputs = {next(iter(_input_keys)): inputs}
|
|
538
562
|
if self.memory is not None:
|
|
539
563
|
external_context = await self.memory.aload_memory_variables(inputs)
|
|
540
564
|
inputs = dict(inputs, **external_context)
|
|
@@ -543,10 +567,11 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
543
567
|
@property
|
|
544
568
|
def _run_output_key(self) -> str:
|
|
545
569
|
if len(self.output_keys) != 1:
|
|
546
|
-
|
|
570
|
+
msg = (
|
|
547
571
|
f"`run` not supported when there is not exactly "
|
|
548
572
|
f"one output key. Got {self.output_keys}."
|
|
549
573
|
)
|
|
574
|
+
raise ValueError(msg)
|
|
550
575
|
return self.output_keys[0]
|
|
551
576
|
|
|
552
577
|
@deprecated("0.1.0", alternative="invoke", removal="1.0")
|
|
@@ -593,13 +618,15 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
593
618
|
context = "Weather report for Boise, Idaho on 07/03/23..."
|
|
594
619
|
chain.run(question=question, context=context)
|
|
595
620
|
# -> "The temperature in Boise is..."
|
|
621
|
+
|
|
596
622
|
"""
|
|
597
623
|
# Run at start to make sure this is possible/defined
|
|
598
624
|
_output_key = self._run_output_key
|
|
599
625
|
|
|
600
626
|
if args and not kwargs:
|
|
601
627
|
if len(args) != 1:
|
|
602
|
-
|
|
628
|
+
msg = "`run` supports only one positional argument."
|
|
629
|
+
raise ValueError(msg)
|
|
603
630
|
return self(args[0], callbacks=callbacks, tags=tags, metadata=metadata)[
|
|
604
631
|
_output_key
|
|
605
632
|
]
|
|
@@ -610,15 +637,16 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
610
637
|
]
|
|
611
638
|
|
|
612
639
|
if not kwargs and not args:
|
|
613
|
-
|
|
640
|
+
msg = (
|
|
614
641
|
"`run` supported with either positional arguments or keyword arguments,"
|
|
615
642
|
" but none were provided."
|
|
616
643
|
)
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
644
|
+
raise ValueError(msg)
|
|
645
|
+
msg = (
|
|
646
|
+
f"`run` supported with either positional arguments or keyword arguments"
|
|
647
|
+
f" but not both. Got args: {args} and kwargs: {kwargs}."
|
|
648
|
+
)
|
|
649
|
+
raise ValueError(msg)
|
|
622
650
|
|
|
623
651
|
@deprecated("0.1.0", alternative="ainvoke", removal="1.0")
|
|
624
652
|
async def arun(
|
|
@@ -665,32 +693,42 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
665
693
|
context = "Weather report for Boise, Idaho on 07/03/23..."
|
|
666
694
|
await chain.arun(question=question, context=context)
|
|
667
695
|
# -> "The temperature in Boise is..."
|
|
696
|
+
|
|
668
697
|
"""
|
|
669
698
|
if len(self.output_keys) != 1:
|
|
670
|
-
|
|
699
|
+
msg = (
|
|
671
700
|
f"`run` not supported when there is not exactly "
|
|
672
701
|
f"one output key. Got {self.output_keys}."
|
|
673
702
|
)
|
|
674
|
-
|
|
703
|
+
raise ValueError(msg)
|
|
704
|
+
if args and not kwargs:
|
|
675
705
|
if len(args) != 1:
|
|
676
|
-
|
|
706
|
+
msg = "`run` supports only one positional argument."
|
|
707
|
+
raise ValueError(msg)
|
|
677
708
|
return (
|
|
678
709
|
await self.acall(
|
|
679
|
-
args[0],
|
|
710
|
+
args[0],
|
|
711
|
+
callbacks=callbacks,
|
|
712
|
+
tags=tags,
|
|
713
|
+
metadata=metadata,
|
|
680
714
|
)
|
|
681
715
|
)[self.output_keys[0]]
|
|
682
716
|
|
|
683
717
|
if kwargs and not args:
|
|
684
718
|
return (
|
|
685
719
|
await self.acall(
|
|
686
|
-
kwargs,
|
|
720
|
+
kwargs,
|
|
721
|
+
callbacks=callbacks,
|
|
722
|
+
tags=tags,
|
|
723
|
+
metadata=metadata,
|
|
687
724
|
)
|
|
688
725
|
)[self.output_keys[0]]
|
|
689
726
|
|
|
690
|
-
|
|
727
|
+
msg = (
|
|
691
728
|
f"`run` supported with either positional arguments or keyword arguments"
|
|
692
729
|
f" but not both. Got args: {args} and kwargs: {kwargs}."
|
|
693
730
|
)
|
|
731
|
+
raise ValueError(msg)
|
|
694
732
|
|
|
695
733
|
def dict(self, **kwargs: Any) -> dict:
|
|
696
734
|
"""Dictionary representation of chain.
|
|
@@ -710,12 +748,11 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
710
748
|
|
|
711
749
|
chain.dict(exclude_unset=True)
|
|
712
750
|
# -> {"_type": "foo", "verbose": False, ...}
|
|
751
|
+
|
|
713
752
|
"""
|
|
714
753
|
_dict = super().dict(**kwargs)
|
|
715
|
-
|
|
754
|
+
with contextlib.suppress(NotImplementedError):
|
|
716
755
|
_dict["_type"] = self._chain_type
|
|
717
|
-
except NotImplementedError:
|
|
718
|
-
pass
|
|
719
756
|
return _dict
|
|
720
757
|
|
|
721
758
|
def save(self, file_path: Union[Path, str]) -> None:
|
|
@@ -731,36 +768,39 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
731
768
|
.. code-block:: python
|
|
732
769
|
|
|
733
770
|
chain.save(file_path="path/chain.yaml")
|
|
771
|
+
|
|
734
772
|
"""
|
|
735
773
|
if self.memory is not None:
|
|
736
|
-
|
|
774
|
+
msg = "Saving of memory is not yet supported."
|
|
775
|
+
raise ValueError(msg)
|
|
737
776
|
|
|
738
777
|
# Fetch dictionary to save
|
|
739
778
|
chain_dict = self.dict()
|
|
740
779
|
if "_type" not in chain_dict:
|
|
741
|
-
|
|
780
|
+
msg = f"Chain {self} does not support saving."
|
|
781
|
+
raise NotImplementedError(msg)
|
|
742
782
|
|
|
743
783
|
# Convert file to Path object.
|
|
744
|
-
if isinstance(file_path, str)
|
|
745
|
-
save_path = Path(file_path)
|
|
746
|
-
else:
|
|
747
|
-
save_path = file_path
|
|
784
|
+
save_path = Path(file_path) if isinstance(file_path, str) else file_path
|
|
748
785
|
|
|
749
786
|
directory_path = save_path.parent
|
|
750
787
|
directory_path.mkdir(parents=True, exist_ok=True)
|
|
751
788
|
|
|
752
789
|
if save_path.suffix == ".json":
|
|
753
|
-
with open(
|
|
790
|
+
with save_path.open("w") as f:
|
|
754
791
|
json.dump(chain_dict, f, indent=4)
|
|
755
792
|
elif save_path.suffix.endswith((".yaml", ".yml")):
|
|
756
|
-
with open(
|
|
793
|
+
with save_path.open("w") as f:
|
|
757
794
|
yaml.dump(chain_dict, f, default_flow_style=False)
|
|
758
795
|
else:
|
|
759
|
-
|
|
796
|
+
msg = f"{save_path} must be json or yaml"
|
|
797
|
+
raise ValueError(msg)
|
|
760
798
|
|
|
761
799
|
@deprecated("0.1.0", alternative="batch", removal="1.0")
|
|
762
800
|
def apply(
|
|
763
|
-
self,
|
|
801
|
+
self,
|
|
802
|
+
input_list: list[builtins.dict[str, Any]],
|
|
803
|
+
callbacks: Callbacks = None,
|
|
764
804
|
) -> list[builtins.dict[str, str]]:
|
|
765
805
|
"""Call the chain on all inputs in the list."""
|
|
766
806
|
return [self(inputs, callbacks=callbacks) for inputs in input_list]
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
from langchain_core.prompts.prompt import PromptTemplate
|
|
3
2
|
|
|
4
3
|
_template = """Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question.
|
|
@@ -6,7 +5,7 @@ _template = """Given the following conversation and a follow up question, rephra
|
|
|
6
5
|
Chat History:
|
|
7
6
|
{chat_history}
|
|
8
7
|
Follow Up Input: {question}
|
|
9
|
-
Standalone question:"""
|
|
8
|
+
Standalone question:""" # noqa: E501
|
|
10
9
|
CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template)
|
|
11
10
|
|
|
12
11
|
prompt_template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
|
|
@@ -14,7 +13,7 @@ prompt_template = """Use the following pieces of context to answer the question
|
|
|
14
13
|
{context}
|
|
15
14
|
|
|
16
15
|
Question: {question}
|
|
17
|
-
Helpful Answer:"""
|
|
16
|
+
Helpful Answer:""" # noqa: E501
|
|
18
17
|
QA_PROMPT = PromptTemplate(
|
|
19
18
|
template=prompt_template, input_variables=["context", "question"]
|
|
20
19
|
)
|
|
@@ -14,6 +14,7 @@ from langchain_core.runnables.config import RunnableConfig
|
|
|
14
14
|
from langchain_core.utils.pydantic import create_model
|
|
15
15
|
from langchain_text_splitters import RecursiveCharacterTextSplitter, TextSplitter
|
|
16
16
|
from pydantic import BaseModel, Field
|
|
17
|
+
from typing_extensions import override
|
|
17
18
|
|
|
18
19
|
from langchain.chains.base import Chain
|
|
19
20
|
|
|
@@ -24,10 +25,11 @@ DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template("{page_content}")
|
|
|
24
25
|
|
|
25
26
|
def _validate_prompt(prompt: BasePromptTemplate, document_variable_name: str) -> None:
|
|
26
27
|
if document_variable_name not in prompt.input_variables:
|
|
27
|
-
|
|
28
|
+
msg = (
|
|
28
29
|
f"Prompt must accept {document_variable_name} as an input variable. "
|
|
29
30
|
f"Received prompt with input variables: {prompt.input_variables}"
|
|
30
31
|
)
|
|
32
|
+
raise ValueError(msg)
|
|
31
33
|
|
|
32
34
|
|
|
33
35
|
class BaseCombineDocumentsChain(Chain, ABC):
|
|
@@ -45,16 +47,20 @@ class BaseCombineDocumentsChain(Chain, ABC):
|
|
|
45
47
|
input_key: str = "input_documents" #: :meta private:
|
|
46
48
|
output_key: str = "output_text" #: :meta private:
|
|
47
49
|
|
|
50
|
+
@override
|
|
48
51
|
def get_input_schema(
|
|
49
|
-
self,
|
|
52
|
+
self,
|
|
53
|
+
config: Optional[RunnableConfig] = None,
|
|
50
54
|
) -> type[BaseModel]:
|
|
51
55
|
return create_model(
|
|
52
56
|
"CombineDocumentsInput",
|
|
53
57
|
**{self.input_key: (list[Document], None)},
|
|
54
58
|
)
|
|
55
59
|
|
|
60
|
+
@override
|
|
56
61
|
def get_output_schema(
|
|
57
|
-
self,
|
|
62
|
+
self,
|
|
63
|
+
config: Optional[RunnableConfig] = None,
|
|
58
64
|
) -> type[BaseModel]:
|
|
59
65
|
return create_model(
|
|
60
66
|
"CombineDocumentsOutput",
|
|
@@ -77,7 +83,7 @@ class BaseCombineDocumentsChain(Chain, ABC):
|
|
|
77
83
|
"""
|
|
78
84
|
return [self.output_key]
|
|
79
85
|
|
|
80
|
-
def prompt_length(self, docs: list[Document], **kwargs: Any) -> Optional[int]:
|
|
86
|
+
def prompt_length(self, docs: list[Document], **kwargs: Any) -> Optional[int]: # noqa: ARG002
|
|
81
87
|
"""Return the prompt length given the documents passed in.
|
|
82
88
|
|
|
83
89
|
This can be used by a caller to determine whether passing in a list
|
|
@@ -111,7 +117,9 @@ class BaseCombineDocumentsChain(Chain, ABC):
|
|
|
111
117
|
|
|
112
118
|
@abstractmethod
|
|
113
119
|
async def acombine_docs(
|
|
114
|
-
self,
|
|
120
|
+
self,
|
|
121
|
+
docs: list[Document],
|
|
122
|
+
**kwargs: Any,
|
|
115
123
|
) -> tuple[str, dict]:
|
|
116
124
|
"""Combine documents into a single string.
|
|
117
125
|
|
|
@@ -136,7 +144,9 @@ class BaseCombineDocumentsChain(Chain, ABC):
|
|
|
136
144
|
# Other keys are assumed to be needed for LLM prediction
|
|
137
145
|
other_keys = {k: v for k, v in inputs.items() if k != self.input_key}
|
|
138
146
|
output, extra_return_dict = self.combine_docs(
|
|
139
|
-
docs,
|
|
147
|
+
docs,
|
|
148
|
+
callbacks=_run_manager.get_child(),
|
|
149
|
+
**other_keys,
|
|
140
150
|
)
|
|
141
151
|
extra_return_dict[self.output_key] = output
|
|
142
152
|
return extra_return_dict
|
|
@@ -152,7 +162,9 @@ class BaseCombineDocumentsChain(Chain, ABC):
|
|
|
152
162
|
# Other keys are assumed to be needed for LLM prediction
|
|
153
163
|
other_keys = {k: v for k, v in inputs.items() if k != self.input_key}
|
|
154
164
|
output, extra_return_dict = await self.acombine_docs(
|
|
155
|
-
docs,
|
|
165
|
+
docs,
|
|
166
|
+
callbacks=_run_manager.get_child(),
|
|
167
|
+
**other_keys,
|
|
156
168
|
)
|
|
157
169
|
extra_return_dict[self.output_key] = output
|
|
158
170
|
return extra_return_dict
|
|
@@ -162,7 +174,7 @@ class BaseCombineDocumentsChain(Chain, ABC):
|
|
|
162
174
|
since="0.2.7",
|
|
163
175
|
alternative=(
|
|
164
176
|
"example in API reference with more detail: "
|
|
165
|
-
"https://api.python.langchain.com/en/latest/chains/langchain.chains.combine_documents.base.AnalyzeDocumentChain.html"
|
|
177
|
+
"https://api.python.langchain.com/en/latest/chains/langchain.chains.combine_documents.base.AnalyzeDocumentChain.html"
|
|
166
178
|
),
|
|
167
179
|
removal="1.0",
|
|
168
180
|
)
|
|
@@ -222,6 +234,7 @@ class AnalyzeDocumentChain(Chain):
|
|
|
222
234
|
input_documents=itemgetter("input_document") | split_text,
|
|
223
235
|
) | chain.pick("output_text")
|
|
224
236
|
)
|
|
237
|
+
|
|
225
238
|
"""
|
|
226
239
|
|
|
227
240
|
input_key: str = "input_document" #: :meta private:
|
|
@@ -244,16 +257,20 @@ class AnalyzeDocumentChain(Chain):
|
|
|
244
257
|
"""
|
|
245
258
|
return self.combine_docs_chain.output_keys
|
|
246
259
|
|
|
260
|
+
@override
|
|
247
261
|
def get_input_schema(
|
|
248
|
-
self,
|
|
262
|
+
self,
|
|
263
|
+
config: Optional[RunnableConfig] = None,
|
|
249
264
|
) -> type[BaseModel]:
|
|
250
265
|
return create_model(
|
|
251
266
|
"AnalyzeDocumentChain",
|
|
252
267
|
**{self.input_key: (str, None)},
|
|
253
268
|
)
|
|
254
269
|
|
|
270
|
+
@override
|
|
255
271
|
def get_output_schema(
|
|
256
|
-
self,
|
|
272
|
+
self,
|
|
273
|
+
config: Optional[RunnableConfig] = None,
|
|
257
274
|
) -> type[BaseModel]:
|
|
258
275
|
return self.combine_docs_chain.get_output_schema(config)
|
|
259
276
|
|
|
@@ -270,5 +287,7 @@ class AnalyzeDocumentChain(Chain):
|
|
|
270
287
|
other_keys: dict = {k: v for k, v in inputs.items() if k != self.input_key}
|
|
271
288
|
other_keys[self.combine_docs_chain.input_key] = docs
|
|
272
289
|
return self.combine_docs_chain(
|
|
273
|
-
other_keys,
|
|
290
|
+
other_keys,
|
|
291
|
+
return_only_outputs=True,
|
|
292
|
+
callbacks=_run_manager.get_child(),
|
|
274
293
|
)
|