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/api/base.py
CHANGED
|
@@ -47,8 +47,8 @@ def _check_in_allowed_domain(url: str, limit_to_domains: Sequence[str]) -> bool:
|
|
|
47
47
|
scheme, domain = _extract_scheme_and_domain(url)
|
|
48
48
|
|
|
49
49
|
for allowed_domain in limit_to_domains:
|
|
50
|
-
allowed_scheme,
|
|
51
|
-
if scheme == allowed_scheme and domain ==
|
|
50
|
+
allowed_scheme, allowed_domain_ = _extract_scheme_and_domain(allowed_domain)
|
|
51
|
+
if scheme == allowed_scheme and domain == allowed_domain_:
|
|
52
52
|
return True
|
|
53
53
|
return False
|
|
54
54
|
|
|
@@ -61,7 +61,7 @@ try:
|
|
|
61
61
|
message=(
|
|
62
62
|
"This class is deprecated and will be removed in langchain 1.0. "
|
|
63
63
|
"See API reference for replacement: "
|
|
64
|
-
"https://api.python.langchain.com/en/latest/chains/langchain.chains.api.base.APIChain.html"
|
|
64
|
+
"https://api.python.langchain.com/en/latest/chains/langchain.chains.api.base.APIChain.html"
|
|
65
65
|
),
|
|
66
66
|
removal="1.0",
|
|
67
67
|
)
|
|
@@ -201,10 +201,10 @@ try:
|
|
|
201
201
|
output_key: str = "output" #: :meta private:
|
|
202
202
|
limit_to_domains: Optional[Sequence[str]] = Field(default_factory=list) # type: ignore[arg-type]
|
|
203
203
|
"""Use to limit the domains that can be accessed by the API chain.
|
|
204
|
-
|
|
204
|
+
|
|
205
205
|
* For example, to limit to just the domain `https://www.example.com`, set
|
|
206
206
|
`limit_to_domains=["https://www.example.com"]`.
|
|
207
|
-
|
|
207
|
+
|
|
208
208
|
* The default value is an empty tuple, which means that no domains are
|
|
209
209
|
allowed by default. By design this will raise an error on instantiation.
|
|
210
210
|
* Use a None if you want to allow all domains by default -- this is not
|
|
@@ -235,9 +235,8 @@ try:
|
|
|
235
235
|
input_vars = self.api_request_chain.prompt.input_variables
|
|
236
236
|
expected_vars = {"question", "api_docs"}
|
|
237
237
|
if set(input_vars) != expected_vars:
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
)
|
|
238
|
+
msg = f"Input variables should be {expected_vars}, got {input_vars}"
|
|
239
|
+
raise ValueError(msg)
|
|
241
240
|
return self
|
|
242
241
|
|
|
243
242
|
@model_validator(mode="before")
|
|
@@ -247,18 +246,20 @@ try:
|
|
|
247
246
|
# This check must be a pre=True check, so that a default of None
|
|
248
247
|
# won't be set to limit_to_domains if it's not provided.
|
|
249
248
|
if "limit_to_domains" not in values:
|
|
250
|
-
|
|
249
|
+
msg = (
|
|
251
250
|
"You must specify a list of domains to limit access using "
|
|
252
251
|
"`limit_to_domains`"
|
|
253
252
|
)
|
|
253
|
+
raise ValueError(msg)
|
|
254
254
|
if (
|
|
255
255
|
not values["limit_to_domains"]
|
|
256
256
|
and values["limit_to_domains"] is not None
|
|
257
257
|
):
|
|
258
|
-
|
|
258
|
+
msg = (
|
|
259
259
|
"Please provide a list of domains to limit access using "
|
|
260
260
|
"`limit_to_domains`."
|
|
261
261
|
)
|
|
262
|
+
raise ValueError(msg)
|
|
262
263
|
return values
|
|
263
264
|
|
|
264
265
|
@model_validator(mode="after")
|
|
@@ -267,9 +268,8 @@ try:
|
|
|
267
268
|
input_vars = self.api_answer_chain.prompt.input_variables
|
|
268
269
|
expected_vars = {"question", "api_docs", "api_url", "api_response"}
|
|
269
270
|
if set(input_vars) != expected_vars:
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
)
|
|
271
|
+
msg = f"Input variables should be {expected_vars}, got {input_vars}"
|
|
272
|
+
raise ValueError(msg)
|
|
273
273
|
return self
|
|
274
274
|
|
|
275
275
|
def _call(
|
|
@@ -287,14 +287,19 @@ try:
|
|
|
287
287
|
_run_manager.on_text(api_url, color="green", end="\n", verbose=self.verbose)
|
|
288
288
|
api_url = api_url.strip()
|
|
289
289
|
if self.limit_to_domains and not _check_in_allowed_domain(
|
|
290
|
-
api_url,
|
|
290
|
+
api_url,
|
|
291
|
+
self.limit_to_domains,
|
|
291
292
|
):
|
|
292
|
-
|
|
293
|
+
msg = (
|
|
293
294
|
f"{api_url} is not in the allowed domains: {self.limit_to_domains}"
|
|
294
295
|
)
|
|
296
|
+
raise ValueError(msg)
|
|
295
297
|
api_response = self.requests_wrapper.get(api_url)
|
|
296
298
|
_run_manager.on_text(
|
|
297
|
-
str(api_response),
|
|
299
|
+
str(api_response),
|
|
300
|
+
color="yellow",
|
|
301
|
+
end="\n",
|
|
302
|
+
verbose=self.verbose,
|
|
298
303
|
)
|
|
299
304
|
answer = self.api_answer_chain.predict(
|
|
300
305
|
question=question,
|
|
@@ -320,18 +325,26 @@ try:
|
|
|
320
325
|
callbacks=_run_manager.get_child(),
|
|
321
326
|
)
|
|
322
327
|
await _run_manager.on_text(
|
|
323
|
-
api_url,
|
|
328
|
+
api_url,
|
|
329
|
+
color="green",
|
|
330
|
+
end="\n",
|
|
331
|
+
verbose=self.verbose,
|
|
324
332
|
)
|
|
325
333
|
api_url = api_url.strip()
|
|
326
334
|
if self.limit_to_domains and not _check_in_allowed_domain(
|
|
327
|
-
api_url,
|
|
335
|
+
api_url,
|
|
336
|
+
self.limit_to_domains,
|
|
328
337
|
):
|
|
329
|
-
|
|
338
|
+
msg = (
|
|
330
339
|
f"{api_url} is not in the allowed domains: {self.limit_to_domains}"
|
|
331
340
|
)
|
|
341
|
+
raise ValueError(msg)
|
|
332
342
|
api_response = await self.requests_wrapper.aget(api_url)
|
|
333
343
|
await _run_manager.on_text(
|
|
334
|
-
str(api_response),
|
|
344
|
+
str(api_response),
|
|
345
|
+
color="yellow",
|
|
346
|
+
end="\n",
|
|
347
|
+
verbose=self.verbose,
|
|
335
348
|
)
|
|
336
349
|
answer = await self.api_answer_chain.apredict(
|
|
337
350
|
question=question,
|
|
@@ -350,7 +363,7 @@ try:
|
|
|
350
363
|
headers: Optional[dict] = None,
|
|
351
364
|
api_url_prompt: BasePromptTemplate = API_URL_PROMPT,
|
|
352
365
|
api_response_prompt: BasePromptTemplate = API_RESPONSE_PROMPT,
|
|
353
|
-
limit_to_domains: Optional[Sequence[str]] =
|
|
366
|
+
limit_to_domains: Optional[Sequence[str]] = (),
|
|
354
367
|
**kwargs: Any,
|
|
355
368
|
) -> APIChain:
|
|
356
369
|
"""Load chain from just an LLM and the api docs."""
|
|
@@ -374,7 +387,8 @@ except ImportError:
|
|
|
374
387
|
|
|
375
388
|
class APIChain: # type: ignore[no-redef]
|
|
376
389
|
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
377
|
-
|
|
390
|
+
msg = (
|
|
378
391
|
"To use the APIChain, you must install the langchain_community package."
|
|
379
392
|
"pip install langchain_community"
|
|
380
393
|
)
|
|
394
|
+
raise ImportError(msg)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
NEWS_DOCS = """API documentation:
|
|
3
2
|
Endpoint: https://newsapi.org
|
|
4
3
|
Top headlines /v2/top-headlines
|
|
@@ -29,4 +28,4 @@ Response object
|
|
|
29
28
|
content | string | The unformatted content of the article, where available. This is truncated to 200 chars.
|
|
30
29
|
|
|
31
30
|
Use page size: 2
|
|
32
|
-
"""
|
|
31
|
+
""" # noqa: E501
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
OPEN_METEO_DOCS = """BASE URL: https://api.open-meteo.com/
|
|
3
2
|
|
|
4
3
|
API Documentation
|
|
@@ -30,4 +29,4 @@ showers Preceding hour sum mm (inch) Showers from convective precipitation in mi
|
|
|
30
29
|
weathercode Instant WMO code Weather condition as a numeric code. Follow WMO weather interpretation codes. See table below for details.
|
|
31
30
|
snow_depth Instant meters Snow depth on the ground
|
|
32
31
|
freezinglevel_height Instant meters Altitude above sea level of the 0°C level
|
|
33
|
-
visibility Instant meters Viewing distance in meters. Influenced by low clouds, humidity and aerosols. Maximum visibility is approximately 24 km."""
|
|
32
|
+
visibility Instant meters Viewing distance in meters. Influenced by low clouds, humidity and aerosols. Maximum visibility is approximately 24 km.""" # noqa: E501
|
langchain/chains/api/prompt.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
from langchain_core.prompts.prompt import PromptTemplate
|
|
3
2
|
|
|
4
3
|
API_URL_PROMPT_TEMPLATE = """You are given the below API Documentation:
|
|
@@ -7,7 +6,7 @@ Using this documentation, generate the full API url to call for answering the us
|
|
|
7
6
|
You should build the API url in order to get a response that is as short as possible, while still getting the necessary information to answer the question. Pay attention to deliberately exclude any unnecessary pieces of data in the API call.
|
|
8
7
|
|
|
9
8
|
Question:{question}
|
|
10
|
-
API url:"""
|
|
9
|
+
API url:""" # noqa: E501
|
|
11
10
|
|
|
12
11
|
API_URL_PROMPT = PromptTemplate(
|
|
13
12
|
input_variables=[
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
TMDB_DOCS = """API documentation:
|
|
3
2
|
Endpoint: https://api.themoviedb.org/3
|
|
4
3
|
GET /search/movie
|
|
@@ -34,4 +33,4 @@ backdrop_path | string or null | optional
|
|
|
34
33
|
popularity | number | optional
|
|
35
34
|
vote_count | integer | optional
|
|
36
35
|
video | boolean | optional
|
|
37
|
-
vote_average | number | optional"""
|
|
36
|
+
vote_average | number | optional""" # noqa: E501
|
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
|
|
@@ -27,7 +28,7 @@ from langchain_core.runnables import (
|
|
|
27
28
|
ensure_config,
|
|
28
29
|
run_in_executor,
|
|
29
30
|
)
|
|
30
|
-
from langchain_core.
|
|
31
|
+
from langchain_core.utils.pydantic import create_model
|
|
31
32
|
from pydantic import (
|
|
32
33
|
BaseModel,
|
|
33
34
|
ConfigDict,
|
|
@@ -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
|
|
|
@@ -107,17 +109,23 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
107
109
|
)
|
|
108
110
|
|
|
109
111
|
def get_input_schema(
|
|
110
|
-
self,
|
|
112
|
+
self,
|
|
113
|
+
config: Optional[RunnableConfig] = None,
|
|
111
114
|
) -> type[BaseModel]:
|
|
112
115
|
# This is correct, but pydantic typings/mypy don't think so.
|
|
113
|
-
return create_model("ChainInput", **
|
|
116
|
+
return create_model("ChainInput", **dict.fromkeys(self.input_keys, (Any, None)))
|
|
114
117
|
|
|
115
118
|
def get_output_schema(
|
|
116
|
-
self,
|
|
119
|
+
self,
|
|
120
|
+
config: Optional[RunnableConfig] = None,
|
|
117
121
|
) -> type[BaseModel]:
|
|
118
122
|
# This is correct, but pydantic typings/mypy don't think so.
|
|
119
|
-
return create_model(
|
|
123
|
+
return create_model(
|
|
124
|
+
"ChainOutput",
|
|
125
|
+
**dict.fromkeys(self.output_keys, (Any, None)),
|
|
126
|
+
)
|
|
120
127
|
|
|
128
|
+
@override
|
|
121
129
|
def invoke(
|
|
122
130
|
self,
|
|
123
131
|
input: dict[str, Any],
|
|
@@ -160,17 +168,20 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
160
168
|
)
|
|
161
169
|
|
|
162
170
|
final_outputs: dict[str, Any] = self.prep_outputs(
|
|
163
|
-
inputs,
|
|
171
|
+
inputs,
|
|
172
|
+
outputs,
|
|
173
|
+
return_only_outputs,
|
|
164
174
|
)
|
|
165
175
|
except BaseException as e:
|
|
166
176
|
run_manager.on_chain_error(e)
|
|
167
|
-
raise
|
|
177
|
+
raise
|
|
168
178
|
run_manager.on_chain_end(outputs)
|
|
169
179
|
|
|
170
180
|
if include_run_info:
|
|
171
181
|
final_outputs[RUN_KEY] = RunInfo(run_id=run_manager.run_id)
|
|
172
182
|
return final_outputs
|
|
173
183
|
|
|
184
|
+
@override
|
|
174
185
|
async def ainvoke(
|
|
175
186
|
self,
|
|
176
187
|
input: dict[str, Any],
|
|
@@ -211,11 +222,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
211
222
|
else await self._acall(inputs)
|
|
212
223
|
)
|
|
213
224
|
final_outputs: dict[str, Any] = await self.aprep_outputs(
|
|
214
|
-
inputs,
|
|
225
|
+
inputs,
|
|
226
|
+
outputs,
|
|
227
|
+
return_only_outputs,
|
|
215
228
|
)
|
|
216
229
|
except BaseException as e:
|
|
217
230
|
await run_manager.on_chain_error(e)
|
|
218
|
-
raise
|
|
231
|
+
raise
|
|
219
232
|
await run_manager.on_chain_end(outputs)
|
|
220
233
|
|
|
221
234
|
if include_run_info:
|
|
@@ -224,7 +237,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
224
237
|
|
|
225
238
|
@property
|
|
226
239
|
def _chain_type(self) -> str:
|
|
227
|
-
|
|
240
|
+
msg = "Saving not supported for this chain type."
|
|
241
|
+
raise NotImplementedError(msg)
|
|
228
242
|
|
|
229
243
|
@model_validator(mode="before")
|
|
230
244
|
@classmethod
|
|
@@ -232,29 +246,33 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
232
246
|
"""Raise deprecation warning if callback_manager is used."""
|
|
233
247
|
if values.get("callback_manager") is not None:
|
|
234
248
|
if values.get("callbacks") is not None:
|
|
235
|
-
|
|
249
|
+
msg = (
|
|
236
250
|
"Cannot specify both callback_manager and callbacks. "
|
|
237
251
|
"callback_manager is deprecated, callbacks is the preferred "
|
|
238
252
|
"parameter to pass in."
|
|
239
253
|
)
|
|
254
|
+
raise ValueError(msg)
|
|
240
255
|
warnings.warn(
|
|
241
256
|
"callback_manager is deprecated. Please use callbacks instead.",
|
|
242
257
|
DeprecationWarning,
|
|
258
|
+
stacklevel=4,
|
|
243
259
|
)
|
|
244
260
|
values["callbacks"] = values.pop("callback_manager", None)
|
|
245
261
|
return values
|
|
246
262
|
|
|
247
263
|
@field_validator("verbose", mode="before")
|
|
248
264
|
@classmethod
|
|
249
|
-
def set_verbose(
|
|
265
|
+
def set_verbose(
|
|
266
|
+
cls,
|
|
267
|
+
verbose: Optional[bool], # noqa: FBT001
|
|
268
|
+
) -> bool:
|
|
250
269
|
"""Set the chain verbosity.
|
|
251
270
|
|
|
252
271
|
Defaults to the global setting if not specified by the user.
|
|
253
272
|
"""
|
|
254
273
|
if verbose is None:
|
|
255
274
|
return _get_verbosity()
|
|
256
|
-
|
|
257
|
-
return verbose
|
|
275
|
+
return verbose
|
|
258
276
|
|
|
259
277
|
@property
|
|
260
278
|
@abstractmethod
|
|
@@ -275,21 +293,24 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
275
293
|
# only one is not set, we can still figure out which key it is.
|
|
276
294
|
_input_keys = _input_keys.difference(self.memory.memory_variables)
|
|
277
295
|
if len(_input_keys) != 1:
|
|
278
|
-
|
|
296
|
+
msg = (
|
|
279
297
|
f"A single string input was passed in, but this chain expects "
|
|
280
298
|
f"multiple inputs ({_input_keys}). When a chain expects "
|
|
281
299
|
f"multiple inputs, please call it by passing in a dictionary, "
|
|
282
300
|
"eg `chain({'foo': 1, 'bar': 2})`"
|
|
283
301
|
)
|
|
302
|
+
raise ValueError(msg)
|
|
284
303
|
|
|
285
304
|
missing_keys = set(self.input_keys).difference(inputs)
|
|
286
305
|
if missing_keys:
|
|
287
|
-
|
|
306
|
+
msg = f"Missing some input keys: {missing_keys}"
|
|
307
|
+
raise ValueError(msg)
|
|
288
308
|
|
|
289
309
|
def _validate_outputs(self, outputs: dict[str, Any]) -> None:
|
|
290
310
|
missing_keys = set(self.output_keys).difference(outputs)
|
|
291
311
|
if missing_keys:
|
|
292
|
-
|
|
312
|
+
msg = f"Missing some output keys: {missing_keys}"
|
|
313
|
+
raise ValueError(msg)
|
|
293
314
|
|
|
294
315
|
@abstractmethod
|
|
295
316
|
def _call(
|
|
@@ -336,14 +357,17 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
336
357
|
`Chain.output_keys`.
|
|
337
358
|
"""
|
|
338
359
|
return await run_in_executor(
|
|
339
|
-
None,
|
|
360
|
+
None,
|
|
361
|
+
self._call,
|
|
362
|
+
inputs,
|
|
363
|
+
run_manager.get_sync() if run_manager else None,
|
|
340
364
|
)
|
|
341
365
|
|
|
342
366
|
@deprecated("0.1.0", alternative="invoke", removal="1.0")
|
|
343
367
|
def __call__(
|
|
344
368
|
self,
|
|
345
369
|
inputs: Union[dict[str, Any], Any],
|
|
346
|
-
return_only_outputs: bool = False,
|
|
370
|
+
return_only_outputs: bool = False, # noqa: FBT001,FBT002
|
|
347
371
|
callbacks: Callbacks = None,
|
|
348
372
|
*,
|
|
349
373
|
tags: Optional[list[str]] = None,
|
|
@@ -394,7 +418,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
394
418
|
async def acall(
|
|
395
419
|
self,
|
|
396
420
|
inputs: Union[dict[str, Any], Any],
|
|
397
|
-
return_only_outputs: bool = False,
|
|
421
|
+
return_only_outputs: bool = False, # noqa: FBT001,FBT002
|
|
398
422
|
callbacks: Callbacks = None,
|
|
399
423
|
*,
|
|
400
424
|
tags: Optional[list[str]] = None,
|
|
@@ -444,7 +468,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
444
468
|
self,
|
|
445
469
|
inputs: dict[str, str],
|
|
446
470
|
outputs: dict[str, str],
|
|
447
|
-
return_only_outputs: bool = False,
|
|
471
|
+
return_only_outputs: bool = False, # noqa: FBT001,FBT002
|
|
448
472
|
) -> dict[str, str]:
|
|
449
473
|
"""Validate and prepare chain outputs, and save info about this run to memory.
|
|
450
474
|
|
|
@@ -463,14 +487,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
463
487
|
self.memory.save_context(inputs, outputs)
|
|
464
488
|
if return_only_outputs:
|
|
465
489
|
return outputs
|
|
466
|
-
|
|
467
|
-
return {**inputs, **outputs}
|
|
490
|
+
return {**inputs, **outputs}
|
|
468
491
|
|
|
469
492
|
async def aprep_outputs(
|
|
470
493
|
self,
|
|
471
494
|
inputs: dict[str, str],
|
|
472
495
|
outputs: dict[str, str],
|
|
473
|
-
return_only_outputs: bool = False,
|
|
496
|
+
return_only_outputs: bool = False, # noqa: FBT001,FBT002
|
|
474
497
|
) -> dict[str, str]:
|
|
475
498
|
"""Validate and prepare chain outputs, and save info about this run to memory.
|
|
476
499
|
|
|
@@ -489,8 +512,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
489
512
|
await self.memory.asave_context(inputs, outputs)
|
|
490
513
|
if return_only_outputs:
|
|
491
514
|
return outputs
|
|
492
|
-
|
|
493
|
-
return {**inputs, **outputs}
|
|
515
|
+
return {**inputs, **outputs}
|
|
494
516
|
|
|
495
517
|
def prep_inputs(self, inputs: Union[dict[str, Any], Any]) -> dict[str, str]:
|
|
496
518
|
"""Prepare chain inputs, including adding inputs from memory.
|
|
@@ -510,7 +532,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
510
532
|
# If there are multiple input keys, but some get set by memory so that
|
|
511
533
|
# only one is not set, we can still figure out which key it is.
|
|
512
534
|
_input_keys = _input_keys.difference(self.memory.memory_variables)
|
|
513
|
-
inputs = {
|
|
535
|
+
inputs = {next(iter(_input_keys)): inputs}
|
|
514
536
|
if self.memory is not None:
|
|
515
537
|
external_context = self.memory.load_memory_variables(inputs)
|
|
516
538
|
inputs = dict(inputs, **external_context)
|
|
@@ -534,7 +556,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
534
556
|
# If there are multiple input keys, but some get set by memory so that
|
|
535
557
|
# only one is not set, we can still figure out which key it is.
|
|
536
558
|
_input_keys = _input_keys.difference(self.memory.memory_variables)
|
|
537
|
-
inputs = {
|
|
559
|
+
inputs = {next(iter(_input_keys)): inputs}
|
|
538
560
|
if self.memory is not None:
|
|
539
561
|
external_context = await self.memory.aload_memory_variables(inputs)
|
|
540
562
|
inputs = dict(inputs, **external_context)
|
|
@@ -543,10 +565,11 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
543
565
|
@property
|
|
544
566
|
def _run_output_key(self) -> str:
|
|
545
567
|
if len(self.output_keys) != 1:
|
|
546
|
-
|
|
568
|
+
msg = (
|
|
547
569
|
f"`run` not supported when there is not exactly "
|
|
548
570
|
f"one output key. Got {self.output_keys}."
|
|
549
571
|
)
|
|
572
|
+
raise ValueError(msg)
|
|
550
573
|
return self.output_keys[0]
|
|
551
574
|
|
|
552
575
|
@deprecated("0.1.0", alternative="invoke", removal="1.0")
|
|
@@ -599,7 +622,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
599
622
|
|
|
600
623
|
if args and not kwargs:
|
|
601
624
|
if len(args) != 1:
|
|
602
|
-
|
|
625
|
+
msg = "`run` supports only one positional argument."
|
|
626
|
+
raise ValueError(msg)
|
|
603
627
|
return self(args[0], callbacks=callbacks, tags=tags, metadata=metadata)[
|
|
604
628
|
_output_key
|
|
605
629
|
]
|
|
@@ -610,15 +634,16 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
610
634
|
]
|
|
611
635
|
|
|
612
636
|
if not kwargs and not args:
|
|
613
|
-
|
|
637
|
+
msg = (
|
|
614
638
|
"`run` supported with either positional arguments or keyword arguments,"
|
|
615
639
|
" but none were provided."
|
|
616
640
|
)
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
641
|
+
raise ValueError(msg)
|
|
642
|
+
msg = (
|
|
643
|
+
f"`run` supported with either positional arguments or keyword arguments"
|
|
644
|
+
f" but not both. Got args: {args} and kwargs: {kwargs}."
|
|
645
|
+
)
|
|
646
|
+
raise ValueError(msg)
|
|
622
647
|
|
|
623
648
|
@deprecated("0.1.0", alternative="ainvoke", removal="1.0")
|
|
624
649
|
async def arun(
|
|
@@ -667,30 +692,39 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
667
692
|
# -> "The temperature in Boise is..."
|
|
668
693
|
"""
|
|
669
694
|
if len(self.output_keys) != 1:
|
|
670
|
-
|
|
695
|
+
msg = (
|
|
671
696
|
f"`run` not supported when there is not exactly "
|
|
672
697
|
f"one output key. Got {self.output_keys}."
|
|
673
698
|
)
|
|
674
|
-
|
|
699
|
+
raise ValueError(msg)
|
|
700
|
+
if args and not kwargs:
|
|
675
701
|
if len(args) != 1:
|
|
676
|
-
|
|
702
|
+
msg = "`run` supports only one positional argument."
|
|
703
|
+
raise ValueError(msg)
|
|
677
704
|
return (
|
|
678
705
|
await self.acall(
|
|
679
|
-
args[0],
|
|
706
|
+
args[0],
|
|
707
|
+
callbacks=callbacks,
|
|
708
|
+
tags=tags,
|
|
709
|
+
metadata=metadata,
|
|
680
710
|
)
|
|
681
711
|
)[self.output_keys[0]]
|
|
682
712
|
|
|
683
713
|
if kwargs and not args:
|
|
684
714
|
return (
|
|
685
715
|
await self.acall(
|
|
686
|
-
kwargs,
|
|
716
|
+
kwargs,
|
|
717
|
+
callbacks=callbacks,
|
|
718
|
+
tags=tags,
|
|
719
|
+
metadata=metadata,
|
|
687
720
|
)
|
|
688
721
|
)[self.output_keys[0]]
|
|
689
722
|
|
|
690
|
-
|
|
723
|
+
msg = (
|
|
691
724
|
f"`run` supported with either positional arguments or keyword arguments"
|
|
692
725
|
f" but not both. Got args: {args} and kwargs: {kwargs}."
|
|
693
726
|
)
|
|
727
|
+
raise ValueError(msg)
|
|
694
728
|
|
|
695
729
|
def dict(self, **kwargs: Any) -> dict:
|
|
696
730
|
"""Dictionary representation of chain.
|
|
@@ -712,10 +746,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
712
746
|
# -> {"_type": "foo", "verbose": False, ...}
|
|
713
747
|
"""
|
|
714
748
|
_dict = super().dict(**kwargs)
|
|
715
|
-
|
|
749
|
+
with contextlib.suppress(NotImplementedError):
|
|
716
750
|
_dict["_type"] = self._chain_type
|
|
717
|
-
except NotImplementedError:
|
|
718
|
-
pass
|
|
719
751
|
return _dict
|
|
720
752
|
|
|
721
753
|
def save(self, file_path: Union[Path, str]) -> None:
|
|
@@ -733,34 +765,36 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
|
|
|
733
765
|
chain.save(file_path="path/chain.yaml")
|
|
734
766
|
"""
|
|
735
767
|
if self.memory is not None:
|
|
736
|
-
|
|
768
|
+
msg = "Saving of memory is not yet supported."
|
|
769
|
+
raise ValueError(msg)
|
|
737
770
|
|
|
738
771
|
# Fetch dictionary to save
|
|
739
772
|
chain_dict = self.dict()
|
|
740
773
|
if "_type" not in chain_dict:
|
|
741
|
-
|
|
774
|
+
msg = f"Chain {self} does not support saving."
|
|
775
|
+
raise NotImplementedError(msg)
|
|
742
776
|
|
|
743
777
|
# Convert file to Path object.
|
|
744
|
-
if isinstance(file_path, str)
|
|
745
|
-
save_path = Path(file_path)
|
|
746
|
-
else:
|
|
747
|
-
save_path = file_path
|
|
778
|
+
save_path = Path(file_path) if isinstance(file_path, str) else file_path
|
|
748
779
|
|
|
749
780
|
directory_path = save_path.parent
|
|
750
781
|
directory_path.mkdir(parents=True, exist_ok=True)
|
|
751
782
|
|
|
752
783
|
if save_path.suffix == ".json":
|
|
753
|
-
with open(
|
|
784
|
+
with save_path.open("w") as f:
|
|
754
785
|
json.dump(chain_dict, f, indent=4)
|
|
755
786
|
elif save_path.suffix.endswith((".yaml", ".yml")):
|
|
756
|
-
with open(
|
|
787
|
+
with save_path.open("w") as f:
|
|
757
788
|
yaml.dump(chain_dict, f, default_flow_style=False)
|
|
758
789
|
else:
|
|
759
|
-
|
|
790
|
+
msg = f"{save_path} must be json or yaml"
|
|
791
|
+
raise ValueError(msg)
|
|
760
792
|
|
|
761
793
|
@deprecated("0.1.0", alternative="batch", removal="1.0")
|
|
762
794
|
def apply(
|
|
763
|
-
self,
|
|
795
|
+
self,
|
|
796
|
+
input_list: list[builtins.dict[str, Any]],
|
|
797
|
+
callbacks: Callbacks = None,
|
|
764
798
|
) -> list[builtins.dict[str, str]]:
|
|
765
799
|
"""Call the chain on all inputs in the list."""
|
|
766
800
|
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
|
)
|