langchain 0.4.0.dev0__py3-none-any.whl → 1.0.0a2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of langchain might be problematic. Click here for more details.
- langchain/__init__.py +7 -434
- langchain/_internal/_documents.py +35 -0
- langchain/_internal/_lazy_import.py +36 -0
- langchain/_internal/_prompts.py +165 -0
- langchain/_internal/_typing.py +70 -0
- langchain/_internal/_utils.py +7 -0
- langchain/agents/__init__.py +5 -179
- langchain/agents/_internal/__init__.py +1 -0
- langchain/agents/_internal/_typing.py +13 -0
- langchain/agents/interrupt.py +92 -0
- langchain/agents/react_agent.py +1175 -0
- langchain/agents/structured_output.py +403 -0
- langchain/agents/tool_node.py +1174 -0
- langchain/chat_models/__init__.py +2 -75
- langchain/chat_models/base.py +138 -208
- langchain/{docstore/document.py → documents/__init__.py} +3 -1
- langchain/embeddings/__init__.py +2 -218
- langchain/embeddings/base.py +6 -13
- langchain/embeddings/cache.py +16 -19
- langchain/globals.py +4 -166
- langchain/storage/__init__.py +0 -35
- langchain/storage/encoder_backed.py +9 -19
- langchain/tools/__init__.py +8 -201
- {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a2.dist-info}/METADATA +20 -26
- langchain-1.0.0a2.dist-info/RECORD +33 -0
- langchain/_api/__init__.py +0 -28
- langchain/_api/deprecation.py +0 -32
- langchain/_api/interactive_env.py +0 -5
- langchain/_api/module_import.py +0 -153
- langchain/_api/path.py +0 -3
- langchain/adapters/openai.py +0 -63
- langchain/agents/agent.py +0 -1824
- langchain/agents/agent_iterator.py +0 -438
- langchain/agents/agent_toolkits/__init__.py +0 -167
- langchain/agents/agent_toolkits/ainetwork/__init__.py +0 -1
- langchain/agents/agent_toolkits/ainetwork/toolkit.py +0 -25
- langchain/agents/agent_toolkits/amadeus/toolkit.py +0 -23
- langchain/agents/agent_toolkits/azure_cognitive_services.py +0 -29
- langchain/agents/agent_toolkits/base.py +0 -3
- langchain/agents/agent_toolkits/clickup/__init__.py +0 -0
- langchain/agents/agent_toolkits/clickup/toolkit.py +0 -25
- langchain/agents/agent_toolkits/conversational_retrieval/__init__.py +0 -0
- langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +0 -87
- langchain/agents/agent_toolkits/conversational_retrieval/tool.py +0 -3
- langchain/agents/agent_toolkits/csv/__init__.py +0 -28
- langchain/agents/agent_toolkits/file_management/__init__.py +0 -31
- langchain/agents/agent_toolkits/file_management/toolkit.py +0 -29
- langchain/agents/agent_toolkits/github/__init__.py +0 -1
- langchain/agents/agent_toolkits/github/toolkit.py +0 -69
- langchain/agents/agent_toolkits/gitlab/__init__.py +0 -1
- langchain/agents/agent_toolkits/gitlab/toolkit.py +0 -25
- langchain/agents/agent_toolkits/gmail/__init__.py +0 -1
- langchain/agents/agent_toolkits/gmail/toolkit.py +0 -23
- langchain/agents/agent_toolkits/jira/__init__.py +0 -1
- langchain/agents/agent_toolkits/jira/toolkit.py +0 -23
- langchain/agents/agent_toolkits/json/__init__.py +0 -1
- langchain/agents/agent_toolkits/json/base.py +0 -25
- langchain/agents/agent_toolkits/json/prompt.py +0 -24
- langchain/agents/agent_toolkits/json/toolkit.py +0 -23
- langchain/agents/agent_toolkits/multion/__init__.py +0 -1
- langchain/agents/agent_toolkits/multion/toolkit.py +0 -25
- langchain/agents/agent_toolkits/nasa/__init__.py +0 -1
- langchain/agents/agent_toolkits/nasa/toolkit.py +0 -23
- langchain/agents/agent_toolkits/nla/__init__.py +0 -0
- langchain/agents/agent_toolkits/nla/tool.py +0 -23
- langchain/agents/agent_toolkits/nla/toolkit.py +0 -23
- langchain/agents/agent_toolkits/office365/__init__.py +0 -1
- langchain/agents/agent_toolkits/office365/toolkit.py +0 -25
- langchain/agents/agent_toolkits/openapi/__init__.py +0 -1
- langchain/agents/agent_toolkits/openapi/base.py +0 -25
- langchain/agents/agent_toolkits/openapi/planner.py +0 -52
- langchain/agents/agent_toolkits/openapi/planner_prompt.py +0 -103
- langchain/agents/agent_toolkits/openapi/prompt.py +0 -29
- langchain/agents/agent_toolkits/openapi/spec.py +0 -30
- langchain/agents/agent_toolkits/openapi/toolkit.py +0 -30
- langchain/agents/agent_toolkits/pandas/__init__.py +0 -28
- langchain/agents/agent_toolkits/playwright/__init__.py +0 -29
- langchain/agents/agent_toolkits/playwright/toolkit.py +0 -27
- langchain/agents/agent_toolkits/powerbi/__init__.py +0 -1
- langchain/agents/agent_toolkits/powerbi/base.py +0 -25
- langchain/agents/agent_toolkits/powerbi/chat_base.py +0 -27
- langchain/agents/agent_toolkits/powerbi/prompt.py +0 -36
- langchain/agents/agent_toolkits/powerbi/toolkit.py +0 -25
- langchain/agents/agent_toolkits/python/__init__.py +0 -28
- langchain/agents/agent_toolkits/slack/__init__.py +0 -1
- langchain/agents/agent_toolkits/slack/toolkit.py +0 -23
- langchain/agents/agent_toolkits/spark/__init__.py +0 -28
- langchain/agents/agent_toolkits/spark_sql/__init__.py +0 -1
- langchain/agents/agent_toolkits/spark_sql/base.py +0 -25
- langchain/agents/agent_toolkits/spark_sql/prompt.py +0 -27
- langchain/agents/agent_toolkits/spark_sql/toolkit.py +0 -25
- langchain/agents/agent_toolkits/sql/__init__.py +0 -1
- langchain/agents/agent_toolkits/sql/base.py +0 -23
- langchain/agents/agent_toolkits/sql/prompt.py +0 -29
- langchain/agents/agent_toolkits/sql/toolkit.py +0 -25
- langchain/agents/agent_toolkits/steam/__init__.py +0 -1
- langchain/agents/agent_toolkits/steam/toolkit.py +0 -23
- langchain/agents/agent_toolkits/vectorstore/__init__.py +0 -1
- langchain/agents/agent_toolkits/vectorstore/base.py +0 -219
- langchain/agents/agent_toolkits/vectorstore/prompt.py +0 -11
- langchain/agents/agent_toolkits/vectorstore/toolkit.py +0 -97
- langchain/agents/agent_toolkits/xorbits/__init__.py +0 -28
- langchain/agents/agent_toolkits/zapier/__init__.py +0 -1
- langchain/agents/agent_toolkits/zapier/toolkit.py +0 -25
- langchain/agents/agent_types.py +0 -57
- langchain/agents/chat/__init__.py +0 -0
- langchain/agents/chat/base.py +0 -180
- langchain/agents/chat/output_parser.py +0 -74
- langchain/agents/chat/prompt.py +0 -29
- langchain/agents/conversational/__init__.py +0 -1
- langchain/agents/conversational/base.py +0 -178
- langchain/agents/conversational/output_parser.py +0 -51
- langchain/agents/conversational/prompt.py +0 -35
- langchain/agents/conversational_chat/__init__.py +0 -1
- langchain/agents/conversational_chat/base.py +0 -183
- langchain/agents/conversational_chat/output_parser.py +0 -57
- langchain/agents/conversational_chat/prompt.py +0 -56
- langchain/agents/format_scratchpad/__init__.py +0 -25
- langchain/agents/format_scratchpad/log.py +0 -25
- langchain/agents/format_scratchpad/log_to_messages.py +0 -26
- langchain/agents/format_scratchpad/openai_functions.py +0 -80
- langchain/agents/format_scratchpad/openai_tools.py +0 -5
- langchain/agents/format_scratchpad/tools.py +0 -65
- langchain/agents/format_scratchpad/xml.py +0 -52
- langchain/agents/initialize.py +0 -105
- langchain/agents/json_chat/__init__.py +0 -0
- langchain/agents/json_chat/base.py +0 -196
- langchain/agents/json_chat/prompt.py +0 -8
- langchain/agents/load_tools.py +0 -13
- langchain/agents/loading.py +0 -148
- langchain/agents/mrkl/__init__.py +0 -1
- langchain/agents/mrkl/base.py +0 -218
- langchain/agents/mrkl/output_parser.py +0 -103
- langchain/agents/mrkl/prompt.py +0 -15
- langchain/agents/openai_assistant/__init__.py +0 -3
- langchain/agents/openai_assistant/base.py +0 -818
- langchain/agents/openai_functions_agent/__init__.py +0 -0
- langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +0 -103
- langchain/agents/openai_functions_agent/base.py +0 -382
- langchain/agents/openai_functions_multi_agent/__init__.py +0 -0
- langchain/agents/openai_functions_multi_agent/base.py +0 -337
- langchain/agents/openai_tools/__init__.py +0 -0
- langchain/agents/openai_tools/base.py +0 -109
- langchain/agents/output_parsers/__init__.py +0 -35
- langchain/agents/output_parsers/json.py +0 -64
- langchain/agents/output_parsers/openai_functions.py +0 -103
- langchain/agents/output_parsers/openai_tools.py +0 -77
- langchain/agents/output_parsers/react_json_single_input.py +0 -87
- langchain/agents/output_parsers/react_single_input.py +0 -102
- langchain/agents/output_parsers/self_ask.py +0 -53
- langchain/agents/output_parsers/tools.py +0 -121
- langchain/agents/output_parsers/xml.py +0 -126
- langchain/agents/react/__init__.py +0 -1
- langchain/agents/react/agent.py +0 -145
- langchain/agents/react/base.py +0 -189
- langchain/agents/react/output_parser.py +0 -35
- langchain/agents/react/textworld_prompt.py +0 -51
- langchain/agents/react/wiki_prompt.py +0 -70
- langchain/agents/schema.py +0 -37
- langchain/agents/self_ask_with_search/__init__.py +0 -4
- langchain/agents/self_ask_with_search/base.py +0 -219
- langchain/agents/self_ask_with_search/output_parser.py +0 -4
- langchain/agents/self_ask_with_search/prompt.py +0 -43
- langchain/agents/structured_chat/__init__.py +0 -0
- langchain/agents/structured_chat/base.py +0 -309
- langchain/agents/structured_chat/output_parser.py +0 -112
- langchain/agents/structured_chat/prompt.py +0 -34
- langchain/agents/tool_calling_agent/__init__.py +0 -0
- langchain/agents/tool_calling_agent/base.py +0 -111
- langchain/agents/tools.py +0 -50
- langchain/agents/types.py +0 -27
- langchain/agents/utils.py +0 -19
- langchain/agents/xml/__init__.py +0 -0
- langchain/agents/xml/base.py +0 -237
- langchain/agents/xml/prompt.py +0 -21
- langchain/base_language.py +0 -7
- langchain/cache.py +0 -72
- langchain/callbacks/__init__.py +0 -139
- langchain/callbacks/aim_callback.py +0 -33
- langchain/callbacks/argilla_callback.py +0 -25
- langchain/callbacks/arize_callback.py +0 -25
- langchain/callbacks/arthur_callback.py +0 -25
- langchain/callbacks/base.py +0 -29
- langchain/callbacks/clearml_callback.py +0 -25
- langchain/callbacks/comet_ml_callback.py +0 -25
- langchain/callbacks/confident_callback.py +0 -25
- langchain/callbacks/context_callback.py +0 -25
- langchain/callbacks/file.py +0 -3
- langchain/callbacks/flyte_callback.py +0 -25
- langchain/callbacks/human.py +0 -33
- langchain/callbacks/infino_callback.py +0 -25
- langchain/callbacks/labelstudio_callback.py +0 -33
- langchain/callbacks/llmonitor_callback.py +0 -27
- langchain/callbacks/manager.py +0 -89
- langchain/callbacks/mlflow_callback.py +0 -38
- langchain/callbacks/openai_info.py +0 -25
- langchain/callbacks/promptlayer_callback.py +0 -27
- langchain/callbacks/sagemaker_callback.py +0 -27
- langchain/callbacks/stdout.py +0 -3
- langchain/callbacks/streaming_aiter.py +0 -86
- langchain/callbacks/streaming_aiter_final_only.py +0 -100
- langchain/callbacks/streaming_stdout.py +0 -5
- langchain/callbacks/streaming_stdout_final_only.py +0 -96
- langchain/callbacks/streamlit/__init__.py +0 -86
- langchain/callbacks/streamlit/mutable_expander.py +0 -33
- langchain/callbacks/streamlit/streamlit_callback_handler.py +0 -49
- langchain/callbacks/tracers/__init__.py +0 -38
- langchain/callbacks/tracers/base.py +0 -6
- langchain/callbacks/tracers/comet.py +0 -30
- langchain/callbacks/tracers/evaluation.py +0 -8
- langchain/callbacks/tracers/langchain.py +0 -8
- langchain/callbacks/tracers/langchain_v1.py +0 -3
- langchain/callbacks/tracers/log_stream.py +0 -9
- langchain/callbacks/tracers/logging.py +0 -57
- langchain/callbacks/tracers/root_listeners.py +0 -3
- langchain/callbacks/tracers/run_collector.py +0 -3
- langchain/callbacks/tracers/schemas.py +0 -27
- langchain/callbacks/tracers/stdout.py +0 -6
- langchain/callbacks/tracers/wandb.py +0 -27
- langchain/callbacks/trubrics_callback.py +0 -25
- langchain/callbacks/utils.py +0 -48
- langchain/callbacks/wandb_callback.py +0 -25
- langchain/callbacks/whylabs_callback.py +0 -25
- langchain/chains/__init__.py +0 -96
- langchain/chains/api/__init__.py +0 -1
- langchain/chains/api/base.py +0 -398
- langchain/chains/api/news_docs.py +0 -31
- langchain/chains/api/open_meteo_docs.py +0 -32
- langchain/chains/api/openapi/__init__.py +0 -0
- langchain/chains/api/openapi/chain.py +0 -23
- langchain/chains/api/openapi/prompts.py +0 -27
- langchain/chains/api/openapi/requests_chain.py +0 -29
- langchain/chains/api/openapi/response_chain.py +0 -29
- langchain/chains/api/podcast_docs.py +0 -27
- langchain/chains/api/prompt.py +0 -35
- langchain/chains/api/tmdb_docs.py +0 -36
- langchain/chains/base.py +0 -806
- langchain/chains/chat_vector_db/__init__.py +0 -0
- langchain/chains/chat_vector_db/prompts.py +0 -19
- langchain/chains/combine_documents/__init__.py +0 -15
- langchain/chains/combine_documents/base.py +0 -293
- langchain/chains/combine_documents/map_reduce.py +0 -303
- langchain/chains/combine_documents/map_rerank.py +0 -249
- langchain/chains/combine_documents/reduce.py +0 -382
- langchain/chains/combine_documents/refine.py +0 -237
- langchain/chains/combine_documents/stuff.py +0 -292
- langchain/chains/constitutional_ai/__init__.py +0 -2
- langchain/chains/constitutional_ai/base.py +0 -328
- langchain/chains/constitutional_ai/models.py +0 -11
- langchain/chains/constitutional_ai/principles.py +0 -278
- langchain/chains/constitutional_ai/prompts.py +0 -120
- langchain/chains/conversation/__init__.py +0 -1
- langchain/chains/conversation/base.py +0 -146
- langchain/chains/conversation/memory.py +0 -45
- langchain/chains/conversation/prompt.py +0 -28
- langchain/chains/conversational_retrieval/__init__.py +0 -1
- langchain/chains/conversational_retrieval/base.py +0 -576
- langchain/chains/conversational_retrieval/prompts.py +0 -19
- langchain/chains/elasticsearch_database/__init__.py +0 -3
- langchain/chains/elasticsearch_database/base.py +0 -212
- langchain/chains/elasticsearch_database/prompts.py +0 -35
- langchain/chains/ernie_functions/__init__.py +0 -44
- langchain/chains/ernie_functions/base.py +0 -49
- langchain/chains/example_generator.py +0 -22
- langchain/chains/flare/__init__.py +0 -1
- langchain/chains/flare/base.py +0 -284
- langchain/chains/flare/prompts.py +0 -46
- langchain/chains/graph_qa/__init__.py +0 -0
- langchain/chains/graph_qa/arangodb.py +0 -23
- langchain/chains/graph_qa/base.py +0 -23
- langchain/chains/graph_qa/cypher.py +0 -39
- langchain/chains/graph_qa/cypher_utils.py +0 -27
- langchain/chains/graph_qa/falkordb.py +0 -29
- langchain/chains/graph_qa/gremlin.py +0 -36
- langchain/chains/graph_qa/hugegraph.py +0 -23
- langchain/chains/graph_qa/kuzu.py +0 -29
- langchain/chains/graph_qa/nebulagraph.py +0 -23
- langchain/chains/graph_qa/neptune_cypher.py +0 -39
- langchain/chains/graph_qa/neptune_sparql.py +0 -36
- langchain/chains/graph_qa/ontotext_graphdb.py +0 -25
- langchain/chains/graph_qa/prompts.py +0 -96
- langchain/chains/graph_qa/sparql.py +0 -23
- langchain/chains/history_aware_retriever.py +0 -68
- langchain/chains/hyde/__init__.py +0 -4
- langchain/chains/hyde/base.py +0 -124
- langchain/chains/hyde/prompts.py +0 -46
- langchain/chains/llm.py +0 -447
- langchain/chains/llm_bash/__init__.py +0 -10
- langchain/chains/llm_checker/__init__.py +0 -4
- langchain/chains/llm_checker/base.py +0 -205
- langchain/chains/llm_checker/prompt.py +0 -30
- langchain/chains/llm_math/__init__.py +0 -4
- langchain/chains/llm_math/base.py +0 -319
- langchain/chains/llm_math/prompt.py +0 -43
- langchain/chains/llm_requests.py +0 -23
- langchain/chains/llm_summarization_checker/__init__.py +0 -7
- langchain/chains/llm_summarization_checker/base.py +0 -217
- langchain/chains/llm_summarization_checker/prompts/are_all_true_prompt.txt +0 -38
- langchain/chains/llm_summarization_checker/prompts/check_facts.txt +0 -10
- langchain/chains/llm_summarization_checker/prompts/create_facts.txt +0 -10
- langchain/chains/llm_summarization_checker/prompts/revise_summary.txt +0 -17
- langchain/chains/llm_symbolic_math/__init__.py +0 -10
- langchain/chains/loading.py +0 -734
- langchain/chains/mapreduce.py +0 -121
- langchain/chains/moderation.py +0 -135
- langchain/chains/natbot/__init__.py +0 -4
- langchain/chains/natbot/base.py +0 -165
- langchain/chains/natbot/crawler.py +0 -472
- langchain/chains/natbot/prompt.py +0 -143
- langchain/chains/openai_functions/__init__.py +0 -44
- langchain/chains/openai_functions/base.py +0 -237
- langchain/chains/openai_functions/citation_fuzzy_match.py +0 -169
- langchain/chains/openai_functions/extraction.py +0 -197
- langchain/chains/openai_functions/openapi.py +0 -409
- langchain/chains/openai_functions/qa_with_structure.py +0 -142
- langchain/chains/openai_functions/tagging.py +0 -174
- langchain/chains/openai_functions/utils.py +0 -40
- langchain/chains/openai_tools/__init__.py +0 -3
- langchain/chains/openai_tools/extraction.py +0 -79
- langchain/chains/prompt_selector.py +0 -65
- langchain/chains/qa_generation/__init__.py +0 -0
- langchain/chains/qa_generation/base.py +0 -128
- langchain/chains/qa_generation/prompt.py +0 -50
- langchain/chains/qa_with_sources/__init__.py +0 -5
- langchain/chains/qa_with_sources/base.py +0 -266
- langchain/chains/qa_with_sources/loading.py +0 -209
- langchain/chains/qa_with_sources/map_reduce_prompt.py +0 -54
- langchain/chains/qa_with_sources/refine_prompts.py +0 -37
- langchain/chains/qa_with_sources/retrieval.py +0 -75
- langchain/chains/qa_with_sources/stuff_prompt.py +0 -43
- langchain/chains/qa_with_sources/vector_db.py +0 -88
- langchain/chains/query_constructor/__init__.py +0 -3
- langchain/chains/query_constructor/base.py +0 -378
- langchain/chains/query_constructor/ir.py +0 -23
- langchain/chains/query_constructor/parser.py +0 -272
- langchain/chains/query_constructor/prompt.py +0 -226
- langchain/chains/query_constructor/schema.py +0 -14
- langchain/chains/question_answering/__init__.py +0 -6
- langchain/chains/question_answering/chain.py +0 -279
- langchain/chains/question_answering/map_reduce_prompt.py +0 -80
- langchain/chains/question_answering/map_rerank_prompt.py +0 -66
- langchain/chains/question_answering/refine_prompts.py +0 -72
- langchain/chains/question_answering/stuff_prompt.py +0 -33
- langchain/chains/retrieval.py +0 -67
- langchain/chains/retrieval_qa/__init__.py +0 -1
- langchain/chains/retrieval_qa/base.py +0 -374
- langchain/chains/retrieval_qa/prompt.py +0 -11
- langchain/chains/router/__init__.py +0 -12
- langchain/chains/router/base.py +0 -154
- langchain/chains/router/embedding_router.py +0 -96
- langchain/chains/router/llm_router.py +0 -198
- langchain/chains/router/multi_prompt.py +0 -184
- langchain/chains/router/multi_prompt_prompt.py +0 -32
- langchain/chains/router/multi_retrieval_prompt.py +0 -30
- langchain/chains/router/multi_retrieval_qa.py +0 -127
- langchain/chains/sequential.py +0 -220
- langchain/chains/sql_database/__init__.py +0 -1
- langchain/chains/sql_database/prompt.py +0 -282
- langchain/chains/sql_database/query.py +0 -167
- langchain/chains/structured_output/__init__.py +0 -6
- langchain/chains/structured_output/base.py +0 -584
- langchain/chains/summarize/__init__.py +0 -6
- langchain/chains/summarize/chain.py +0 -174
- langchain/chains/summarize/map_reduce_prompt.py +0 -10
- langchain/chains/summarize/refine_prompts.py +0 -23
- langchain/chains/summarize/stuff_prompt.py +0 -10
- langchain/chains/transform.py +0 -88
- langchain/chat_loaders/__init__.py +0 -19
- langchain/chat_loaders/base.py +0 -3
- langchain/chat_loaders/facebook_messenger.py +0 -32
- langchain/chat_loaders/gmail.py +0 -23
- langchain/chat_loaders/imessage.py +0 -23
- langchain/chat_loaders/langsmith.py +0 -30
- langchain/chat_loaders/slack.py +0 -23
- langchain/chat_loaders/telegram.py +0 -23
- langchain/chat_loaders/utils.py +0 -36
- langchain/chat_loaders/whatsapp.py +0 -23
- langchain/chat_models/anthropic.py +0 -30
- langchain/chat_models/anyscale.py +0 -23
- langchain/chat_models/azure_openai.py +0 -23
- langchain/chat_models/azureml_endpoint.py +0 -30
- langchain/chat_models/baichuan.py +0 -23
- langchain/chat_models/baidu_qianfan_endpoint.py +0 -27
- langchain/chat_models/bedrock.py +0 -27
- langchain/chat_models/cohere.py +0 -23
- langchain/chat_models/databricks.py +0 -23
- langchain/chat_models/ernie.py +0 -23
- langchain/chat_models/everlyai.py +0 -23
- langchain/chat_models/fake.py +0 -30
- langchain/chat_models/fireworks.py +0 -23
- langchain/chat_models/gigachat.py +0 -23
- langchain/chat_models/google_palm.py +0 -30
- langchain/chat_models/human.py +0 -23
- langchain/chat_models/hunyuan.py +0 -23
- langchain/chat_models/javelin_ai_gateway.py +0 -30
- langchain/chat_models/jinachat.py +0 -23
- langchain/chat_models/konko.py +0 -23
- langchain/chat_models/litellm.py +0 -30
- langchain/chat_models/meta.py +0 -25
- langchain/chat_models/minimax.py +0 -23
- langchain/chat_models/mlflow.py +0 -23
- langchain/chat_models/mlflow_ai_gateway.py +0 -30
- langchain/chat_models/ollama.py +0 -23
- langchain/chat_models/openai.py +0 -23
- langchain/chat_models/pai_eas_endpoint.py +0 -25
- langchain/chat_models/promptlayer_openai.py +0 -25
- langchain/chat_models/tongyi.py +0 -23
- langchain/chat_models/vertexai.py +0 -23
- langchain/chat_models/volcengine_maas.py +0 -30
- langchain/chat_models/yandex.py +0 -23
- langchain/docstore/__init__.py +0 -48
- langchain/docstore/arbitrary_fn.py +0 -23
- langchain/docstore/base.py +0 -27
- langchain/docstore/in_memory.py +0 -23
- langchain/docstore/wikipedia.py +0 -23
- langchain/document_loaders/__init__.py +0 -553
- langchain/document_loaders/acreom.py +0 -23
- langchain/document_loaders/airbyte.py +0 -48
- langchain/document_loaders/airbyte_json.py +0 -23
- langchain/document_loaders/airtable.py +0 -23
- langchain/document_loaders/apify_dataset.py +0 -23
- langchain/document_loaders/arcgis_loader.py +0 -23
- langchain/document_loaders/arxiv.py +0 -23
- langchain/document_loaders/assemblyai.py +0 -28
- langchain/document_loaders/async_html.py +0 -23
- langchain/document_loaders/azlyrics.py +0 -23
- langchain/document_loaders/azure_ai_data.py +0 -23
- langchain/document_loaders/azure_blob_storage_container.py +0 -25
- langchain/document_loaders/azure_blob_storage_file.py +0 -25
- langchain/document_loaders/baiducloud_bos_directory.py +0 -29
- langchain/document_loaders/baiducloud_bos_file.py +0 -27
- langchain/document_loaders/base.py +0 -3
- langchain/document_loaders/base_o365.py +0 -23
- langchain/document_loaders/bibtex.py +0 -23
- langchain/document_loaders/bigquery.py +0 -23
- langchain/document_loaders/bilibili.py +0 -23
- langchain/document_loaders/blackboard.py +0 -23
- langchain/document_loaders/blob_loaders/__init__.py +0 -36
- langchain/document_loaders/blob_loaders/file_system.py +0 -23
- langchain/document_loaders/blob_loaders/schema.py +0 -26
- langchain/document_loaders/blob_loaders/youtube_audio.py +0 -23
- langchain/document_loaders/blockchain.py +0 -28
- langchain/document_loaders/brave_search.py +0 -23
- langchain/document_loaders/browserless.py +0 -23
- langchain/document_loaders/chatgpt.py +0 -28
- langchain/document_loaders/chromium.py +0 -23
- langchain/document_loaders/college_confidential.py +0 -25
- langchain/document_loaders/concurrent.py +0 -23
- langchain/document_loaders/confluence.py +0 -28
- langchain/document_loaders/conllu.py +0 -23
- langchain/document_loaders/couchbase.py +0 -23
- langchain/document_loaders/csv_loader.py +0 -27
- langchain/document_loaders/cube_semantic.py +0 -23
- langchain/document_loaders/datadog_logs.py +0 -23
- langchain/document_loaders/dataframe.py +0 -28
- langchain/document_loaders/diffbot.py +0 -23
- langchain/document_loaders/directory.py +0 -23
- langchain/document_loaders/discord.py +0 -23
- langchain/document_loaders/docugami.py +0 -23
- langchain/document_loaders/docusaurus.py +0 -23
- langchain/document_loaders/dropbox.py +0 -23
- langchain/document_loaders/duckdb_loader.py +0 -23
- langchain/document_loaders/email.py +0 -30
- langchain/document_loaders/epub.py +0 -23
- langchain/document_loaders/etherscan.py +0 -23
- langchain/document_loaders/evernote.py +0 -23
- langchain/document_loaders/excel.py +0 -23
- langchain/document_loaders/facebook_chat.py +0 -28
- langchain/document_loaders/fauna.py +0 -23
- langchain/document_loaders/figma.py +0 -23
- langchain/document_loaders/gcs_directory.py +0 -23
- langchain/document_loaders/gcs_file.py +0 -23
- langchain/document_loaders/generic.py +0 -23
- langchain/document_loaders/geodataframe.py +0 -23
- langchain/document_loaders/git.py +0 -23
- langchain/document_loaders/gitbook.py +0 -23
- langchain/document_loaders/github.py +0 -28
- langchain/document_loaders/google_speech_to_text.py +0 -23
- langchain/document_loaders/googledrive.py +0 -23
- langchain/document_loaders/gutenberg.py +0 -23
- langchain/document_loaders/helpers.py +0 -30
- langchain/document_loaders/hn.py +0 -23
- langchain/document_loaders/html.py +0 -23
- langchain/document_loaders/html_bs.py +0 -23
- langchain/document_loaders/hugging_face_dataset.py +0 -23
- langchain/document_loaders/ifixit.py +0 -23
- langchain/document_loaders/image.py +0 -23
- langchain/document_loaders/image_captions.py +0 -23
- langchain/document_loaders/imsdb.py +0 -23
- langchain/document_loaders/iugu.py +0 -23
- langchain/document_loaders/joplin.py +0 -23
- langchain/document_loaders/json_loader.py +0 -23
- langchain/document_loaders/lakefs.py +0 -33
- langchain/document_loaders/larksuite.py +0 -23
- langchain/document_loaders/markdown.py +0 -25
- langchain/document_loaders/mastodon.py +0 -23
- langchain/document_loaders/max_compute.py +0 -23
- langchain/document_loaders/mediawikidump.py +0 -23
- langchain/document_loaders/merge.py +0 -23
- langchain/document_loaders/mhtml.py +0 -23
- langchain/document_loaders/modern_treasury.py +0 -23
- langchain/document_loaders/mongodb.py +0 -23
- langchain/document_loaders/news.py +0 -23
- langchain/document_loaders/notebook.py +0 -33
- langchain/document_loaders/notion.py +0 -23
- langchain/document_loaders/notiondb.py +0 -23
- langchain/document_loaders/nuclia.py +0 -23
- langchain/document_loaders/obs_directory.py +0 -23
- langchain/document_loaders/obs_file.py +0 -23
- langchain/document_loaders/obsidian.py +0 -23
- langchain/document_loaders/odt.py +0 -23
- langchain/document_loaders/onedrive.py +0 -23
- langchain/document_loaders/onedrive_file.py +0 -23
- langchain/document_loaders/onenote.py +0 -23
- langchain/document_loaders/open_city_data.py +0 -23
- langchain/document_loaders/org_mode.py +0 -25
- langchain/document_loaders/parsers/__init__.py +0 -58
- langchain/document_loaders/parsers/audio.py +0 -33
- langchain/document_loaders/parsers/docai.py +0 -30
- langchain/document_loaders/parsers/generic.py +0 -25
- langchain/document_loaders/parsers/grobid.py +0 -30
- langchain/document_loaders/parsers/html/__init__.py +0 -25
- langchain/document_loaders/parsers/html/bs4.py +0 -25
- langchain/document_loaders/parsers/language/__init__.py +0 -29
- langchain/document_loaders/parsers/language/cobol.py +0 -27
- langchain/document_loaders/parsers/language/code_segmenter.py +0 -29
- langchain/document_loaders/parsers/language/javascript.py +0 -29
- langchain/document_loaders/parsers/language/language_parser.py +0 -29
- langchain/document_loaders/parsers/language/python.py +0 -27
- langchain/document_loaders/parsers/msword.py +0 -25
- langchain/document_loaders/parsers/pdf.py +0 -50
- langchain/document_loaders/parsers/registry.py +0 -25
- langchain/document_loaders/parsers/txt.py +0 -23
- langchain/document_loaders/pdf.py +0 -65
- langchain/document_loaders/polars_dataframe.py +0 -23
- langchain/document_loaders/powerpoint.py +0 -25
- langchain/document_loaders/psychic.py +0 -23
- langchain/document_loaders/pubmed.py +0 -23
- langchain/document_loaders/pyspark_dataframe.py +0 -26
- langchain/document_loaders/python.py +0 -22
- langchain/document_loaders/quip.py +0 -23
- langchain/document_loaders/readthedocs.py +0 -23
- langchain/document_loaders/recursive_url_loader.py +0 -23
- langchain/document_loaders/reddit.py +0 -23
- langchain/document_loaders/roam.py +0 -23
- langchain/document_loaders/rocksetdb.py +0 -23
- langchain/document_loaders/rspace.py +0 -23
- langchain/document_loaders/rss.py +0 -23
- langchain/document_loaders/rst.py +0 -23
- langchain/document_loaders/rtf.py +0 -23
- langchain/document_loaders/s3_directory.py +0 -23
- langchain/document_loaders/s3_file.py +0 -23
- langchain/document_loaders/sharepoint.py +0 -23
- langchain/document_loaders/sitemap.py +0 -23
- langchain/document_loaders/slack_directory.py +0 -23
- langchain/document_loaders/snowflake_loader.py +0 -23
- langchain/document_loaders/spreedly.py +0 -23
- langchain/document_loaders/srt.py +0 -23
- langchain/document_loaders/stripe.py +0 -23
- langchain/document_loaders/telegram.py +0 -38
- langchain/document_loaders/tencent_cos_directory.py +0 -25
- langchain/document_loaders/tencent_cos_file.py +0 -23
- langchain/document_loaders/tensorflow_datasets.py +0 -23
- langchain/document_loaders/text.py +0 -23
- langchain/document_loaders/tomarkdown.py +0 -23
- langchain/document_loaders/toml.py +0 -23
- langchain/document_loaders/trello.py +0 -23
- langchain/document_loaders/tsv.py +0 -23
- langchain/document_loaders/twitter.py +0 -23
- langchain/document_loaders/unstructured.py +0 -54
- langchain/document_loaders/url.py +0 -23
- langchain/document_loaders/url_playwright.py +0 -33
- langchain/document_loaders/url_selenium.py +0 -23
- langchain/document_loaders/weather.py +0 -23
- langchain/document_loaders/web_base.py +0 -23
- langchain/document_loaders/whatsapp_chat.py +0 -28
- langchain/document_loaders/wikipedia.py +0 -23
- langchain/document_loaders/word_document.py +0 -30
- langchain/document_loaders/xml.py +0 -23
- langchain/document_loaders/xorbits.py +0 -23
- langchain/document_loaders/youtube.py +0 -33
- langchain/document_transformers/__init__.py +0 -77
- langchain/document_transformers/beautiful_soup_transformer.py +0 -25
- langchain/document_transformers/doctran_text_extract.py +0 -25
- langchain/document_transformers/doctran_text_qa.py +0 -25
- langchain/document_transformers/doctran_text_translate.py +0 -25
- langchain/document_transformers/embeddings_redundant_filter.py +0 -50
- langchain/document_transformers/google_translate.py +0 -25
- langchain/document_transformers/html2text.py +0 -25
- langchain/document_transformers/long_context_reorder.py +0 -23
- langchain/document_transformers/nuclia_text_transform.py +0 -25
- langchain/document_transformers/openai_functions.py +0 -32
- langchain/document_transformers/xsl/html_chunks_with_headers.xslt +0 -199
- langchain/embeddings/aleph_alpha.py +0 -30
- langchain/embeddings/awa.py +0 -23
- langchain/embeddings/azure_openai.py +0 -23
- langchain/embeddings/baidu_qianfan_endpoint.py +0 -23
- langchain/embeddings/bedrock.py +0 -23
- langchain/embeddings/bookend.py +0 -23
- langchain/embeddings/clarifai.py +0 -23
- langchain/embeddings/cloudflare_workersai.py +0 -29
- langchain/embeddings/cohere.py +0 -23
- langchain/embeddings/dashscope.py +0 -23
- langchain/embeddings/databricks.py +0 -23
- langchain/embeddings/deepinfra.py +0 -23
- langchain/embeddings/edenai.py +0 -23
- langchain/embeddings/elasticsearch.py +0 -23
- langchain/embeddings/embaas.py +0 -23
- langchain/embeddings/ernie.py +0 -23
- langchain/embeddings/fake.py +0 -30
- langchain/embeddings/fastembed.py +0 -23
- langchain/embeddings/google_palm.py +0 -23
- langchain/embeddings/gpt4all.py +0 -23
- langchain/embeddings/gradient_ai.py +0 -23
- langchain/embeddings/huggingface.py +0 -36
- langchain/embeddings/huggingface_hub.py +0 -23
- langchain/embeddings/infinity.py +0 -30
- langchain/embeddings/javelin_ai_gateway.py +0 -23
- langchain/embeddings/jina.py +0 -23
- langchain/embeddings/johnsnowlabs.py +0 -23
- langchain/embeddings/llamacpp.py +0 -23
- langchain/embeddings/llm_rails.py +0 -23
- langchain/embeddings/localai.py +0 -23
- langchain/embeddings/minimax.py +0 -23
- langchain/embeddings/mlflow.py +0 -23
- langchain/embeddings/mlflow_gateway.py +0 -23
- langchain/embeddings/modelscope_hub.py +0 -23
- langchain/embeddings/mosaicml.py +0 -23
- langchain/embeddings/nlpcloud.py +0 -23
- langchain/embeddings/octoai_embeddings.py +0 -23
- langchain/embeddings/ollama.py +0 -23
- langchain/embeddings/openai.py +0 -23
- langchain/embeddings/sagemaker_endpoint.py +0 -30
- langchain/embeddings/self_hosted.py +0 -23
- langchain/embeddings/self_hosted_hugging_face.py +0 -30
- langchain/embeddings/sentence_transformer.py +0 -21
- langchain/embeddings/spacy_embeddings.py +0 -23
- langchain/embeddings/tensorflow_hub.py +0 -23
- langchain/embeddings/vertexai.py +0 -23
- langchain/embeddings/voyageai.py +0 -23
- langchain/embeddings/xinference.py +0 -23
- langchain/env.py +0 -17
- langchain/evaluation/__init__.py +0 -128
- langchain/evaluation/agents/__init__.py +0 -5
- langchain/evaluation/agents/trajectory_eval_chain.py +0 -416
- langchain/evaluation/agents/trajectory_eval_prompt.py +0 -146
- langchain/evaluation/comparison/__init__.py +0 -36
- langchain/evaluation/comparison/eval_chain.py +0 -462
- langchain/evaluation/comparison/prompt.py +0 -59
- langchain/evaluation/criteria/__init__.py +0 -56
- langchain/evaluation/criteria/eval_chain.py +0 -606
- langchain/evaluation/criteria/prompt.py +0 -37
- langchain/evaluation/embedding_distance/__init__.py +0 -13
- langchain/evaluation/embedding_distance/base.py +0 -613
- langchain/evaluation/exact_match/__init__.py +0 -0
- langchain/evaluation/exact_match/base.py +0 -110
- langchain/evaluation/loading.py +0 -207
- langchain/evaluation/parsing/__init__.py +0 -0
- langchain/evaluation/parsing/base.py +0 -175
- langchain/evaluation/parsing/json_distance.py +0 -108
- langchain/evaluation/parsing/json_schema.py +0 -97
- langchain/evaluation/qa/__init__.py +0 -10
- langchain/evaluation/qa/eval_chain.py +0 -372
- langchain/evaluation/qa/eval_prompt.py +0 -78
- langchain/evaluation/qa/generate_chain.py +0 -36
- langchain/evaluation/qa/generate_prompt.py +0 -21
- langchain/evaluation/regex_match/__init__.py +0 -0
- langchain/evaluation/regex_match/base.py +0 -94
- langchain/evaluation/schema.py +0 -491
- langchain/evaluation/scoring/__init__.py +0 -31
- langchain/evaluation/scoring/eval_chain.py +0 -476
- langchain/evaluation/scoring/prompt.py +0 -53
- langchain/evaluation/string_distance/__init__.py +0 -13
- langchain/evaluation/string_distance/base.py +0 -472
- langchain/example_generator.py +0 -5
- langchain/formatting.py +0 -5
- langchain/graphs/__init__.py +0 -57
- langchain/graphs/arangodb_graph.py +0 -28
- langchain/graphs/falkordb_graph.py +0 -23
- langchain/graphs/graph_document.py +0 -33
- langchain/graphs/graph_store.py +0 -23
- langchain/graphs/hugegraph.py +0 -23
- langchain/graphs/kuzu_graph.py +0 -23
- langchain/graphs/memgraph_graph.py +0 -23
- langchain/graphs/nebula_graph.py +0 -23
- langchain/graphs/neo4j_graph.py +0 -23
- langchain/graphs/neptune_graph.py +0 -23
- langchain/graphs/networkx_graph.py +0 -36
- langchain/graphs/rdf_graph.py +0 -23
- langchain/hub.py +0 -131
- langchain/indexes/__init__.py +0 -50
- langchain/indexes/_api.py +0 -5
- langchain/indexes/_sql_record_manager.py +0 -539
- langchain/indexes/graph.py +0 -28
- langchain/indexes/prompts/__init__.py +0 -13
- langchain/indexes/prompts/entity_extraction.py +0 -39
- langchain/indexes/prompts/entity_summarization.py +0 -24
- langchain/indexes/prompts/knowledge_triplet_extraction.py +0 -36
- langchain/indexes/vectorstore.py +0 -269
- langchain/input.py +0 -15
- langchain/llms/__init__.py +0 -734
- langchain/llms/ai21.py +0 -28
- langchain/llms/aleph_alpha.py +0 -23
- langchain/llms/amazon_api_gateway.py +0 -23
- langchain/llms/anthropic.py +0 -23
- langchain/llms/anyscale.py +0 -23
- langchain/llms/arcee.py +0 -23
- langchain/llms/aviary.py +0 -23
- langchain/llms/azureml_endpoint.py +0 -48
- langchain/llms/baidu_qianfan_endpoint.py +0 -23
- langchain/llms/bananadev.py +0 -23
- langchain/llms/base.py +0 -20
- langchain/llms/baseten.py +0 -23
- langchain/llms/beam.py +0 -23
- langchain/llms/bedrock.py +0 -28
- langchain/llms/bittensor.py +0 -23
- langchain/llms/cerebriumai.py +0 -23
- langchain/llms/chatglm.py +0 -23
- langchain/llms/clarifai.py +0 -23
- langchain/llms/cloudflare_workersai.py +0 -25
- langchain/llms/cohere.py +0 -23
- langchain/llms/ctransformers.py +0 -23
- langchain/llms/ctranslate2.py +0 -23
- langchain/llms/databricks.py +0 -23
- langchain/llms/deepinfra.py +0 -23
- langchain/llms/deepsparse.py +0 -23
- langchain/llms/edenai.py +0 -23
- langchain/llms/fake.py +0 -28
- langchain/llms/fireworks.py +0 -23
- langchain/llms/forefrontai.py +0 -23
- langchain/llms/gigachat.py +0 -23
- langchain/llms/google_palm.py +0 -23
- langchain/llms/gooseai.py +0 -23
- langchain/llms/gpt4all.py +0 -23
- langchain/llms/gradient_ai.py +0 -28
- langchain/llms/grammars/json.gbnf +0 -29
- langchain/llms/grammars/list.gbnf +0 -14
- langchain/llms/huggingface_endpoint.py +0 -23
- langchain/llms/huggingface_hub.py +0 -23
- langchain/llms/huggingface_pipeline.py +0 -23
- langchain/llms/huggingface_text_gen_inference.py +0 -23
- langchain/llms/human.py +0 -23
- langchain/llms/javelin_ai_gateway.py +0 -28
- langchain/llms/koboldai.py +0 -23
- langchain/llms/llamacpp.py +0 -23
- langchain/llms/loading.py +0 -27
- langchain/llms/manifest.py +0 -23
- langchain/llms/minimax.py +0 -23
- langchain/llms/mlflow.py +0 -23
- langchain/llms/mlflow_ai_gateway.py +0 -23
- langchain/llms/modal.py +0 -23
- langchain/llms/mosaicml.py +0 -23
- langchain/llms/nlpcloud.py +0 -23
- langchain/llms/octoai_endpoint.py +0 -23
- langchain/llms/ollama.py +0 -23
- langchain/llms/opaqueprompts.py +0 -23
- langchain/llms/openai.py +0 -32
- langchain/llms/openllm.py +0 -23
- langchain/llms/openlm.py +0 -23
- langchain/llms/pai_eas_endpoint.py +0 -23
- langchain/llms/petals.py +0 -23
- langchain/llms/pipelineai.py +0 -23
- langchain/llms/predibase.py +0 -23
- langchain/llms/predictionguard.py +0 -23
- langchain/llms/promptlayer_openai.py +0 -27
- langchain/llms/replicate.py +0 -23
- langchain/llms/rwkv.py +0 -23
- langchain/llms/sagemaker_endpoint.py +0 -28
- langchain/llms/self_hosted.py +0 -23
- langchain/llms/self_hosted_hugging_face.py +0 -23
- langchain/llms/stochasticai.py +0 -23
- langchain/llms/symblai_nebula.py +0 -23
- langchain/llms/textgen.py +0 -23
- langchain/llms/titan_takeoff.py +0 -23
- langchain/llms/titan_takeoff_pro.py +0 -23
- langchain/llms/together.py +0 -23
- langchain/llms/tongyi.py +0 -23
- langchain/llms/utils.py +0 -23
- langchain/llms/vertexai.py +0 -27
- langchain/llms/vllm.py +0 -27
- langchain/llms/volcengine_maas.py +0 -28
- langchain/llms/watsonxllm.py +0 -23
- langchain/llms/writer.py +0 -23
- langchain/llms/xinference.py +0 -23
- langchain/llms/yandex.py +0 -23
- langchain/load/__init__.py +0 -11
- langchain/load/dump.py +0 -3
- langchain/load/load.py +0 -3
- langchain/load/serializable.py +0 -19
- langchain/memory/__init__.py +0 -153
- langchain/memory/buffer.py +0 -178
- langchain/memory/buffer_window.py +0 -62
- langchain/memory/chat_memory.py +0 -104
- langchain/memory/chat_message_histories/__init__.py +0 -84
- langchain/memory/chat_message_histories/astradb.py +0 -25
- langchain/memory/chat_message_histories/cassandra.py +0 -25
- langchain/memory/chat_message_histories/cosmos_db.py +0 -25
- langchain/memory/chat_message_histories/dynamodb.py +0 -25
- langchain/memory/chat_message_histories/elasticsearch.py +0 -27
- langchain/memory/chat_message_histories/file.py +0 -25
- langchain/memory/chat_message_histories/firestore.py +0 -25
- langchain/memory/chat_message_histories/in_memory.py +0 -5
- langchain/memory/chat_message_histories/momento.py +0 -25
- langchain/memory/chat_message_histories/mongodb.py +0 -25
- langchain/memory/chat_message_histories/neo4j.py +0 -25
- langchain/memory/chat_message_histories/postgres.py +0 -25
- langchain/memory/chat_message_histories/redis.py +0 -25
- langchain/memory/chat_message_histories/rocksetdb.py +0 -25
- langchain/memory/chat_message_histories/singlestoredb.py +0 -27
- langchain/memory/chat_message_histories/sql.py +0 -33
- langchain/memory/chat_message_histories/streamlit.py +0 -25
- langchain/memory/chat_message_histories/upstash_redis.py +0 -27
- langchain/memory/chat_message_histories/xata.py +0 -25
- langchain/memory/chat_message_histories/zep.py +0 -25
- langchain/memory/combined.py +0 -85
- langchain/memory/entity.py +0 -611
- langchain/memory/kg.py +0 -23
- langchain/memory/motorhead_memory.py +0 -23
- langchain/memory/prompt.py +0 -164
- langchain/memory/readonly.py +0 -24
- langchain/memory/simple.py +0 -27
- langchain/memory/summary.py +0 -170
- langchain/memory/summary_buffer.py +0 -151
- langchain/memory/token_buffer.py +0 -74
- langchain/memory/utils.py +0 -21
- langchain/memory/vectorstore.py +0 -120
- langchain/memory/vectorstore_token_buffer_memory.py +0 -184
- langchain/memory/zep_memory.py +0 -23
- langchain/model_laboratory.py +0 -99
- langchain/output_parsers/__init__.py +0 -87
- langchain/output_parsers/boolean.py +0 -54
- langchain/output_parsers/combining.py +0 -59
- langchain/output_parsers/datetime.py +0 -58
- langchain/output_parsers/enum.py +0 -45
- langchain/output_parsers/ernie_functions.py +0 -45
- langchain/output_parsers/fix.py +0 -155
- langchain/output_parsers/format_instructions.py +0 -79
- langchain/output_parsers/json.py +0 -15
- langchain/output_parsers/list.py +0 -13
- langchain/output_parsers/loading.py +0 -22
- langchain/output_parsers/openai_functions.py +0 -13
- langchain/output_parsers/openai_tools.py +0 -7
- langchain/output_parsers/pandas_dataframe.py +0 -171
- langchain/output_parsers/prompts.py +0 -21
- langchain/output_parsers/pydantic.py +0 -3
- langchain/output_parsers/rail_parser.py +0 -25
- langchain/output_parsers/regex.py +0 -41
- langchain/output_parsers/regex_dict.py +0 -43
- langchain/output_parsers/retry.py +0 -316
- langchain/output_parsers/structured.py +0 -116
- langchain/output_parsers/xml.py +0 -3
- langchain/output_parsers/yaml.py +0 -77
- langchain/prompts/__init__.py +0 -102
- langchain/prompts/base.py +0 -21
- langchain/prompts/chat.py +0 -37
- langchain/prompts/example_selector/__init__.py +0 -42
- langchain/prompts/example_selector/base.py +0 -3
- langchain/prompts/example_selector/length_based.py +0 -5
- langchain/prompts/example_selector/ngram_overlap.py +0 -32
- langchain/prompts/example_selector/semantic_similarity.py +0 -11
- langchain/prompts/few_shot.py +0 -11
- langchain/prompts/few_shot_with_templates.py +0 -3
- langchain/prompts/loading.py +0 -23
- langchain/prompts/pipeline.py +0 -3
- langchain/prompts/prompt.py +0 -6
- langchain/pydantic_v1/__init__.py +0 -38
- langchain/pydantic_v1/dataclasses.py +0 -20
- langchain/pydantic_v1/main.py +0 -20
- langchain/python.py +0 -19
- langchain/requests.py +0 -35
- langchain/retrievers/__init__.py +0 -178
- langchain/retrievers/arcee.py +0 -23
- langchain/retrievers/arxiv.py +0 -23
- langchain/retrievers/azure_ai_search.py +0 -30
- langchain/retrievers/bedrock.py +0 -33
- langchain/retrievers/bm25.py +0 -28
- langchain/retrievers/chaindesk.py +0 -23
- langchain/retrievers/chatgpt_plugin_retriever.py +0 -23
- langchain/retrievers/cohere_rag_retriever.py +0 -23
- langchain/retrievers/contextual_compression.py +0 -81
- langchain/retrievers/databerry.py +0 -23
- langchain/retrievers/docarray.py +0 -28
- langchain/retrievers/document_compressors/__init__.py +0 -44
- langchain/retrievers/document_compressors/base.py +0 -82
- langchain/retrievers/document_compressors/chain_extract.py +0 -123
- langchain/retrievers/document_compressors/chain_extract_prompt.py +0 -10
- langchain/retrievers/document_compressors/chain_filter.py +0 -133
- langchain/retrievers/document_compressors/chain_filter_prompt.py +0 -8
- langchain/retrievers/document_compressors/cohere_rerank.py +0 -126
- langchain/retrievers/document_compressors/cross_encoder.py +0 -16
- langchain/retrievers/document_compressors/cross_encoder_rerank.py +0 -50
- langchain/retrievers/document_compressors/embeddings_filter.py +0 -140
- langchain/retrievers/document_compressors/flashrank_rerank.py +0 -27
- langchain/retrievers/document_compressors/listwise_rerank.py +0 -145
- langchain/retrievers/elastic_search_bm25.py +0 -23
- langchain/retrievers/embedchain.py +0 -23
- langchain/retrievers/ensemble.py +0 -336
- langchain/retrievers/google_cloud_documentai_warehouse.py +0 -25
- langchain/retrievers/google_vertex_ai_search.py +0 -33
- langchain/retrievers/kay.py +0 -23
- langchain/retrievers/kendra.py +0 -66
- langchain/retrievers/knn.py +0 -23
- langchain/retrievers/llama_index.py +0 -30
- langchain/retrievers/merger_retriever.py +0 -123
- langchain/retrievers/metal.py +0 -23
- langchain/retrievers/milvus.py +0 -28
- langchain/retrievers/multi_query.py +0 -233
- langchain/retrievers/multi_vector.py +0 -135
- langchain/retrievers/outline.py +0 -23
- langchain/retrievers/parent_document_retriever.py +0 -172
- langchain/retrievers/pinecone_hybrid_search.py +0 -23
- langchain/retrievers/pubmed.py +0 -23
- langchain/retrievers/pupmed.py +0 -23
- langchain/retrievers/re_phraser.py +0 -89
- langchain/retrievers/remote_retriever.py +0 -23
- langchain/retrievers/self_query/__init__.py +0 -0
- langchain/retrievers/self_query/astradb.py +0 -23
- langchain/retrievers/self_query/base.py +0 -416
- langchain/retrievers/self_query/chroma.py +0 -23
- langchain/retrievers/self_query/dashvector.py +0 -23
- langchain/retrievers/self_query/databricks_vector_search.py +0 -27
- langchain/retrievers/self_query/deeplake.py +0 -27
- langchain/retrievers/self_query/dingo.py +0 -23
- langchain/retrievers/self_query/elasticsearch.py +0 -25
- langchain/retrievers/self_query/milvus.py +0 -27
- langchain/retrievers/self_query/mongodb_atlas.py +0 -25
- langchain/retrievers/self_query/myscale.py +0 -23
- langchain/retrievers/self_query/opensearch.py +0 -23
- langchain/retrievers/self_query/pgvector.py +0 -23
- langchain/retrievers/self_query/pinecone.py +0 -23
- langchain/retrievers/self_query/qdrant.py +0 -23
- langchain/retrievers/self_query/redis.py +0 -23
- langchain/retrievers/self_query/supabase.py +0 -23
- langchain/retrievers/self_query/tencentvectordb.py +0 -27
- langchain/retrievers/self_query/timescalevector.py +0 -27
- langchain/retrievers/self_query/vectara.py +0 -27
- langchain/retrievers/self_query/weaviate.py +0 -23
- langchain/retrievers/svm.py +0 -23
- langchain/retrievers/tavily_search_api.py +0 -28
- langchain/retrievers/tfidf.py +0 -23
- langchain/retrievers/time_weighted_retriever.py +0 -196
- langchain/retrievers/vespa_retriever.py +0 -23
- langchain/retrievers/weaviate_hybrid_search.py +0 -23
- langchain/retrievers/web_research.py +0 -29
- langchain/retrievers/wikipedia.py +0 -23
- langchain/retrievers/you.py +0 -23
- langchain/retrievers/zep.py +0 -30
- langchain/retrievers/zilliz.py +0 -28
- langchain/runnables/__init__.py +0 -18
- langchain/runnables/hub.py +0 -44
- langchain/runnables/openai_functions.py +0 -57
- langchain/schema/__init__.py +0 -82
- langchain/schema/agent.py +0 -3
- langchain/schema/cache.py +0 -3
- langchain/schema/callbacks/__init__.py +0 -0
- langchain/schema/callbacks/base.py +0 -23
- langchain/schema/callbacks/manager.py +0 -55
- langchain/schema/callbacks/stdout.py +0 -3
- langchain/schema/callbacks/streaming_stdout.py +0 -3
- langchain/schema/callbacks/tracers/__init__.py +0 -0
- langchain/schema/callbacks/tracers/base.py +0 -4
- langchain/schema/callbacks/tracers/evaluation.py +0 -6
- langchain/schema/callbacks/tracers/langchain.py +0 -8
- langchain/schema/callbacks/tracers/langchain_v1.py +0 -3
- langchain/schema/callbacks/tracers/log_stream.py +0 -9
- langchain/schema/callbacks/tracers/root_listeners.py +0 -3
- langchain/schema/callbacks/tracers/run_collector.py +0 -3
- langchain/schema/callbacks/tracers/schemas.py +0 -27
- langchain/schema/callbacks/tracers/stdout.py +0 -13
- langchain/schema/chat.py +0 -3
- langchain/schema/chat_history.py +0 -3
- langchain/schema/document.py +0 -3
- langchain/schema/embeddings.py +0 -3
- langchain/schema/exceptions.py +0 -3
- langchain/schema/language_model.py +0 -15
- langchain/schema/memory.py +0 -3
- langchain/schema/messages.py +0 -51
- langchain/schema/output.py +0 -19
- langchain/schema/output_parser.py +0 -25
- langchain/schema/prompt.py +0 -3
- langchain/schema/prompt_template.py +0 -3
- langchain/schema/retriever.py +0 -3
- langchain/schema/runnable/__init__.py +0 -58
- langchain/schema/runnable/base.py +0 -38
- langchain/schema/runnable/branch.py +0 -3
- langchain/schema/runnable/config.py +0 -27
- langchain/schema/runnable/configurable.py +0 -15
- langchain/schema/runnable/fallbacks.py +0 -3
- langchain/schema/runnable/history.py +0 -11
- langchain/schema/runnable/passthrough.py +0 -8
- langchain/schema/runnable/retry.py +0 -3
- langchain/schema/runnable/router.py +0 -3
- langchain/schema/runnable/utils.py +0 -51
- langchain/schema/storage.py +0 -3
- langchain/schema/vectorstore.py +0 -3
- langchain/serpapi.py +0 -25
- langchain/smith/__init__.py +0 -103
- langchain/smith/evaluation/__init__.py +0 -68
- langchain/smith/evaluation/config.py +0 -365
- langchain/smith/evaluation/name_generation.py +0 -727
- langchain/smith/evaluation/progress.py +0 -146
- langchain/smith/evaluation/runner_utils.py +0 -1689
- langchain/smith/evaluation/string_run_evaluator.py +0 -467
- langchain/sql_database.py +0 -25
- langchain/storage/_lc_store.py +0 -91
- langchain/storage/file_system.py +0 -176
- langchain/storage/redis.py +0 -23
- langchain/storage/upstash_redis.py +0 -27
- langchain/tools/ainetwork/__init__.py +0 -0
- langchain/tools/ainetwork/app.py +0 -30
- langchain/tools/ainetwork/base.py +0 -27
- langchain/tools/ainetwork/owner.py +0 -28
- langchain/tools/ainetwork/rule.py +0 -28
- langchain/tools/ainetwork/transfer.py +0 -28
- langchain/tools/ainetwork/value.py +0 -28
- langchain/tools/amadeus/__init__.py +0 -30
- langchain/tools/amadeus/base.py +0 -23
- langchain/tools/amadeus/closest_airport.py +0 -30
- langchain/tools/amadeus/flight_search.py +0 -30
- langchain/tools/arxiv/__init__.py +0 -1
- langchain/tools/arxiv/tool.py +0 -28
- langchain/tools/azure_cognitive_services/__init__.py +0 -41
- langchain/tools/azure_cognitive_services/form_recognizer.py +0 -23
- langchain/tools/azure_cognitive_services/image_analysis.py +0 -23
- langchain/tools/azure_cognitive_services/speech2text.py +0 -23
- langchain/tools/azure_cognitive_services/text2speech.py +0 -23
- langchain/tools/azure_cognitive_services/text_analytics_health.py +0 -23
- langchain/tools/base.py +0 -19
- langchain/tools/bearly/__init__.py +0 -0
- langchain/tools/bearly/tool.py +0 -33
- langchain/tools/bing_search/__init__.py +0 -29
- langchain/tools/bing_search/tool.py +0 -27
- langchain/tools/brave_search/__init__.py +0 -0
- langchain/tools/brave_search/tool.py +0 -23
- langchain/tools/clickup/__init__.py +0 -0
- langchain/tools/clickup/tool.py +0 -23
- langchain/tools/convert_to_openai.py +0 -4
- langchain/tools/dataforseo_api_search/__init__.py +0 -34
- langchain/tools/dataforseo_api_search/tool.py +0 -32
- langchain/tools/ddg_search/__init__.py +0 -25
- langchain/tools/ddg_search/tool.py +0 -32
- langchain/tools/e2b_data_analysis/__init__.py +0 -0
- langchain/tools/e2b_data_analysis/tool.py +0 -33
- langchain/tools/edenai/__init__.py +0 -50
- langchain/tools/edenai/audio_speech_to_text.py +0 -23
- langchain/tools/edenai/audio_text_to_speech.py +0 -23
- langchain/tools/edenai/edenai_base_tool.py +0 -23
- langchain/tools/edenai/image_explicitcontent.py +0 -23
- langchain/tools/edenai/image_objectdetection.py +0 -23
- langchain/tools/edenai/ocr_identityparser.py +0 -23
- langchain/tools/edenai/ocr_invoiceparser.py +0 -23
- langchain/tools/edenai/text_moderation.py +0 -23
- langchain/tools/eleven_labs/__init__.py +0 -25
- langchain/tools/eleven_labs/models.py +0 -23
- langchain/tools/eleven_labs/text2speech.py +0 -23
- langchain/tools/file_management/__init__.py +0 -47
- langchain/tools/file_management/copy.py +0 -28
- langchain/tools/file_management/delete.py +0 -28
- langchain/tools/file_management/file_search.py +0 -28
- langchain/tools/file_management/list_dir.py +0 -28
- langchain/tools/file_management/move.py +0 -28
- langchain/tools/file_management/read.py +0 -28
- langchain/tools/file_management/write.py +0 -28
- langchain/tools/github/__init__.py +0 -1
- langchain/tools/github/tool.py +0 -23
- langchain/tools/gitlab/__init__.py +0 -1
- langchain/tools/gitlab/tool.py +0 -23
- langchain/tools/gmail/__init__.py +0 -41
- langchain/tools/gmail/base.py +0 -23
- langchain/tools/gmail/create_draft.py +0 -28
- langchain/tools/gmail/get_message.py +0 -28
- langchain/tools/gmail/get_thread.py +0 -28
- langchain/tools/gmail/search.py +0 -30
- langchain/tools/gmail/send_message.py +0 -28
- langchain/tools/golden_query/__init__.py +0 -25
- langchain/tools/golden_query/tool.py +0 -23
- langchain/tools/google_cloud/__init__.py +0 -25
- langchain/tools/google_cloud/texttospeech.py +0 -23
- langchain/tools/google_finance/__init__.py +0 -27
- langchain/tools/google_finance/tool.py +0 -25
- langchain/tools/google_jobs/__init__.py +0 -25
- langchain/tools/google_jobs/tool.py +0 -23
- langchain/tools/google_lens/__init__.py +0 -25
- langchain/tools/google_lens/tool.py +0 -23
- langchain/tools/google_places/__init__.py +0 -25
- langchain/tools/google_places/tool.py +0 -28
- langchain/tools/google_scholar/__init__.py +0 -27
- langchain/tools/google_scholar/tool.py +0 -25
- langchain/tools/google_search/__init__.py +0 -29
- langchain/tools/google_search/tool.py +0 -27
- langchain/tools/google_serper/__init__.py +0 -30
- langchain/tools/google_serper/tool.py +0 -27
- langchain/tools/google_trends/__init__.py +0 -27
- langchain/tools/google_trends/tool.py +0 -25
- langchain/tools/graphql/__init__.py +0 -1
- langchain/tools/graphql/tool.py +0 -23
- langchain/tools/human/__init__.py +0 -25
- langchain/tools/human/tool.py +0 -23
- langchain/tools/ifttt.py +0 -23
- langchain/tools/interaction/__init__.py +0 -1
- langchain/tools/interaction/tool.py +0 -23
- langchain/tools/jira/__init__.py +0 -1
- langchain/tools/jira/tool.py +0 -42
- langchain/tools/json/__init__.py +0 -1
- langchain/tools/json/tool.py +0 -52
- langchain/tools/memorize/__init__.py +0 -25
- langchain/tools/memorize/tool.py +0 -27
- langchain/tools/merriam_webster/__init__.py +0 -1
- langchain/tools/merriam_webster/tool.py +0 -23
- langchain/tools/metaphor_search/__init__.py +0 -25
- langchain/tools/metaphor_search/tool.py +0 -23
- langchain/tools/multion/__init__.py +0 -33
- langchain/tools/multion/close_session.py +0 -30
- langchain/tools/multion/create_session.py +0 -30
- langchain/tools/multion/update_session.py +0 -30
- langchain/tools/nasa/__init__.py +0 -0
- langchain/tools/nasa/tool.py +0 -23
- langchain/tools/nuclia/__init__.py +0 -23
- langchain/tools/nuclia/tool.py +0 -27
- langchain/tools/office365/__init__.py +0 -41
- langchain/tools/office365/base.py +0 -23
- langchain/tools/office365/create_draft_message.py +0 -32
- langchain/tools/office365/events_search.py +0 -28
- langchain/tools/office365/messages_search.py +0 -28
- langchain/tools/office365/send_event.py +0 -28
- langchain/tools/office365/send_message.py +0 -28
- langchain/tools/openapi/__init__.py +0 -0
- langchain/tools/openapi/utils/__init__.py +0 -0
- langchain/tools/openapi/utils/api_models.py +0 -54
- langchain/tools/openapi/utils/openapi_utils.py +0 -30
- langchain/tools/openweathermap/__init__.py +0 -25
- langchain/tools/openweathermap/tool.py +0 -23
- langchain/tools/playwright/__init__.py +0 -47
- langchain/tools/playwright/base.py +0 -23
- langchain/tools/playwright/click.py +0 -28
- langchain/tools/playwright/current_page.py +0 -23
- langchain/tools/playwright/extract_hyperlinks.py +0 -32
- langchain/tools/playwright/extract_text.py +0 -23
- langchain/tools/playwright/get_elements.py +0 -28
- langchain/tools/playwright/navigate.py +0 -28
- langchain/tools/playwright/navigate_back.py +0 -23
- langchain/tools/plugin.py +0 -32
- langchain/tools/powerbi/__init__.py +0 -1
- langchain/tools/powerbi/tool.py +0 -33
- langchain/tools/pubmed/__init__.py +0 -1
- langchain/tools/pubmed/tool.py +0 -23
- langchain/tools/python/__init__.py +0 -13
- langchain/tools/reddit_search/__init__.py +0 -0
- langchain/tools/reddit_search/tool.py +0 -27
- langchain/tools/render.py +0 -23
- langchain/tools/requests/__init__.py +0 -1
- langchain/tools/requests/tool.py +0 -42
- langchain/tools/retriever.py +0 -11
- langchain/tools/scenexplain/__init__.py +0 -1
- langchain/tools/scenexplain/tool.py +0 -28
- langchain/tools/searchapi/__init__.py +0 -30
- langchain/tools/searchapi/tool.py +0 -27
- langchain/tools/searx_search/__init__.py +0 -0
- langchain/tools/searx_search/tool.py +0 -27
- langchain/tools/shell/__init__.py +0 -25
- langchain/tools/shell/tool.py +0 -28
- langchain/tools/slack/__init__.py +0 -38
- langchain/tools/slack/base.py +0 -23
- langchain/tools/slack/get_channel.py +0 -23
- langchain/tools/slack/get_message.py +0 -28
- langchain/tools/slack/schedule_message.py +0 -28
- langchain/tools/slack/send_message.py +0 -28
- langchain/tools/sleep/__init__.py +0 -1
- langchain/tools/sleep/tool.py +0 -28
- langchain/tools/spark_sql/__init__.py +0 -1
- langchain/tools/spark_sql/tool.py +0 -39
- langchain/tools/sql_database/__init__.py +0 -1
- langchain/tools/sql_database/prompt.py +0 -24
- langchain/tools/sql_database/tool.py +0 -39
- langchain/tools/stackexchange/__init__.py +0 -1
- langchain/tools/stackexchange/tool.py +0 -23
- langchain/tools/steam/__init__.py +0 -1
- langchain/tools/steam/tool.py +0 -23
- langchain/tools/steamship_image_generation/__init__.py +0 -25
- langchain/tools/steamship_image_generation/tool.py +0 -28
- langchain/tools/tavily_search/__init__.py +0 -32
- langchain/tools/tavily_search/tool.py +0 -33
- langchain/tools/vectorstore/__init__.py +0 -1
- langchain/tools/vectorstore/tool.py +0 -30
- langchain/tools/wikipedia/__init__.py +0 -1
- langchain/tools/wikipedia/tool.py +0 -23
- langchain/tools/wolfram_alpha/__init__.py +0 -25
- langchain/tools/wolfram_alpha/tool.py +0 -23
- langchain/tools/yahoo_finance_news.py +0 -23
- langchain/tools/youtube/__init__.py +0 -0
- langchain/tools/youtube/search.py +0 -23
- langchain/tools/zapier/__init__.py +0 -29
- langchain/tools/zapier/tool.py +0 -49
- langchain/utilities/__init__.py +0 -168
- langchain/utilities/alpha_vantage.py +0 -23
- langchain/utilities/anthropic.py +0 -30
- langchain/utilities/apify.py +0 -23
- langchain/utilities/arcee.py +0 -45
- langchain/utilities/arxiv.py +0 -23
- langchain/utilities/asyncio.py +0 -11
- langchain/utilities/awslambda.py +0 -23
- langchain/utilities/bibtex.py +0 -23
- langchain/utilities/bing_search.py +0 -23
- langchain/utilities/brave_search.py +0 -23
- langchain/utilities/clickup.py +0 -45
- langchain/utilities/dalle_image_generator.py +0 -25
- langchain/utilities/dataforseo_api_search.py +0 -25
- langchain/utilities/duckduckgo_search.py +0 -23
- langchain/utilities/github.py +0 -23
- langchain/utilities/gitlab.py +0 -23
- langchain/utilities/golden_query.py +0 -23
- langchain/utilities/google_finance.py +0 -23
- langchain/utilities/google_jobs.py +0 -23
- langchain/utilities/google_lens.py +0 -23
- langchain/utilities/google_places_api.py +0 -23
- langchain/utilities/google_scholar.py +0 -23
- langchain/utilities/google_search.py +0 -23
- langchain/utilities/google_serper.py +0 -23
- langchain/utilities/google_trends.py +0 -23
- langchain/utilities/graphql.py +0 -23
- langchain/utilities/jira.py +0 -23
- langchain/utilities/loading.py +0 -4
- langchain/utilities/max_compute.py +0 -23
- langchain/utilities/merriam_webster.py +0 -23
- langchain/utilities/metaphor_search.py +0 -23
- langchain/utilities/nasa.py +0 -23
- langchain/utilities/opaqueprompts.py +0 -27
- langchain/utilities/openapi.py +0 -28
- langchain/utilities/openweathermap.py +0 -23
- langchain/utilities/outline.py +0 -23
- langchain/utilities/portkey.py +0 -23
- langchain/utilities/powerbi.py +0 -23
- langchain/utilities/pubmed.py +0 -23
- langchain/utilities/python.py +0 -19
- langchain/utilities/reddit_search.py +0 -25
- langchain/utilities/redis.py +0 -33
- langchain/utilities/requests.py +0 -27
- langchain/utilities/scenexplain.py +0 -23
- langchain/utilities/searchapi.py +0 -23
- langchain/utilities/searx_search.py +0 -28
- langchain/utilities/serpapi.py +0 -28
- langchain/utilities/spark_sql.py +0 -23
- langchain/utilities/sql_database.py +0 -28
- langchain/utilities/stackexchange.py +0 -23
- langchain/utilities/steam.py +0 -23
- langchain/utilities/tavily_search.py +0 -25
- langchain/utilities/tensorflow_datasets.py +0 -23
- langchain/utilities/twilio.py +0 -23
- langchain/utilities/vertexai.py +0 -36
- langchain/utilities/wikipedia.py +0 -23
- langchain/utilities/wolfram_alpha.py +0 -23
- langchain/utilities/zapier.py +0 -23
- langchain/utils/__init__.py +0 -77
- langchain/utils/aiter.py +0 -3
- langchain/utils/env.py +0 -3
- langchain/utils/ernie_functions.py +0 -36
- langchain/utils/formatting.py +0 -3
- langchain/utils/html.py +0 -19
- langchain/utils/input.py +0 -8
- langchain/utils/iter.py +0 -3
- langchain/utils/json_schema.py +0 -11
- langchain/utils/loading.py +0 -3
- langchain/utils/math.py +0 -32
- langchain/utils/openai.py +0 -23
- langchain/utils/openai_functions.py +0 -13
- langchain/utils/pydantic.py +0 -3
- langchain/utils/strings.py +0 -3
- langchain/utils/utils.py +0 -21
- langchain/vectorstores/__init__.py +0 -262
- langchain/vectorstores/alibabacloud_opensearch.py +0 -30
- langchain/vectorstores/analyticdb.py +0 -23
- langchain/vectorstores/annoy.py +0 -23
- langchain/vectorstores/astradb.py +0 -23
- langchain/vectorstores/atlas.py +0 -23
- langchain/vectorstores/awadb.py +0 -23
- langchain/vectorstores/azure_cosmos_db.py +0 -28
- langchain/vectorstores/azuresearch.py +0 -30
- langchain/vectorstores/bageldb.py +0 -23
- langchain/vectorstores/baiducloud_vector_search.py +0 -23
- langchain/vectorstores/base.py +0 -3
- langchain/vectorstores/cassandra.py +0 -23
- langchain/vectorstores/chroma.py +0 -23
- langchain/vectorstores/clarifai.py +0 -23
- langchain/vectorstores/clickhouse.py +0 -27
- langchain/vectorstores/dashvector.py +0 -23
- langchain/vectorstores/databricks_vector_search.py +0 -23
- langchain/vectorstores/deeplake.py +0 -23
- langchain/vectorstores/dingo.py +0 -23
- langchain/vectorstores/docarray/__init__.py +0 -30
- langchain/vectorstores/docarray/base.py +0 -23
- langchain/vectorstores/docarray/hnsw.py +0 -23
- langchain/vectorstores/docarray/in_memory.py +0 -23
- langchain/vectorstores/elastic_vector_search.py +0 -27
- langchain/vectorstores/elasticsearch.py +0 -39
- langchain/vectorstores/epsilla.py +0 -23
- langchain/vectorstores/faiss.py +0 -23
- langchain/vectorstores/hippo.py +0 -23
- langchain/vectorstores/hologres.py +0 -23
- langchain/vectorstores/lancedb.py +0 -23
- langchain/vectorstores/llm_rails.py +0 -28
- langchain/vectorstores/marqo.py +0 -23
- langchain/vectorstores/matching_engine.py +0 -23
- langchain/vectorstores/meilisearch.py +0 -23
- langchain/vectorstores/milvus.py +0 -23
- langchain/vectorstores/momento_vector_index.py +0 -23
- langchain/vectorstores/mongodb_atlas.py +0 -23
- langchain/vectorstores/myscale.py +0 -30
- langchain/vectorstores/neo4j_vector.py +0 -28
- langchain/vectorstores/nucliadb.py +0 -23
- langchain/vectorstores/opensearch_vector_search.py +0 -23
- langchain/vectorstores/pgembedding.py +0 -36
- langchain/vectorstores/pgvecto_rs.py +0 -23
- langchain/vectorstores/pgvector.py +0 -28
- langchain/vectorstores/pinecone.py +0 -23
- langchain/vectorstores/qdrant.py +0 -28
- langchain/vectorstores/redis/__init__.py +0 -42
- langchain/vectorstores/redis/base.py +0 -33
- langchain/vectorstores/redis/filters.py +0 -48
- langchain/vectorstores/redis/schema.py +0 -54
- langchain/vectorstores/rocksetdb.py +0 -23
- langchain/vectorstores/scann.py +0 -23
- langchain/vectorstores/semadb.py +0 -23
- langchain/vectorstores/singlestoredb.py +0 -23
- langchain/vectorstores/sklearn.py +0 -42
- langchain/vectorstores/sqlitevss.py +0 -23
- langchain/vectorstores/starrocks.py +0 -28
- langchain/vectorstores/supabase.py +0 -23
- langchain/vectorstores/tair.py +0 -23
- langchain/vectorstores/tencentvectordb.py +0 -33
- langchain/vectorstores/tigris.py +0 -23
- langchain/vectorstores/tiledb.py +0 -23
- langchain/vectorstores/timescalevector.py +0 -23
- langchain/vectorstores/typesense.py +0 -23
- langchain/vectorstores/usearch.py +0 -23
- langchain/vectorstores/utils.py +0 -33
- langchain/vectorstores/vald.py +0 -23
- langchain/vectorstores/vearch.py +0 -23
- langchain/vectorstores/vectara.py +0 -28
- langchain/vectorstores/vespa.py +0 -23
- langchain/vectorstores/weaviate.py +0 -23
- langchain/vectorstores/xata.py +0 -23
- langchain/vectorstores/yellowbrick.py +0 -23
- langchain/vectorstores/zep.py +0 -28
- langchain/vectorstores/zilliz.py +0 -23
- langchain-0.4.0.dev0.dist-info/RECORD +0 -1341
- /langchain/{adapters → _internal}/__init__.py +0 -0
- {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a2.dist-info}/WHEEL +0 -0
- {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a2.dist-info}/entry_points.txt +0 -0
- {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,1175 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import inspect
|
|
4
|
+
from collections.abc import Awaitable, Callable, Sequence
|
|
5
|
+
from dataclasses import asdict, is_dataclass
|
|
6
|
+
from typing import (
|
|
7
|
+
TYPE_CHECKING,
|
|
8
|
+
Annotated,
|
|
9
|
+
Any,
|
|
10
|
+
Generic,
|
|
11
|
+
Literal,
|
|
12
|
+
Union,
|
|
13
|
+
cast,
|
|
14
|
+
get_type_hints,
|
|
15
|
+
)
|
|
16
|
+
from warnings import warn
|
|
17
|
+
|
|
18
|
+
from langchain_core.language_models import (
|
|
19
|
+
BaseChatModel,
|
|
20
|
+
LanguageModelInput,
|
|
21
|
+
LanguageModelLike,
|
|
22
|
+
)
|
|
23
|
+
from langchain_core.messages import (
|
|
24
|
+
AIMessage,
|
|
25
|
+
AnyMessage,
|
|
26
|
+
BaseMessage,
|
|
27
|
+
SystemMessage,
|
|
28
|
+
ToolCall,
|
|
29
|
+
ToolMessage,
|
|
30
|
+
)
|
|
31
|
+
from langchain_core.runnables import (
|
|
32
|
+
Runnable,
|
|
33
|
+
RunnableConfig,
|
|
34
|
+
)
|
|
35
|
+
from langgraph._internal._runnable import RunnableCallable, RunnableLike
|
|
36
|
+
from langgraph._internal._typing import MISSING
|
|
37
|
+
from langgraph.errors import ErrorCode, create_error_message
|
|
38
|
+
from langgraph.graph import END, StateGraph
|
|
39
|
+
from langgraph.graph.message import add_messages
|
|
40
|
+
from langgraph.managed import RemainingSteps # noqa: TC002
|
|
41
|
+
from langgraph.types import Checkpointer, Command, Send
|
|
42
|
+
from langgraph.typing import ContextT, StateT
|
|
43
|
+
from pydantic import BaseModel
|
|
44
|
+
from typing_extensions import NotRequired, TypedDict, TypeVar
|
|
45
|
+
|
|
46
|
+
from langchain.agents.structured_output import (
|
|
47
|
+
MultipleStructuredOutputsError,
|
|
48
|
+
OutputToolBinding,
|
|
49
|
+
ProviderStrategy,
|
|
50
|
+
ProviderStrategyBinding,
|
|
51
|
+
ResponseFormat,
|
|
52
|
+
StructuredOutputValidationError,
|
|
53
|
+
ToolStrategy,
|
|
54
|
+
)
|
|
55
|
+
from langchain.agents.tool_node import ToolNode
|
|
56
|
+
from langchain.chat_models import init_chat_model
|
|
57
|
+
|
|
58
|
+
if TYPE_CHECKING:
|
|
59
|
+
from langchain_core.tools import BaseTool
|
|
60
|
+
from langgraph.graph.state import CompiledStateGraph
|
|
61
|
+
from langgraph.runtime import Runtime
|
|
62
|
+
from langgraph.store.base import BaseStore
|
|
63
|
+
|
|
64
|
+
from langchain.agents._internal._typing import (
|
|
65
|
+
SyncOrAsync,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
StructuredResponseT = TypeVar("StructuredResponseT", default=None)
|
|
69
|
+
|
|
70
|
+
STRUCTURED_OUTPUT_ERROR_TEMPLATE = "Error: {error}\n Please fix your mistakes."
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class AgentState(TypedDict):
|
|
74
|
+
"""The state of the agent."""
|
|
75
|
+
|
|
76
|
+
messages: Annotated[Sequence[BaseMessage], add_messages]
|
|
77
|
+
|
|
78
|
+
remaining_steps: NotRequired[RemainingSteps]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class AgentStatePydantic(BaseModel):
|
|
82
|
+
"""The state of the agent."""
|
|
83
|
+
|
|
84
|
+
messages: Annotated[Sequence[BaseMessage], add_messages]
|
|
85
|
+
|
|
86
|
+
remaining_steps: RemainingSteps = 25
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class AgentStateWithStructuredResponse(AgentState, Generic[StructuredResponseT]):
|
|
90
|
+
"""The state of the agent with a structured response."""
|
|
91
|
+
|
|
92
|
+
structured_response: StructuredResponseT
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class AgentStateWithStructuredResponsePydantic(AgentStatePydantic, Generic[StructuredResponseT]):
|
|
96
|
+
"""The state of the agent with a structured response."""
|
|
97
|
+
|
|
98
|
+
structured_response: StructuredResponseT
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
PROMPT_RUNNABLE_NAME = "Prompt"
|
|
102
|
+
|
|
103
|
+
Prompt = Union[
|
|
104
|
+
SystemMessage,
|
|
105
|
+
str,
|
|
106
|
+
Callable[[StateT], LanguageModelInput],
|
|
107
|
+
Runnable[StateT, LanguageModelInput],
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _get_state_value(state: StateT, key: str, default: Any = None) -> Any:
|
|
112
|
+
return state.get(key, default) if isinstance(state, dict) else getattr(state, key, default)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _get_prompt_runnable(prompt: Prompt | None) -> Runnable:
|
|
116
|
+
prompt_runnable: Runnable
|
|
117
|
+
if prompt is None:
|
|
118
|
+
prompt_runnable = RunnableCallable(
|
|
119
|
+
lambda state: _get_state_value(state, "messages"), name=PROMPT_RUNNABLE_NAME
|
|
120
|
+
)
|
|
121
|
+
elif isinstance(prompt, str):
|
|
122
|
+
_system_message: BaseMessage = SystemMessage(content=prompt)
|
|
123
|
+
prompt_runnable = RunnableCallable(
|
|
124
|
+
lambda state: [_system_message, *_get_state_value(state, "messages")],
|
|
125
|
+
name=PROMPT_RUNNABLE_NAME,
|
|
126
|
+
)
|
|
127
|
+
elif isinstance(prompt, SystemMessage):
|
|
128
|
+
prompt_runnable = RunnableCallable(
|
|
129
|
+
lambda state: [prompt, *_get_state_value(state, "messages")],
|
|
130
|
+
name=PROMPT_RUNNABLE_NAME,
|
|
131
|
+
)
|
|
132
|
+
elif inspect.iscoroutinefunction(prompt):
|
|
133
|
+
prompt_runnable = RunnableCallable(
|
|
134
|
+
None,
|
|
135
|
+
prompt,
|
|
136
|
+
name=PROMPT_RUNNABLE_NAME,
|
|
137
|
+
)
|
|
138
|
+
elif callable(prompt):
|
|
139
|
+
prompt_runnable = RunnableCallable(
|
|
140
|
+
prompt,
|
|
141
|
+
name=PROMPT_RUNNABLE_NAME,
|
|
142
|
+
)
|
|
143
|
+
elif isinstance(prompt, Runnable):
|
|
144
|
+
prompt_runnable = prompt
|
|
145
|
+
else:
|
|
146
|
+
msg = f"Got unexpected type for `prompt`: {type(prompt)}"
|
|
147
|
+
raise ValueError(msg)
|
|
148
|
+
|
|
149
|
+
return prompt_runnable
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _validate_chat_history(
|
|
153
|
+
messages: Sequence[BaseMessage],
|
|
154
|
+
) -> None:
|
|
155
|
+
"""Validate that all tool calls in AIMessages have a corresponding ToolMessage."""
|
|
156
|
+
all_tool_calls = [
|
|
157
|
+
tool_call
|
|
158
|
+
for message in messages
|
|
159
|
+
if isinstance(message, AIMessage)
|
|
160
|
+
for tool_call in message.tool_calls
|
|
161
|
+
]
|
|
162
|
+
tool_call_ids_with_results = {
|
|
163
|
+
message.tool_call_id for message in messages if isinstance(message, ToolMessage)
|
|
164
|
+
}
|
|
165
|
+
tool_calls_without_results = [
|
|
166
|
+
tool_call
|
|
167
|
+
for tool_call in all_tool_calls
|
|
168
|
+
if tool_call["id"] not in tool_call_ids_with_results
|
|
169
|
+
]
|
|
170
|
+
if not tool_calls_without_results:
|
|
171
|
+
return
|
|
172
|
+
|
|
173
|
+
error_message = create_error_message(
|
|
174
|
+
message="Found AIMessages with tool_calls that do not have a corresponding ToolMessage. "
|
|
175
|
+
f"Here are the first few of those tool calls: {tool_calls_without_results[:3]}.\n\n"
|
|
176
|
+
"Every tool call (LLM requesting to call a tool) in the message history MUST have a corresponding ToolMessage "
|
|
177
|
+
"(result of a tool invocation to return to the LLM) - this is required by most LLM providers.",
|
|
178
|
+
error_code=ErrorCode.INVALID_CHAT_HISTORY,
|
|
179
|
+
)
|
|
180
|
+
raise ValueError(error_message)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class _AgentBuilder(Generic[StateT, ContextT, StructuredResponseT]):
|
|
184
|
+
"""Internal builder class for constructing and agent."""
|
|
185
|
+
|
|
186
|
+
def __init__(
|
|
187
|
+
self,
|
|
188
|
+
model: Union[
|
|
189
|
+
str,
|
|
190
|
+
BaseChatModel,
|
|
191
|
+
SyncOrAsync[[StateT, Runtime[ContextT]], BaseChatModel],
|
|
192
|
+
],
|
|
193
|
+
tools: Union[Sequence[Union[BaseTool, Callable, dict[str, Any]]], ToolNode],
|
|
194
|
+
*,
|
|
195
|
+
prompt: Prompt | None = None,
|
|
196
|
+
response_format: ResponseFormat[StructuredResponseT] | None = None,
|
|
197
|
+
pre_model_hook: RunnableLike | None = None,
|
|
198
|
+
post_model_hook: RunnableLike | None = None,
|
|
199
|
+
state_schema: type[StateT] | None = None,
|
|
200
|
+
context_schema: type[ContextT] | None = None,
|
|
201
|
+
version: Literal["v1", "v2"] = "v2",
|
|
202
|
+
name: str | None = None,
|
|
203
|
+
store: BaseStore | None = None,
|
|
204
|
+
) -> None:
|
|
205
|
+
self.model = model
|
|
206
|
+
self.tools = tools
|
|
207
|
+
self.prompt = prompt
|
|
208
|
+
self.response_format = response_format
|
|
209
|
+
self.pre_model_hook = pre_model_hook
|
|
210
|
+
self.post_model_hook = post_model_hook
|
|
211
|
+
self.state_schema = state_schema
|
|
212
|
+
self.context_schema = context_schema
|
|
213
|
+
self.version = version
|
|
214
|
+
self.name = name
|
|
215
|
+
self.store = store
|
|
216
|
+
|
|
217
|
+
if isinstance(model, Runnable) and not isinstance(model, BaseChatModel):
|
|
218
|
+
msg = (
|
|
219
|
+
"Expected `model` to be a BaseChatModel or a string, got {type(model)}."
|
|
220
|
+
"The `model` parameter should not have pre-bound tools, simply pass the model and tools separately."
|
|
221
|
+
)
|
|
222
|
+
raise ValueError(msg)
|
|
223
|
+
|
|
224
|
+
self._setup_tools()
|
|
225
|
+
self._setup_state_schema()
|
|
226
|
+
self._setup_structured_output()
|
|
227
|
+
self._setup_model()
|
|
228
|
+
|
|
229
|
+
def _setup_tools(self) -> None:
|
|
230
|
+
"""Setup tool-related attributes."""
|
|
231
|
+
if isinstance(self.tools, ToolNode):
|
|
232
|
+
self._tool_classes = list(self.tools.tools_by_name.values())
|
|
233
|
+
self._tool_node = self.tools
|
|
234
|
+
self._llm_builtin_tools = []
|
|
235
|
+
else:
|
|
236
|
+
self._llm_builtin_tools = [t for t in self.tools if isinstance(t, dict)]
|
|
237
|
+
self._tool_node = ToolNode([t for t in self.tools if not isinstance(t, dict)])
|
|
238
|
+
self._tool_classes = list(self._tool_node.tools_by_name.values())
|
|
239
|
+
|
|
240
|
+
self._should_return_direct = {t.name for t in self._tool_classes if t.return_direct}
|
|
241
|
+
self._tool_calling_enabled = len(self._tool_classes) > 0
|
|
242
|
+
|
|
243
|
+
def _setup_structured_output(self) -> None:
|
|
244
|
+
"""Set up structured output tracking for "tools" and "native" strategies.
|
|
245
|
+
|
|
246
|
+
"tools" strategy for structured output:
|
|
247
|
+
1. Converting response format schemas to LangChain tools
|
|
248
|
+
2. Creating metadata for proper response reconstruction
|
|
249
|
+
3. Handling both Pydantic models and dict schemas
|
|
250
|
+
|
|
251
|
+
"native" strategy for structured output:
|
|
252
|
+
1. Capturing the schema reference for later parsing
|
|
253
|
+
2. Binding provider-native response_format kwargs at model bind time
|
|
254
|
+
3. Parsing provider-enforced structured output directly into the schema
|
|
255
|
+
"""
|
|
256
|
+
self.structured_output_tools: dict[str, OutputToolBinding[StructuredResponseT]] = {}
|
|
257
|
+
self.native_output_binding: ProviderStrategyBinding[StructuredResponseT] | None = None
|
|
258
|
+
|
|
259
|
+
if self.response_format is not None:
|
|
260
|
+
response_format = self.response_format
|
|
261
|
+
|
|
262
|
+
if isinstance(response_format, ToolStrategy):
|
|
263
|
+
# check if response_format.schema is a union
|
|
264
|
+
for response_schema in response_format.schema_specs:
|
|
265
|
+
structured_tool_info = OutputToolBinding.from_schema_spec(response_schema)
|
|
266
|
+
self.structured_output_tools[structured_tool_info.tool.name] = (
|
|
267
|
+
structured_tool_info
|
|
268
|
+
)
|
|
269
|
+
elif isinstance(response_format, ProviderStrategy):
|
|
270
|
+
# Use native strategy - create ProviderStrategyBinding for parsing
|
|
271
|
+
self.native_output_binding = ProviderStrategyBinding.from_schema_spec(
|
|
272
|
+
response_format.schema_spec
|
|
273
|
+
)
|
|
274
|
+
else:
|
|
275
|
+
# This shouldn't happen with the new ResponseFormat type, but keeping for safety
|
|
276
|
+
msg = (
|
|
277
|
+
f"Unsupported response_format type: {type(response_format)}. "
|
|
278
|
+
f"Expected ToolStrategy."
|
|
279
|
+
)
|
|
280
|
+
raise ValueError(msg)
|
|
281
|
+
|
|
282
|
+
def _setup_state_schema(self) -> None:
|
|
283
|
+
"""Setup state schema with validation."""
|
|
284
|
+
if self.state_schema is not None:
|
|
285
|
+
required_keys = {"messages", "remaining_steps"}
|
|
286
|
+
if self.response_format is not None:
|
|
287
|
+
required_keys.add("structured_response")
|
|
288
|
+
|
|
289
|
+
schema_keys = set(get_type_hints(self.state_schema))
|
|
290
|
+
if missing_keys := required_keys - schema_keys:
|
|
291
|
+
msg = f"Missing required key(s) {missing_keys} in state_schema"
|
|
292
|
+
raise ValueError(msg)
|
|
293
|
+
|
|
294
|
+
self._final_state_schema = self.state_schema
|
|
295
|
+
else:
|
|
296
|
+
self._final_state_schema = (
|
|
297
|
+
AgentStateWithStructuredResponse # type: ignore[assignment]
|
|
298
|
+
if self.response_format is not None
|
|
299
|
+
else AgentState
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
def _handle_structured_response_tool_calls(self, response: AIMessage) -> Command | None:
|
|
303
|
+
"""Handle tool calls that match structured output tools using the tools strategy.
|
|
304
|
+
|
|
305
|
+
Args:
|
|
306
|
+
response: The AI message containing potential tool calls
|
|
307
|
+
|
|
308
|
+
Returns:
|
|
309
|
+
Command with structured response update if found, None otherwise
|
|
310
|
+
|
|
311
|
+
Raises:
|
|
312
|
+
MultipleStructuredOutputsError: If multiple structured responses are returned and error handling is disabled
|
|
313
|
+
StructuredOutputParsingError: If parsing fails and error handling is disabled
|
|
314
|
+
"""
|
|
315
|
+
if not isinstance(self.response_format, ToolStrategy) or not response.tool_calls:
|
|
316
|
+
return None
|
|
317
|
+
|
|
318
|
+
structured_tool_calls = [
|
|
319
|
+
tool_call
|
|
320
|
+
for tool_call in response.tool_calls
|
|
321
|
+
if tool_call["name"] in self.structured_output_tools
|
|
322
|
+
]
|
|
323
|
+
|
|
324
|
+
if not structured_tool_calls:
|
|
325
|
+
return None
|
|
326
|
+
|
|
327
|
+
if len(structured_tool_calls) > 1:
|
|
328
|
+
return self._handle_multiple_structured_outputs(response, structured_tool_calls)
|
|
329
|
+
|
|
330
|
+
return self._handle_single_structured_output(response, structured_tool_calls[0])
|
|
331
|
+
|
|
332
|
+
def _handle_multiple_structured_outputs(
|
|
333
|
+
self,
|
|
334
|
+
response: AIMessage,
|
|
335
|
+
structured_tool_calls: list[ToolCall],
|
|
336
|
+
) -> Command:
|
|
337
|
+
"""Handle multiple structured output tool calls."""
|
|
338
|
+
tool_names = [tool_call["name"] for tool_call in structured_tool_calls]
|
|
339
|
+
exception = MultipleStructuredOutputsError(tool_names)
|
|
340
|
+
|
|
341
|
+
should_retry, error_message = self._handle_structured_output_error(exception)
|
|
342
|
+
|
|
343
|
+
if not should_retry:
|
|
344
|
+
raise exception
|
|
345
|
+
|
|
346
|
+
tool_messages = [
|
|
347
|
+
ToolMessage(
|
|
348
|
+
content=error_message,
|
|
349
|
+
tool_call_id=tool_call["id"],
|
|
350
|
+
name=tool_call["name"],
|
|
351
|
+
)
|
|
352
|
+
for tool_call in structured_tool_calls
|
|
353
|
+
]
|
|
354
|
+
|
|
355
|
+
return Command(
|
|
356
|
+
update={"messages": [response, *tool_messages]},
|
|
357
|
+
goto="agent",
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
def _handle_single_structured_output(
|
|
361
|
+
self,
|
|
362
|
+
response: AIMessage,
|
|
363
|
+
tool_call: Any,
|
|
364
|
+
) -> Command:
|
|
365
|
+
"""Handle a single structured output tool call."""
|
|
366
|
+
structured_tool_binding = self.structured_output_tools[tool_call["name"]]
|
|
367
|
+
|
|
368
|
+
try:
|
|
369
|
+
structured_response = structured_tool_binding.parse(tool_call["args"])
|
|
370
|
+
|
|
371
|
+
if isinstance(structured_response, BaseModel):
|
|
372
|
+
structured_response_dict = structured_response.model_dump()
|
|
373
|
+
elif is_dataclass(structured_response):
|
|
374
|
+
structured_response_dict = asdict(structured_response) # type: ignore[arg-type]
|
|
375
|
+
else:
|
|
376
|
+
structured_response_dict = cast("dict", structured_response)
|
|
377
|
+
|
|
378
|
+
tool_message_content = (
|
|
379
|
+
self.response_format.tool_message_content
|
|
380
|
+
if isinstance(self.response_format, ToolStrategy)
|
|
381
|
+
and self.response_format.tool_message_content
|
|
382
|
+
else f"Returning structured response: {structured_response_dict}"
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
return Command(
|
|
386
|
+
update={
|
|
387
|
+
"messages": [
|
|
388
|
+
response,
|
|
389
|
+
ToolMessage(
|
|
390
|
+
content=tool_message_content,
|
|
391
|
+
tool_call_id=tool_call["id"],
|
|
392
|
+
name=tool_call["name"],
|
|
393
|
+
),
|
|
394
|
+
],
|
|
395
|
+
"structured_response": structured_response,
|
|
396
|
+
}
|
|
397
|
+
)
|
|
398
|
+
except Exception as exc: # noqa: BLE001
|
|
399
|
+
exception = StructuredOutputValidationError(tool_call["name"], exc)
|
|
400
|
+
|
|
401
|
+
should_retry, error_message = self._handle_structured_output_error(exception)
|
|
402
|
+
|
|
403
|
+
if not should_retry:
|
|
404
|
+
raise exception
|
|
405
|
+
|
|
406
|
+
return Command(
|
|
407
|
+
update={
|
|
408
|
+
"messages": [
|
|
409
|
+
response,
|
|
410
|
+
ToolMessage(
|
|
411
|
+
content=error_message,
|
|
412
|
+
tool_call_id=tool_call["id"],
|
|
413
|
+
name=tool_call["name"],
|
|
414
|
+
),
|
|
415
|
+
],
|
|
416
|
+
},
|
|
417
|
+
goto="agent",
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
def _handle_structured_output_error(
|
|
421
|
+
self,
|
|
422
|
+
exception: Exception,
|
|
423
|
+
) -> tuple[bool, str]:
|
|
424
|
+
"""Handle structured output error.
|
|
425
|
+
|
|
426
|
+
Returns (should_retry, retry_tool_message).
|
|
427
|
+
"""
|
|
428
|
+
handle_errors = cast("ToolStrategy", self.response_format).handle_errors
|
|
429
|
+
|
|
430
|
+
if handle_errors is False:
|
|
431
|
+
return False, ""
|
|
432
|
+
if handle_errors is True:
|
|
433
|
+
return True, STRUCTURED_OUTPUT_ERROR_TEMPLATE.format(error=str(exception))
|
|
434
|
+
if isinstance(handle_errors, str):
|
|
435
|
+
return True, handle_errors
|
|
436
|
+
if isinstance(handle_errors, type) and issubclass(handle_errors, Exception):
|
|
437
|
+
if isinstance(exception, handle_errors):
|
|
438
|
+
return True, STRUCTURED_OUTPUT_ERROR_TEMPLATE.format(error=str(exception))
|
|
439
|
+
return False, ""
|
|
440
|
+
if isinstance(handle_errors, tuple):
|
|
441
|
+
if any(isinstance(exception, exc_type) for exc_type in handle_errors):
|
|
442
|
+
return True, STRUCTURED_OUTPUT_ERROR_TEMPLATE.format(error=str(exception))
|
|
443
|
+
return False, ""
|
|
444
|
+
if callable(handle_errors):
|
|
445
|
+
return True, handle_errors(exception) # type: ignore[call-arg, return-value]
|
|
446
|
+
return False, ""
|
|
447
|
+
|
|
448
|
+
def _apply_native_output_binding(self, model: LanguageModelLike) -> LanguageModelLike:
|
|
449
|
+
"""If native output is configured, bind provider-native kwargs onto the model."""
|
|
450
|
+
if not isinstance(self.response_format, ProviderStrategy):
|
|
451
|
+
return model
|
|
452
|
+
kwargs = self.response_format.to_model_kwargs()
|
|
453
|
+
return model.bind(**kwargs)
|
|
454
|
+
|
|
455
|
+
def _handle_structured_response_native(self, response: AIMessage) -> Command | None:
|
|
456
|
+
"""If native output is configured and there are no tool calls, parse using ProviderStrategyBinding."""
|
|
457
|
+
if self.native_output_binding is None:
|
|
458
|
+
return None
|
|
459
|
+
if response.tool_calls:
|
|
460
|
+
# if the model chooses to call tools, we let the normal flow handle it
|
|
461
|
+
return None
|
|
462
|
+
|
|
463
|
+
structured_response = self.native_output_binding.parse(response)
|
|
464
|
+
|
|
465
|
+
return Command(update={"messages": [response], "structured_response": structured_response})
|
|
466
|
+
|
|
467
|
+
def _setup_model(self) -> None:
|
|
468
|
+
"""Setup model-related attributes."""
|
|
469
|
+
self._is_dynamic_model = not isinstance(self.model, (str, Runnable)) and callable(
|
|
470
|
+
self.model
|
|
471
|
+
)
|
|
472
|
+
self._is_async_dynamic_model = self._is_dynamic_model and inspect.iscoroutinefunction(
|
|
473
|
+
self.model
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
if not self._is_dynamic_model:
|
|
477
|
+
model = self.model
|
|
478
|
+
if isinstance(model, str):
|
|
479
|
+
model = init_chat_model(model)
|
|
480
|
+
|
|
481
|
+
# Collect all tools: regular tools + structured output tools
|
|
482
|
+
structured_output_tools = list(self.structured_output_tools.values())
|
|
483
|
+
all_tools = (
|
|
484
|
+
self._tool_classes
|
|
485
|
+
+ self._llm_builtin_tools
|
|
486
|
+
+ [info.tool for info in structured_output_tools]
|
|
487
|
+
)
|
|
488
|
+
|
|
489
|
+
if len(all_tools) > 0:
|
|
490
|
+
# Check if we need to force tool use for structured output
|
|
491
|
+
tool_choice = None
|
|
492
|
+
if self.response_format is not None and isinstance(
|
|
493
|
+
self.response_format, ToolStrategy
|
|
494
|
+
):
|
|
495
|
+
tool_choice = "any"
|
|
496
|
+
|
|
497
|
+
if tool_choice:
|
|
498
|
+
model = cast("BaseChatModel", model).bind_tools( # type: ignore[assignment]
|
|
499
|
+
all_tools, tool_choice=tool_choice
|
|
500
|
+
)
|
|
501
|
+
# If native output is configured, bind tools with strict=True. Required for OpenAI.
|
|
502
|
+
elif isinstance(self.response_format, ProviderStrategy):
|
|
503
|
+
model = cast("BaseChatModel", model).bind_tools( # type: ignore[assignment]
|
|
504
|
+
all_tools, strict=True
|
|
505
|
+
)
|
|
506
|
+
else:
|
|
507
|
+
model = cast("BaseChatModel", model).bind_tools(all_tools) # type: ignore[assignment]
|
|
508
|
+
|
|
509
|
+
# bind native structured-output kwargs
|
|
510
|
+
model = self._apply_native_output_binding(model) # type: ignore[assignment, arg-type]
|
|
511
|
+
|
|
512
|
+
# Extract just the model part for direct invocation
|
|
513
|
+
self._static_model: Runnable | None = model # type: ignore[assignment]
|
|
514
|
+
else:
|
|
515
|
+
self._static_model = None
|
|
516
|
+
|
|
517
|
+
def _resolve_model(self, state: StateT, runtime: Runtime[ContextT]) -> LanguageModelLike:
|
|
518
|
+
"""Resolve the model to use, handling both static and dynamic models."""
|
|
519
|
+
if self._is_dynamic_model:
|
|
520
|
+
dynamic_model = self.model(state, runtime) # type: ignore[operator, arg-type]
|
|
521
|
+
return self._apply_native_output_binding(dynamic_model) # type: ignore[arg-type]
|
|
522
|
+
return self._static_model # type: ignore[return-value]
|
|
523
|
+
|
|
524
|
+
async def _aresolve_model(self, state: StateT, runtime: Runtime[ContextT]) -> LanguageModelLike:
|
|
525
|
+
"""Async resolve the model to use, handling both static and dynamic models."""
|
|
526
|
+
if self._is_async_dynamic_model:
|
|
527
|
+
dynamic_model = cast(
|
|
528
|
+
"Callable[[StateT, Runtime[ContextT]], Awaitable[BaseChatModel]]",
|
|
529
|
+
self.model,
|
|
530
|
+
)
|
|
531
|
+
return await dynamic_model(state, runtime)
|
|
532
|
+
if self._is_dynamic_model:
|
|
533
|
+
dynamic_model = self.model(state, runtime) # type: ignore[arg-type, assignment, operator]
|
|
534
|
+
return self._apply_native_output_binding(dynamic_model) # type: ignore[arg-type]
|
|
535
|
+
return self._static_model # type: ignore[return-value]
|
|
536
|
+
|
|
537
|
+
def create_model_node(self) -> RunnableCallable:
|
|
538
|
+
"""Create the 'agent' node that calls the LLM."""
|
|
539
|
+
|
|
540
|
+
def _get_model_input_state(state: StateT) -> StateT:
|
|
541
|
+
if self.pre_model_hook is not None:
|
|
542
|
+
messages = _get_state_value(state, "llm_input_messages") or _get_state_value(
|
|
543
|
+
state, "messages"
|
|
544
|
+
)
|
|
545
|
+
error_msg = (
|
|
546
|
+
f"Expected input to call_model to have 'llm_input_messages' "
|
|
547
|
+
f"or 'messages' key, but got {state}"
|
|
548
|
+
)
|
|
549
|
+
else:
|
|
550
|
+
messages = _get_state_value(state, "messages")
|
|
551
|
+
error_msg = f"Expected input to call_model to have 'messages' key, but got {state}"
|
|
552
|
+
|
|
553
|
+
if messages is None:
|
|
554
|
+
raise ValueError(error_msg)
|
|
555
|
+
|
|
556
|
+
_validate_chat_history(messages)
|
|
557
|
+
|
|
558
|
+
if isinstance(self._final_state_schema, type) and issubclass(
|
|
559
|
+
self._final_state_schema, BaseModel
|
|
560
|
+
):
|
|
561
|
+
# we're passing messages under `messages` key, as this
|
|
562
|
+
# is expected by the prompt
|
|
563
|
+
state.messages = messages # type: ignore[union-attr]
|
|
564
|
+
else:
|
|
565
|
+
state["messages"] = messages # type: ignore[index]
|
|
566
|
+
return state
|
|
567
|
+
|
|
568
|
+
def _are_more_steps_needed(state: StateT, response: BaseMessage) -> bool:
|
|
569
|
+
has_tool_calls = isinstance(response, AIMessage) and response.tool_calls
|
|
570
|
+
all_tools_return_direct = (
|
|
571
|
+
all(call["name"] in self._should_return_direct for call in response.tool_calls)
|
|
572
|
+
if isinstance(response, AIMessage)
|
|
573
|
+
else False
|
|
574
|
+
)
|
|
575
|
+
remaining_steps = _get_state_value(state, "remaining_steps", None)
|
|
576
|
+
return (
|
|
577
|
+
remaining_steps is not None # type: ignore[return-value]
|
|
578
|
+
and (
|
|
579
|
+
(remaining_steps < 1 and all_tools_return_direct)
|
|
580
|
+
or (remaining_steps < 2 and has_tool_calls)
|
|
581
|
+
)
|
|
582
|
+
)
|
|
583
|
+
|
|
584
|
+
def call_model(
|
|
585
|
+
state: StateT, runtime: Runtime[ContextT], config: RunnableConfig
|
|
586
|
+
) -> dict[str, Any] | Command:
|
|
587
|
+
"""Call the model with the current state and return the response."""
|
|
588
|
+
if self._is_async_dynamic_model:
|
|
589
|
+
msg = (
|
|
590
|
+
"Async model callable provided but agent invoked synchronously. "
|
|
591
|
+
"Use agent.ainvoke() or agent.astream(), or provide a sync model callable."
|
|
592
|
+
)
|
|
593
|
+
raise RuntimeError(msg)
|
|
594
|
+
|
|
595
|
+
model_input = _get_model_input_state(state)
|
|
596
|
+
model = self._resolve_model(state, runtime)
|
|
597
|
+
|
|
598
|
+
# Get prompt runnable and invoke it first to prepare messages
|
|
599
|
+
prompt_runnable = _get_prompt_runnable(self.prompt)
|
|
600
|
+
prepared_messages = prompt_runnable.invoke(model_input, config)
|
|
601
|
+
|
|
602
|
+
# Then invoke the model with the prepared messages
|
|
603
|
+
response = cast("AIMessage", model.invoke(prepared_messages, config))
|
|
604
|
+
response.name = self.name
|
|
605
|
+
|
|
606
|
+
if _are_more_steps_needed(state, response):
|
|
607
|
+
return {
|
|
608
|
+
"messages": [
|
|
609
|
+
AIMessage(
|
|
610
|
+
id=response.id,
|
|
611
|
+
content="Sorry, need more steps to process this request.",
|
|
612
|
+
)
|
|
613
|
+
]
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
# Check if any tool calls match structured output tools
|
|
617
|
+
structured_command = self._handle_structured_response_tool_calls(response)
|
|
618
|
+
if structured_command:
|
|
619
|
+
return structured_command
|
|
620
|
+
|
|
621
|
+
# Native structured output
|
|
622
|
+
native_command = self._handle_structured_response_native(response)
|
|
623
|
+
if native_command:
|
|
624
|
+
return native_command
|
|
625
|
+
|
|
626
|
+
return {"messages": [response]}
|
|
627
|
+
|
|
628
|
+
async def acall_model(
|
|
629
|
+
state: StateT, runtime: Runtime[ContextT], config: RunnableConfig
|
|
630
|
+
) -> dict[str, Any] | Command:
|
|
631
|
+
"""Call the model with the current state and return the response."""
|
|
632
|
+
model_input = _get_model_input_state(state)
|
|
633
|
+
|
|
634
|
+
model = await self._aresolve_model(state, runtime)
|
|
635
|
+
|
|
636
|
+
# Get prompt runnable and invoke it first to prepare messages
|
|
637
|
+
prompt_runnable = _get_prompt_runnable(self.prompt)
|
|
638
|
+
prepared_messages = await prompt_runnable.ainvoke(model_input, config)
|
|
639
|
+
|
|
640
|
+
# Then invoke the model with the prepared messages
|
|
641
|
+
response = cast(
|
|
642
|
+
"AIMessage",
|
|
643
|
+
await model.ainvoke(prepared_messages, config),
|
|
644
|
+
)
|
|
645
|
+
response.name = self.name
|
|
646
|
+
if _are_more_steps_needed(state, response):
|
|
647
|
+
return {
|
|
648
|
+
"messages": [
|
|
649
|
+
AIMessage(
|
|
650
|
+
id=response.id,
|
|
651
|
+
content="Sorry, need more steps to process this request.",
|
|
652
|
+
)
|
|
653
|
+
]
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
# Check if any tool calls match structured output tools
|
|
657
|
+
structured_command = self._handle_structured_response_tool_calls(response)
|
|
658
|
+
if structured_command:
|
|
659
|
+
return structured_command
|
|
660
|
+
|
|
661
|
+
# Native structured output
|
|
662
|
+
native_command = self._handle_structured_response_native(response)
|
|
663
|
+
if native_command:
|
|
664
|
+
return native_command
|
|
665
|
+
|
|
666
|
+
return {"messages": [response]}
|
|
667
|
+
|
|
668
|
+
return RunnableCallable(call_model, acall_model)
|
|
669
|
+
|
|
670
|
+
def _get_input_schema(self) -> type[StateT]:
|
|
671
|
+
"""Get input schema for model node."""
|
|
672
|
+
if self.pre_model_hook is not None:
|
|
673
|
+
if isinstance(self._final_state_schema, type) and issubclass(
|
|
674
|
+
self._final_state_schema, BaseModel
|
|
675
|
+
):
|
|
676
|
+
from pydantic import create_model
|
|
677
|
+
|
|
678
|
+
return create_model(
|
|
679
|
+
"CallModelInputSchema",
|
|
680
|
+
llm_input_messages=(list[AnyMessage], ...),
|
|
681
|
+
__base__=self._final_state_schema,
|
|
682
|
+
)
|
|
683
|
+
|
|
684
|
+
class CallModelInputSchema(self._final_state_schema): # type: ignore[name-defined, misc]
|
|
685
|
+
llm_input_messages: list[AnyMessage]
|
|
686
|
+
|
|
687
|
+
return CallModelInputSchema
|
|
688
|
+
return self._final_state_schema
|
|
689
|
+
|
|
690
|
+
def create_model_router(self) -> Callable[[StateT], Union[str, list[Send]]]:
|
|
691
|
+
"""Create routing function for model node conditional edges."""
|
|
692
|
+
|
|
693
|
+
def should_continue(state: StateT) -> Union[str, list[Send]]:
|
|
694
|
+
messages = _get_state_value(state, "messages")
|
|
695
|
+
last_message = messages[-1]
|
|
696
|
+
|
|
697
|
+
# Check if the last message is a ToolMessage from a structured tool.
|
|
698
|
+
# This condition exists to support structured output via tools.
|
|
699
|
+
# Once a tool has been called for structured output, we skip
|
|
700
|
+
# tool execution and go to END (if there is no post_model_hook).
|
|
701
|
+
if (
|
|
702
|
+
isinstance(last_message, ToolMessage)
|
|
703
|
+
and last_message.name in self.structured_output_tools
|
|
704
|
+
):
|
|
705
|
+
return END
|
|
706
|
+
|
|
707
|
+
if isinstance(last_message, ToolMessage):
|
|
708
|
+
return END
|
|
709
|
+
|
|
710
|
+
if not isinstance(last_message, AIMessage) or not last_message.tool_calls:
|
|
711
|
+
if self.post_model_hook is not None:
|
|
712
|
+
return "post_model_hook"
|
|
713
|
+
return END
|
|
714
|
+
if self.version == "v1":
|
|
715
|
+
return "tools"
|
|
716
|
+
if self.version == "v2":
|
|
717
|
+
if self.post_model_hook is not None:
|
|
718
|
+
return "post_model_hook"
|
|
719
|
+
tool_calls = [
|
|
720
|
+
self._tool_node.inject_tool_args(call, state, self.store) # type: ignore[arg-type]
|
|
721
|
+
for call in last_message.tool_calls
|
|
722
|
+
]
|
|
723
|
+
return [Send("tools", [tool_call]) for tool_call in tool_calls]
|
|
724
|
+
return None
|
|
725
|
+
|
|
726
|
+
return should_continue
|
|
727
|
+
|
|
728
|
+
def create_post_model_hook_router(
|
|
729
|
+
self,
|
|
730
|
+
) -> Callable[[StateT], Union[str, list[Send]]]:
|
|
731
|
+
"""Create a routing function for post_model_hook node conditional edges."""
|
|
732
|
+
|
|
733
|
+
def post_model_hook_router(state: StateT) -> Union[str, list[Send]]:
|
|
734
|
+
messages = _get_state_value(state, "messages")
|
|
735
|
+
|
|
736
|
+
# Check if the last message is a ToolMessage from a structured tool.
|
|
737
|
+
# This condition exists to support structured output via tools.
|
|
738
|
+
# Once a tool has been called for structured output, we skip
|
|
739
|
+
# tool execution and go to END (if there is no post_model_hook).
|
|
740
|
+
last_message = messages[-1]
|
|
741
|
+
if (
|
|
742
|
+
isinstance(last_message, ToolMessage)
|
|
743
|
+
and last_message.name in self.structured_output_tools
|
|
744
|
+
):
|
|
745
|
+
return END
|
|
746
|
+
|
|
747
|
+
tool_messages = [m.tool_call_id for m in messages if isinstance(m, ToolMessage)]
|
|
748
|
+
last_ai_message = next(m for m in reversed(messages) if isinstance(m, AIMessage))
|
|
749
|
+
pending_tool_calls = [
|
|
750
|
+
c for c in last_ai_message.tool_calls if c["id"] not in tool_messages
|
|
751
|
+
]
|
|
752
|
+
|
|
753
|
+
if pending_tool_calls:
|
|
754
|
+
pending_tool_calls = [
|
|
755
|
+
self._tool_node.inject_tool_args(call, state, self.store) # type: ignore[arg-type]
|
|
756
|
+
for call in pending_tool_calls
|
|
757
|
+
]
|
|
758
|
+
return [Send("tools", [tool_call]) for tool_call in pending_tool_calls]
|
|
759
|
+
if isinstance(messages[-1], ToolMessage):
|
|
760
|
+
return self._get_entry_point()
|
|
761
|
+
return END
|
|
762
|
+
|
|
763
|
+
return post_model_hook_router
|
|
764
|
+
|
|
765
|
+
def create_tools_router(self) -> Callable[[StateT], str] | None:
|
|
766
|
+
"""Create a routing function for tools node conditional edges."""
|
|
767
|
+
if not self._should_return_direct:
|
|
768
|
+
return None
|
|
769
|
+
|
|
770
|
+
def route_tool_responses(state: StateT) -> str:
|
|
771
|
+
messages = _get_state_value(state, "messages")
|
|
772
|
+
for m in reversed(messages):
|
|
773
|
+
if not isinstance(m, ToolMessage):
|
|
774
|
+
break
|
|
775
|
+
if m.name in self._should_return_direct:
|
|
776
|
+
return END
|
|
777
|
+
|
|
778
|
+
if (
|
|
779
|
+
isinstance(m, AIMessage)
|
|
780
|
+
and m.tool_calls
|
|
781
|
+
and any(call["name"] in self._should_return_direct for call in m.tool_calls)
|
|
782
|
+
):
|
|
783
|
+
return END
|
|
784
|
+
|
|
785
|
+
return self._get_entry_point()
|
|
786
|
+
|
|
787
|
+
return route_tool_responses
|
|
788
|
+
|
|
789
|
+
def _get_entry_point(self) -> str:
|
|
790
|
+
"""Get the workflow entry point."""
|
|
791
|
+
return "pre_model_hook" if self.pre_model_hook else "agent"
|
|
792
|
+
|
|
793
|
+
def _get_model_paths(self) -> list[str]:
|
|
794
|
+
"""Get possible edge destinations from model node."""
|
|
795
|
+
paths = []
|
|
796
|
+
if self._tool_calling_enabled:
|
|
797
|
+
paths.append("tools")
|
|
798
|
+
if self.post_model_hook:
|
|
799
|
+
paths.append("post_model_hook")
|
|
800
|
+
else:
|
|
801
|
+
paths.append(END)
|
|
802
|
+
|
|
803
|
+
return paths
|
|
804
|
+
|
|
805
|
+
def _get_post_model_hook_paths(self) -> list[str]:
|
|
806
|
+
"""Get possible edge destinations from post_model_hook node."""
|
|
807
|
+
paths = []
|
|
808
|
+
if self._tool_calling_enabled:
|
|
809
|
+
paths = [self._get_entry_point(), "tools"]
|
|
810
|
+
paths.append(END)
|
|
811
|
+
return paths
|
|
812
|
+
|
|
813
|
+
def build(self) -> StateGraph[StateT, ContextT]:
|
|
814
|
+
"""Build the agent workflow graph (uncompiled)."""
|
|
815
|
+
workflow = StateGraph(
|
|
816
|
+
state_schema=self._final_state_schema,
|
|
817
|
+
context_schema=self.context_schema,
|
|
818
|
+
)
|
|
819
|
+
|
|
820
|
+
# Set entry point
|
|
821
|
+
workflow.set_entry_point(self._get_entry_point())
|
|
822
|
+
|
|
823
|
+
# Add nodes
|
|
824
|
+
workflow.add_node("agent", self.create_model_node(), input_schema=self._get_input_schema())
|
|
825
|
+
|
|
826
|
+
if self._tool_calling_enabled:
|
|
827
|
+
workflow.add_node("tools", self._tool_node)
|
|
828
|
+
|
|
829
|
+
if self.pre_model_hook:
|
|
830
|
+
workflow.add_node("pre_model_hook", self.pre_model_hook) # type: ignore[arg-type]
|
|
831
|
+
|
|
832
|
+
if self.post_model_hook:
|
|
833
|
+
workflow.add_node("post_model_hook", self.post_model_hook) # type: ignore[arg-type]
|
|
834
|
+
|
|
835
|
+
# Add edges
|
|
836
|
+
if self.pre_model_hook:
|
|
837
|
+
workflow.add_edge("pre_model_hook", "agent")
|
|
838
|
+
|
|
839
|
+
if self.post_model_hook:
|
|
840
|
+
workflow.add_edge("agent", "post_model_hook")
|
|
841
|
+
post_hook_paths = self._get_post_model_hook_paths()
|
|
842
|
+
if len(post_hook_paths) == 1:
|
|
843
|
+
# No need for a conditional edge if there's only one path
|
|
844
|
+
workflow.add_edge("post_model_hook", post_hook_paths[0])
|
|
845
|
+
else:
|
|
846
|
+
workflow.add_conditional_edges(
|
|
847
|
+
"post_model_hook",
|
|
848
|
+
self.create_post_model_hook_router(),
|
|
849
|
+
path_map=post_hook_paths,
|
|
850
|
+
)
|
|
851
|
+
else:
|
|
852
|
+
model_paths = self._get_model_paths()
|
|
853
|
+
if len(model_paths) == 1:
|
|
854
|
+
# No need for a conditional edge if there's only one path
|
|
855
|
+
workflow.add_edge("agent", model_paths[0])
|
|
856
|
+
else:
|
|
857
|
+
workflow.add_conditional_edges(
|
|
858
|
+
"agent",
|
|
859
|
+
self.create_model_router(),
|
|
860
|
+
path_map=model_paths,
|
|
861
|
+
)
|
|
862
|
+
|
|
863
|
+
if self._tool_calling_enabled:
|
|
864
|
+
# In some cases, tools can return directly. In these cases
|
|
865
|
+
# we add a conditional edge from the tools node to the END node
|
|
866
|
+
# instead of going to the entry point.
|
|
867
|
+
tools_router = self.create_tools_router()
|
|
868
|
+
if tools_router:
|
|
869
|
+
workflow.add_conditional_edges(
|
|
870
|
+
"tools",
|
|
871
|
+
tools_router,
|
|
872
|
+
path_map=[self._get_entry_point(), END],
|
|
873
|
+
)
|
|
874
|
+
else:
|
|
875
|
+
workflow.add_edge("tools", self._get_entry_point())
|
|
876
|
+
|
|
877
|
+
return workflow
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
def _supports_native_structured_output(
|
|
881
|
+
model: Union[str, BaseChatModel, SyncOrAsync[[StateT, Runtime[ContextT]], BaseChatModel]],
|
|
882
|
+
) -> bool:
|
|
883
|
+
"""Check if a model supports native structured output.
|
|
884
|
+
|
|
885
|
+
TODO: replace with more robust model profiles.
|
|
886
|
+
"""
|
|
887
|
+
model_name: str | None = None
|
|
888
|
+
if isinstance(model, str):
|
|
889
|
+
model_name = model
|
|
890
|
+
elif isinstance(model, BaseChatModel):
|
|
891
|
+
model_name = getattr(model, "model_name", None)
|
|
892
|
+
|
|
893
|
+
return (
|
|
894
|
+
"grok" in model_name.lower()
|
|
895
|
+
or any(part in model_name for part in ["gpt-5", "gpt-4.1", "gpt-oss", "o3-pro", "o3-mini"])
|
|
896
|
+
if model_name
|
|
897
|
+
else False
|
|
898
|
+
)
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
def create_react_agent( # noqa: D417
|
|
902
|
+
model: Union[
|
|
903
|
+
str,
|
|
904
|
+
BaseChatModel,
|
|
905
|
+
SyncOrAsync[[StateT, Runtime[ContextT]], BaseChatModel],
|
|
906
|
+
],
|
|
907
|
+
tools: Union[Sequence[Union[BaseTool, Callable, dict[str, Any]]], ToolNode],
|
|
908
|
+
*,
|
|
909
|
+
prompt: Prompt | None = None,
|
|
910
|
+
response_format: Union[
|
|
911
|
+
ToolStrategy[StructuredResponseT],
|
|
912
|
+
ProviderStrategy[StructuredResponseT],
|
|
913
|
+
type[StructuredResponseT],
|
|
914
|
+
]
|
|
915
|
+
| None = None,
|
|
916
|
+
pre_model_hook: RunnableLike | None = None,
|
|
917
|
+
post_model_hook: RunnableLike | None = None,
|
|
918
|
+
state_schema: type[StateT] | None = None,
|
|
919
|
+
context_schema: type[ContextT] | None = None,
|
|
920
|
+
checkpointer: Checkpointer | None = None,
|
|
921
|
+
store: BaseStore | None = None,
|
|
922
|
+
interrupt_before: list[str] | None = None,
|
|
923
|
+
interrupt_after: list[str] | None = None,
|
|
924
|
+
debug: bool = False,
|
|
925
|
+
version: Literal["v1", "v2"] = "v2",
|
|
926
|
+
name: str | None = None,
|
|
927
|
+
**deprecated_kwargs: Any,
|
|
928
|
+
) -> CompiledStateGraph[StateT, ContextT]:
|
|
929
|
+
"""Creates an agent graph that calls tools in a loop until a stopping condition is met.
|
|
930
|
+
|
|
931
|
+
For more details on using `create_react_agent`, visit [Agents](https://langchain-ai.github.io/langgraph/agents/overview/) documentation.
|
|
932
|
+
|
|
933
|
+
Args:
|
|
934
|
+
model: The language model for the agent. Supports static and dynamic
|
|
935
|
+
model selection.
|
|
936
|
+
|
|
937
|
+
- **Static model**: A chat model instance (e.g., `ChatOpenAI()`) or
|
|
938
|
+
string identifier (e.g., `"openai:gpt-4"`)
|
|
939
|
+
- **Dynamic model**: A callable with signature
|
|
940
|
+
`(state, runtime) -> BaseChatModel` that returns different models
|
|
941
|
+
based on runtime context
|
|
942
|
+
If the model has tools bound via `.bind_tools()` or other configurations,
|
|
943
|
+
the return type should be a Runnable[LanguageModelInput, BaseMessage]
|
|
944
|
+
Coroutines are also supported, allowing for asynchronous model selection.
|
|
945
|
+
|
|
946
|
+
Dynamic functions receive graph state and runtime, enabling
|
|
947
|
+
context-dependent model selection. Must return a `BaseChatModel`
|
|
948
|
+
instance. For tool calling, bind tools using `.bind_tools()`.
|
|
949
|
+
Bound tools must be a subset of the `tools` parameter.
|
|
950
|
+
|
|
951
|
+
Dynamic model example:
|
|
952
|
+
```python
|
|
953
|
+
from dataclasses import dataclass
|
|
954
|
+
|
|
955
|
+
@dataclass
|
|
956
|
+
class ModelContext:
|
|
957
|
+
model_name: str = "gpt-3.5-turbo"
|
|
958
|
+
|
|
959
|
+
# Instantiate models globally
|
|
960
|
+
gpt4_model = ChatOpenAI(model="gpt-4")
|
|
961
|
+
gpt35_model = ChatOpenAI(model="gpt-3.5-turbo")
|
|
962
|
+
|
|
963
|
+
def select_model(state: AgentState, runtime: Runtime[ModelContext]) -> ChatOpenAI:
|
|
964
|
+
model_name = runtime.context.model_name
|
|
965
|
+
model = gpt4_model if model_name == "gpt-4" else gpt35_model
|
|
966
|
+
return model.bind_tools(tools)
|
|
967
|
+
```
|
|
968
|
+
|
|
969
|
+
!!! note "Dynamic Model Requirements"
|
|
970
|
+
Ensure returned models have appropriate tools bound via
|
|
971
|
+
`.bind_tools()` and support required functionality. Bound tools
|
|
972
|
+
must be a subset of those specified in the `tools` parameter.
|
|
973
|
+
|
|
974
|
+
tools: A list of tools or a ToolNode instance.
|
|
975
|
+
If an empty list is provided, the agent will consist of a single LLM node without tool calling.
|
|
976
|
+
prompt: An optional prompt for the LLM. Can take a few different forms:
|
|
977
|
+
|
|
978
|
+
- str: This is converted to a SystemMessage and added to the beginning of the list of messages in state["messages"].
|
|
979
|
+
- SystemMessage: this is added to the beginning of the list of messages in state["messages"].
|
|
980
|
+
- Callable: This function should take in full graph state and the output is then passed to the language model.
|
|
981
|
+
- Runnable: This runnable should take in full graph state and the output is then passed to the language model.
|
|
982
|
+
|
|
983
|
+
response_format: An optional UsingToolStrategy configuration for structured responses.
|
|
984
|
+
|
|
985
|
+
If provided, the agent will handle structured output via tool calls during the normal conversation flow.
|
|
986
|
+
When the model calls a structured output tool, the response will be captured and returned in the 'structured_response' state key.
|
|
987
|
+
If not provided, `structured_response` will not be present in the output state.
|
|
988
|
+
|
|
989
|
+
The UsingToolStrategy should contain:
|
|
990
|
+
- schemas: A sequence of ResponseSchema objects that define the structured output format
|
|
991
|
+
- tool_choice: Either "required" or "auto" to control when structured output is used
|
|
992
|
+
|
|
993
|
+
Each ResponseSchema contains:
|
|
994
|
+
- schema: A Pydantic model that defines the structure
|
|
995
|
+
- name: Optional custom name for the tool (defaults to model name)
|
|
996
|
+
- description: Optional custom description (defaults to model docstring)
|
|
997
|
+
- strict: Whether to enforce strict validation
|
|
998
|
+
|
|
999
|
+
!!! Important
|
|
1000
|
+
`response_format` requires the model to support tool calling
|
|
1001
|
+
|
|
1002
|
+
!!! Note
|
|
1003
|
+
Structured responses are handled directly in the model call node via tool calls, eliminating the need for separate structured response nodes.
|
|
1004
|
+
|
|
1005
|
+
pre_model_hook: An optional node to add before the `agent` node (i.e., the node that calls the LLM).
|
|
1006
|
+
Useful for managing long message histories (e.g., message trimming, summarization, etc.).
|
|
1007
|
+
Pre-model hook must be a callable or a runnable that takes in current graph state and returns a state update in the form of
|
|
1008
|
+
```python
|
|
1009
|
+
# At least one of `messages` or `llm_input_messages` MUST be provided
|
|
1010
|
+
{
|
|
1011
|
+
# If provided, will UPDATE the `messages` in the state
|
|
1012
|
+
"messages": [RemoveMessage(id=REMOVE_ALL_MESSAGES), ...],
|
|
1013
|
+
# If provided, will be used as the input to the LLM,
|
|
1014
|
+
# and will NOT UPDATE `messages` in the state
|
|
1015
|
+
"llm_input_messages": [...],
|
|
1016
|
+
# Any other state keys that need to be propagated
|
|
1017
|
+
...
|
|
1018
|
+
}
|
|
1019
|
+
```
|
|
1020
|
+
|
|
1021
|
+
!!! Important
|
|
1022
|
+
At least one of `messages` or `llm_input_messages` MUST be provided and will be used as an input to the `agent` node.
|
|
1023
|
+
The rest of the keys will be added to the graph state.
|
|
1024
|
+
|
|
1025
|
+
!!! Warning
|
|
1026
|
+
If you are returning `messages` in the pre-model hook, you should OVERWRITE the `messages` key by doing the following:
|
|
1027
|
+
|
|
1028
|
+
```python
|
|
1029
|
+
{
|
|
1030
|
+
"messages": [RemoveMessage(id=REMOVE_ALL_MESSAGES), *new_messages]
|
|
1031
|
+
...
|
|
1032
|
+
}
|
|
1033
|
+
```
|
|
1034
|
+
post_model_hook: An optional node to add after the `agent` node (i.e., the node that calls the LLM).
|
|
1035
|
+
Useful for implementing human-in-the-loop, guardrails, validation, or other post-processing.
|
|
1036
|
+
Post-model hook must be a callable or a runnable that takes in current graph state and returns a state update.
|
|
1037
|
+
|
|
1038
|
+
!!! Note
|
|
1039
|
+
Only available with `version="v2"`.
|
|
1040
|
+
state_schema: An optional state schema that defines graph state.
|
|
1041
|
+
Must have `messages` and `remaining_steps` keys.
|
|
1042
|
+
Defaults to `AgentState` that defines those two keys.
|
|
1043
|
+
context_schema: An optional schema for runtime context.
|
|
1044
|
+
checkpointer: An optional checkpoint saver object. This is used for persisting
|
|
1045
|
+
the state of the graph (e.g., as chat memory) for a single thread (e.g., a single conversation).
|
|
1046
|
+
store: An optional store object. This is used for persisting data
|
|
1047
|
+
across multiple threads (e.g., multiple conversations / users).
|
|
1048
|
+
interrupt_before: An optional list of node names to interrupt before.
|
|
1049
|
+
Should be one of the following: "agent", "tools".
|
|
1050
|
+
This is useful if you want to add a user confirmation or other interrupt before taking an action.
|
|
1051
|
+
interrupt_after: An optional list of node names to interrupt after.
|
|
1052
|
+
Should be one of the following: "agent", "tools".
|
|
1053
|
+
This is useful if you want to return directly or run additional processing on an output.
|
|
1054
|
+
debug: A flag indicating whether to enable debug mode.
|
|
1055
|
+
version: Determines the version of the graph to create.
|
|
1056
|
+
Can be one of:
|
|
1057
|
+
|
|
1058
|
+
- `"v1"`: The tool node processes a single message. All tool
|
|
1059
|
+
calls in the message are executed in parallel within the tool node.
|
|
1060
|
+
- `"v2"`: The tool node processes a tool call.
|
|
1061
|
+
Tool calls are distributed across multiple instances of the tool
|
|
1062
|
+
node using the [Send](https://langchain-ai.github.io/langgraph/concepts/low_level/#send)
|
|
1063
|
+
API.
|
|
1064
|
+
name: An optional name for the CompiledStateGraph.
|
|
1065
|
+
This name will be automatically used when adding ReAct agent graph to another graph as a subgraph node -
|
|
1066
|
+
particularly useful for building multi-agent systems.
|
|
1067
|
+
|
|
1068
|
+
!!! warning "`config_schema` Deprecated"
|
|
1069
|
+
The `config_schema` parameter is deprecated in v0.6.0 and support will be removed in v2.0.0.
|
|
1070
|
+
Please use `context_schema` instead to specify the schema for run-scoped context.
|
|
1071
|
+
|
|
1072
|
+
|
|
1073
|
+
Returns:
|
|
1074
|
+
A compiled LangChain runnable that can be used for chat interactions.
|
|
1075
|
+
|
|
1076
|
+
The "agent" node calls the language model with the messages list (after applying the prompt).
|
|
1077
|
+
If the resulting AIMessage contains `tool_calls`, the graph will then call the ["tools"][langgraph.prebuilt.tool_node.ToolNode].
|
|
1078
|
+
The "tools" node executes the tools (1 tool per `tool_call`) and adds the responses to the messages list
|
|
1079
|
+
as `ToolMessage` objects. The agent node then calls the language model again.
|
|
1080
|
+
The process repeats until no more `tool_calls` are present in the response.
|
|
1081
|
+
The agent then returns the full list of messages as a dictionary containing the key "messages".
|
|
1082
|
+
|
|
1083
|
+
``` mermaid
|
|
1084
|
+
sequenceDiagram
|
|
1085
|
+
participant U as User
|
|
1086
|
+
participant A as LLM
|
|
1087
|
+
participant T as Tools
|
|
1088
|
+
U->>A: Initial input
|
|
1089
|
+
Note over A: Prompt + LLM
|
|
1090
|
+
loop while tool_calls present
|
|
1091
|
+
A->>T: Execute tools
|
|
1092
|
+
T-->>A: ToolMessage for each tool_calls
|
|
1093
|
+
end
|
|
1094
|
+
A->>U: Return final state
|
|
1095
|
+
```
|
|
1096
|
+
|
|
1097
|
+
Example:
|
|
1098
|
+
```python
|
|
1099
|
+
from langchain.agents import create_react_agent
|
|
1100
|
+
|
|
1101
|
+
def check_weather(location: str) -> str:
|
|
1102
|
+
'''Return the weather forecast for the specified location.'''
|
|
1103
|
+
return f"It's always sunny in {location}"
|
|
1104
|
+
|
|
1105
|
+
graph = create_react_agent(
|
|
1106
|
+
"anthropic:claude-3-7-sonnet-latest",
|
|
1107
|
+
tools=[check_weather],
|
|
1108
|
+
prompt="You are a helpful assistant",
|
|
1109
|
+
)
|
|
1110
|
+
inputs = {"messages": [{"role": "user", "content": "what is the weather in sf"}]}
|
|
1111
|
+
for chunk in graph.stream(inputs, stream_mode="updates"):
|
|
1112
|
+
print(chunk)
|
|
1113
|
+
```
|
|
1114
|
+
"""
|
|
1115
|
+
# Handle deprecated config_schema parameter
|
|
1116
|
+
if (config_schema := deprecated_kwargs.pop("config_schema", MISSING)) is not MISSING:
|
|
1117
|
+
warn(
|
|
1118
|
+
"`config_schema` is deprecated and will be removed. Please use `context_schema` instead.",
|
|
1119
|
+
category=DeprecationWarning,
|
|
1120
|
+
stacklevel=2,
|
|
1121
|
+
)
|
|
1122
|
+
if context_schema is None:
|
|
1123
|
+
context_schema = config_schema
|
|
1124
|
+
|
|
1125
|
+
if len(deprecated_kwargs) > 0:
|
|
1126
|
+
msg = f"create_react_agent() got unexpected keyword arguments: {deprecated_kwargs}"
|
|
1127
|
+
raise TypeError(msg)
|
|
1128
|
+
|
|
1129
|
+
if response_format and not isinstance(response_format, (ToolStrategy, ProviderStrategy)):
|
|
1130
|
+
if _supports_native_structured_output(model):
|
|
1131
|
+
response_format = ProviderStrategy(
|
|
1132
|
+
schema=response_format,
|
|
1133
|
+
)
|
|
1134
|
+
else:
|
|
1135
|
+
response_format = ToolStrategy(
|
|
1136
|
+
schema=response_format,
|
|
1137
|
+
)
|
|
1138
|
+
elif isinstance(response_format, tuple) and len(response_format) == 2:
|
|
1139
|
+
msg = "Passing a 2-tuple as response_format is no longer supported. "
|
|
1140
|
+
raise ValueError(msg)
|
|
1141
|
+
|
|
1142
|
+
# Create and configure the agent builder
|
|
1143
|
+
builder = _AgentBuilder(
|
|
1144
|
+
model=model,
|
|
1145
|
+
tools=tools,
|
|
1146
|
+
prompt=prompt,
|
|
1147
|
+
response_format=cast("Union[ResponseFormat[StructuredResponseT], None]", response_format),
|
|
1148
|
+
pre_model_hook=pre_model_hook,
|
|
1149
|
+
post_model_hook=post_model_hook,
|
|
1150
|
+
state_schema=state_schema,
|
|
1151
|
+
context_schema=context_schema,
|
|
1152
|
+
version=version,
|
|
1153
|
+
name=name,
|
|
1154
|
+
store=store,
|
|
1155
|
+
)
|
|
1156
|
+
|
|
1157
|
+
# Build and compile the workflow
|
|
1158
|
+
workflow = builder.build()
|
|
1159
|
+
return workflow.compile( # type: ignore[return-value]
|
|
1160
|
+
checkpointer=checkpointer,
|
|
1161
|
+
store=store,
|
|
1162
|
+
interrupt_before=interrupt_before,
|
|
1163
|
+
interrupt_after=interrupt_after,
|
|
1164
|
+
debug=debug,
|
|
1165
|
+
name=name,
|
|
1166
|
+
)
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
__all__ = [
|
|
1170
|
+
"AgentState",
|
|
1171
|
+
"AgentStatePydantic",
|
|
1172
|
+
"AgentStateWithStructuredResponse",
|
|
1173
|
+
"AgentStateWithStructuredResponsePydantic",
|
|
1174
|
+
"create_react_agent",
|
|
1175
|
+
]
|