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/hub.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Interface with the LangChain Hub."""
|
|
1
|
+
"""Interface with the `LangChain Hub <https://smith.langchain.com/hub>`__."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
@@ -21,25 +21,25 @@ def _get_client(
|
|
|
21
21
|
ls_client = LangSmithClient(api_url, api_key=api_key)
|
|
22
22
|
if hasattr(ls_client, "push_prompt") and hasattr(ls_client, "pull_prompt"):
|
|
23
23
|
return ls_client
|
|
24
|
-
|
|
25
|
-
from langchainhub import Client as LangChainHubClient
|
|
24
|
+
from langchainhub import Client as LangChainHubClient
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
return LangChainHubClient(api_url, api_key=api_key)
|
|
28
27
|
except ImportError:
|
|
29
28
|
try:
|
|
30
29
|
from langchainhub import Client as LangChainHubClient
|
|
31
30
|
|
|
32
31
|
return LangChainHubClient(api_url, api_key=api_key)
|
|
33
32
|
except ImportError as e:
|
|
34
|
-
|
|
33
|
+
msg = (
|
|
35
34
|
"Could not import langsmith or langchainhub (deprecated),"
|
|
36
35
|
"please install with `pip install langsmith`."
|
|
37
|
-
)
|
|
36
|
+
)
|
|
37
|
+
raise ImportError(msg) from e
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
def push(
|
|
41
41
|
repo_full_name: str,
|
|
42
|
-
object: Any,
|
|
42
|
+
object: Any, # noqa: A002
|
|
43
43
|
*,
|
|
44
44
|
api_url: Optional[str] = None,
|
|
45
45
|
api_key: Optional[str] = None,
|
|
@@ -81,14 +81,13 @@ def push(
|
|
|
81
81
|
|
|
82
82
|
# Then it's langchainhub
|
|
83
83
|
manifest_json = dumps(object)
|
|
84
|
-
|
|
84
|
+
return client.push(
|
|
85
85
|
repo_full_name,
|
|
86
86
|
manifest_json,
|
|
87
87
|
parent_commit_hash=parent_commit_hash,
|
|
88
88
|
new_repo_is_public=new_repo_is_public,
|
|
89
89
|
new_repo_description=new_repo_description,
|
|
90
90
|
)
|
|
91
|
-
return message
|
|
92
91
|
|
|
93
92
|
|
|
94
93
|
def pull(
|
|
@@ -112,8 +111,7 @@ def pull(
|
|
|
112
111
|
|
|
113
112
|
# Then it's langsmith
|
|
114
113
|
if hasattr(client, "pull_prompt"):
|
|
115
|
-
|
|
116
|
-
return response
|
|
114
|
+
return client.pull_prompt(owner_repo_commit, include_model=include_model)
|
|
117
115
|
|
|
118
116
|
# Then it's langchainhub
|
|
119
117
|
if hasattr(client, "pull_repo"):
|
langchain/indexes/__init__.py
CHANGED
|
@@ -119,10 +119,12 @@ class SQLRecordManager(RecordManager):
|
|
|
119
119
|
"""
|
|
120
120
|
super().__init__(namespace=namespace)
|
|
121
121
|
if db_url is None and engine is None:
|
|
122
|
-
|
|
122
|
+
msg = "Must specify either db_url or engine"
|
|
123
|
+
raise ValueError(msg)
|
|
123
124
|
|
|
124
125
|
if db_url is not None and engine is not None:
|
|
125
|
-
|
|
126
|
+
msg = "Must specify either db_url or engine, not both"
|
|
127
|
+
raise ValueError(msg)
|
|
126
128
|
|
|
127
129
|
_engine: Union[Engine, AsyncEngine]
|
|
128
130
|
if db_url:
|
|
@@ -134,7 +136,8 @@ class SQLRecordManager(RecordManager):
|
|
|
134
136
|
_engine = engine
|
|
135
137
|
|
|
136
138
|
else:
|
|
137
|
-
|
|
139
|
+
msg = "Something went wrong with configuration of engine."
|
|
140
|
+
raise AssertionError(msg)
|
|
138
141
|
|
|
139
142
|
_session_factory: Union[sessionmaker[Session], async_sessionmaker[AsyncSession]]
|
|
140
143
|
if isinstance(_engine, AsyncEngine):
|
|
@@ -149,7 +152,8 @@ class SQLRecordManager(RecordManager):
|
|
|
149
152
|
def create_schema(self) -> None:
|
|
150
153
|
"""Create the database schema."""
|
|
151
154
|
if isinstance(self.engine, AsyncEngine):
|
|
152
|
-
|
|
155
|
+
msg = "This method is not supported for async engines."
|
|
156
|
+
raise AssertionError(msg) # noqa: TRY004
|
|
153
157
|
|
|
154
158
|
Base.metadata.create_all(self.engine)
|
|
155
159
|
|
|
@@ -157,7 +161,8 @@ class SQLRecordManager(RecordManager):
|
|
|
157
161
|
"""Create the database schema."""
|
|
158
162
|
|
|
159
163
|
if not isinstance(self.engine, AsyncEngine):
|
|
160
|
-
|
|
164
|
+
msg = "This method is not supported for sync engines."
|
|
165
|
+
raise AssertionError(msg) # noqa: TRY004
|
|
161
166
|
|
|
162
167
|
async with self.engine.begin() as session:
|
|
163
168
|
await session.run_sync(Base.metadata.create_all)
|
|
@@ -167,7 +172,8 @@ class SQLRecordManager(RecordManager):
|
|
|
167
172
|
"""Create a session and close it after use."""
|
|
168
173
|
|
|
169
174
|
if isinstance(self.session_factory, async_sessionmaker):
|
|
170
|
-
|
|
175
|
+
msg = "This method is not supported for async engines."
|
|
176
|
+
raise AssertionError(msg) # noqa: TRY004
|
|
171
177
|
|
|
172
178
|
session = self.session_factory()
|
|
173
179
|
try:
|
|
@@ -180,7 +186,8 @@ class SQLRecordManager(RecordManager):
|
|
|
180
186
|
"""Create a session and close it after use."""
|
|
181
187
|
|
|
182
188
|
if not isinstance(self.session_factory, async_sessionmaker):
|
|
183
|
-
|
|
189
|
+
msg = "This method is not supported for sync engines."
|
|
190
|
+
raise AssertionError(msg) # noqa: TRY004
|
|
184
191
|
|
|
185
192
|
async with self.session_factory() as session:
|
|
186
193
|
yield session
|
|
@@ -206,13 +213,15 @@ class SQLRecordManager(RecordManager):
|
|
|
206
213
|
elif self.dialect == "postgresql":
|
|
207
214
|
query = text("SELECT EXTRACT (EPOCH FROM CURRENT_TIMESTAMP);")
|
|
208
215
|
else:
|
|
209
|
-
|
|
216
|
+
msg = f"Not implemented for dialect {self.dialect}"
|
|
217
|
+
raise NotImplementedError(msg)
|
|
210
218
|
|
|
211
219
|
dt = session.execute(query).scalar()
|
|
212
220
|
if isinstance(dt, decimal.Decimal):
|
|
213
221
|
dt = float(dt)
|
|
214
222
|
if not isinstance(dt, float):
|
|
215
|
-
|
|
223
|
+
msg = f"Unexpected type for datetime: {type(dt)}"
|
|
224
|
+
raise AssertionError(msg) # noqa: TRY004
|
|
216
225
|
return dt
|
|
217
226
|
|
|
218
227
|
async def aget_time(self) -> float:
|
|
@@ -236,14 +245,16 @@ class SQLRecordManager(RecordManager):
|
|
|
236
245
|
elif self.dialect == "postgresql":
|
|
237
246
|
query = text("SELECT EXTRACT (EPOCH FROM CURRENT_TIMESTAMP);")
|
|
238
247
|
else:
|
|
239
|
-
|
|
248
|
+
msg = f"Not implemented for dialect {self.dialect}"
|
|
249
|
+
raise NotImplementedError(msg)
|
|
240
250
|
|
|
241
251
|
dt = (await session.execute(query)).scalar_one_or_none()
|
|
242
252
|
|
|
243
253
|
if isinstance(dt, decimal.Decimal):
|
|
244
254
|
dt = float(dt)
|
|
245
255
|
if not isinstance(dt, float):
|
|
246
|
-
|
|
256
|
+
msg = f"Unexpected type for datetime: {type(dt)}"
|
|
257
|
+
raise AssertionError(msg) # noqa: TRY004
|
|
247
258
|
return dt
|
|
248
259
|
|
|
249
260
|
def update(
|
|
@@ -258,10 +269,11 @@ class SQLRecordManager(RecordManager):
|
|
|
258
269
|
group_ids = [None] * len(keys)
|
|
259
270
|
|
|
260
271
|
if len(keys) != len(group_ids):
|
|
261
|
-
|
|
272
|
+
msg = (
|
|
262
273
|
f"Number of keys ({len(keys)}) does not match number of "
|
|
263
274
|
f"group_ids ({len(group_ids)})"
|
|
264
275
|
)
|
|
276
|
+
raise ValueError(msg)
|
|
265
277
|
|
|
266
278
|
# Get the current time from the server.
|
|
267
279
|
# This makes an extra round trip to the server, should not be a big deal
|
|
@@ -274,7 +286,8 @@ class SQLRecordManager(RecordManager):
|
|
|
274
286
|
|
|
275
287
|
if time_at_least and update_time < time_at_least:
|
|
276
288
|
# Safeguard against time sync issues
|
|
277
|
-
|
|
289
|
+
msg = f"Time sync issue: {update_time} < {time_at_least}"
|
|
290
|
+
raise AssertionError(msg)
|
|
278
291
|
|
|
279
292
|
records_to_upsert = [
|
|
280
293
|
{
|
|
@@ -294,14 +307,14 @@ class SQLRecordManager(RecordManager):
|
|
|
294
307
|
# Note: uses SQLite insert to make on_conflict_do_update work.
|
|
295
308
|
# This code needs to be generalized a bit to work with more dialects.
|
|
296
309
|
sqlite_insert_stmt: SqliteInsertType = sqlite_insert(
|
|
297
|
-
UpsertionRecord
|
|
310
|
+
UpsertionRecord,
|
|
298
311
|
).values(records_to_upsert)
|
|
299
312
|
stmt = sqlite_insert_stmt.on_conflict_do_update(
|
|
300
313
|
[UpsertionRecord.key, UpsertionRecord.namespace],
|
|
301
|
-
set_=
|
|
302
|
-
updated_at
|
|
303
|
-
group_id
|
|
304
|
-
|
|
314
|
+
set_={
|
|
315
|
+
"updated_at": sqlite_insert_stmt.excluded.updated_at,
|
|
316
|
+
"group_id": sqlite_insert_stmt.excluded.group_id,
|
|
317
|
+
},
|
|
305
318
|
)
|
|
306
319
|
elif self.dialect == "postgresql":
|
|
307
320
|
from sqlalchemy.dialects.postgresql import Insert as PgInsertType
|
|
@@ -310,17 +323,18 @@ class SQLRecordManager(RecordManager):
|
|
|
310
323
|
# Note: uses postgresql insert to make on_conflict_do_update work.
|
|
311
324
|
# This code needs to be generalized a bit to work with more dialects.
|
|
312
325
|
pg_insert_stmt: PgInsertType = pg_insert(UpsertionRecord).values(
|
|
313
|
-
records_to_upsert
|
|
326
|
+
records_to_upsert,
|
|
314
327
|
)
|
|
315
328
|
stmt = pg_insert_stmt.on_conflict_do_update( # type: ignore[assignment]
|
|
316
329
|
"uix_key_namespace", # Name of constraint
|
|
317
|
-
set_=
|
|
318
|
-
updated_at
|
|
319
|
-
group_id
|
|
320
|
-
|
|
330
|
+
set_={
|
|
331
|
+
"updated_at": pg_insert_stmt.excluded.updated_at,
|
|
332
|
+
"group_id": pg_insert_stmt.excluded.group_id,
|
|
333
|
+
},
|
|
321
334
|
)
|
|
322
335
|
else:
|
|
323
|
-
|
|
336
|
+
msg = f"Unsupported dialect {self.dialect}"
|
|
337
|
+
raise NotImplementedError(msg)
|
|
324
338
|
|
|
325
339
|
session.execute(stmt)
|
|
326
340
|
session.commit()
|
|
@@ -337,10 +351,11 @@ class SQLRecordManager(RecordManager):
|
|
|
337
351
|
group_ids = [None] * len(keys)
|
|
338
352
|
|
|
339
353
|
if len(keys) != len(group_ids):
|
|
340
|
-
|
|
354
|
+
msg = (
|
|
341
355
|
f"Number of keys ({len(keys)}) does not match number of "
|
|
342
356
|
f"group_ids ({len(group_ids)})"
|
|
343
357
|
)
|
|
358
|
+
raise ValueError(msg)
|
|
344
359
|
|
|
345
360
|
# Get the current time from the server.
|
|
346
361
|
# This makes an extra round trip to the server, should not be a big deal
|
|
@@ -353,7 +368,8 @@ class SQLRecordManager(RecordManager):
|
|
|
353
368
|
|
|
354
369
|
if time_at_least and update_time < time_at_least:
|
|
355
370
|
# Safeguard against time sync issues
|
|
356
|
-
|
|
371
|
+
msg = f"Time sync issue: {update_time} < {time_at_least}"
|
|
372
|
+
raise AssertionError(msg)
|
|
357
373
|
|
|
358
374
|
records_to_upsert = [
|
|
359
375
|
{
|
|
@@ -373,14 +389,14 @@ class SQLRecordManager(RecordManager):
|
|
|
373
389
|
# Note: uses SQLite insert to make on_conflict_do_update work.
|
|
374
390
|
# This code needs to be generalized a bit to work with more dialects.
|
|
375
391
|
sqlite_insert_stmt: SqliteInsertType = sqlite_insert(
|
|
376
|
-
UpsertionRecord
|
|
392
|
+
UpsertionRecord,
|
|
377
393
|
).values(records_to_upsert)
|
|
378
394
|
stmt = sqlite_insert_stmt.on_conflict_do_update(
|
|
379
395
|
[UpsertionRecord.key, UpsertionRecord.namespace],
|
|
380
|
-
set_=
|
|
381
|
-
updated_at
|
|
382
|
-
group_id
|
|
383
|
-
|
|
396
|
+
set_={
|
|
397
|
+
"updated_at": sqlite_insert_stmt.excluded.updated_at,
|
|
398
|
+
"group_id": sqlite_insert_stmt.excluded.group_id,
|
|
399
|
+
},
|
|
384
400
|
)
|
|
385
401
|
elif self.dialect == "postgresql":
|
|
386
402
|
from sqlalchemy.dialects.postgresql import Insert as PgInsertType
|
|
@@ -389,17 +405,18 @@ class SQLRecordManager(RecordManager):
|
|
|
389
405
|
# Note: uses SQLite insert to make on_conflict_do_update work.
|
|
390
406
|
# This code needs to be generalized a bit to work with more dialects.
|
|
391
407
|
pg_insert_stmt: PgInsertType = pg_insert(UpsertionRecord).values(
|
|
392
|
-
records_to_upsert
|
|
408
|
+
records_to_upsert,
|
|
393
409
|
)
|
|
394
410
|
stmt = pg_insert_stmt.on_conflict_do_update( # type: ignore[assignment]
|
|
395
411
|
"uix_key_namespace", # Name of constraint
|
|
396
|
-
set_=
|
|
397
|
-
updated_at
|
|
398
|
-
group_id
|
|
399
|
-
|
|
412
|
+
set_={
|
|
413
|
+
"updated_at": pg_insert_stmt.excluded.updated_at,
|
|
414
|
+
"group_id": pg_insert_stmt.excluded.group_id,
|
|
415
|
+
},
|
|
400
416
|
)
|
|
401
417
|
else:
|
|
402
|
-
|
|
418
|
+
msg = f"Unsupported dialect {self.dialect}"
|
|
419
|
+
raise NotImplementedError(msg)
|
|
403
420
|
|
|
404
421
|
await session.execute(stmt)
|
|
405
422
|
await session.commit()
|
|
@@ -412,10 +429,10 @@ class SQLRecordManager(RecordManager):
|
|
|
412
429
|
and_(
|
|
413
430
|
UpsertionRecord.key.in_(keys),
|
|
414
431
|
UpsertionRecord.namespace == self.namespace,
|
|
415
|
-
)
|
|
432
|
+
),
|
|
416
433
|
)
|
|
417
434
|
records = filtered_query.all()
|
|
418
|
-
found_keys =
|
|
435
|
+
found_keys = {r.key for r in records}
|
|
419
436
|
return [k in found_keys for k in keys]
|
|
420
437
|
|
|
421
438
|
async def aexists(self, keys: Sequence[str]) -> list[bool]:
|
|
@@ -428,8 +445,8 @@ class SQLRecordManager(RecordManager):
|
|
|
428
445
|
and_(
|
|
429
446
|
UpsertionRecord.key.in_(keys),
|
|
430
447
|
UpsertionRecord.namespace == self.namespace,
|
|
431
|
-
)
|
|
432
|
-
)
|
|
448
|
+
),
|
|
449
|
+
),
|
|
433
450
|
)
|
|
434
451
|
)
|
|
435
452
|
.scalars()
|
|
@@ -450,7 +467,7 @@ class SQLRecordManager(RecordManager):
|
|
|
450
467
|
session: Session
|
|
451
468
|
with self._make_session() as session:
|
|
452
469
|
query: Query = session.query(UpsertionRecord).filter(
|
|
453
|
-
UpsertionRecord.namespace == self.namespace
|
|
470
|
+
UpsertionRecord.namespace == self.namespace,
|
|
454
471
|
)
|
|
455
472
|
|
|
456
473
|
if after:
|
|
@@ -477,7 +494,7 @@ class SQLRecordManager(RecordManager):
|
|
|
477
494
|
session: AsyncSession
|
|
478
495
|
async with self._amake_session() as session:
|
|
479
496
|
query: Query = select(UpsertionRecord.key).filter( # type: ignore[assignment]
|
|
480
|
-
UpsertionRecord.namespace == self.namespace
|
|
497
|
+
UpsertionRecord.namespace == self.namespace,
|
|
481
498
|
)
|
|
482
499
|
|
|
483
500
|
# mypy does not recognize .all() or .filter()
|
|
@@ -501,7 +518,7 @@ class SQLRecordManager(RecordManager):
|
|
|
501
518
|
and_(
|
|
502
519
|
UpsertionRecord.key.in_(keys),
|
|
503
520
|
UpsertionRecord.namespace == self.namespace,
|
|
504
|
-
)
|
|
521
|
+
),
|
|
505
522
|
)
|
|
506
523
|
|
|
507
524
|
filtered_query.delete()
|
|
@@ -515,8 +532,8 @@ class SQLRecordManager(RecordManager):
|
|
|
515
532
|
and_(
|
|
516
533
|
UpsertionRecord.key.in_(keys),
|
|
517
534
|
UpsertionRecord.namespace == self.namespace,
|
|
518
|
-
)
|
|
519
|
-
)
|
|
535
|
+
),
|
|
536
|
+
),
|
|
520
537
|
)
|
|
521
538
|
|
|
522
539
|
await session.commit()
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
from langchain_core.prompts.prompt import PromptTemplate
|
|
3
2
|
|
|
4
3
|
_DEFAULT_ENTITY_EXTRACTION_TEMPLATE = """You are an AI assistant reading the transcript of a conversation between an AI and a human. Extract all of the proper nouns from the last line of conversation. As a guideline, a proper noun is generally capitalized. You should definitely extract all names and places.
|
|
@@ -34,7 +33,7 @@ Conversation history (for reference only):
|
|
|
34
33
|
Last line of conversation (for extraction):
|
|
35
34
|
Human: {input}
|
|
36
35
|
|
|
37
|
-
Output:"""
|
|
36
|
+
Output:""" # noqa: E501
|
|
38
37
|
ENTITY_EXTRACTION_PROMPT = PromptTemplate(
|
|
39
38
|
input_variables=["history", "input"], template=_DEFAULT_ENTITY_EXTRACTION_TEMPLATE
|
|
40
39
|
)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
from langchain_core.prompts.prompt import PromptTemplate
|
|
3
2
|
|
|
4
3
|
_DEFAULT_ENTITY_SUMMARIZATION_TEMPLATE = """You are an AI assistant helping a human keep track of facts about relevant people, places, and concepts in their life. Update the summary of the provided entity in the "Entity" section based on the last line of your conversation with the human. If you are writing the summary for the first time, return a single sentence.
|
|
@@ -17,7 +16,7 @@ Existing summary of {entity}:
|
|
|
17
16
|
|
|
18
17
|
Last line of conversation:
|
|
19
18
|
Human: {input}
|
|
20
|
-
Updated summary:"""
|
|
19
|
+
Updated summary:""" # noqa: E501
|
|
21
20
|
|
|
22
21
|
ENTITY_SUMMARIZATION_PROMPT = PromptTemplate(
|
|
23
22
|
input_variables=["entity", "summary", "history", "input"],
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
|
-
|
|
3
1
|
from langchain_core.prompts.prompt import PromptTemplate
|
|
4
2
|
|
|
5
3
|
KG_TRIPLE_DELIMITER = "<|>"
|
|
@@ -25,7 +23,7 @@ _DEFAULT_KNOWLEDGE_TRIPLE_EXTRACTION_TEMPLATE = (
|
|
|
25
23
|
"END OF EXAMPLE\n\n"
|
|
26
24
|
"EXAMPLE\n"
|
|
27
25
|
"Oh huh. I know Descartes likes to drive antique scooters and play the mandolin.\n"
|
|
28
|
-
f"Output: (Descartes, likes to drive, antique scooters){KG_TRIPLE_DELIMITER}(Descartes, plays, mandolin)\n"
|
|
26
|
+
f"Output: (Descartes, likes to drive, antique scooters){KG_TRIPLE_DELIMITER}(Descartes, plays, mandolin)\n" # noqa: E501
|
|
29
27
|
"END OF EXAMPLE\n\n"
|
|
30
28
|
"EXAMPLE\n"
|
|
31
29
|
"{text}"
|
langchain/indexes/vectorstore.py
CHANGED
|
@@ -48,16 +48,19 @@ class VectorStoreIndexWrapper(BaseModel):
|
|
|
48
48
|
The result string from the RetrievalQA chain.
|
|
49
49
|
"""
|
|
50
50
|
if llm is None:
|
|
51
|
-
|
|
51
|
+
msg = (
|
|
52
52
|
"This API has been changed to require an LLM. "
|
|
53
53
|
"Please provide an llm to use for querying the vectorstore.\n"
|
|
54
54
|
"For example,\n"
|
|
55
55
|
"from langchain_openai import OpenAI\n"
|
|
56
56
|
"llm = OpenAI(temperature=0)"
|
|
57
57
|
)
|
|
58
|
+
raise NotImplementedError(msg)
|
|
58
59
|
retriever_kwargs = retriever_kwargs or {}
|
|
59
60
|
chain = RetrievalQA.from_chain_type(
|
|
60
|
-
llm,
|
|
61
|
+
llm,
|
|
62
|
+
retriever=self.vectorstore.as_retriever(**retriever_kwargs),
|
|
63
|
+
**kwargs,
|
|
61
64
|
)
|
|
62
65
|
return chain.invoke({chain.input_key: question})[chain.output_key]
|
|
63
66
|
|
|
@@ -80,16 +83,19 @@ class VectorStoreIndexWrapper(BaseModel):
|
|
|
80
83
|
The asynchronous result string from the RetrievalQA chain.
|
|
81
84
|
"""
|
|
82
85
|
if llm is None:
|
|
83
|
-
|
|
86
|
+
msg = (
|
|
84
87
|
"This API has been changed to require an LLM. "
|
|
85
88
|
"Please provide an llm to use for querying the vectorstore.\n"
|
|
86
89
|
"For example,\n"
|
|
87
90
|
"from langchain_openai import OpenAI\n"
|
|
88
91
|
"llm = OpenAI(temperature=0)"
|
|
89
92
|
)
|
|
93
|
+
raise NotImplementedError(msg)
|
|
90
94
|
retriever_kwargs = retriever_kwargs or {}
|
|
91
95
|
chain = RetrievalQA.from_chain_type(
|
|
92
|
-
llm,
|
|
96
|
+
llm,
|
|
97
|
+
retriever=self.vectorstore.as_retriever(**retriever_kwargs),
|
|
98
|
+
**kwargs,
|
|
93
99
|
)
|
|
94
100
|
return (await chain.ainvoke({chain.input_key: question}))[chain.output_key]
|
|
95
101
|
|
|
@@ -112,16 +118,19 @@ class VectorStoreIndexWrapper(BaseModel):
|
|
|
112
118
|
A dictionary containing the answer and source documents.
|
|
113
119
|
"""
|
|
114
120
|
if llm is None:
|
|
115
|
-
|
|
121
|
+
msg = (
|
|
116
122
|
"This API has been changed to require an LLM. "
|
|
117
123
|
"Please provide an llm to use for querying the vectorstore.\n"
|
|
118
124
|
"For example,\n"
|
|
119
125
|
"from langchain_openai import OpenAI\n"
|
|
120
126
|
"llm = OpenAI(temperature=0)"
|
|
121
127
|
)
|
|
128
|
+
raise NotImplementedError(msg)
|
|
122
129
|
retriever_kwargs = retriever_kwargs or {}
|
|
123
130
|
chain = RetrievalQAWithSourcesChain.from_chain_type(
|
|
124
|
-
llm,
|
|
131
|
+
llm,
|
|
132
|
+
retriever=self.vectorstore.as_retriever(**retriever_kwargs),
|
|
133
|
+
**kwargs,
|
|
125
134
|
)
|
|
126
135
|
return chain.invoke({chain.question_key: question})
|
|
127
136
|
|
|
@@ -144,16 +153,19 @@ class VectorStoreIndexWrapper(BaseModel):
|
|
|
144
153
|
A dictionary containing the answer and source documents.
|
|
145
154
|
"""
|
|
146
155
|
if llm is None:
|
|
147
|
-
|
|
156
|
+
msg = (
|
|
148
157
|
"This API has been changed to require an LLM. "
|
|
149
158
|
"Please provide an llm to use for querying the vectorstore.\n"
|
|
150
159
|
"For example,\n"
|
|
151
160
|
"from langchain_openai import OpenAI\n"
|
|
152
161
|
"llm = OpenAI(temperature=0)"
|
|
153
162
|
)
|
|
163
|
+
raise NotImplementedError(msg)
|
|
154
164
|
retriever_kwargs = retriever_kwargs or {}
|
|
155
165
|
chain = RetrievalQAWithSourcesChain.from_chain_type(
|
|
156
|
-
llm,
|
|
166
|
+
llm,
|
|
167
|
+
retriever=self.vectorstore.as_retriever(**retriever_kwargs),
|
|
168
|
+
**kwargs,
|
|
157
169
|
)
|
|
158
170
|
return await chain.ainvoke({chain.question_key: question})
|
|
159
171
|
|
|
@@ -164,14 +176,14 @@ def _get_in_memory_vectorstore() -> type[VectorStore]:
|
|
|
164
176
|
|
|
165
177
|
try:
|
|
166
178
|
from langchain_community.vectorstores.inmemory import InMemoryVectorStore
|
|
167
|
-
except ImportError:
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
)
|
|
179
|
+
except ImportError as e:
|
|
180
|
+
msg = "Please install langchain-community to use the InMemoryVectorStore."
|
|
181
|
+
raise ImportError(msg) from e
|
|
171
182
|
warnings.warn(
|
|
172
183
|
"Using InMemoryVectorStore as the default vectorstore."
|
|
173
184
|
"This memory store won't persist data. You should explicitly"
|
|
174
|
-
"specify a vectorstore when using VectorstoreIndexCreator"
|
|
185
|
+
"specify a vectorstore when using VectorstoreIndexCreator",
|
|
186
|
+
stacklevel=3,
|
|
175
187
|
)
|
|
176
188
|
return InMemoryVectorStore
|
|
177
189
|
|
|
@@ -180,7 +192,7 @@ class VectorstoreIndexCreator(BaseModel):
|
|
|
180
192
|
"""Logic for creating indexes."""
|
|
181
193
|
|
|
182
194
|
vectorstore_cls: type[VectorStore] = Field(
|
|
183
|
-
default_factory=_get_in_memory_vectorstore
|
|
195
|
+
default_factory=_get_in_memory_vectorstore,
|
|
184
196
|
)
|
|
185
197
|
embedding: Embeddings
|
|
186
198
|
text_splitter: TextSplitter = Field(default_factory=_get_default_text_splitter)
|
|
@@ -216,8 +228,7 @@ class VectorstoreIndexCreator(BaseModel):
|
|
|
216
228
|
"""
|
|
217
229
|
docs = []
|
|
218
230
|
for loader in loaders:
|
|
219
|
-
async for doc in loader.alazy_load()
|
|
220
|
-
docs.append(doc)
|
|
231
|
+
docs.extend([doc async for doc in loader.alazy_load()])
|
|
221
232
|
return await self.afrom_documents(docs)
|
|
222
233
|
|
|
223
234
|
def from_documents(self, documents: list[Document]) -> VectorStoreIndexWrapper:
|
|
@@ -231,12 +242,15 @@ class VectorstoreIndexCreator(BaseModel):
|
|
|
231
242
|
"""
|
|
232
243
|
sub_docs = self.text_splitter.split_documents(documents)
|
|
233
244
|
vectorstore = self.vectorstore_cls.from_documents(
|
|
234
|
-
sub_docs,
|
|
245
|
+
sub_docs,
|
|
246
|
+
self.embedding,
|
|
247
|
+
**self.vectorstore_kwargs,
|
|
235
248
|
)
|
|
236
249
|
return VectorStoreIndexWrapper(vectorstore=vectorstore)
|
|
237
250
|
|
|
238
251
|
async def afrom_documents(
|
|
239
|
-
self,
|
|
252
|
+
self,
|
|
253
|
+
documents: list[Document],
|
|
240
254
|
) -> VectorStoreIndexWrapper:
|
|
241
255
|
"""Asynchronously create a vectorstore index from a list of documents.
|
|
242
256
|
|
|
@@ -248,6 +262,8 @@ class VectorstoreIndexCreator(BaseModel):
|
|
|
248
262
|
"""
|
|
249
263
|
sub_docs = self.text_splitter.split_documents(documents)
|
|
250
264
|
vectorstore = await self.vectorstore_cls.afrom_documents(
|
|
251
|
-
sub_docs,
|
|
265
|
+
sub_docs,
|
|
266
|
+
self.embedding,
|
|
267
|
+
**self.vectorstore_kwargs,
|
|
252
268
|
)
|
|
253
269
|
return VectorStoreIndexWrapper(vectorstore=vectorstore)
|
langchain/llms/__init__.py
CHANGED
|
@@ -552,6 +552,7 @@ def __getattr__(name: str) -> Any:
|
|
|
552
552
|
"Please import from langchain-community instead:\n\n"
|
|
553
553
|
f"`from langchain_community.llms import {name}`.\n\n"
|
|
554
554
|
"To install langchain-community run `pip install -U langchain-community`.",
|
|
555
|
+
stacklevel=2,
|
|
555
556
|
category=LangChainDeprecationWarning,
|
|
556
557
|
)
|
|
557
558
|
|
|
@@ -561,12 +562,13 @@ def __getattr__(name: str) -> Any:
|
|
|
561
562
|
k: v() for k, v in get_type_to_cls_dict().items()
|
|
562
563
|
}
|
|
563
564
|
return type_to_cls_dict
|
|
564
|
-
|
|
565
|
-
return getattr(llms, name)
|
|
565
|
+
return getattr(llms, name)
|
|
566
566
|
|
|
567
567
|
|
|
568
568
|
__all__ = [
|
|
569
569
|
"AI21",
|
|
570
|
+
"RWKV",
|
|
571
|
+
"VLLM",
|
|
570
572
|
"AlephAlpha",
|
|
571
573
|
"AmazonAPIGateway",
|
|
572
574
|
"Anthropic",
|
|
@@ -592,8 +594,8 @@ __all__ = [
|
|
|
592
594
|
"FakeListLLM",
|
|
593
595
|
"Fireworks",
|
|
594
596
|
"ForefrontAI",
|
|
595
|
-
"GigaChat",
|
|
596
597
|
"GPT4All",
|
|
598
|
+
"GigaChat",
|
|
597
599
|
"GooglePalm",
|
|
598
600
|
"GooseAI",
|
|
599
601
|
"GradientLLM",
|
|
@@ -602,18 +604,20 @@ __all__ = [
|
|
|
602
604
|
"HuggingFacePipeline",
|
|
603
605
|
"HuggingFaceTextGenInference",
|
|
604
606
|
"HumanInputLLM",
|
|
607
|
+
"JavelinAIGateway",
|
|
605
608
|
"KoboldApiLLM",
|
|
606
609
|
"LlamaCpp",
|
|
607
|
-
"TextGen",
|
|
608
610
|
"ManifestWrapper",
|
|
609
611
|
"Minimax",
|
|
610
612
|
"MlflowAIGateway",
|
|
611
613
|
"Modal",
|
|
612
614
|
"MosaicML",
|
|
613
|
-
"Nebula",
|
|
614
615
|
"NIBittensorLLM",
|
|
615
616
|
"NLPCloud",
|
|
617
|
+
"Nebula",
|
|
618
|
+
"OctoAIEndpoint",
|
|
616
619
|
"Ollama",
|
|
620
|
+
"OpaquePrompts",
|
|
617
621
|
"OpenAI",
|
|
618
622
|
"OpenAIChat",
|
|
619
623
|
"OpenLLM",
|
|
@@ -625,28 +629,24 @@ __all__ = [
|
|
|
625
629
|
"PredictionGuard",
|
|
626
630
|
"PromptLayerOpenAI",
|
|
627
631
|
"PromptLayerOpenAIChat",
|
|
628
|
-
"
|
|
629
|
-
"RWKV",
|
|
632
|
+
"QianfanLLMEndpoint",
|
|
630
633
|
"Replicate",
|
|
631
634
|
"SagemakerEndpoint",
|
|
632
635
|
"SelfHostedHuggingFaceLLM",
|
|
633
636
|
"SelfHostedPipeline",
|
|
634
637
|
"StochasticAI",
|
|
638
|
+
"TextGen",
|
|
635
639
|
"TitanTakeoff",
|
|
636
640
|
"TitanTakeoffPro",
|
|
637
641
|
"Tongyi",
|
|
642
|
+
"VLLMOpenAI",
|
|
638
643
|
"VertexAI",
|
|
639
644
|
"VertexAIModelGarden",
|
|
640
|
-
"
|
|
641
|
-
"VLLMOpenAI",
|
|
645
|
+
"VolcEngineMaasLLM",
|
|
642
646
|
"WatsonxLLM",
|
|
643
647
|
"Writer",
|
|
644
|
-
"OctoAIEndpoint",
|
|
645
648
|
"Xinference",
|
|
646
|
-
"JavelinAIGateway",
|
|
647
|
-
"QianfanLLMEndpoint",
|
|
648
649
|
"YandexGPT",
|
|
649
|
-
"VolcEngineMaasLLM",
|
|
650
650
|
]
|
|
651
651
|
|
|
652
652
|
|