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/output_parsers/fix.py
CHANGED
|
@@ -7,7 +7,7 @@ from langchain_core.output_parsers import BaseOutputParser, StrOutputParser
|
|
|
7
7
|
from langchain_core.prompts import BasePromptTemplate
|
|
8
8
|
from langchain_core.runnables import Runnable, RunnableSerializable
|
|
9
9
|
from pydantic import SkipValidation
|
|
10
|
-
from typing_extensions import TypedDict
|
|
10
|
+
from typing_extensions import TypedDict, override
|
|
11
11
|
|
|
12
12
|
from langchain.output_parsers.prompts import NAIVE_FIX_PROMPT
|
|
13
13
|
|
|
@@ -15,6 +15,8 @@ T = TypeVar("T")
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class OutputFixingParserRetryChainInput(TypedDict, total=False):
|
|
18
|
+
"""Input for the retry chain of the OutputFixingParser."""
|
|
19
|
+
|
|
18
20
|
instructions: str
|
|
19
21
|
completion: str
|
|
20
22
|
error: str
|
|
@@ -24,6 +26,7 @@ class OutputFixingParser(BaseOutputParser[T]):
|
|
|
24
26
|
"""Wrap a parser and try to fix parsing errors."""
|
|
25
27
|
|
|
26
28
|
@classmethod
|
|
29
|
+
@override
|
|
27
30
|
def is_lc_serializable(cls) -> bool:
|
|
28
31
|
return True
|
|
29
32
|
|
|
@@ -62,6 +65,7 @@ class OutputFixingParser(BaseOutputParser[T]):
|
|
|
62
65
|
chain = prompt | llm | StrOutputParser()
|
|
63
66
|
return cls(parser=parser, retry_chain=chain, max_retries=max_retries)
|
|
64
67
|
|
|
68
|
+
@override
|
|
65
69
|
def parse(self, completion: str) -> T:
|
|
66
70
|
retries = 0
|
|
67
71
|
|
|
@@ -70,35 +74,36 @@ class OutputFixingParser(BaseOutputParser[T]):
|
|
|
70
74
|
return self.parser.parse(completion)
|
|
71
75
|
except OutputParserException as e:
|
|
72
76
|
if retries == self.max_retries:
|
|
73
|
-
raise
|
|
77
|
+
raise
|
|
78
|
+
retries += 1
|
|
79
|
+
if self.legacy and hasattr(self.retry_chain, "run"):
|
|
80
|
+
completion = self.retry_chain.run(
|
|
81
|
+
instructions=self.parser.get_format_instructions(),
|
|
82
|
+
completion=completion,
|
|
83
|
+
error=repr(e),
|
|
84
|
+
)
|
|
74
85
|
else:
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
86
|
+
try:
|
|
87
|
+
completion = self.retry_chain.invoke(
|
|
88
|
+
{
|
|
89
|
+
"instructions": self.parser.get_format_instructions(),
|
|
90
|
+
"completion": completion,
|
|
91
|
+
"error": repr(e),
|
|
92
|
+
},
|
|
93
|
+
)
|
|
94
|
+
except (NotImplementedError, AttributeError):
|
|
95
|
+
# Case: self.parser does not have get_format_instructions
|
|
96
|
+
completion = self.retry_chain.invoke(
|
|
97
|
+
{
|
|
98
|
+
"completion": completion,
|
|
99
|
+
"error": repr(e),
|
|
100
|
+
},
|
|
81
101
|
)
|
|
82
|
-
else:
|
|
83
|
-
try:
|
|
84
|
-
completion = self.retry_chain.invoke(
|
|
85
|
-
dict(
|
|
86
|
-
instructions=self.parser.get_format_instructions(),
|
|
87
|
-
completion=completion,
|
|
88
|
-
error=repr(e),
|
|
89
|
-
)
|
|
90
|
-
)
|
|
91
|
-
except (NotImplementedError, AttributeError):
|
|
92
|
-
# Case: self.parser does not have get_format_instructions
|
|
93
|
-
completion = self.retry_chain.invoke(
|
|
94
|
-
dict(
|
|
95
|
-
completion=completion,
|
|
96
|
-
error=repr(e),
|
|
97
|
-
)
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
raise OutputParserException("Failed to parse")
|
|
101
102
|
|
|
103
|
+
msg = "Failed to parse"
|
|
104
|
+
raise OutputParserException(msg)
|
|
105
|
+
|
|
106
|
+
@override
|
|
102
107
|
async def aparse(self, completion: str) -> T:
|
|
103
108
|
retries = 0
|
|
104
109
|
|
|
@@ -107,35 +112,36 @@ class OutputFixingParser(BaseOutputParser[T]):
|
|
|
107
112
|
return await self.parser.aparse(completion)
|
|
108
113
|
except OutputParserException as e:
|
|
109
114
|
if retries == self.max_retries:
|
|
110
|
-
raise
|
|
115
|
+
raise
|
|
116
|
+
retries += 1
|
|
117
|
+
if self.legacy and hasattr(self.retry_chain, "arun"):
|
|
118
|
+
completion = await self.retry_chain.arun(
|
|
119
|
+
instructions=self.parser.get_format_instructions(),
|
|
120
|
+
completion=completion,
|
|
121
|
+
error=repr(e),
|
|
122
|
+
)
|
|
111
123
|
else:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
124
|
+
try:
|
|
125
|
+
completion = await self.retry_chain.ainvoke(
|
|
126
|
+
{
|
|
127
|
+
"instructions": self.parser.get_format_instructions(),
|
|
128
|
+
"completion": completion,
|
|
129
|
+
"error": repr(e),
|
|
130
|
+
},
|
|
118
131
|
)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
completion = await self.retry_chain.ainvoke(
|
|
131
|
-
dict(
|
|
132
|
-
completion=completion,
|
|
133
|
-
error=repr(e),
|
|
134
|
-
)
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
raise OutputParserException("Failed to parse")
|
|
132
|
+
except (NotImplementedError, AttributeError):
|
|
133
|
+
# Case: self.parser does not have get_format_instructions
|
|
134
|
+
completion = await self.retry_chain.ainvoke(
|
|
135
|
+
{
|
|
136
|
+
"completion": completion,
|
|
137
|
+
"error": repr(e),
|
|
138
|
+
},
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
msg = "Failed to parse"
|
|
142
|
+
raise OutputParserException(msg)
|
|
138
143
|
|
|
144
|
+
@override
|
|
139
145
|
def get_format_instructions(self) -> str:
|
|
140
146
|
return self.parser.get_format_instructions()
|
|
141
147
|
|
|
@@ -144,5 +150,6 @@ class OutputFixingParser(BaseOutputParser[T]):
|
|
|
144
150
|
return "output_fixing"
|
|
145
151
|
|
|
146
152
|
@property
|
|
153
|
+
@override
|
|
147
154
|
def OutputType(self) -> type[T]:
|
|
148
155
|
return self.parser.OutputType
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
|
-
|
|
3
1
|
STRUCTURED_FORMAT_INSTRUCTIONS = """The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":
|
|
4
2
|
|
|
5
3
|
```json
|
|
6
4
|
{{
|
|
7
5
|
{format}
|
|
8
6
|
}}
|
|
9
|
-
```"""
|
|
7
|
+
```""" # noqa: E501
|
|
10
8
|
|
|
11
9
|
STRUCTURED_FORMAT_SIMPLE_INSTRUCTIONS = """
|
|
12
10
|
```json
|
|
@@ -24,7 +22,7 @@ the object {{"foo": ["bar", "baz"]}} is a well-formatted instance of the schema.
|
|
|
24
22
|
Here is the output schema:
|
|
25
23
|
```
|
|
26
24
|
{schema}
|
|
27
|
-
```"""
|
|
25
|
+
```""" # noqa: E501
|
|
28
26
|
|
|
29
27
|
YAML_FORMAT_INSTRUCTIONS = """The output should be formatted as a YAML instance that conforms to the given JSON schema below.
|
|
30
28
|
|
|
@@ -49,14 +47,14 @@ YAML_FORMAT_INSTRUCTIONS = """The output should be formatted as a YAML instance
|
|
|
49
47
|
```
|
|
50
48
|
habit: Using disposable water bottles for daily hydration.
|
|
51
49
|
sustainable_alternative: Switch to a reusable water bottle to reduce plastic waste and decrease your environmental footprint.
|
|
52
|
-
```
|
|
50
|
+
```
|
|
53
51
|
|
|
54
|
-
Please follow the standard YAML formatting conventions with an indent of 2 spaces and make sure that the data types adhere strictly to the following JSON schema:
|
|
52
|
+
Please follow the standard YAML formatting conventions with an indent of 2 spaces and make sure that the data types adhere strictly to the following JSON schema:
|
|
55
53
|
```
|
|
56
54
|
{schema}
|
|
57
55
|
```
|
|
58
56
|
|
|
59
|
-
Make sure to always enclose the YAML output in triple backticks (```). Please do not add anything other than valid YAML output!"""
|
|
57
|
+
Make sure to always enclose the YAML output in triple backticks (```). Please do not add anything other than valid YAML output!""" # noqa: E501
|
|
60
58
|
|
|
61
59
|
|
|
62
60
|
PANDAS_DATAFRAME_FORMAT_INSTRUCTIONS = """The output should be formatted as a string as the operation, followed by a colon, followed by the column or row to be queried on, followed by optional array parameters.
|
|
@@ -78,4 +76,4 @@ Here are the possible columns:
|
|
|
78
76
|
```
|
|
79
77
|
{columns}
|
|
80
78
|
```
|
|
81
|
-
"""
|
|
79
|
+
""" # noqa: E501
|
langchain/output_parsers/json.py
CHANGED
langchain/output_parsers/list.py
CHANGED
|
@@ -10,13 +10,13 @@ def load_output_parser(config: dict) -> dict:
|
|
|
10
10
|
Returns:
|
|
11
11
|
config dict with output parser loaded
|
|
12
12
|
"""
|
|
13
|
-
if "output_parsers" in config:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
13
|
+
if "output_parsers" in config and config["output_parsers"] is not None:
|
|
14
|
+
_config = config["output_parsers"]
|
|
15
|
+
output_parser_type = _config["_type"]
|
|
16
|
+
if output_parser_type == "regex_parser":
|
|
17
|
+
output_parser = RegexParser(**_config)
|
|
18
|
+
else:
|
|
19
|
+
msg = f"Unsupported output parser {output_parser_type}"
|
|
20
|
+
raise ValueError(msg)
|
|
21
|
+
config["output_parsers"] = output_parser
|
|
22
22
|
return config
|
|
@@ -6,8 +6,8 @@ from langchain_core.output_parsers.openai_functions import (
|
|
|
6
6
|
)
|
|
7
7
|
|
|
8
8
|
__all__ = [
|
|
9
|
-
"PydanticOutputFunctionsParser",
|
|
10
|
-
"PydanticAttrOutputFunctionsParser",
|
|
11
|
-
"JsonOutputFunctionsParser",
|
|
12
9
|
"JsonKeyOutputFunctionsParser",
|
|
10
|
+
"JsonOutputFunctionsParser",
|
|
11
|
+
"PydanticAttrOutputFunctionsParser",
|
|
12
|
+
"PydanticOutputFunctionsParser",
|
|
13
13
|
]
|
|
@@ -4,6 +4,7 @@ from typing import Any, Union
|
|
|
4
4
|
from langchain_core.exceptions import OutputParserException
|
|
5
5
|
from langchain_core.output_parsers.base import BaseOutputParser
|
|
6
6
|
from pydantic import field_validator
|
|
7
|
+
from typing_extensions import override
|
|
7
8
|
|
|
8
9
|
from langchain.output_parsers.format_instructions import (
|
|
9
10
|
PANDAS_DATAFRAME_FORMAT_INSTRUCTIONS,
|
|
@@ -18,22 +19,36 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
|
|
|
18
19
|
|
|
19
20
|
@field_validator("dataframe")
|
|
20
21
|
@classmethod
|
|
21
|
-
def
|
|
22
|
+
def _validate_dataframe(cls, val: Any) -> Any:
|
|
22
23
|
import pandas as pd
|
|
23
24
|
|
|
24
25
|
if issubclass(type(val), pd.DataFrame):
|
|
25
26
|
return val
|
|
26
27
|
if pd.DataFrame(val).empty:
|
|
27
|
-
|
|
28
|
+
msg = "DataFrame cannot be empty."
|
|
29
|
+
raise ValueError(msg)
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
"Wrong type for 'dataframe', must be a subclass \
|
|
31
|
+
msg = "Wrong type for 'dataframe', must be a subclass \
|
|
31
32
|
of Pandas DataFrame (pd.DataFrame)"
|
|
32
|
-
)
|
|
33
|
+
raise TypeError(msg)
|
|
33
34
|
|
|
34
35
|
def parse_array(
|
|
35
|
-
self,
|
|
36
|
+
self,
|
|
37
|
+
array: str,
|
|
38
|
+
original_request_params: str,
|
|
36
39
|
) -> tuple[list[Union[int, str]], str]:
|
|
40
|
+
"""Parse the array from the request parameters.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
array: The array string to parse.
|
|
44
|
+
original_request_params: The original request parameters string.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
A tuple containing the parsed array and the stripped request parameters.
|
|
48
|
+
|
|
49
|
+
Raises:
|
|
50
|
+
OutputParserException: If the array format is invalid or cannot be parsed.
|
|
51
|
+
"""
|
|
37
52
|
parsed_array: list[Union[int, str]] = []
|
|
38
53
|
|
|
39
54
|
# Check if the format is [1,3,5]
|
|
@@ -46,57 +61,53 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
|
|
|
46
61
|
start, end = map(int, match.groups())
|
|
47
62
|
parsed_array = list(range(start, end + 1))
|
|
48
63
|
else:
|
|
49
|
-
|
|
50
|
-
f"Unable to parse the array provided in {array}. \
|
|
64
|
+
msg = f"Unable to parse the array provided in {array}. \
|
|
51
65
|
Please check the format instructions."
|
|
52
|
-
)
|
|
66
|
+
raise OutputParserException(msg)
|
|
53
67
|
# Check if the format is ["column_name"]
|
|
54
68
|
elif re.match(r"\[[a-zA-Z0-9_]+(?:,[a-zA-Z0-9_]+)*\]", array):
|
|
55
69
|
match = re.match(r"\[[a-zA-Z0-9_]+(?:,[a-zA-Z0-9_]+)*\]", array)
|
|
56
70
|
if match:
|
|
57
71
|
parsed_array = list(map(str, match.group().strip("[]").split(",")))
|
|
58
72
|
else:
|
|
59
|
-
|
|
60
|
-
f"Unable to parse the array provided in {array}. \
|
|
73
|
+
msg = f"Unable to parse the array provided in {array}. \
|
|
61
74
|
Please check the format instructions."
|
|
62
|
-
)
|
|
75
|
+
raise OutputParserException(msg)
|
|
63
76
|
|
|
64
77
|
# Validate the array
|
|
65
78
|
if not parsed_array:
|
|
66
|
-
|
|
67
|
-
f"Invalid array format in '{original_request_params}'. \
|
|
79
|
+
msg = f"Invalid array format in '{original_request_params}'. \
|
|
68
80
|
Please check the format instructions."
|
|
69
|
-
)
|
|
70
|
-
|
|
81
|
+
raise OutputParserException(msg)
|
|
82
|
+
if (
|
|
71
83
|
isinstance(parsed_array[0], int)
|
|
72
84
|
and parsed_array[-1] > self.dataframe.index.max()
|
|
73
85
|
):
|
|
74
|
-
|
|
75
|
-
f"The maximum index {parsed_array[-1]} exceeds the maximum index of \
|
|
86
|
+
msg = f"The maximum index {parsed_array[-1]} exceeds the maximum index of \
|
|
76
87
|
the Pandas DataFrame {self.dataframe.index.max()}."
|
|
77
|
-
)
|
|
88
|
+
raise OutputParserException(msg)
|
|
78
89
|
|
|
79
90
|
return parsed_array, original_request_params.split("[")[0]
|
|
80
91
|
|
|
92
|
+
@override
|
|
81
93
|
def parse(self, request: str) -> dict[str, Any]:
|
|
82
94
|
stripped_request_params = None
|
|
83
95
|
splitted_request = request.strip().split(":")
|
|
84
|
-
if len(splitted_request) != 2:
|
|
85
|
-
|
|
86
|
-
f"Request '{request}' is not correctly formatted. \
|
|
96
|
+
if len(splitted_request) != 2: # noqa: PLR2004
|
|
97
|
+
msg = f"Request '{request}' is not correctly formatted. \
|
|
87
98
|
Please refer to the format instructions."
|
|
88
|
-
)
|
|
99
|
+
raise OutputParserException(msg)
|
|
89
100
|
result = {}
|
|
90
101
|
try:
|
|
91
102
|
request_type, request_params = splitted_request
|
|
92
103
|
if request_type in {"Invalid column", "Invalid operation"}:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
)
|
|
104
|
+
msg = f"{request}. Please check the format instructions."
|
|
105
|
+
raise OutputParserException(msg)
|
|
96
106
|
array_exists = re.search(r"(\[.*?\])", request_params)
|
|
97
107
|
if array_exists:
|
|
98
108
|
parsed_array, stripped_request_params = self.parse_array(
|
|
99
|
-
array_exists.group(1),
|
|
109
|
+
array_exists.group(1),
|
|
110
|
+
request_params,
|
|
100
111
|
)
|
|
101
112
|
if request_type == "column":
|
|
102
113
|
filtered_df = self.dataframe[
|
|
@@ -127,34 +138,34 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
|
|
|
127
138
|
self.dataframe.index.isin(parsed_array)
|
|
128
139
|
]
|
|
129
140
|
result[request_type] = getattr(
|
|
130
|
-
filtered_df[stripped_request_params],
|
|
141
|
+
filtered_df[stripped_request_params],
|
|
142
|
+
request_type,
|
|
131
143
|
)()
|
|
144
|
+
elif request_type == "column":
|
|
145
|
+
result[request_params] = self.dataframe[request_params]
|
|
146
|
+
elif request_type == "row":
|
|
147
|
+
result[request_params] = self.dataframe.iloc[int(request_params)]
|
|
132
148
|
else:
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
result[request_type] = getattr(
|
|
139
|
-
self.dataframe[request_params], request_type
|
|
140
|
-
)()
|
|
141
|
-
except (AttributeError, IndexError, KeyError):
|
|
149
|
+
result[request_type] = getattr(
|
|
150
|
+
self.dataframe[request_params],
|
|
151
|
+
request_type,
|
|
152
|
+
)()
|
|
153
|
+
except (AttributeError, IndexError, KeyError) as e:
|
|
142
154
|
if request_type not in {"column", "row"}:
|
|
143
|
-
|
|
144
|
-
f"Unsupported request type '{request_type}'. \
|
|
155
|
+
msg = f"Unsupported request type '{request_type}'. \
|
|
145
156
|
Please check the format instructions."
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
)
|
|
157
|
+
raise OutputParserException(msg) from e
|
|
158
|
+
msg = f"""Requested index {
|
|
159
|
+
request_params
|
|
160
|
+
if stripped_request_params is None
|
|
161
|
+
else stripped_request_params
|
|
162
|
+
} is out of bounds."""
|
|
163
|
+
raise OutputParserException(msg) from e
|
|
154
164
|
|
|
155
165
|
return result
|
|
156
166
|
|
|
167
|
+
@override
|
|
157
168
|
def get_format_instructions(self) -> str:
|
|
158
169
|
return PANDAS_DATAFRAME_FORMAT_INSTRUCTIONS.format(
|
|
159
|
-
columns=", ".join(self.dataframe.columns)
|
|
170
|
+
columns=", ".join(self.dataframe.columns),
|
|
160
171
|
)
|
|
@@ -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)
|
|
@@ -4,12 +4,14 @@ import re
|
|
|
4
4
|
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from langchain_core.output_parsers import BaseOutputParser
|
|
7
|
+
from typing_extensions import override
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class RegexParser(BaseOutputParser[dict[str, str]]):
|
|
10
11
|
"""Parse the output of an LLM call using a regex."""
|
|
11
12
|
|
|
12
13
|
@classmethod
|
|
14
|
+
@override
|
|
13
15
|
def is_lc_serializable(cls) -> bool:
|
|
14
16
|
return True
|
|
15
17
|
|
|
@@ -30,11 +32,10 @@ class RegexParser(BaseOutputParser[dict[str, str]]):
|
|
|
30
32
|
match = re.search(self.regex, text)
|
|
31
33
|
if match:
|
|
32
34
|
return {key: match.group(i + 1) for i, key in enumerate(self.output_keys)}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
35
|
+
if self.default_output_key is None:
|
|
36
|
+
msg = f"Could not parse output: {text}"
|
|
37
|
+
raise ValueError(msg)
|
|
38
|
+
return {
|
|
39
|
+
key: text if key == self.default_output_key else ""
|
|
40
|
+
for key in self.output_keys
|
|
41
|
+
}
|
|
@@ -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
|