langchain 0.3.26__py3-none-any.whl → 0.3.27__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of langchain might be problematic. Click here for more details.
- langchain/__init__.py +110 -96
- langchain/_api/__init__.py +2 -2
- langchain/_api/deprecation.py +3 -3
- langchain/_api/module_import.py +51 -46
- langchain/_api/path.py +1 -1
- langchain/adapters/openai.py +8 -8
- langchain/agents/__init__.py +15 -12
- langchain/agents/agent.py +160 -133
- langchain/agents/agent_iterator.py +31 -14
- langchain/agents/agent_toolkits/__init__.py +7 -6
- langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
- langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
- langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
- langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
- langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
- langchain/agents/agent_toolkits/csv/__init__.py +4 -2
- langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
- langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
- langchain/agents/agent_toolkits/github/toolkit.py +9 -9
- langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
- langchain/agents/agent_toolkits/json/base.py +1 -1
- langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
- langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
- langchain/agents/agent_toolkits/openapi/base.py +1 -1
- langchain/agents/agent_toolkits/openapi/planner.py +2 -2
- langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
- langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
- langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
- langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
- langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
- langchain/agents/agent_toolkits/powerbi/base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
- langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/python/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
- langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/sql/prompt.py +1 -1
- langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/vectorstore/base.py +2 -2
- langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
- langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
- langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
- langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
- langchain/agents/agent_types.py +6 -6
- langchain/agents/chat/base.py +6 -12
- langchain/agents/chat/output_parser.py +9 -6
- langchain/agents/chat/prompt.py +3 -4
- langchain/agents/conversational/base.py +9 -5
- langchain/agents/conversational/output_parser.py +4 -2
- langchain/agents/conversational/prompt.py +2 -3
- langchain/agents/conversational_chat/base.py +7 -5
- langchain/agents/conversational_chat/output_parser.py +9 -11
- langchain/agents/conversational_chat/prompt.py +5 -6
- langchain/agents/format_scratchpad/__init__.py +3 -3
- langchain/agents/format_scratchpad/log_to_messages.py +1 -1
- langchain/agents/format_scratchpad/openai_functions.py +8 -6
- langchain/agents/format_scratchpad/tools.py +5 -3
- langchain/agents/format_scratchpad/xml.py +33 -2
- langchain/agents/initialize.py +16 -8
- langchain/agents/json_chat/base.py +18 -18
- langchain/agents/json_chat/prompt.py +2 -3
- langchain/agents/load_tools.py +2 -1
- langchain/agents/loading.py +28 -18
- langchain/agents/mrkl/base.py +9 -4
- langchain/agents/mrkl/output_parser.py +17 -13
- langchain/agents/mrkl/prompt.py +1 -2
- langchain/agents/openai_assistant/base.py +80 -70
- langchain/agents/openai_functions_agent/base.py +46 -37
- langchain/agents/openai_functions_multi_agent/base.py +39 -26
- langchain/agents/openai_tools/base.py +8 -8
- langchain/agents/output_parsers/__init__.py +3 -3
- langchain/agents/output_parsers/json.py +6 -6
- langchain/agents/output_parsers/openai_functions.py +15 -7
- langchain/agents/output_parsers/openai_tools.py +9 -4
- langchain/agents/output_parsers/react_json_single_input.py +10 -5
- langchain/agents/output_parsers/react_single_input.py +15 -11
- langchain/agents/output_parsers/self_ask.py +3 -2
- langchain/agents/output_parsers/tools.py +18 -13
- langchain/agents/output_parsers/xml.py +99 -28
- langchain/agents/react/agent.py +4 -4
- langchain/agents/react/base.py +22 -17
- langchain/agents/react/output_parser.py +5 -6
- langchain/agents/react/textworld_prompt.py +0 -1
- langchain/agents/react/wiki_prompt.py +14 -15
- langchain/agents/schema.py +3 -2
- langchain/agents/self_ask_with_search/base.py +19 -15
- langchain/agents/self_ask_with_search/prompt.py +0 -1
- langchain/agents/structured_chat/base.py +14 -11
- langchain/agents/structured_chat/output_parser.py +16 -18
- langchain/agents/structured_chat/prompt.py +3 -4
- langchain/agents/tool_calling_agent/base.py +7 -6
- langchain/agents/tools.py +2 -2
- langchain/agents/utils.py +2 -3
- langchain/agents/xml/base.py +5 -5
- langchain/agents/xml/prompt.py +1 -2
- langchain/cache.py +12 -12
- langchain/callbacks/__init__.py +11 -11
- langchain/callbacks/aim_callback.py +2 -2
- langchain/callbacks/argilla_callback.py +1 -1
- langchain/callbacks/arize_callback.py +1 -1
- langchain/callbacks/arthur_callback.py +1 -1
- langchain/callbacks/base.py +7 -7
- langchain/callbacks/clearml_callback.py +1 -1
- langchain/callbacks/comet_ml_callback.py +1 -1
- langchain/callbacks/confident_callback.py +1 -1
- langchain/callbacks/context_callback.py +1 -1
- langchain/callbacks/flyte_callback.py +1 -1
- langchain/callbacks/human.py +2 -2
- langchain/callbacks/infino_callback.py +1 -1
- langchain/callbacks/labelstudio_callback.py +1 -1
- langchain/callbacks/llmonitor_callback.py +1 -1
- langchain/callbacks/manager.py +5 -5
- langchain/callbacks/mlflow_callback.py +2 -2
- langchain/callbacks/openai_info.py +1 -1
- langchain/callbacks/promptlayer_callback.py +1 -1
- langchain/callbacks/sagemaker_callback.py +1 -1
- langchain/callbacks/streaming_aiter.py +4 -1
- langchain/callbacks/streaming_aiter_final_only.py +5 -3
- langchain/callbacks/streaming_stdout_final_only.py +5 -3
- langchain/callbacks/streamlit/__init__.py +3 -2
- langchain/callbacks/streamlit/mutable_expander.py +1 -1
- langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
- langchain/callbacks/tracers/__init__.py +1 -1
- langchain/callbacks/tracers/comet.py +1 -1
- langchain/callbacks/tracers/evaluation.py +1 -1
- langchain/callbacks/tracers/log_stream.py +1 -1
- langchain/callbacks/tracers/logging.py +1 -1
- langchain/callbacks/tracers/stdout.py +1 -1
- langchain/callbacks/trubrics_callback.py +1 -1
- langchain/callbacks/utils.py +4 -4
- langchain/callbacks/wandb_callback.py +1 -1
- langchain/callbacks/whylabs_callback.py +1 -1
- langchain/chains/api/base.py +36 -22
- langchain/chains/api/news_docs.py +1 -2
- langchain/chains/api/open_meteo_docs.py +1 -2
- langchain/chains/api/openapi/requests_chain.py +1 -1
- langchain/chains/api/openapi/response_chain.py +1 -1
- langchain/chains/api/podcast_docs.py +1 -2
- langchain/chains/api/prompt.py +1 -2
- langchain/chains/api/tmdb_docs.py +1 -2
- langchain/chains/base.py +88 -54
- langchain/chains/chat_vector_db/prompts.py +2 -3
- langchain/chains/combine_documents/__init__.py +1 -1
- langchain/chains/combine_documents/base.py +23 -10
- langchain/chains/combine_documents/map_reduce.py +38 -30
- langchain/chains/combine_documents/map_rerank.py +33 -20
- langchain/chains/combine_documents/reduce.py +47 -26
- langchain/chains/combine_documents/refine.py +26 -17
- langchain/chains/combine_documents/stuff.py +19 -12
- langchain/chains/constitutional_ai/base.py +4 -4
- langchain/chains/constitutional_ai/principles.py +22 -25
- langchain/chains/constitutional_ai/prompts.py +25 -28
- langchain/chains/conversation/base.py +5 -3
- langchain/chains/conversation/memory.py +5 -5
- langchain/chains/conversation/prompt.py +5 -5
- langchain/chains/conversational_retrieval/base.py +41 -20
- langchain/chains/conversational_retrieval/prompts.py +2 -3
- langchain/chains/elasticsearch_database/base.py +8 -9
- langchain/chains/elasticsearch_database/prompts.py +2 -3
- langchain/chains/ernie_functions/__init__.py +2 -2
- langchain/chains/example_generator.py +3 -1
- langchain/chains/flare/base.py +26 -12
- langchain/chains/graph_qa/cypher.py +2 -2
- langchain/chains/graph_qa/falkordb.py +1 -1
- langchain/chains/graph_qa/gremlin.py +1 -1
- langchain/chains/graph_qa/neptune_sparql.py +1 -1
- langchain/chains/graph_qa/prompts.py +2 -2
- langchain/chains/history_aware_retriever.py +2 -1
- langchain/chains/hyde/base.py +6 -5
- langchain/chains/hyde/prompts.py +5 -6
- langchain/chains/llm.py +77 -61
- langchain/chains/llm_bash/__init__.py +2 -1
- langchain/chains/llm_checker/base.py +7 -5
- langchain/chains/llm_checker/prompt.py +3 -4
- langchain/chains/llm_math/base.py +16 -9
- langchain/chains/llm_math/prompt.py +1 -2
- langchain/chains/llm_summarization_checker/base.py +9 -6
- langchain/chains/llm_symbolic_math/__init__.py +2 -1
- langchain/chains/loading.py +151 -95
- langchain/chains/mapreduce.py +4 -3
- langchain/chains/moderation.py +8 -9
- langchain/chains/natbot/base.py +8 -8
- langchain/chains/natbot/crawler.py +73 -76
- langchain/chains/natbot/prompt.py +2 -3
- langchain/chains/openai_functions/__init__.py +7 -7
- langchain/chains/openai_functions/base.py +13 -10
- langchain/chains/openai_functions/citation_fuzzy_match.py +12 -11
- langchain/chains/openai_functions/extraction.py +19 -19
- langchain/chains/openai_functions/openapi.py +35 -35
- langchain/chains/openai_functions/qa_with_structure.py +19 -12
- langchain/chains/openai_functions/tagging.py +2 -4
- langchain/chains/openai_tools/extraction.py +7 -8
- langchain/chains/qa_generation/base.py +4 -3
- langchain/chains/qa_generation/prompt.py +5 -5
- langchain/chains/qa_with_sources/base.py +14 -6
- langchain/chains/qa_with_sources/loading.py +16 -8
- langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
- langchain/chains/qa_with_sources/refine_prompts.py +0 -1
- langchain/chains/qa_with_sources/retrieval.py +14 -5
- langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
- langchain/chains/qa_with_sources/vector_db.py +17 -6
- langchain/chains/query_constructor/base.py +34 -33
- langchain/chains/query_constructor/ir.py +4 -4
- langchain/chains/query_constructor/parser.py +37 -32
- langchain/chains/query_constructor/prompt.py +5 -6
- langchain/chains/question_answering/chain.py +21 -10
- langchain/chains/question_answering/map_reduce_prompt.py +14 -14
- langchain/chains/question_answering/map_rerank_prompt.py +3 -3
- langchain/chains/question_answering/refine_prompts.py +2 -5
- langchain/chains/question_answering/stuff_prompt.py +5 -5
- langchain/chains/retrieval.py +1 -3
- langchain/chains/retrieval_qa/base.py +34 -27
- langchain/chains/retrieval_qa/prompt.py +1 -2
- langchain/chains/router/__init__.py +3 -3
- langchain/chains/router/base.py +24 -20
- langchain/chains/router/embedding_router.py +12 -8
- langchain/chains/router/llm_router.py +17 -16
- langchain/chains/router/multi_prompt.py +2 -2
- langchain/chains/router/multi_retrieval_qa.py +10 -5
- langchain/chains/sequential.py +30 -18
- langchain/chains/sql_database/prompt.py +14 -16
- langchain/chains/sql_database/query.py +6 -5
- langchain/chains/structured_output/__init__.py +1 -1
- langchain/chains/structured_output/base.py +75 -67
- langchain/chains/summarize/chain.py +11 -5
- langchain/chains/summarize/map_reduce_prompt.py +0 -1
- langchain/chains/summarize/stuff_prompt.py +0 -1
- langchain/chains/transform.py +5 -6
- langchain/chat_loaders/facebook_messenger.py +1 -1
- langchain/chat_loaders/langsmith.py +1 -1
- langchain/chat_loaders/utils.py +3 -3
- langchain/chat_models/__init__.py +20 -19
- langchain/chat_models/anthropic.py +1 -1
- langchain/chat_models/azureml_endpoint.py +1 -1
- langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
- langchain/chat_models/base.py +160 -123
- langchain/chat_models/bedrock.py +1 -1
- langchain/chat_models/fake.py +1 -1
- langchain/chat_models/meta.py +1 -1
- langchain/chat_models/pai_eas_endpoint.py +1 -1
- langchain/chat_models/promptlayer_openai.py +1 -1
- langchain/chat_models/volcengine_maas.py +1 -1
- langchain/docstore/base.py +1 -1
- langchain/document_loaders/__init__.py +9 -9
- langchain/document_loaders/airbyte.py +3 -3
- langchain/document_loaders/assemblyai.py +1 -1
- langchain/document_loaders/azure_blob_storage_container.py +1 -1
- langchain/document_loaders/azure_blob_storage_file.py +1 -1
- langchain/document_loaders/baiducloud_bos_file.py +1 -1
- langchain/document_loaders/base.py +1 -1
- langchain/document_loaders/blob_loaders/__init__.py +1 -1
- langchain/document_loaders/blockchain.py +1 -1
- langchain/document_loaders/chatgpt.py +1 -1
- langchain/document_loaders/college_confidential.py +1 -1
- langchain/document_loaders/confluence.py +1 -1
- langchain/document_loaders/email.py +1 -1
- langchain/document_loaders/facebook_chat.py +1 -1
- langchain/document_loaders/markdown.py +1 -1
- langchain/document_loaders/notebook.py +1 -1
- langchain/document_loaders/org_mode.py +1 -1
- langchain/document_loaders/parsers/__init__.py +1 -1
- langchain/document_loaders/parsers/docai.py +1 -1
- langchain/document_loaders/parsers/generic.py +1 -1
- langchain/document_loaders/parsers/html/__init__.py +1 -1
- langchain/document_loaders/parsers/html/bs4.py +1 -1
- langchain/document_loaders/parsers/language/cobol.py +1 -1
- langchain/document_loaders/parsers/language/python.py +1 -1
- langchain/document_loaders/parsers/msword.py +1 -1
- langchain/document_loaders/parsers/pdf.py +5 -5
- langchain/document_loaders/parsers/registry.py +1 -1
- langchain/document_loaders/pdf.py +8 -8
- langchain/document_loaders/powerpoint.py +1 -1
- langchain/document_loaders/pyspark_dataframe.py +1 -1
- langchain/document_loaders/telegram.py +2 -2
- langchain/document_loaders/tencent_cos_directory.py +1 -1
- langchain/document_loaders/unstructured.py +5 -5
- langchain/document_loaders/url_playwright.py +1 -1
- langchain/document_loaders/whatsapp_chat.py +1 -1
- langchain/document_loaders/youtube.py +2 -2
- langchain/document_transformers/__init__.py +3 -3
- langchain/document_transformers/beautiful_soup_transformer.py +1 -1
- langchain/document_transformers/doctran_text_extract.py +1 -1
- langchain/document_transformers/doctran_text_qa.py +1 -1
- langchain/document_transformers/doctran_text_translate.py +1 -1
- langchain/document_transformers/embeddings_redundant_filter.py +3 -3
- langchain/document_transformers/google_translate.py +1 -1
- langchain/document_transformers/html2text.py +1 -1
- langchain/document_transformers/nuclia_text_transform.py +1 -1
- langchain/embeddings/__init__.py +5 -5
- langchain/embeddings/base.py +33 -24
- langchain/embeddings/cache.py +36 -31
- langchain/embeddings/fake.py +1 -1
- langchain/embeddings/huggingface.py +2 -2
- langchain/evaluation/__init__.py +22 -22
- langchain/evaluation/agents/trajectory_eval_chain.py +23 -23
- langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
- langchain/evaluation/comparison/__init__.py +1 -1
- langchain/evaluation/comparison/eval_chain.py +20 -13
- langchain/evaluation/comparison/prompt.py +1 -2
- langchain/evaluation/criteria/__init__.py +1 -1
- langchain/evaluation/criteria/eval_chain.py +20 -11
- langchain/evaluation/criteria/prompt.py +2 -3
- langchain/evaluation/embedding_distance/base.py +23 -20
- langchain/evaluation/loading.py +15 -11
- langchain/evaluation/parsing/base.py +4 -1
- langchain/evaluation/parsing/json_distance.py +5 -2
- langchain/evaluation/parsing/json_schema.py +12 -8
- langchain/evaluation/qa/__init__.py +1 -1
- langchain/evaluation/qa/eval_chain.py +12 -5
- langchain/evaluation/qa/eval_prompt.py +7 -8
- langchain/evaluation/qa/generate_chain.py +2 -1
- langchain/evaluation/qa/generate_prompt.py +2 -4
- langchain/evaluation/schema.py +38 -30
- langchain/evaluation/scoring/__init__.py +1 -1
- langchain/evaluation/scoring/eval_chain.py +22 -15
- langchain/evaluation/scoring/prompt.py +0 -1
- langchain/evaluation/string_distance/base.py +14 -9
- langchain/globals.py +12 -11
- langchain/graphs/__init__.py +6 -6
- langchain/graphs/graph_document.py +1 -1
- langchain/graphs/networkx_graph.py +2 -2
- langchain/hub.py +9 -11
- langchain/indexes/__init__.py +3 -3
- langchain/indexes/_sql_record_manager.py +63 -46
- langchain/indexes/prompts/entity_extraction.py +1 -2
- langchain/indexes/prompts/entity_summarization.py +1 -2
- langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
- langchain/indexes/vectorstore.py +35 -19
- langchain/llms/__init__.py +13 -13
- langchain/llms/ai21.py +1 -1
- langchain/llms/azureml_endpoint.py +4 -4
- langchain/llms/base.py +15 -7
- langchain/llms/bedrock.py +1 -1
- langchain/llms/cloudflare_workersai.py +1 -1
- langchain/llms/gradient_ai.py +1 -1
- langchain/llms/loading.py +1 -1
- langchain/llms/openai.py +1 -1
- langchain/llms/sagemaker_endpoint.py +1 -1
- langchain/load/dump.py +1 -1
- langchain/load/load.py +1 -1
- langchain/load/serializable.py +3 -3
- langchain/memory/__init__.py +3 -3
- langchain/memory/buffer.py +9 -7
- langchain/memory/chat_memory.py +14 -8
- langchain/memory/chat_message_histories/__init__.py +1 -1
- langchain/memory/chat_message_histories/astradb.py +1 -1
- langchain/memory/chat_message_histories/cassandra.py +1 -1
- langchain/memory/chat_message_histories/cosmos_db.py +1 -1
- langchain/memory/chat_message_histories/dynamodb.py +1 -1
- langchain/memory/chat_message_histories/elasticsearch.py +1 -1
- langchain/memory/chat_message_histories/file.py +1 -1
- langchain/memory/chat_message_histories/firestore.py +1 -1
- langchain/memory/chat_message_histories/momento.py +1 -1
- langchain/memory/chat_message_histories/mongodb.py +1 -1
- langchain/memory/chat_message_histories/neo4j.py +1 -1
- langchain/memory/chat_message_histories/postgres.py +1 -1
- langchain/memory/chat_message_histories/redis.py +1 -1
- langchain/memory/chat_message_histories/rocksetdb.py +1 -1
- langchain/memory/chat_message_histories/singlestoredb.py +1 -1
- langchain/memory/chat_message_histories/streamlit.py +1 -1
- langchain/memory/chat_message_histories/upstash_redis.py +1 -1
- langchain/memory/chat_message_histories/xata.py +1 -1
- langchain/memory/chat_message_histories/zep.py +1 -1
- langchain/memory/combined.py +13 -12
- langchain/memory/entity.py +84 -61
- langchain/memory/prompt.py +10 -11
- langchain/memory/readonly.py +0 -2
- langchain/memory/simple.py +1 -3
- langchain/memory/summary.py +13 -11
- langchain/memory/summary_buffer.py +17 -8
- langchain/memory/utils.py +3 -2
- langchain/memory/vectorstore.py +12 -5
- langchain/memory/vectorstore_token_buffer_memory.py +5 -5
- langchain/model_laboratory.py +12 -11
- langchain/output_parsers/__init__.py +4 -4
- langchain/output_parsers/boolean.py +7 -4
- langchain/output_parsers/combining.py +10 -5
- langchain/output_parsers/datetime.py +32 -31
- langchain/output_parsers/enum.py +5 -3
- langchain/output_parsers/fix.py +52 -52
- langchain/output_parsers/format_instructions.py +6 -8
- langchain/output_parsers/json.py +2 -2
- langchain/output_parsers/list.py +2 -2
- langchain/output_parsers/loading.py +9 -9
- langchain/output_parsers/openai_functions.py +3 -3
- langchain/output_parsers/openai_tools.py +1 -1
- langchain/output_parsers/pandas_dataframe.py +43 -47
- langchain/output_parsers/prompts.py +1 -2
- langchain/output_parsers/rail_parser.py +1 -1
- langchain/output_parsers/regex.py +7 -8
- langchain/output_parsers/regex_dict.py +7 -10
- langchain/output_parsers/retry.py +77 -78
- langchain/output_parsers/structured.py +11 -6
- langchain/output_parsers/yaml.py +15 -11
- langchain/prompts/__init__.py +5 -3
- langchain/prompts/base.py +5 -5
- langchain/prompts/chat.py +8 -8
- langchain/prompts/example_selector/__init__.py +3 -1
- langchain/prompts/example_selector/semantic_similarity.py +2 -2
- langchain/prompts/few_shot.py +1 -1
- langchain/prompts/loading.py +3 -3
- langchain/prompts/prompt.py +1 -1
- langchain/retrievers/__init__.py +5 -5
- langchain/retrievers/bedrock.py +2 -2
- langchain/retrievers/bm25.py +1 -1
- langchain/retrievers/contextual_compression.py +14 -8
- langchain/retrievers/docarray.py +1 -1
- langchain/retrievers/document_compressors/__init__.py +5 -4
- langchain/retrievers/document_compressors/base.py +12 -6
- langchain/retrievers/document_compressors/chain_extract.py +2 -2
- langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
- langchain/retrievers/document_compressors/chain_filter.py +9 -9
- langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
- langchain/retrievers/document_compressors/cohere_rerank.py +15 -15
- langchain/retrievers/document_compressors/embeddings_filter.py +21 -17
- langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
- langchain/retrievers/document_compressors/listwise_rerank.py +7 -5
- langchain/retrievers/ensemble.py +28 -25
- langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
- langchain/retrievers/google_vertex_ai_search.py +2 -2
- langchain/retrievers/kendra.py +10 -10
- langchain/retrievers/llama_index.py +1 -1
- langchain/retrievers/merger_retriever.py +11 -11
- langchain/retrievers/milvus.py +1 -1
- langchain/retrievers/multi_query.py +32 -26
- langchain/retrievers/multi_vector.py +20 -8
- langchain/retrievers/parent_document_retriever.py +18 -9
- langchain/retrievers/re_phraser.py +6 -5
- langchain/retrievers/self_query/base.py +138 -127
- langchain/retrievers/time_weighted_retriever.py +18 -7
- langchain/retrievers/zilliz.py +1 -1
- langchain/runnables/openai_functions.py +6 -2
- langchain/schema/__init__.py +23 -23
- langchain/schema/cache.py +1 -1
- langchain/schema/callbacks/base.py +7 -7
- langchain/schema/callbacks/manager.py +19 -19
- langchain/schema/callbacks/tracers/base.py +1 -1
- langchain/schema/callbacks/tracers/evaluation.py +1 -1
- langchain/schema/callbacks/tracers/langchain.py +1 -1
- langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
- langchain/schema/callbacks/tracers/log_stream.py +1 -1
- langchain/schema/callbacks/tracers/schemas.py +8 -8
- langchain/schema/callbacks/tracers/stdout.py +3 -3
- langchain/schema/document.py +1 -1
- langchain/schema/language_model.py +2 -2
- langchain/schema/messages.py +12 -12
- langchain/schema/output.py +3 -3
- langchain/schema/output_parser.py +3 -3
- langchain/schema/runnable/__init__.py +3 -3
- langchain/schema/runnable/base.py +9 -9
- langchain/schema/runnable/config.py +5 -5
- langchain/schema/runnable/configurable.py +1 -1
- langchain/schema/runnable/history.py +1 -1
- langchain/schema/runnable/passthrough.py +1 -1
- langchain/schema/runnable/utils.py +16 -16
- langchain/schema/vectorstore.py +1 -1
- langchain/smith/__init__.py +1 -1
- langchain/smith/evaluation/__init__.py +2 -2
- langchain/smith/evaluation/config.py +10 -7
- langchain/smith/evaluation/name_generation.py +3 -3
- langchain/smith/evaluation/progress.py +11 -2
- langchain/smith/evaluation/runner_utils.py +179 -127
- langchain/smith/evaluation/string_run_evaluator.py +75 -68
- langchain/storage/__init__.py +2 -2
- langchain/storage/_lc_store.py +4 -2
- langchain/storage/encoder_backed.py +6 -2
- langchain/storage/file_system.py +19 -16
- langchain/storage/in_memory.py +1 -1
- langchain/storage/upstash_redis.py +1 -1
- langchain/text_splitter.py +15 -15
- langchain/tools/__init__.py +28 -26
- langchain/tools/ainetwork/app.py +1 -1
- langchain/tools/ainetwork/base.py +1 -1
- langchain/tools/ainetwork/owner.py +1 -1
- langchain/tools/ainetwork/rule.py +1 -1
- langchain/tools/ainetwork/transfer.py +1 -1
- langchain/tools/ainetwork/value.py +1 -1
- langchain/tools/amadeus/closest_airport.py +1 -1
- langchain/tools/amadeus/flight_search.py +1 -1
- langchain/tools/azure_cognitive_services/__init__.py +1 -1
- langchain/tools/base.py +4 -4
- langchain/tools/bearly/tool.py +1 -1
- langchain/tools/bing_search/__init__.py +1 -1
- langchain/tools/bing_search/tool.py +1 -1
- langchain/tools/dataforseo_api_search/__init__.py +1 -1
- langchain/tools/dataforseo_api_search/tool.py +1 -1
- langchain/tools/ddg_search/tool.py +1 -1
- langchain/tools/e2b_data_analysis/tool.py +2 -2
- langchain/tools/edenai/__init__.py +1 -1
- langchain/tools/file_management/__init__.py +1 -1
- langchain/tools/file_management/copy.py +1 -1
- langchain/tools/file_management/delete.py +1 -1
- langchain/tools/gmail/__init__.py +2 -2
- langchain/tools/gmail/get_message.py +1 -1
- langchain/tools/gmail/search.py +1 -1
- langchain/tools/gmail/send_message.py +1 -1
- langchain/tools/google_finance/__init__.py +1 -1
- langchain/tools/google_finance/tool.py +1 -1
- langchain/tools/google_scholar/__init__.py +1 -1
- langchain/tools/google_scholar/tool.py +1 -1
- langchain/tools/google_search/__init__.py +1 -1
- langchain/tools/google_search/tool.py +1 -1
- langchain/tools/google_serper/__init__.py +1 -1
- langchain/tools/google_serper/tool.py +1 -1
- langchain/tools/google_trends/__init__.py +1 -1
- langchain/tools/google_trends/tool.py +1 -1
- langchain/tools/jira/tool.py +20 -1
- langchain/tools/json/tool.py +25 -3
- langchain/tools/memorize/tool.py +1 -1
- langchain/tools/multion/__init__.py +1 -1
- langchain/tools/multion/update_session.py +1 -1
- langchain/tools/office365/__init__.py +2 -2
- langchain/tools/office365/events_search.py +1 -1
- langchain/tools/office365/messages_search.py +1 -1
- langchain/tools/office365/send_event.py +1 -1
- langchain/tools/office365/send_message.py +1 -1
- langchain/tools/openapi/utils/api_models.py +6 -6
- langchain/tools/playwright/__init__.py +5 -5
- langchain/tools/playwright/click.py +1 -1
- langchain/tools/playwright/extract_hyperlinks.py +1 -1
- langchain/tools/playwright/get_elements.py +1 -1
- langchain/tools/playwright/navigate.py +1 -1
- langchain/tools/plugin.py +2 -2
- langchain/tools/powerbi/tool.py +1 -1
- langchain/tools/python/__init__.py +2 -1
- langchain/tools/reddit_search/tool.py +1 -1
- langchain/tools/render.py +2 -2
- langchain/tools/requests/tool.py +2 -2
- langchain/tools/searchapi/tool.py +1 -1
- langchain/tools/searx_search/tool.py +1 -1
- langchain/tools/slack/get_message.py +1 -1
- langchain/tools/spark_sql/tool.py +1 -1
- langchain/tools/sql_database/tool.py +1 -1
- langchain/tools/tavily_search/__init__.py +1 -1
- langchain/tools/tavily_search/tool.py +1 -1
- langchain/tools/zapier/__init__.py +1 -1
- langchain/tools/zapier/tool.py +24 -2
- langchain/utilities/__init__.py +4 -4
- langchain/utilities/arcee.py +4 -4
- langchain/utilities/clickup.py +4 -4
- langchain/utilities/dalle_image_generator.py +1 -1
- langchain/utilities/dataforseo_api_search.py +1 -1
- langchain/utilities/opaqueprompts.py +1 -1
- langchain/utilities/reddit_search.py +1 -1
- langchain/utilities/sql_database.py +1 -1
- langchain/utilities/tavily_search.py +1 -1
- langchain/utilities/vertexai.py +2 -2
- langchain/utils/__init__.py +1 -1
- langchain/utils/aiter.py +1 -1
- langchain/utils/html.py +3 -3
- langchain/utils/input.py +1 -1
- langchain/utils/iter.py +1 -1
- langchain/utils/json_schema.py +1 -3
- langchain/utils/strings.py +1 -1
- langchain/utils/utils.py +6 -6
- langchain/vectorstores/__init__.py +5 -5
- langchain/vectorstores/alibabacloud_opensearch.py +1 -1
- langchain/vectorstores/azure_cosmos_db.py +1 -1
- langchain/vectorstores/clickhouse.py +1 -1
- langchain/vectorstores/elastic_vector_search.py +1 -1
- langchain/vectorstores/elasticsearch.py +2 -2
- langchain/vectorstores/myscale.py +1 -1
- langchain/vectorstores/neo4j_vector.py +1 -1
- langchain/vectorstores/pgembedding.py +1 -1
- langchain/vectorstores/qdrant.py +1 -1
- langchain/vectorstores/redis/__init__.py +1 -1
- langchain/vectorstores/redis/base.py +1 -1
- langchain/vectorstores/redis/filters.py +4 -4
- langchain/vectorstores/redis/schema.py +6 -6
- langchain/vectorstores/sklearn.py +2 -2
- langchain/vectorstores/starrocks.py +1 -1
- langchain/vectorstores/utils.py +1 -1
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/METADATA +4 -4
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/RECORD +580 -580
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/WHEEL +1 -1
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/entry_points.txt +0 -0
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/licenses/LICENSE +0 -0
|
@@ -24,15 +24,17 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
|
|
|
24
24
|
if issubclass(type(val), pd.DataFrame):
|
|
25
25
|
return val
|
|
26
26
|
if pd.DataFrame(val).empty:
|
|
27
|
-
|
|
27
|
+
msg = "DataFrame cannot be empty."
|
|
28
|
+
raise ValueError(msg)
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
"Wrong type for 'dataframe', must be a subclass \
|
|
30
|
+
msg = "Wrong type for 'dataframe', must be a subclass \
|
|
31
31
|
of Pandas DataFrame (pd.DataFrame)"
|
|
32
|
-
)
|
|
32
|
+
raise TypeError(msg)
|
|
33
33
|
|
|
34
34
|
def parse_array(
|
|
35
|
-
self,
|
|
35
|
+
self,
|
|
36
|
+
array: str,
|
|
37
|
+
original_request_params: str,
|
|
36
38
|
) -> tuple[list[Union[int, str]], str]:
|
|
37
39
|
parsed_array: list[Union[int, str]] = []
|
|
38
40
|
|
|
@@ -46,57 +48,52 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
|
|
|
46
48
|
start, end = map(int, match.groups())
|
|
47
49
|
parsed_array = list(range(start, end + 1))
|
|
48
50
|
else:
|
|
49
|
-
|
|
50
|
-
f"Unable to parse the array provided in {array}. \
|
|
51
|
+
msg = f"Unable to parse the array provided in {array}. \
|
|
51
52
|
Please check the format instructions."
|
|
52
|
-
)
|
|
53
|
+
raise OutputParserException(msg)
|
|
53
54
|
# Check if the format is ["column_name"]
|
|
54
55
|
elif re.match(r"\[[a-zA-Z0-9_]+(?:,[a-zA-Z0-9_]+)*\]", array):
|
|
55
56
|
match = re.match(r"\[[a-zA-Z0-9_]+(?:,[a-zA-Z0-9_]+)*\]", array)
|
|
56
57
|
if match:
|
|
57
58
|
parsed_array = list(map(str, match.group().strip("[]").split(",")))
|
|
58
59
|
else:
|
|
59
|
-
|
|
60
|
-
f"Unable to parse the array provided in {array}. \
|
|
60
|
+
msg = f"Unable to parse the array provided in {array}. \
|
|
61
61
|
Please check the format instructions."
|
|
62
|
-
)
|
|
62
|
+
raise OutputParserException(msg)
|
|
63
63
|
|
|
64
64
|
# Validate the array
|
|
65
65
|
if not parsed_array:
|
|
66
|
-
|
|
67
|
-
f"Invalid array format in '{original_request_params}'. \
|
|
66
|
+
msg = f"Invalid array format in '{original_request_params}'. \
|
|
68
67
|
Please check the format instructions."
|
|
69
|
-
)
|
|
70
|
-
|
|
68
|
+
raise OutputParserException(msg)
|
|
69
|
+
if (
|
|
71
70
|
isinstance(parsed_array[0], int)
|
|
72
71
|
and parsed_array[-1] > self.dataframe.index.max()
|
|
73
72
|
):
|
|
74
|
-
|
|
75
|
-
f"The maximum index {parsed_array[-1]} exceeds the maximum index of \
|
|
73
|
+
msg = f"The maximum index {parsed_array[-1]} exceeds the maximum index of \
|
|
76
74
|
the Pandas DataFrame {self.dataframe.index.max()}."
|
|
77
|
-
)
|
|
75
|
+
raise OutputParserException(msg)
|
|
78
76
|
|
|
79
77
|
return parsed_array, original_request_params.split("[")[0]
|
|
80
78
|
|
|
81
79
|
def parse(self, request: str) -> dict[str, Any]:
|
|
82
80
|
stripped_request_params = None
|
|
83
81
|
splitted_request = request.strip().split(":")
|
|
84
|
-
if len(splitted_request) != 2:
|
|
85
|
-
|
|
86
|
-
f"Request '{request}' is not correctly formatted. \
|
|
82
|
+
if len(splitted_request) != 2: # noqa: PLR2004
|
|
83
|
+
msg = f"Request '{request}' is not correctly formatted. \
|
|
87
84
|
Please refer to the format instructions."
|
|
88
|
-
)
|
|
85
|
+
raise OutputParserException(msg)
|
|
89
86
|
result = {}
|
|
90
87
|
try:
|
|
91
88
|
request_type, request_params = splitted_request
|
|
92
89
|
if request_type in {"Invalid column", "Invalid operation"}:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
)
|
|
90
|
+
msg = f"{request}. Please check the format instructions."
|
|
91
|
+
raise OutputParserException(msg)
|
|
96
92
|
array_exists = re.search(r"(\[.*?\])", request_params)
|
|
97
93
|
if array_exists:
|
|
98
94
|
parsed_array, stripped_request_params = self.parse_array(
|
|
99
|
-
array_exists.group(1),
|
|
95
|
+
array_exists.group(1),
|
|
96
|
+
request_params,
|
|
100
97
|
)
|
|
101
98
|
if request_type == "column":
|
|
102
99
|
filtered_df = self.dataframe[
|
|
@@ -127,34 +124,33 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
|
|
|
127
124
|
self.dataframe.index.isin(parsed_array)
|
|
128
125
|
]
|
|
129
126
|
result[request_type] = getattr(
|
|
130
|
-
filtered_df[stripped_request_params],
|
|
127
|
+
filtered_df[stripped_request_params],
|
|
128
|
+
request_type,
|
|
131
129
|
)()
|
|
130
|
+
elif request_type == "column":
|
|
131
|
+
result[request_params] = self.dataframe[request_params]
|
|
132
|
+
elif request_type == "row":
|
|
133
|
+
result[request_params] = self.dataframe.iloc[int(request_params)]
|
|
132
134
|
else:
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
result[request_type] = getattr(
|
|
139
|
-
self.dataframe[request_params], request_type
|
|
140
|
-
)()
|
|
141
|
-
except (AttributeError, IndexError, KeyError):
|
|
135
|
+
result[request_type] = getattr(
|
|
136
|
+
self.dataframe[request_params],
|
|
137
|
+
request_type,
|
|
138
|
+
)()
|
|
139
|
+
except (AttributeError, IndexError, KeyError) as e:
|
|
142
140
|
if request_type not in {"column", "row"}:
|
|
143
|
-
|
|
144
|
-
f"Unsupported request type '{request_type}'. \
|
|
141
|
+
msg = f"Unsupported request type '{request_type}'. \
|
|
145
142
|
Please check the format instructions."
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
)
|
|
143
|
+
raise OutputParserException(msg) from e
|
|
144
|
+
msg = f"""Requested index {
|
|
145
|
+
request_params
|
|
146
|
+
if stripped_request_params is None
|
|
147
|
+
else stripped_request_params
|
|
148
|
+
} is out of bounds."""
|
|
149
|
+
raise OutputParserException(msg) from e
|
|
154
150
|
|
|
155
151
|
return result
|
|
156
152
|
|
|
157
153
|
def get_format_instructions(self) -> str:
|
|
158
154
|
return PANDAS_DATAFRAME_FORMAT_INSTRUCTIONS.format(
|
|
159
|
-
columns=", ".join(self.dataframe.columns)
|
|
155
|
+
columns=", ".join(self.dataframe.columns),
|
|
160
156
|
)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
from langchain_core.prompts.prompt import PromptTemplate
|
|
3
2
|
|
|
4
3
|
NAIVE_FIX = """Instructions:
|
|
@@ -16,7 +15,7 @@ Error:
|
|
|
16
15
|
{error}
|
|
17
16
|
--------------
|
|
18
17
|
|
|
19
|
-
Please try again. Please only respond with an answer that satisfies the constraints laid out in the Instructions:"""
|
|
18
|
+
Please try again. Please only respond with an answer that satisfies the constraints laid out in the Instructions:""" # noqa: E501
|
|
20
19
|
|
|
21
20
|
|
|
22
21
|
NAIVE_FIX_PROMPT = PromptTemplate.from_template(NAIVE_FIX)
|
|
@@ -9,7 +9,7 @@ if TYPE_CHECKING:
|
|
|
9
9
|
# Used to consolidate logic for raising deprecation warnings and
|
|
10
10
|
# handling optional imports.
|
|
11
11
|
DEPRECATED_LOOKUP = {
|
|
12
|
-
"GuardrailsOutputParser": "langchain_community.output_parsers.rail_parser"
|
|
12
|
+
"GuardrailsOutputParser": "langchain_community.output_parsers.rail_parser",
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
_import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)
|
|
@@ -30,11 +30,10 @@ class RegexParser(BaseOutputParser[dict[str, str]]):
|
|
|
30
30
|
match = re.search(self.regex, text)
|
|
31
31
|
if match:
|
|
32
32
|
return {key: match.group(i + 1) for i, key in enumerate(self.output_keys)}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
33
|
+
if self.default_output_key is None:
|
|
34
|
+
msg = f"Could not parse output: {text}"
|
|
35
|
+
raise ValueError(msg)
|
|
36
|
+
return {
|
|
37
|
+
key: text if key == self.default_output_key else ""
|
|
38
|
+
for key in self.output_keys
|
|
39
|
+
}
|
|
@@ -28,19 +28,16 @@ class RegexDictParser(BaseOutputParser[dict[str, str]]):
|
|
|
28
28
|
specific_regex = self.regex_pattern.format(re.escape(expected_format))
|
|
29
29
|
matches = re.findall(specific_regex, text)
|
|
30
30
|
if not matches:
|
|
31
|
-
|
|
31
|
+
msg = (
|
|
32
32
|
f"No match found for output key: {output_key} with expected format \
|
|
33
33
|
{expected_format} on text {text}"
|
|
34
34
|
)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
raise ValueError(msg)
|
|
36
|
+
if len(matches) > 1:
|
|
37
|
+
msg = f"Multiple matches found for output key: {output_key} with \
|
|
38
38
|
expected format {expected_format} on text {text}"
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
self.no_update_value is not None and matches[0] == self.no_update_value
|
|
42
|
-
):
|
|
39
|
+
raise ValueError(msg)
|
|
40
|
+
if self.no_update_value is not None and matches[0] == self.no_update_value:
|
|
43
41
|
continue
|
|
44
|
-
|
|
45
|
-
result[output_key] = matches[0]
|
|
42
|
+
result[output_key] = matches[0]
|
|
46
43
|
return result
|
|
@@ -30,7 +30,7 @@ Please try again:"""
|
|
|
30
30
|
|
|
31
31
|
NAIVE_RETRY_PROMPT = PromptTemplate.from_template(NAIVE_COMPLETION_RETRY)
|
|
32
32
|
NAIVE_RETRY_WITH_ERROR_PROMPT = PromptTemplate.from_template(
|
|
33
|
-
NAIVE_COMPLETION_RETRY_WITH_ERROR
|
|
33
|
+
NAIVE_COMPLETION_RETRY_WITH_ERROR,
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
T = TypeVar("T")
|
|
@@ -104,25 +104,25 @@ class RetryOutputParser(BaseOutputParser[T]):
|
|
|
104
104
|
while retries <= self.max_retries:
|
|
105
105
|
try:
|
|
106
106
|
return self.parser.parse(completion)
|
|
107
|
-
except OutputParserException
|
|
107
|
+
except OutputParserException:
|
|
108
108
|
if retries == self.max_retries:
|
|
109
|
-
raise
|
|
109
|
+
raise
|
|
110
|
+
retries += 1
|
|
111
|
+
if self.legacy and hasattr(self.retry_chain, "run"):
|
|
112
|
+
completion = self.retry_chain.run(
|
|
113
|
+
prompt=prompt_value.to_string(),
|
|
114
|
+
completion=completion,
|
|
115
|
+
)
|
|
110
116
|
else:
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
prompt=prompt_value.to_string(),
|
|
121
|
-
completion=completion,
|
|
122
|
-
)
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
raise OutputParserException("Failed to parse")
|
|
117
|
+
completion = self.retry_chain.invoke(
|
|
118
|
+
{
|
|
119
|
+
"prompt": prompt_value.to_string(),
|
|
120
|
+
"completion": completion,
|
|
121
|
+
},
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
msg = "Failed to parse"
|
|
125
|
+
raise OutputParserException(msg)
|
|
126
126
|
|
|
127
127
|
async def aparse_with_prompt(self, completion: str, prompt_value: PromptValue) -> T:
|
|
128
128
|
"""Parse the output of an LLM call using a wrapped parser.
|
|
@@ -141,29 +141,28 @@ class RetryOutputParser(BaseOutputParser[T]):
|
|
|
141
141
|
return await self.parser.aparse(completion)
|
|
142
142
|
except OutputParserException as e:
|
|
143
143
|
if retries == self.max_retries:
|
|
144
|
-
raise
|
|
144
|
+
raise
|
|
145
|
+
retries += 1
|
|
146
|
+
if self.legacy and hasattr(self.retry_chain, "arun"):
|
|
147
|
+
completion = await self.retry_chain.arun(
|
|
148
|
+
prompt=prompt_value.to_string(),
|
|
149
|
+
completion=completion,
|
|
150
|
+
error=repr(e),
|
|
151
|
+
)
|
|
145
152
|
else:
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
dict(
|
|
156
|
-
prompt=prompt_value.to_string(),
|
|
157
|
-
completion=completion,
|
|
158
|
-
)
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
raise OutputParserException("Failed to parse")
|
|
153
|
+
completion = await self.retry_chain.ainvoke(
|
|
154
|
+
{
|
|
155
|
+
"prompt": prompt_value.to_string(),
|
|
156
|
+
"completion": completion,
|
|
157
|
+
},
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
msg = "Failed to parse"
|
|
161
|
+
raise OutputParserException(msg)
|
|
162
162
|
|
|
163
163
|
def parse(self, completion: str) -> T:
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
)
|
|
164
|
+
msg = "This OutputParser can only be called by the `parse_with_prompt` method."
|
|
165
|
+
raise NotImplementedError(msg)
|
|
167
166
|
|
|
168
167
|
def get_format_instructions(self) -> str:
|
|
169
168
|
return self.parser.get_format_instructions()
|
|
@@ -192,7 +191,8 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
|
|
|
192
191
|
# Should be an LLMChain but we want to avoid top-level imports from langchain.chains
|
|
193
192
|
retry_chain: Annotated[
|
|
194
193
|
Union[
|
|
195
|
-
RunnableSerializable[RetryWithErrorOutputParserRetryChainInput, str],
|
|
194
|
+
RunnableSerializable[RetryWithErrorOutputParserRetryChainInput, str],
|
|
195
|
+
Any,
|
|
196
196
|
],
|
|
197
197
|
SkipValidation(),
|
|
198
198
|
]
|
|
@@ -232,25 +232,25 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
|
|
|
232
232
|
return self.parser.parse(completion)
|
|
233
233
|
except OutputParserException as e:
|
|
234
234
|
if retries == self.max_retries:
|
|
235
|
-
raise
|
|
235
|
+
raise
|
|
236
|
+
retries += 1
|
|
237
|
+
if self.legacy and hasattr(self.retry_chain, "run"):
|
|
238
|
+
completion = self.retry_chain.run(
|
|
239
|
+
prompt=prompt_value.to_string(),
|
|
240
|
+
completion=completion,
|
|
241
|
+
error=repr(e),
|
|
242
|
+
)
|
|
236
243
|
else:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
prompt
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
completion=completion,
|
|
248
|
-
prompt=prompt_value.to_string(),
|
|
249
|
-
error=repr(e),
|
|
250
|
-
)
|
|
251
|
-
)
|
|
252
|
-
|
|
253
|
-
raise OutputParserException("Failed to parse")
|
|
244
|
+
completion = self.retry_chain.invoke(
|
|
245
|
+
{
|
|
246
|
+
"completion": completion,
|
|
247
|
+
"prompt": prompt_value.to_string(),
|
|
248
|
+
"error": repr(e),
|
|
249
|
+
},
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
msg = "Failed to parse"
|
|
253
|
+
raise OutputParserException(msg)
|
|
254
254
|
|
|
255
255
|
async def aparse_with_prompt(self, completion: str, prompt_value: PromptValue) -> T:
|
|
256
256
|
retries = 0
|
|
@@ -260,30 +260,29 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
|
|
|
260
260
|
return await self.parser.aparse(completion)
|
|
261
261
|
except OutputParserException as e:
|
|
262
262
|
if retries == self.max_retries:
|
|
263
|
-
raise
|
|
263
|
+
raise
|
|
264
|
+
retries += 1
|
|
265
|
+
if self.legacy and hasattr(self.retry_chain, "arun"):
|
|
266
|
+
completion = await self.retry_chain.arun(
|
|
267
|
+
prompt=prompt_value.to_string(),
|
|
268
|
+
completion=completion,
|
|
269
|
+
error=repr(e),
|
|
270
|
+
)
|
|
264
271
|
else:
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
prompt=prompt_value.to_string(),
|
|
276
|
-
completion=completion,
|
|
277
|
-
error=repr(e),
|
|
278
|
-
)
|
|
279
|
-
)
|
|
280
|
-
|
|
281
|
-
raise OutputParserException("Failed to parse")
|
|
272
|
+
completion = await self.retry_chain.ainvoke(
|
|
273
|
+
{
|
|
274
|
+
"prompt": prompt_value.to_string(),
|
|
275
|
+
"completion": completion,
|
|
276
|
+
"error": repr(e),
|
|
277
|
+
},
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
msg = "Failed to parse"
|
|
281
|
+
raise OutputParserException(msg)
|
|
282
282
|
|
|
283
283
|
def parse(self, completion: str) -> T:
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
)
|
|
284
|
+
msg = "This OutputParser can only be called by the `parse_with_prompt` method."
|
|
285
|
+
raise NotImplementedError(msg)
|
|
287
286
|
|
|
288
287
|
def get_format_instructions(self) -> str:
|
|
289
288
|
return self.parser.get_format_instructions()
|
|
@@ -27,7 +27,9 @@ class ResponseSchema(BaseModel):
|
|
|
27
27
|
|
|
28
28
|
def _get_sub_string(schema: ResponseSchema) -> str:
|
|
29
29
|
return line_template.format(
|
|
30
|
-
name=schema.name,
|
|
30
|
+
name=schema.name,
|
|
31
|
+
description=schema.description,
|
|
32
|
+
type=schema.type,
|
|
31
33
|
)
|
|
32
34
|
|
|
33
35
|
|
|
@@ -39,11 +41,15 @@ class StructuredOutputParser(BaseOutputParser[dict[str, Any]]):
|
|
|
39
41
|
|
|
40
42
|
@classmethod
|
|
41
43
|
def from_response_schemas(
|
|
42
|
-
cls,
|
|
44
|
+
cls,
|
|
45
|
+
response_schemas: list[ResponseSchema],
|
|
43
46
|
) -> StructuredOutputParser:
|
|
44
47
|
return cls(response_schemas=response_schemas)
|
|
45
48
|
|
|
46
|
-
def get_format_instructions(
|
|
49
|
+
def get_format_instructions(
|
|
50
|
+
self,
|
|
51
|
+
only_json: bool = False, # noqa: FBT001,FBT002
|
|
52
|
+
) -> str:
|
|
47
53
|
"""Get format instructions for the output parser.
|
|
48
54
|
|
|
49
55
|
example:
|
|
@@ -85,12 +91,11 @@ class StructuredOutputParser(BaseOutputParser[dict[str, Any]]):
|
|
|
85
91
|
will be returned, without the introducing text. Defaults to False.
|
|
86
92
|
"""
|
|
87
93
|
schema_str = "\n".join(
|
|
88
|
-
[_get_sub_string(schema) for schema in self.response_schemas]
|
|
94
|
+
[_get_sub_string(schema) for schema in self.response_schemas],
|
|
89
95
|
)
|
|
90
96
|
if only_json:
|
|
91
97
|
return STRUCTURED_FORMAT_SIMPLE_INSTRUCTIONS.format(format=schema_str)
|
|
92
|
-
|
|
93
|
-
return STRUCTURED_FORMAT_INSTRUCTIONS.format(format=schema_str)
|
|
98
|
+
return STRUCTURED_FORMAT_INSTRUCTIONS.format(format=schema_str)
|
|
94
99
|
|
|
95
100
|
def parse(self, text: str) -> dict[str, Any]:
|
|
96
101
|
expected_keys = [rs.name for rs in self.response_schemas]
|
langchain/output_parsers/yaml.py
CHANGED
|
@@ -18,27 +18,23 @@ class YamlOutputParser(BaseOutputParser[T]):
|
|
|
18
18
|
pydantic_object: type[T]
|
|
19
19
|
"""The pydantic model to parse."""
|
|
20
20
|
pattern: re.Pattern = re.compile(
|
|
21
|
-
r"^```(?:ya?ml)?(?P<yaml>[^`]*)",
|
|
21
|
+
r"^```(?:ya?ml)?(?P<yaml>[^`]*)",
|
|
22
|
+
re.MULTILINE | re.DOTALL,
|
|
22
23
|
)
|
|
23
|
-
"""Regex pattern to match yaml code blocks
|
|
24
|
+
"""Regex pattern to match yaml code blocks
|
|
24
25
|
within triple backticks with optional yaml or yml prefix."""
|
|
25
26
|
|
|
26
27
|
def parse(self, text: str) -> T:
|
|
27
28
|
try:
|
|
28
29
|
# Greedy search for 1st yaml candidate.
|
|
29
30
|
match = re.search(self.pattern, text.strip())
|
|
30
|
-
|
|
31
|
-
if match
|
|
32
|
-
yaml_str = match.group("yaml")
|
|
33
|
-
else:
|
|
34
|
-
# If no backticks were present, try to parse the entire output as yaml.
|
|
35
|
-
yaml_str = text
|
|
31
|
+
# If no backticks were present, try to parse the entire output as yaml.
|
|
32
|
+
yaml_str = match.group("yaml") if match else text
|
|
36
33
|
|
|
37
34
|
json_object = yaml.safe_load(yaml_str)
|
|
38
35
|
if hasattr(self.pydantic_object, "model_validate"):
|
|
39
36
|
return self.pydantic_object.model_validate(json_object)
|
|
40
|
-
|
|
41
|
-
return self.pydantic_object.parse_obj(json_object)
|
|
37
|
+
return self.pydantic_object.parse_obj(json_object)
|
|
42
38
|
|
|
43
39
|
except (yaml.YAMLError, ValidationError) as e:
|
|
44
40
|
name = self.pydantic_object.__name__
|
|
@@ -47,7 +43,15 @@ class YamlOutputParser(BaseOutputParser[T]):
|
|
|
47
43
|
|
|
48
44
|
def get_format_instructions(self) -> str:
|
|
49
45
|
# Copy schema to avoid altering original Pydantic schema.
|
|
50
|
-
|
|
46
|
+
if hasattr(self.pydantic_object, "model_json_schema"):
|
|
47
|
+
# Pydantic v2
|
|
48
|
+
schema = dict(self.pydantic_object.model_json_schema().items())
|
|
49
|
+
elif hasattr(self.pydantic_object, "schema"):
|
|
50
|
+
# Pydantic v1
|
|
51
|
+
schema = dict(self.pydantic_object.schema().items())
|
|
52
|
+
else:
|
|
53
|
+
msg = "Pydantic object must have either model_json_schema or schema method"
|
|
54
|
+
raise ValueError(msg)
|
|
51
55
|
|
|
52
56
|
# Remove extraneous fields.
|
|
53
57
|
reduced_schema = schema
|
langchain/prompts/__init__.py
CHANGED
|
@@ -65,7 +65,9 @@ if TYPE_CHECKING:
|
|
|
65
65
|
# Used to consolidate logic for raising deprecation warnings and
|
|
66
66
|
# handling optional imports.
|
|
67
67
|
MODULE_LOOKUP = {
|
|
68
|
-
"NGramOverlapExampleSelector":
|
|
68
|
+
"NGramOverlapExampleSelector": (
|
|
69
|
+
"langchain_community.example_selectors.ngram_overlap"
|
|
70
|
+
),
|
|
69
71
|
}
|
|
70
72
|
|
|
71
73
|
_import_attribute = create_importer(__file__, module_lookup=MODULE_LOOKUP)
|
|
@@ -82,6 +84,7 @@ __all__ = [
|
|
|
82
84
|
"BasePromptTemplate",
|
|
83
85
|
"ChatMessagePromptTemplate",
|
|
84
86
|
"ChatPromptTemplate",
|
|
87
|
+
"FewShotChatMessagePromptTemplate",
|
|
85
88
|
"FewShotPromptTemplate",
|
|
86
89
|
"FewShotPromptWithTemplates",
|
|
87
90
|
"HumanMessagePromptTemplate",
|
|
@@ -90,11 +93,10 @@ __all__ = [
|
|
|
90
93
|
"MessagesPlaceholder",
|
|
91
94
|
"NGramOverlapExampleSelector",
|
|
92
95
|
"PipelinePromptTemplate",
|
|
96
|
+
"Prompt",
|
|
93
97
|
"PromptTemplate",
|
|
94
98
|
"SemanticSimilarityExampleSelector",
|
|
95
99
|
"StringPromptTemplate",
|
|
96
100
|
"SystemMessagePromptTemplate",
|
|
97
101
|
"load_prompt",
|
|
98
|
-
"FewShotChatMessagePromptTemplate",
|
|
99
|
-
"Prompt",
|
|
100
102
|
]
|
langchain/prompts/base.py
CHANGED
|
@@ -10,12 +10,12 @@ from langchain_core.prompts import (
|
|
|
10
10
|
from langchain_core.prompts.string import _get_jinja2_variables_from_template
|
|
11
11
|
|
|
12
12
|
__all__ = [
|
|
13
|
-
"jinja2_formatter",
|
|
14
|
-
"validate_jinja2",
|
|
15
|
-
"check_valid_template",
|
|
16
|
-
"get_template_variables",
|
|
17
|
-
"StringPromptTemplate",
|
|
18
13
|
"BasePromptTemplate",
|
|
14
|
+
"StringPromptTemplate",
|
|
19
15
|
"StringPromptValue",
|
|
20
16
|
"_get_jinja2_variables_from_template",
|
|
17
|
+
"check_valid_template",
|
|
18
|
+
"get_template_variables",
|
|
19
|
+
"jinja2_formatter",
|
|
20
|
+
"validate_jinja2",
|
|
21
21
|
]
|
langchain/prompts/chat.py
CHANGED
|
@@ -16,22 +16,22 @@ from langchain_core.prompts.chat import (
|
|
|
16
16
|
)
|
|
17
17
|
|
|
18
18
|
__all__ = [
|
|
19
|
+
"AIMessagePromptTemplate",
|
|
20
|
+
"BaseChatPromptTemplate",
|
|
19
21
|
"BaseMessagePromptTemplate",
|
|
20
|
-
"MessagesPlaceholder",
|
|
21
22
|
"BaseStringMessagePromptTemplate",
|
|
22
23
|
"ChatMessagePromptTemplate",
|
|
23
|
-
"HumanMessagePromptTemplate",
|
|
24
|
-
"AIMessagePromptTemplate",
|
|
25
|
-
"SystemMessagePromptTemplate",
|
|
26
|
-
"BaseChatPromptTemplate",
|
|
27
24
|
"ChatPromptTemplate",
|
|
28
25
|
"ChatPromptValue",
|
|
29
26
|
"ChatPromptValueConcrete",
|
|
30
|
-
"
|
|
31
|
-
"_create_template_from_message_type",
|
|
32
|
-
"MessagePromptTemplateT",
|
|
27
|
+
"HumanMessagePromptTemplate",
|
|
33
28
|
"MessageLike",
|
|
34
29
|
"MessageLikeRepresentation",
|
|
30
|
+
"MessagePromptTemplateT",
|
|
31
|
+
"MessagesPlaceholder",
|
|
32
|
+
"SystemMessagePromptTemplate",
|
|
33
|
+
"_convert_to_message",
|
|
34
|
+
"_create_template_from_message_type",
|
|
35
35
|
]
|
|
36
36
|
|
|
37
37
|
from langchain_core.prompts.message import BaseMessagePromptTemplate
|
|
@@ -21,7 +21,9 @@ if TYPE_CHECKING:
|
|
|
21
21
|
# Used to consolidate logic for raising deprecation warnings and
|
|
22
22
|
# handling optional imports.
|
|
23
23
|
DEPRECATED_LOOKUPS = {
|
|
24
|
-
"NGramOverlapExampleSelector":
|
|
24
|
+
"NGramOverlapExampleSelector": (
|
|
25
|
+
"langchain_community.example_selectors.ngram_overlap"
|
|
26
|
+
),
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
_import_attribute = create_importer(__file__, deprecated_lookups=DEPRECATED_LOOKUPS)
|
langchain/prompts/few_shot.py
CHANGED
langchain/prompts/loading.py
CHANGED
|
@@ -11,13 +11,13 @@ from langchain_core.prompts.loading import (
|
|
|
11
11
|
from langchain_core.utils.loading import try_load_from_hub
|
|
12
12
|
|
|
13
13
|
__all__ = [
|
|
14
|
-
"load_prompt_from_config",
|
|
15
|
-
"load_prompt",
|
|
16
|
-
"try_load_from_hub",
|
|
17
14
|
"_load_examples",
|
|
18
15
|
"_load_few_shot_prompt",
|
|
19
16
|
"_load_output_parser",
|
|
20
17
|
"_load_prompt",
|
|
21
18
|
"_load_prompt_from_file",
|
|
22
19
|
"_load_template",
|
|
20
|
+
"load_prompt",
|
|
21
|
+
"load_prompt_from_config",
|
|
22
|
+
"try_load_from_hub",
|
|
23
23
|
]
|