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
|
@@ -16,6 +16,7 @@ from langchain_core.load.serializable import Serializable
|
|
|
16
16
|
from langchain_core.messages import BaseMessage, get_buffer_string, messages_from_dict
|
|
17
17
|
from langsmith import EvaluationResult, RunEvaluator
|
|
18
18
|
from langsmith.schemas import DataType, Example, Run
|
|
19
|
+
from typing_extensions import override
|
|
19
20
|
|
|
20
21
|
from langchain.chains.base import Chain
|
|
21
22
|
from langchain.evaluation.schema import StringEvaluator
|
|
@@ -28,8 +29,7 @@ def _get_messages_from_run_dict(messages: list[dict]) -> list[BaseMessage]:
|
|
|
28
29
|
first_message = messages[0]
|
|
29
30
|
if "lc" in first_message:
|
|
30
31
|
return [load(dumpd(message)) for message in messages]
|
|
31
|
-
|
|
32
|
-
return messages_from_dict(messages)
|
|
32
|
+
return messages_from_dict(messages)
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
class StringRunMapper(Serializable):
|
|
@@ -47,7 +47,8 @@ class StringRunMapper(Serializable):
|
|
|
47
47
|
def __call__(self, run: Run) -> dict[str, str]:
|
|
48
48
|
"""Maps the Run to a dictionary."""
|
|
49
49
|
if not run.outputs:
|
|
50
|
-
|
|
50
|
+
msg = f"Run {run.id} has no outputs to evaluate."
|
|
51
|
+
raise ValueError(msg)
|
|
51
52
|
return self.map(run)
|
|
52
53
|
|
|
53
54
|
|
|
@@ -63,11 +64,22 @@ class LLMStringRunMapper(StringRunMapper):
|
|
|
63
64
|
# Runs from Tracer have messages as a list of lists of dicts
|
|
64
65
|
chat_messages = _get_messages_from_run_dict(messages[0])
|
|
65
66
|
else:
|
|
66
|
-
|
|
67
|
+
msg = f"Could not extract messages to evaluate {messages}"
|
|
68
|
+
raise ValueError(msg)
|
|
67
69
|
return get_buffer_string(chat_messages)
|
|
68
|
-
|
|
70
|
+
msg = f"Could not extract messages to evaluate {messages}"
|
|
71
|
+
raise ValueError(msg)
|
|
69
72
|
|
|
70
73
|
def serialize_inputs(self, inputs: dict) -> str:
|
|
74
|
+
"""Serialize inputs.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
inputs: The inputs from the run, expected to contain prompts or messages.
|
|
78
|
+
Returns:
|
|
79
|
+
The serialized input text from the prompts or messages.
|
|
80
|
+
Raises:
|
|
81
|
+
ValueError: If neither prompts nor messages are found in the inputs.
|
|
82
|
+
"""
|
|
71
83
|
if "prompts" in inputs: # Should we even accept this?
|
|
72
84
|
input_ = "\n\n".join(inputs["prompts"])
|
|
73
85
|
elif "prompt" in inputs:
|
|
@@ -75,15 +87,30 @@ class LLMStringRunMapper(StringRunMapper):
|
|
|
75
87
|
elif "messages" in inputs:
|
|
76
88
|
input_ = self.serialize_chat_messages(inputs["messages"])
|
|
77
89
|
else:
|
|
78
|
-
|
|
90
|
+
msg = "LLM Run must have either messages or prompts as inputs."
|
|
91
|
+
raise ValueError(msg)
|
|
79
92
|
return input_
|
|
80
93
|
|
|
81
94
|
def serialize_outputs(self, outputs: dict) -> str:
|
|
95
|
+
"""Serialize outputs.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
outputs: The outputs from the run, expected to contain generations.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
The serialized output text from the first generation.
|
|
102
|
+
|
|
103
|
+
Raises:
|
|
104
|
+
ValueError: If no generations are found in the outputs,
|
|
105
|
+
or if the generations are empty.
|
|
106
|
+
"""
|
|
82
107
|
if not outputs.get("generations"):
|
|
83
|
-
|
|
108
|
+
msg = "Cannot evaluate LLM Run without generations."
|
|
109
|
+
raise ValueError(msg)
|
|
84
110
|
generations: list[dict] = outputs["generations"]
|
|
85
111
|
if not generations:
|
|
86
|
-
|
|
112
|
+
msg = "Cannot evaluate LLM run with empty generations."
|
|
113
|
+
raise ValueError(msg)
|
|
87
114
|
first_generation: dict = generations[0]
|
|
88
115
|
if isinstance(first_generation, list):
|
|
89
116
|
# Runs from Tracer have generations as a list of lists of dicts
|
|
@@ -98,30 +125,25 @@ class LLMStringRunMapper(StringRunMapper):
|
|
|
98
125
|
def map(self, run: Run) -> dict[str, str]:
|
|
99
126
|
"""Maps the Run to a dictionary."""
|
|
100
127
|
if run.run_type != "llm":
|
|
101
|
-
|
|
102
|
-
|
|
128
|
+
msg = "LLM RunMapper only supports LLM runs."
|
|
129
|
+
raise ValueError(msg)
|
|
130
|
+
if not run.outputs:
|
|
103
131
|
if run.error:
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
output_ = self.serialize_outputs(run.outputs)
|
|
120
|
-
except Exception as e:
|
|
121
|
-
raise ValueError(
|
|
122
|
-
f"Could not parse LM prediction from run outputs {run.outputs}"
|
|
123
|
-
) from e
|
|
124
|
-
return {"input": inputs, "prediction": output_}
|
|
132
|
+
msg = f"Cannot evaluate errored LLM run {run.id}: {run.error}"
|
|
133
|
+
raise ValueError(msg)
|
|
134
|
+
msg = f"Run {run.id} has no outputs. Cannot evaluate this run."
|
|
135
|
+
raise ValueError(msg)
|
|
136
|
+
try:
|
|
137
|
+
inputs = self.serialize_inputs(run.inputs)
|
|
138
|
+
except Exception as e:
|
|
139
|
+
msg = f"Could not parse LM input from run inputs {run.inputs}"
|
|
140
|
+
raise ValueError(msg) from e
|
|
141
|
+
try:
|
|
142
|
+
output_ = self.serialize_outputs(run.outputs)
|
|
143
|
+
except Exception as e:
|
|
144
|
+
msg = f"Could not parse LM prediction from run outputs {run.outputs}"
|
|
145
|
+
raise ValueError(msg) from e
|
|
146
|
+
return {"input": inputs, "prediction": output_}
|
|
125
147
|
|
|
126
148
|
|
|
127
149
|
class ChainStringRunMapper(StringRunMapper):
|
|
@@ -139,53 +161,57 @@ class ChainStringRunMapper(StringRunMapper):
|
|
|
139
161
|
def _get_key(self, source: dict, key: Optional[str], which: str) -> str:
|
|
140
162
|
if key is not None:
|
|
141
163
|
return source[key]
|
|
142
|
-
|
|
164
|
+
if len(source) == 1:
|
|
143
165
|
return next(iter(source.values()))
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
166
|
+
msg = (
|
|
167
|
+
f"Could not map run {which} with multiple keys: "
|
|
168
|
+
f"{source}\nPlease manually specify a {which}_key"
|
|
169
|
+
)
|
|
170
|
+
raise ValueError(msg)
|
|
149
171
|
|
|
150
172
|
def map(self, run: Run) -> dict[str, str]:
|
|
151
173
|
"""Maps the Run to a dictionary."""
|
|
152
174
|
if not run.outputs:
|
|
153
|
-
|
|
175
|
+
msg = (
|
|
154
176
|
f"Run with ID {run.id} lacks outputs required for evaluation."
|
|
155
177
|
" Ensure the Run has valid outputs."
|
|
156
178
|
)
|
|
179
|
+
raise ValueError(msg)
|
|
157
180
|
if self.input_key is not None and self.input_key not in run.inputs:
|
|
158
|
-
|
|
181
|
+
msg = (
|
|
159
182
|
f"Run with ID {run.id} is missing the expected input key"
|
|
160
183
|
f" '{self.input_key}'.\nAvailable input keys in this Run"
|
|
161
184
|
f" are: {run.inputs.keys()}.\nAdjust the evaluator's"
|
|
162
185
|
f" input_key or ensure your input data includes key"
|
|
163
186
|
f" '{self.input_key}'."
|
|
164
187
|
)
|
|
165
|
-
|
|
188
|
+
raise ValueError(msg)
|
|
189
|
+
if self.prediction_key is not None and self.prediction_key not in run.outputs:
|
|
166
190
|
available_keys = ", ".join(run.outputs.keys())
|
|
167
|
-
|
|
191
|
+
msg = (
|
|
168
192
|
f"Run with ID {run.id} doesn't have the expected prediction key"
|
|
169
193
|
f" '{self.prediction_key}'. Available prediction keys in this Run are:"
|
|
170
194
|
f" {available_keys}. Adjust the evaluator's prediction_key or"
|
|
171
195
|
" ensure the Run object's outputs the expected key."
|
|
172
196
|
)
|
|
197
|
+
raise ValueError(msg)
|
|
173
198
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
199
|
+
input_ = self._get_key(run.inputs, self.input_key, "input")
|
|
200
|
+
prediction = self._get_key(run.outputs, self.prediction_key, "prediction")
|
|
201
|
+
return {
|
|
202
|
+
"input": input_,
|
|
203
|
+
"prediction": prediction,
|
|
204
|
+
}
|
|
181
205
|
|
|
182
206
|
|
|
183
207
|
class ToolStringRunMapper(StringRunMapper):
|
|
184
208
|
"""Map an input to the tool."""
|
|
185
209
|
|
|
210
|
+
@override
|
|
186
211
|
def map(self, run: Run) -> dict[str, str]:
|
|
187
212
|
if not run.outputs:
|
|
188
|
-
|
|
213
|
+
msg = f"Run {run.id} has no outputs to evaluate."
|
|
214
|
+
raise ValueError(msg)
|
|
189
215
|
return {"input": run.inputs["input"], "prediction": run.outputs["output"]}
|
|
190
216
|
|
|
191
217
|
|
|
@@ -207,36 +233,35 @@ class StringExampleMapper(Serializable):
|
|
|
207
233
|
def map(self, example: Example) -> dict[str, str]:
|
|
208
234
|
"""Maps the Example, or dataset row to a dictionary."""
|
|
209
235
|
if not example.outputs:
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
)
|
|
236
|
+
msg = f"Example {example.id} has no outputs to use as a reference."
|
|
237
|
+
raise ValueError(msg)
|
|
213
238
|
if self.reference_key is None:
|
|
214
239
|
if len(example.outputs) > 1:
|
|
215
|
-
|
|
240
|
+
msg = (
|
|
216
241
|
f"Example {example.id} has multiple outputs, so you must"
|
|
217
242
|
" specify a reference_key."
|
|
218
243
|
)
|
|
219
|
-
|
|
220
|
-
|
|
244
|
+
raise ValueError(msg)
|
|
245
|
+
output = next(iter(example.outputs.values()))
|
|
221
246
|
elif self.reference_key not in example.outputs:
|
|
222
|
-
|
|
247
|
+
msg = (
|
|
223
248
|
f"Example {example.id} does not have reference key"
|
|
224
249
|
f" {self.reference_key}."
|
|
225
250
|
)
|
|
251
|
+
raise ValueError(msg)
|
|
226
252
|
else:
|
|
227
253
|
output = example.outputs[self.reference_key]
|
|
228
254
|
return {
|
|
229
255
|
"reference": self.serialize_chat_messages([output])
|
|
230
256
|
if isinstance(output, dict) and output.get("type") and output.get("data")
|
|
231
|
-
else output
|
|
257
|
+
else output,
|
|
232
258
|
}
|
|
233
259
|
|
|
234
260
|
def __call__(self, example: Example) -> dict[str, str]:
|
|
235
261
|
"""Maps the Run and Example to a dictionary."""
|
|
236
262
|
if not example.outputs:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
)
|
|
263
|
+
msg = f"Example {example.id} has no outputs to use as areference label."
|
|
264
|
+
raise ValueError(msg)
|
|
240
265
|
return self.map(example)
|
|
241
266
|
|
|
242
267
|
|
|
@@ -254,10 +279,12 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
|
|
|
254
279
|
"""The evaluation chain."""
|
|
255
280
|
|
|
256
281
|
@property
|
|
282
|
+
@override
|
|
257
283
|
def input_keys(self) -> list[str]:
|
|
258
284
|
return ["run", "example"]
|
|
259
285
|
|
|
260
286
|
@property
|
|
287
|
+
@override
|
|
261
288
|
def output_keys(self) -> list[str]:
|
|
262
289
|
return ["feedback"]
|
|
263
290
|
|
|
@@ -271,16 +298,19 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
|
|
|
271
298
|
if example and self.example_mapper and self.string_evaluator.requires_reference:
|
|
272
299
|
evaluate_strings_inputs.update(self.example_mapper(example))
|
|
273
300
|
elif self.string_evaluator.requires_reference:
|
|
274
|
-
|
|
301
|
+
msg = (
|
|
275
302
|
f"Evaluator {self.name} requires an reference"
|
|
276
303
|
" example from the dataset,"
|
|
277
304
|
f" but none was provided for run {run.id}."
|
|
278
305
|
)
|
|
306
|
+
raise ValueError(msg)
|
|
279
307
|
return evaluate_strings_inputs
|
|
280
308
|
|
|
281
309
|
def _prepare_output(self, output: dict[str, Any]) -> dict[str, Any]:
|
|
282
310
|
evaluation_result = EvaluationResult(
|
|
283
|
-
key=self.name,
|
|
311
|
+
key=self.name,
|
|
312
|
+
comment=output.get("reasoning"),
|
|
313
|
+
**output,
|
|
284
314
|
)
|
|
285
315
|
if RUN_KEY in output:
|
|
286
316
|
# TODO: Not currently surfaced. Update
|
|
@@ -325,6 +355,7 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
|
|
|
325
355
|
feedback.evaluator_info[RUN_KEY] = output[RUN_KEY]
|
|
326
356
|
return feedback
|
|
327
357
|
|
|
358
|
+
@override
|
|
328
359
|
def evaluate_run(
|
|
329
360
|
self,
|
|
330
361
|
run: Run,
|
|
@@ -342,6 +373,7 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
|
|
|
342
373
|
# TODO: Add run ID once we can declare it via callbacks
|
|
343
374
|
)
|
|
344
375
|
|
|
376
|
+
@override
|
|
345
377
|
async def aevaluate_run(
|
|
346
378
|
self,
|
|
347
379
|
run: Run,
|
|
@@ -351,7 +383,8 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
|
|
|
351
383
|
"""Evaluate an example."""
|
|
352
384
|
try:
|
|
353
385
|
result = await self.acall(
|
|
354
|
-
{"run": run, "example": example},
|
|
386
|
+
{"run": run, "example": example},
|
|
387
|
+
include_run_info=True,
|
|
355
388
|
)
|
|
356
389
|
return self._prepare_evaluator_output(result)
|
|
357
390
|
except Exception as e:
|
|
@@ -402,12 +435,12 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
|
|
|
402
435
|
run_mapper: StringRunMapper = LLMStringRunMapper()
|
|
403
436
|
elif run_type == "chain":
|
|
404
437
|
run_mapper = ChainStringRunMapper(
|
|
405
|
-
input_key=input_key,
|
|
438
|
+
input_key=input_key,
|
|
439
|
+
prediction_key=prediction_key,
|
|
406
440
|
)
|
|
407
441
|
else:
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
)
|
|
442
|
+
msg = f"Unsupported run type {run_type}. Expected one of 'llm' or 'chain'."
|
|
443
|
+
raise ValueError(msg)
|
|
411
444
|
|
|
412
445
|
# Configure how example rows are fed as a reference string to the evaluator
|
|
413
446
|
if (
|
|
@@ -417,11 +450,12 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
|
|
|
417
450
|
):
|
|
418
451
|
example_mapper = StringExampleMapper(reference_key=reference_key)
|
|
419
452
|
elif evaluator.requires_reference:
|
|
420
|
-
|
|
453
|
+
msg = (
|
|
421
454
|
f"Evaluator {evaluator.evaluation_name} requires a reference"
|
|
422
455
|
" example from the dataset. Please specify the reference key from"
|
|
423
456
|
" amongst the dataset outputs keys."
|
|
424
457
|
)
|
|
458
|
+
raise ValueError(msg)
|
|
425
459
|
else:
|
|
426
460
|
example_mapper = None
|
|
427
461
|
return cls(
|
langchain/storage/__init__.py
CHANGED
|
@@ -44,8 +44,6 @@ def __getattr__(name: str) -> Any:
|
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
__all__ = [
|
|
47
|
-
"create_kv_docstore",
|
|
48
|
-
"create_lc_store",
|
|
49
47
|
"EncoderBackedStore",
|
|
50
48
|
"InMemoryByteStore",
|
|
51
49
|
"InMemoryStore",
|
|
@@ -54,4 +52,6 @@ __all__ = [
|
|
|
54
52
|
"RedisStore",
|
|
55
53
|
"UpstashRedisByteStore",
|
|
56
54
|
"UpstashRedisStore",
|
|
55
|
+
"create_kv_docstore",
|
|
56
|
+
"create_lc_store",
|
|
57
57
|
]
|
langchain/storage/_lc_store.py
CHANGED
|
@@ -17,7 +17,8 @@ def _dump_as_bytes(obj: Serializable) -> bytes:
|
|
|
17
17
|
def _dump_document_as_bytes(obj: Document) -> bytes:
|
|
18
18
|
"""Return a bytes representation of a document."""
|
|
19
19
|
if not isinstance(obj, Document):
|
|
20
|
-
|
|
20
|
+
msg = "Expected a Document instance"
|
|
21
|
+
raise TypeError(msg)
|
|
21
22
|
return dumps(obj).encode("utf-8")
|
|
22
23
|
|
|
23
24
|
|
|
@@ -25,7 +26,8 @@ def _load_document_from_bytes(serialized: bytes) -> Document:
|
|
|
25
26
|
"""Return a document from a bytes representation."""
|
|
26
27
|
obj = loads(serialized.decode("utf-8"))
|
|
27
28
|
if not isinstance(obj, Document):
|
|
28
|
-
|
|
29
|
+
msg = f"Expected a Document instance. Got {type(obj)}"
|
|
30
|
+
raise TypeError(msg)
|
|
29
31
|
return obj
|
|
30
32
|
|
|
31
33
|
|
|
@@ -46,6 +46,7 @@ class EncoderBackedStore(BaseStore[K, V]):
|
|
|
46
46
|
store.mset([(1, 3.14), (2, 2.718)])
|
|
47
47
|
values = store.mget([1, 2]) # Retrieves [3.14, 2.718]
|
|
48
48
|
store.mdelete([1, 2]) # Deletes the keys 1 and 2
|
|
49
|
+
|
|
49
50
|
"""
|
|
50
51
|
|
|
51
52
|
def __init__(
|
|
@@ -106,7 +107,9 @@ class EncoderBackedStore(BaseStore[K, V]):
|
|
|
106
107
|
await self.store.amdelete(encoded_keys)
|
|
107
108
|
|
|
108
109
|
def yield_keys(
|
|
109
|
-
self,
|
|
110
|
+
self,
|
|
111
|
+
*,
|
|
112
|
+
prefix: Optional[str] = None,
|
|
110
113
|
) -> Union[Iterator[K], Iterator[str]]:
|
|
111
114
|
"""Get an iterator over keys that match the given prefix."""
|
|
112
115
|
# For the time being this does not return K, but str
|
|
@@ -114,7 +117,9 @@ class EncoderBackedStore(BaseStore[K, V]):
|
|
|
114
117
|
yield from self.store.yield_keys(prefix=prefix)
|
|
115
118
|
|
|
116
119
|
async def ayield_keys(
|
|
117
|
-
self,
|
|
120
|
+
self,
|
|
121
|
+
*,
|
|
122
|
+
prefix: Optional[str] = None,
|
|
118
123
|
) -> Union[AsyncIterator[K], AsyncIterator[str]]:
|
|
119
124
|
"""Get an iterator over keys that match the given prefix."""
|
|
120
125
|
# For the time being this does not return K, but str
|
langchain/storage/file_system.py
CHANGED
|
@@ -75,34 +75,37 @@ class LocalFileStore(ByteStore):
|
|
|
75
75
|
Path: The full path for the given key.
|
|
76
76
|
"""
|
|
77
77
|
if not re.match(r"^[a-zA-Z0-9_.\-/]+$", key):
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
78
|
+
msg = f"Invalid characters in key: {key}"
|
|
79
|
+
raise InvalidKeyException(msg)
|
|
80
|
+
full_path = (self.root_path / key).resolve()
|
|
81
|
+
root_path = self.root_path.resolve()
|
|
82
|
+
common_path = os.path.commonpath([root_path, full_path])
|
|
83
|
+
if common_path != str(root_path):
|
|
84
|
+
msg = (
|
|
85
|
+
f"Invalid key: {key}. Key should be relative to the full path. "
|
|
86
|
+
f"{root_path} vs. {common_path} and full path of {full_path}"
|
|
85
87
|
)
|
|
88
|
+
raise InvalidKeyException(msg)
|
|
86
89
|
|
|
87
|
-
return
|
|
90
|
+
return full_path
|
|
88
91
|
|
|
89
|
-
def _mkdir_for_store(self,
|
|
92
|
+
def _mkdir_for_store(self, dir_path: Path) -> None:
|
|
90
93
|
"""Makes a store directory path (including parents) with specified permissions
|
|
91
94
|
|
|
92
95
|
This is needed because `Path.mkdir()` is restricted by the current `umask`,
|
|
93
96
|
whereas the explicit `os.chmod()` used here is not.
|
|
94
97
|
|
|
95
98
|
Args:
|
|
96
|
-
|
|
99
|
+
dir_path: (Path) The store directory to make
|
|
97
100
|
|
|
98
101
|
Returns:
|
|
99
102
|
None
|
|
100
103
|
"""
|
|
101
|
-
if not
|
|
102
|
-
self._mkdir_for_store(
|
|
103
|
-
|
|
104
|
+
if not dir_path.exists():
|
|
105
|
+
self._mkdir_for_store(dir_path.parent)
|
|
106
|
+
dir_path.mkdir(exist_ok=True)
|
|
104
107
|
if self.chmod_dir is not None:
|
|
105
|
-
|
|
108
|
+
dir_path.chmod(self.chmod_dir)
|
|
106
109
|
|
|
107
110
|
def mget(self, keys: Sequence[str]) -> list[Optional[bytes]]:
|
|
108
111
|
"""Get the values associated with the given keys.
|
|
@@ -122,7 +125,7 @@ class LocalFileStore(ByteStore):
|
|
|
122
125
|
values.append(value)
|
|
123
126
|
if self.update_atime:
|
|
124
127
|
# update access time only; preserve modified time
|
|
125
|
-
os.utime(full_path, (time.time(),
|
|
128
|
+
os.utime(full_path, (time.time(), full_path.stat().st_mtime))
|
|
126
129
|
else:
|
|
127
130
|
values.append(None)
|
|
128
131
|
return values
|
|
@@ -141,7 +144,7 @@ class LocalFileStore(ByteStore):
|
|
|
141
144
|
self._mkdir_for_store(full_path.parent)
|
|
142
145
|
full_path.write_bytes(value)
|
|
143
146
|
if self.chmod_file is not None:
|
|
144
|
-
|
|
147
|
+
full_path.chmod(self.chmod_file)
|
|
145
148
|
|
|
146
149
|
def mdelete(self, keys: Sequence[str]) -> None:
|
|
147
150
|
"""Delete the given keys and their associated values.
|
langchain/storage/in_memory.py
CHANGED
langchain/text_splitter.py
CHANGED
|
@@ -27,24 +27,24 @@ from langchain_text_splitters.sentence_transformers import (
|
|
|
27
27
|
from langchain_text_splitters.spacy import SpacyTextSplitter
|
|
28
28
|
|
|
29
29
|
__all__ = [
|
|
30
|
-
"
|
|
31
|
-
"TextSplitter",
|
|
32
|
-
"Tokenizer",
|
|
33
|
-
"Language",
|
|
34
|
-
"RecursiveCharacterTextSplitter",
|
|
35
|
-
"RecursiveJsonSplitter",
|
|
36
|
-
"LatexTextSplitter",
|
|
37
|
-
"PythonCodeTextSplitter",
|
|
38
|
-
"KonlpyTextSplitter",
|
|
39
|
-
"SpacyTextSplitter",
|
|
40
|
-
"NLTKTextSplitter",
|
|
41
|
-
"split_text_on_tokens",
|
|
42
|
-
"SentenceTransformersTokenTextSplitter",
|
|
30
|
+
"CharacterTextSplitter",
|
|
43
31
|
"ElementType",
|
|
32
|
+
"HTMLHeaderTextSplitter",
|
|
44
33
|
"HeaderType",
|
|
34
|
+
"KonlpyTextSplitter",
|
|
35
|
+
"Language",
|
|
36
|
+
"LatexTextSplitter",
|
|
45
37
|
"LineType",
|
|
46
|
-
"HTMLHeaderTextSplitter",
|
|
47
38
|
"MarkdownHeaderTextSplitter",
|
|
48
39
|
"MarkdownTextSplitter",
|
|
49
|
-
"
|
|
40
|
+
"NLTKTextSplitter",
|
|
41
|
+
"PythonCodeTextSplitter",
|
|
42
|
+
"RecursiveCharacterTextSplitter",
|
|
43
|
+
"RecursiveJsonSplitter",
|
|
44
|
+
"SentenceTransformersTokenTextSplitter",
|
|
45
|
+
"SpacyTextSplitter",
|
|
46
|
+
"TextSplitter",
|
|
47
|
+
"TokenTextSplitter",
|
|
48
|
+
"Tokenizer",
|
|
49
|
+
"split_text_on_tokens",
|
|
50
50
|
]
|