From 9762d685c7adcab7684fd3c8ca45c82fbc717a6f Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 21 Sep 2026 12:44:33 -0400
Subject: [PATCH] docs: update OpenWiki (#40359)
Automated OpenWiki documentation update.
OpenWiki result: success
When the result is `failure`, this PR intentionally preserves only the
pages completed before the failure. Merge it to make that progress the
baseline for the next scheduled run.
Co-authored-by: npentrel <5212232+npentrel@users.noreply.github.com>
---
openwiki/.claims/agent-execution.json | 16 +-
openwiki/.claims/agent-factory.json | 16 +-
openwiki/.claims/architecture.json | 16 +-
openwiki/.claims/callbacks.json | 4 +-
openwiki/.claims/chat-models.json | 4 +-
openwiki/.claims/ci-workflows.json | 42 +-
openwiki/.claims/composability.json | 56 ++-
openwiki/.claims/dev-commands.json | 4 +-
openwiki/.claims/integration-tests.json | 4 +-
openwiki/.claims/mcp-integration.json | 24 +-
openwiki/.claims/messages.json | 4 +-
openwiki/.claims/middleware.json | 12 +-
openwiki/.claims/model-initialization.json | 6 +-
openwiki/.claims/openai-provider.json | 138 ++++++-
openwiki/.claims/partner-pattern.json | 22 +-
openwiki/.claims/prompts.json | 4 +-
openwiki/.claims/quickstart.json | 12 +-
openwiki/.claims/runnables.json | 4 +-
openwiki/.claims/source-map.json | 18 +-
openwiki/.claims/streaming.json | 4 +-
openwiki/.claims/structured-output.json | 4 +-
openwiki/.claims/tools.json | 4 +-
openwiki/.claims/unit-tests.json | 6 +-
openwiki/.last-update.json | 4 +-
openwiki/.page-manifest.json | 184 ++++-----
openwiki/agent-execution.md | 20 +-
openwiki/agent-factory.md | 53 +--
openwiki/architecture.md | 16 +-
openwiki/callbacks.md | 17 +-
openwiki/chat-models.md | 2 +-
openwiki/ci-workflows.md | 23 +-
openwiki/composability.md | 112 +++++-
openwiki/dev-commands.md | 2 +-
openwiki/index.md | 6 +-
openwiki/integration-tests.md | 2 +-
openwiki/mcp-integration.md | 6 +-
openwiki/messages.md | 2 +-
openwiki/middleware.md | 6 +-
openwiki/model-initialization.md | 9 +-
openwiki/openai-provider.md | 445 +++++++++++++++++++--
openwiki/partner-pattern.md | 12 +-
openwiki/prompts.md | 2 +-
openwiki/quickstart.md | 44 +-
openwiki/runnables.md | 2 +-
openwiki/source-map.md | 12 +-
openwiki/streaming.md | 351 ++++++++--------
openwiki/structured-output.md | 2 +-
openwiki/tools.md | 10 +-
openwiki/unit-tests.md | 20 +-
49 files changed, 1276 insertions(+), 512 deletions(-)
diff --git a/openwiki/.claims/agent-execution.json b/openwiki/.claims/agent-execution.json
index 3316d68b21..c8d6044724 100644
--- a/openwiki/.claims/agent-execution.json
+++ b/openwiki/.claims/agent-execution.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:bd16b5e2d2f508d0aba8962fb1e836569b2a9af1615a3ec3a278948b6b703043",
+ "pageVersion": "sha256:6d2dd5c14c9fd39233694a1e55b4834368b448da97791dd15f15bc0543d0a4ad",
"claims": [
{
"id": "claim_601f8ad960a04f2195c35dab22235db1",
@@ -80,11 +80,11 @@
},
{
"id": "claim_28399de8706b4de9a4940d95163c6961",
- "statement": "_make_tools_to_model_edge decides after tool execution whether to continue the loop or exit. It exits if no AIMessage exists, if all executed client-side tools have return_direct=True, or if a structured output tool was executed. Otherwise it loops back to the model via loop_entry_node.",
+ "statement": "_make_tools_to_model_edge decides after tool execution whether to continue the loop or exit. It routes back to the model if no AIMessage exists (for recovery). It exits if all executed client-side tools have return_direct=True or if a structured output tool was executed. Otherwise it loops back to the model via model_destination.",
"evidence": [
{
- "resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L2004-L2038",
- "version": "repo-lines-v1:sha256:d4d2f05e92f40a9bf4105bce6ae4578bc49a8e2803c4a74c7e3f86cb5c8b91d6:eyJzZWxlY3RlZExpbmVDb3VudCI6MzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxY2ZjMmJmMGMwNmFhZmMyOTNjNWE3MTkzYzc2MjFhMmQwYjIyOWZjNGE1MWZjZmRlOGUwYmRiYzUwNjUyMjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU4ZTE2NjY1MDcwYTE2MzkwYzYyZjliN2NkNWE2ZWQ5ZmI2ODZhODE2ZGNkNjAwMjBlNTNkMzhmNjAxYzUxYjkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRjM2UxMWUyMGMwZTFlZGQ0ZTVkOWQ4NGUxYTI4NjgzNTVlMzhlY2Q5MmRlMWE5OTIyNWRmOGZlN2RiZWZiZDAifQ"
+ "resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L2004-L2043",
+ "version": "repo-lines-v1:sha256:600efbf881448e5cb5250d3ab7f403b67c281cc1963747fb68ba2b03ce762369:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxY2ZjMmJmMGMwNmFhZmMyOTNjNWE3MTkzYzc2MjFhMmQwYjIyOWZjNGE1MWZjZmRlOGUwYmRiYzUwNjUyMjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM0NDc5Y2NlZDY2YWZmYzNjMDk5ODhiNTAzODY1NmNhNTJhOWY5YTQ0NTJjMWE0ZjZlZTQ1ZDVlYzViNDU3YTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU4ZTE2NjY1MDcwYTE2MzkwYzYyZjliN2NkNWE2ZWQ5ZmI2ODZhODE2ZGNkNjAwMjBlNTNkMzhmNjAxYzUxYjkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjEzYTAxMjkzY2I3Njk4NDI1NTk0MzViYzQ2ZGZjNTFhYTBhZmNlMWEzYjA0NzE0ZDNiMTdlMzA2YzdiMjQxZTAifQ"
}
]
},
@@ -134,15 +134,15 @@
},
{
"id": "claim_6f03a00d76e84d2b9df99159d2c73d41",
- "statement": "The agent loop terminates when: (1) model does not call tools (tool_calls is empty), (2) middleware sets jump_to='end', (3) all pending tool calls are structured output tools, (4) a structured output tool is executed, (5) a tool with return_direct=True is executed, or (6) an unhandled exception occurs.",
+ "statement": "The agent loop terminates when: (1) model does not call tools (tool_calls is empty), (2) middleware sets jump_to='end', (3) a structured output tool is executed and its response is parsed, (4) a tool with return_direct=True is executed, (5) state['structured_response'] is populated after a model invocation, or (6) an unhandled exception occurs.",
"evidence": [
{
"resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L1923-L1975",
"version": "repo-lines-v1:sha256:964403b0cff43101e0a6d7fc69ae5b93dc942efb343cfc9f243a36cbe0684356:eyJzZWxlY3RlZExpbmVDb3VudCI6NTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE1MTk5NmZkM2IyMzMzY2I4NjM2ZDA0ODRiZjE5M2FiMTBkM2EzMDIyYTEzNjVjYjUyMWM1OGViZjBlZDU5NWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjhlY2FhN2I3NjczYjkzMmU5YTQ1M2U2ZGJlNWFiN2E2NTQ4ZTkwYzFkMjdiZWQ0NWI2ZDU2NTUwODNmZTg1NmYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjUxMTJhMDFhZTM4MjIzNGM5YTBiNzQxOGIxNDJjMGI4MWQ2ODMwODhhMDAzYWVjNDgxZTkyNWYzOTk3NjhjNDQifQ"
},
{
- "resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L2004-L2038",
- "version": "repo-lines-v1:sha256:d4d2f05e92f40a9bf4105bce6ae4578bc49a8e2803c4a74c7e3f86cb5c8b91d6:eyJzZWxlY3RlZExpbmVDb3VudCI6MzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxY2ZjMmJmMGMwNmFhZmMyOTNjNWE3MTkzYzc2MjFhMmQwYjIyOWZjNGE1MWZjZmRlOGUwYmRiYzUwNjUyMjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU4ZTE2NjY1MDcwYTE2MzkwYzYyZjliN2NkNWE2ZWQ5ZmI2ODZhODE2ZGNkNjAwMjBlNTNkMzhmNjAxYzUxYjkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRjM2UxMWUyMGMwZTFlZGQ0ZTVkOWQ4NGUxYTI4NjgzNTVlMzhlY2Q5MmRlMWE5OTIyNWRmOGZlN2RiZWZiZDAifQ"
+ "resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L2004-L2043",
+ "version": "repo-lines-v1:sha256:600efbf881448e5cb5250d3ab7f403b67c281cc1963747fb68ba2b03ce762369:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxY2ZjMmJmMGMwNmFhZmMyOTNjNWE3MTkzYzc2MjFhMmQwYjIyOWZjNGE1MWZjZmRlOGUwYmRiYzUwNjUyMjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM0NDc5Y2NlZDY2YWZmYzNjMDk5ODhiNTAzODY1NmNhNTJhOWY5YTQ0NTJjMWE0ZjZlZTQ1ZDVlYzViNDU3YTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU4ZTE2NjY1MDcwYTE2MzkwYzYyZjliN2NkNWE2ZWQ5ZmI2ODZhODE2ZGNkNjAwMjBlNTNkMzhmNjAxYzUxYjkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjEzYTAxMjkzY2I3Njk4NDI1NTk0MzViYzQ2ZGZjNTFhYTBhZmNlMWEzYjA0NzE0ZDNiMTdlMzA2YzdiMjQxZTAifQ"
}
]
},
@@ -247,6 +247,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/agent-factory.json b/openwiki/.claims/agent-factory.json
index f09ceabb41..4782addaab 100644
--- a/openwiki/.claims/agent-factory.json
+++ b/openwiki/.claims/agent-factory.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:861e60569112cc57094912804e603c9cd7bd4162df709645dd543bb46b2cca3f",
+ "pageVersion": "sha256:2c73027e4ac35b6bafe1b1e6da66b81ecdbdfdd7c36522eee378830a21a33af5",
"claims": [
{
"id": "claim_0d3a898647bd4d1d9c08eb386919394b",
@@ -14,15 +14,15 @@
},
{
"id": "claim_6d5428a93f294d5daf8a181cdd80d95f",
- "statement": "The agent factory constructs a state machine with nodes: START → before_agent → before_model → model → after_model → [tools → after_model loop | after_agent] → END. The model is called, and if it returns tool calls, the tools node executes them and loops back unless a tool has return_direct=True or a structured output was produced.",
+ "statement": "The agent factory constructs a state machine with nodes: START → entry_node (before_agent or before_model or model) → loop_entry_node (before_model or model) → model → loop_exit_node (after_model or model) → [tools → loop_entry_node loop | exit_node] → END. The model is called, and if it returns tool calls, the tools node executes them and loops back to loop_entry_node unless a tool has return_direct=True, a structured output was produced, or no pending tool calls remain.",
"evidence": [
{
"resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L1647-L1743",
"version": "repo-lines-v1:sha256:e5d4752fd45563b2294e6d0e37f5aff8f5ced6fd3f7b62a204f170a82d433a0b:eyJzZWxlY3RlZExpbmVDb3VudCI6OTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImIyYjM1ZjA3NzlhODIwMDkzMTkzZDkzOGEzYWE0OTA1NmVjMjk2ODc2YjViM2E1YWQyZmU1MTA3MDMyMDEzZGQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MDlhNTNhNjE4ZDAyOGUxZDMwMDBjMGE3YWJjZWVjYmU1ZmIzN2Y0ZTUxMWVmZTQ2NjQzZmFkNmU2Njg3MmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQwOWY2YTA3YmVkNjMwN2Q0MjRjNjAxMzRjMzg3ZThiZjc1NDAxNGEzZjY0ZDk0NzQ3ZWFhZWRkZWViZTMxZTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjcxN2UwYTFmMTc1YWZhZGQ2MGViYzMwOGQzMGU4ZDQ3NGExZDVmZGIyMDFlZWZjZWM5NTk0NDRlM2RkZTQ1MDgifQ"
},
{
- "resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L1923-L2037",
- "version": "repo-lines-v1:sha256:a9bc359f6e804a4cdc0cb76ebfb4141003353d4d8539636a2a7f5f658cb4c82c:eyJzZWxlY3RlZExpbmVDb3VudCI6MTE1LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIxNTE5OTZmZDNiMjMzM2NiODYzNmQwNDg0YmYxOTNhYjEwZDNhMzAyMmExMzY1Y2I1MjFjNThlYmYwZWQ1OTVlIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJjNDQ3OWNjZWQ2NmFmZmMzYzA5OTg4YjUwMzg2NTZjYTUyYTlmOWE0NDUyYzFhNGY2ZWU0NWQ1ZWM1YjQ1N2EzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI4ZWNhYTdiNzY3M2I5MzJlOWE0NTNlNmRiZTVhYjdhNjU0OGU5MGMxZDI3YmVkNDViNmQ1NjU1MDgzZmU4NTZmIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIxM2EwMTI5M2NiNzY5ODQyNTU5NDM1YmM0NmRmYzUxYWEwYWZjZTFhM2IwNDcxNGQzYjE3ZTMwNmM3YjI0MWUwIn0"
+ "resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L2004-L2043",
+ "version": "repo-lines-v1:sha256:600efbf881448e5cb5250d3ab7f403b67c281cc1963747fb68ba2b03ce762369:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxY2ZjMmJmMGMwNmFhZmMyOTNjNWE3MTkzYzc2MjFhMmQwYjIyOWZjNGE1MWZjZmRlOGUwYmRiYzUwNjUyMjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM0NDc5Y2NlZDY2YWZmYzNjMDk5ODhiNTAzODY1NmNhNTJhOWY5YTQ0NTJjMWE0ZjZlZTQ1ZDVlYzViNDU3YTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU4ZTE2NjY1MDcwYTE2MzkwYzYyZjliN2NkNWE2ZWQ5ZmI2ODZhODE2ZGNkNjAwMjBlNTNkMzhmNjAxYzUxYjkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjEzYTAxMjkzY2I3Njk4NDI1NTk0MzViYzQ2ZGZjNTFhYTBhZmNlMWEzYjA0NzE0ZDNiMTdlMzA2YzdiMjQxZTAifQ"
}
]
},
@@ -112,15 +112,15 @@
},
{
"id": "claim_0acc06eb9c7d45e8b886f43ee4a296b7",
- "statement": "Tools are registered at agent creation from BaseTool instances, raw callables (auto-wrapped), or dict-based provider tools. The ToolNode batches pending tool calls and executes them. Conditional edges route back to model unless a tool has return_direct=True, a structured output tool was called, or no tool calls remain.",
+ "statement": "Tools are registered at agent creation from BaseTool instances, raw callables (auto-wrapped), or dict-based provider tools. The ToolNode batches pending tool calls and executes them. Conditional edges route back to loop_entry_node unless all executed tools have return_direct=True, a structured output tool was called, or no pending tool calls remain.",
"evidence": [
{
"resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L1077-L1096",
"version": "repo-lines-v1:sha256:f51ce8995c6e7b5b534cc0b32939c94c0739cfdae2e1bac61c23707201372310:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkxN2EyMDA1ODk0MzI1ODA1MmVlOTkzNDZjZmQwNGI0OTVmOWM4ZGI5NDMyMjMzYTk3ZWMxNWI5ZGM3ZDZhOWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwYzFmMTg4ZjE0MmVkN2E4MjQ2ODBiMjA3MTcyYzU1MTliYzYxNGE0OGZkYTdjZjE2N2VkYjhkZGY3OTk1NmMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjFiZmE4NzY1YjhjZDgxOWNlZDI4ODVkMzFmMTNkNTUwMGUwYWJiMjdhZGM1M2FlOWM3ZDE5YTJmZTNhNDFkZTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE4YzM2ZmUxMTg0NTI5MDAyNThmZjEwNWEyY2M2NjNlZWJlOWFhN2YxN2YwYzM0NTI3ZWU5NWM0ODdmYTQ4YWQifQ"
},
{
- "resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L2004-L2037",
- "version": "repo-lines-v1:sha256:940f4f6befc1131d7e75249e7b77d093f0043727ec8dad72724605c33f9e9d89:eyJzZWxlY3RlZExpbmVDb3VudCI6MzQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxY2ZjMmJmMGMwNmFhZmMyOTNjNWE3MTkzYzc2MjFhMmQwYjIyOWZjNGE1MWZjZmRlOGUwYmRiYzUwNjUyMjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM0NDc5Y2NlZDY2YWZmYzNjMDk5ODhiNTAzODY1NmNhNTJhOWY5YTQ0NTJjMWE0ZjZlZTQ1ZDVlYzViNDU3YTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU4ZTE2NjY1MDcwYTE2MzkwYzYyZjliN2NkNWE2ZWQ5ZmI2ODZhODE2ZGNkNjAwMjBlNTNkMzhmNjAxYzUxYjkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjEzYTAxMjkzY2I3Njk4NDI1NTk0MzViYzQ2ZGZjNTFhYTBhZmNlMWEzYjA0NzE0ZDNiMTdlMzA2YzdiMjQxZTAifQ"
+ "resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L2004-L2043",
+ "version": "repo-lines-v1:sha256:600efbf881448e5cb5250d3ab7f403b67c281cc1963747fb68ba2b03ce762369:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxY2ZjMmJmMGMwNmFhZmMyOTNjNWE3MTkzYzc2MjFhMmQwYjIyOWZjNGE1MWZjZmRlOGUwYmRiYzUwNjUyMjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM0NDc5Y2NlZDY2YWZmYzNjMDk5ODhiNTAzODY1NmNhNTJhOWY5YTQ0NTJjMWE0ZjZlZTQ1ZDVlYzViNDU3YTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU4ZTE2NjY1MDcwYTE2MzkwYzYyZjliN2NkNWE2ZWQ5ZmI2ODZhODE2ZGNkNjAwMjBlNTNkMzhmNjAxYzUxYjkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjEzYTAxMjkzY2I3Njk4NDI1NTk0MzViYzQ2ZGZjNTFhYTBhZmNlMWEzYjA0NzE0ZDNiMTdlMzA2YzdiMjQxZTAifQ"
}
]
},
@@ -225,6 +225,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/architecture.json b/openwiki/.claims/architecture.json
index d39c14ef68..9da92cfb53 100644
--- a/openwiki/.claims/architecture.json
+++ b/openwiki/.claims/architecture.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:955c0c402efcda6052d84d4421645bd6720847d59e4d25c1c4ac40bec2d68e2a",
+ "pageVersion": "sha256:e2eaa0a82ef06f6bae3ab2af47341b9267a702975bbde4e2512ea2fc13086df9",
"claims": [
{
"id": "claim_d872799ce6874d76b63667fe912b7616",
@@ -26,7 +26,7 @@
},
{
"id": "claim_bf4afec1395b4acbbf413fe2928daab6",
- "statement": "langchain-core (v1.6.2) provides the stable base abstractions including Runnable protocol, BaseChatModel, message types, tools, prompts, and callbacks.",
+ "statement": "langchain-core (v1.6.3) provides the stable base abstractions including Runnable protocol, BaseChatModel, message types, tools, prompts, and callbacks.",
"evidence": [
{
"resource": "repo://libs/core/langchain_core/language_models/chat_models.py#L1-L50",
@@ -38,25 +38,25 @@
},
{
"resource": "repo://libs/core/pyproject.toml#L24-L24",
- "version": "repo-lines-v1:sha256:aedcca5df1c476f4736d0f7d783cfab756063205d0b98960d97ce7c40356c7e8:eyJzZWxlY3RlZExpbmVDb3VudCI6MSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYWVkY2NhNWRmMWM0NzZmNDczNmQwZjdkNzgzY2ZhYjc1NjA2MzIwNWQwYjk4OTYwZDk3Y2U3YzQwMzU2YzdlOCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYWVkY2NhNWRmMWM0NzZmNDczNmQwZjdkNzgzY2ZhYjc1NjA2MzIwNWQwYjk4OTYwZDk3Y2U3YzQwMzU2YzdlOCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmRmYWFiMzNiMmUzYTUwMTM3NmZlODIxNDNkNzBmNmVkYjMyNWI4YWMzYWI5MDUwYTg0OTgwN2ZmM2FhZGI3NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOGEyM2RmNzFkODljMGE5NmUzNWFhZjk1ZTdjZTllYTczYTRiN2FlZjQyNDZjN2Q3YzAzZjhlM2EwMTJiZjliNSJ9"
+ "version": "repo-lines-v1:sha256:67892ee7e2e8e6143d7f7f98cf7004dbd056574aec1c7f6da71cbfcc086d07fb:eyJzZWxlY3RlZExpbmVDb3VudCI6MSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNjc4OTJlZTdlMmU4ZTYxNDNkN2Y3Zjk4Y2Y3MDA0ZGJkMDU2NTc0YWVjMWM3ZjZkYTcxY2JmY2MwODZkMDdmYiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNjc4OTJlZTdlMmU4ZTYxNDNkN2Y3Zjk4Y2Y3MDA0ZGJkMDU2NTc0YWVjMWM3ZjZkYTcxY2JmY2MwODZkMDdmYiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmRmYWFiMzNiMmUzYTUwMTM3NmZlODIxNDNkNzBmNmVkYjMyNWI4YWMzYWI5MDUwYTg0OTgwN2ZmM2FhZGI3NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOGEyM2RmNzFkODljMGE5NmUzNWFhZjk1ZTdjZTllYTczYTRiN2FlZjQyNDZjN2Q3YzAzZjhlM2EwMTJiZjliNSJ9"
}
]
},
{
"id": "claim_54ce93defa3a454f9a4a03bc2d6ef614",
- "statement": "langchain (v1.4.0) depends on langchain-core and LangGraph, and provides the Agent Factory, agent middleware system, and init_chat_model for high-level orchestration.",
+ "statement": "langchain (v1.4.2) depends on langchain-core and LangGraph, and provides the Agent Factory, agent middleware system, and init_chat_model for high-level orchestration.",
"evidence": [
{
"resource": "repo://libs/langchain_v1/langchain/agents/factory.py#L1-L50",
"version": "repo-lines-v1:sha256:37c541026ea7a52554d7ef187d5ebb63de7262e3fbd5ab31e15895e63f83ee0b:eyJzZWxlY3RlZExpbmVDb3VudCI6NTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRiODk5ZDMyOGM3OWUzYTI0NzBmNDgxMDRjMGNhMjgyYmMyYTU2ODZlMmU3ZDhmOTdmOGEzMzFmOTQ1MzAxOGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZjMDExN2RlMmQ0N2YyNmMzOWIwNTkzNDEwNzYzYmI4NTBmNjMzMzUyOGQ2MGE3YWFmNDZmN2NmM2RkOWEzMTQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjgyNGRlMmE2YTc3N2ZiNWRjOTk4MmUwNDBlYzY3M2VmNWEwOGVhZmRkMTEyM2JiNWQwMWZiODk4MTZmNzI0MzUifQ"
},
{
- "resource": "repo://libs/langchain_v1/langchain/chat_models/base.py#L40-L100",
- "version": "repo-lines-v1:sha256:0df6b02c264382e864de70c5639df298325600f5ae5d73c025c60952ed7ac692:eyJzZWxlY3RlZExpbmVDb3VudCI6NjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRhZThiZWVkZDRkNzFkMTk1MDM2NTk3YjQxNTY0OTFhYjA3MTYyNGQzNWFiYWJlZDBiYjc5YzIyZWZkNWU0ZGYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVhNWM3YzdlOTc3NDFmYzU0NWViODQ4YzY1MGEwZWE0NTI1Y2VhYWU0ZTgxOWJkNjQ3NzgzZjA5NzlmYzJhMmMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZmN2Q5MTY0Mzc2YzZkMThkZDZkMTNiN2U2MTZlNzdjMTc2MDBjZTQ4YWVlNTA0MGJlZTJjNmRiOWUxMmM1NzUifQ"
+ "resource": "repo://libs/langchain_v1/langchain/chat_models/base.py#L1-L100",
+ "version": "repo-lines-v1:sha256:177ed818a218b34411626c6dcd0acd177faee055ce3738e360913bf7e3693235:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAwLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJkYmQ1OGIwYTEwODJhNjFmZWU5NGY4MTMyNjYzNTZjOGU2YTllYTJjMjQzMDgyOGNhNjI5NTI2MWY3MWQwYzc0IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJkYWU4YmVlZGQ0ZDcxZDE5NTAzNjU5N2I0MTU2NDkxYWIwNzE2MjRkMzVhYmFiZWQwYmI3OWMyMmVmZDVlNGRmIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MCwicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI2ZjdkOTE2NDM3NmM2ZDE4ZGQ2ZDEzYjdlNjE2ZTc3YzE3NjAwY2U0OGFlZTUwNDBiZWUyYzZkYjllMTJjNTc1In0"
},
{
"resource": "repo://libs/langchain_v1/pyproject.toml#L24-L30",
- "version": "repo-lines-v1:sha256:f1e9208403e3c9fd13366581d5ade2b9c624606c9a35e4bee2b4f08fbea1eb4a:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZDI0NzFjMzU4MDRjYjhkMDM3M2M4ODY1MTEyNWE2ODdjYzRmZDUzNWE5MzZkMjA0Y2QyZDFkZmIxZjM0NDgyZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZjk0MTZlMDlmNzhiYTMxNmMwMzI1NjgyMTNiODU1ZWU3NTZlNDE1NjVkOTE4ZjA5NTE5YzgxZmQ2MjBmNDA2MCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmRmYWFiMzNiMmUzYTUwMTM3NmZlODIxNDNkNzBmNmVkYjMyNWI4YWMzYWI5MDUwYTg0OTgwN2ZmM2FhZGI3NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDQyZWY1NmY0YTJjOWRmNjRkZDllM2VmMDBjZmZhYjIxNzM3ZjA1MWFjNTZjNzNkMGM2YTA3NDk0NDI2OGVhZSJ9"
+ "version": "repo-lines-v1:sha256:2ad19ef28e3bcec2b4cb818a5ce7403233f5b687ccf3bdf6b821fce0ed662bc4:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZmFlNWFkOTRiMWU5ZDQ0MGQxZGViZmI3MDlhMzkyYTQ4NTcyYzU5MjJmNWRiZDI5YjAzMTEyOGMwNWQyZDY5NSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZjk0MTZlMDlmNzhiYTMxNmMwMzI1NjgyMTNiODU1ZWU3NTZlNDE1NjVkOTE4ZjA5NTE5YzgxZmQ2MjBmNDA2MCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmRmYWFiMzNiMmUzYTUwMTM3NmZlODIxNDNkNzBmNmVkYjMyNWI4YWMzYWI5MDUwYTg0OTgwN2ZmM2FhZGI3NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDQyZWY1NmY0YTJjOWRmNjRkZDllM2VmMDBjZmZhYjIxNzM3ZjA1MWFjNTZjNzNkMGM2YTA3NDk0NDI2OGVhZSJ9"
}
]
},
@@ -149,6 +149,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-08T08:27:09.597Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/callbacks.json b/openwiki/.claims/callbacks.json
index d4231e08be..92d61892ba 100644
--- a/openwiki/.claims/callbacks.json
+++ b/openwiki/.claims/callbacks.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:1bc36cc5d9a9fd1c9ab60ccb76938f7eb0d0722738953a69f474fe7e532f2a78",
+ "pageVersion": "sha256:438fb8bb5d1224fb820ab31d6d0c8e16554980cf2e3e713ee995f9925142b53f",
"claims": [
{
"id": "claim_1870ae33ffdb41fa87eaee4125620240",
@@ -193,6 +193,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-08T08:27:09.597Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/chat-models.json b/openwiki/.claims/chat-models.json
index affc410788..d9e8ebcd1b 100644
--- a/openwiki/.claims/chat-models.json
+++ b/openwiki/.claims/chat-models.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:67dc4d64315fbd418d3cdd7cd0f5500ae8f6059c10d263e69dfedd8e7d3a8338",
+ "pageVersion": "sha256:5fe640d3b1fec48eebaf85f24ff73909b2f78e628131169dd37d3ea97895e8a2",
"claims": [
{
"id": "claim_d2cdcf05dd4149bb9ea0a5fb0d1568d8",
@@ -303,6 +303,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-08T08:27:09.597Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/ci-workflows.json b/openwiki/.claims/ci-workflows.json
index a84c6ce738..d7bce26988 100644
--- a/openwiki/.claims/ci-workflows.json
+++ b/openwiki/.claims/ci-workflows.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:8af0cd4e2f4fde3bbeaa007c68ac7b8049bd352e75e6455e2b7896818da707cc",
+ "pageVersion": "sha256:99120eb4274fdb568b343816c5a26e10c7e18e8f7307515fd2c70607b21f5f12",
"claims": [
{
"id": "claim_cb5fe3f72803497eac3f09ebf02d97cd",
@@ -90,7 +90,7 @@
"evidence": [
{
"resource": "repo://.github/workflows/_release.yml#L383-L540",
- "version": "repo-lines-v1:sha256:a104fedce8750e7ab5723c475b0b13ebfd3f3d796baf2019da078b2ec4acc729:eyJzZWxlY3RlZExpbmVDb3VudCI6MTU4LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIzNmI2OTNjOWRmMzU1MThmNzEyODQwN2UyNDhiODM3ZTAxZjBlZmJmNTQ4ZTg4MGUyMDA4NTgyZDdmMTI3MDdmIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiIzMzIxNWFlOWJkMDZkZTVkNGE1YjYyZDYxMjhkOTZlYWI1MGVjNWZjMjQ3ZGI2YjAzOWFlMzcyYTYyNTFlZTRmIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIwM2YwY2ViYjhlODY5OTBkMjBiMzc5MzljYmI1NzYyMDUwNmU4ZTJiZGNhOGU2NzBlZjVkMTczNTQxYmVlMDkzIn0"
+ "version": "repo-lines-v1:sha256:cdedcd960d8acd380444732587850d7c5819c6ba96fe744365d0f9c1e28210c6:eyJzZWxlY3RlZExpbmVDb3VudCI6MTU5LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIzNmI2OTNjOWRmMzU1MThmNzEyODQwN2UyNDhiODM3ZTAxZjBlZmJmNTQ4ZTg4MGUyMDA4NTgyZDdmMTI3MDdmIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiIzMzIxNWFlOWJkMDZkZTVkNGE1YjYyZDYxMjhkOTZlYWI1MGVjNWZjMjQ3ZGI2YjAzOWFlMzcyYTYyNTFlZTRmIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIwM2YwY2ViYjhlODY5OTBkMjBiMzc5MzljYmI1NzYyMDUwNmU4ZTJiZGNhOGU2NzBlZjVkMTczNTQxYmVlMDkzIn0"
}
]
},
@@ -110,7 +110,7 @@
"evidence": [
{
"resource": "repo://.github/workflows/integration_tests.yml#L152-L250",
- "version": "repo-lines-v1:sha256:f171d5b939a4417dba2c2ba55d219c4555bc150a7422e4b0fdd0ee5a3c902593:eyJzZWxlY3RlZExpbmVDb3VudCI6OTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjZTUzNjI0Nzk1ZDA0YmIxMjI2ZjI1NTgxOGUxNmRlZWZhMGU1ZTVlODYxN2I3MDZkMjAyNzA5MWYxMGE3ZWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNkNGQwMzc4MWVmYzEwM2VkMTMzNTk1YWFlMjlmYzI4NDdmMTBkYmQ1MjAzMWFhMTZiNmYzYTI0ODdjNDA5OTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE3ODljMzlkMGFiNzhkOWFjNzRjNDBiODEzZGRiNGNkYmRlMTc5Mjk0OTY4M2VhYzVmZTZiYjkyMDgwZTc2OGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRiNjU0ZGI5YTFhZjZiYTQ1MDQ2NDViODQxNWM5ODZjOTlmMmMzYTU1YTUyMzgwN2IwMmRhZDllMjM1Y2Q5OGQifQ"
+ "version": "repo-lines-v1:sha256:8b13d0714f4249cf34f163a21b2100013dbd521889e5b0aabc0ab66ff1980f79:eyJzZWxlY3RlZExpbmVDb3VudCI6OTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjZTUzNjI0Nzk1ZDA0YmIxMjI2ZjI1NTgxOGUxNmRlZWZhMGU1ZTVlODYxN2I3MDZkMjAyNzA5MWYxMGE3ZWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNkNGQwMzc4MWVmYzEwM2VkMTMzNTk1YWFlMjlmYzI4NDdmMTBkYmQ1MjAzMWFhMTZiNmYzYTI0ODdjNDA5OTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE3ODljMzlkMGFiNzhkOWFjNzRjNDBiODEzZGRiNGNkYmRlMTc5Mjk0OTY4M2VhYzVmZTZiYjkyMDgwZTc2OGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRiNjU0ZGI5YTFhZjZiYTQ1MDQ2NDViODQxNWM5ODZjOTlmMmMzYTU1YTUyMzgwN2IwMmRhZDllMjM1Y2Q5OGQifQ"
},
{
"resource": "repo://.github/workflows/integration_tests.yml#L56-L173",
@@ -124,17 +124,7 @@
"evidence": [
{
"resource": "repo://.github/workflows/integration_tests.yml#L179-L248",
- "version": "repo-lines-v1:sha256:c2e36b44b35a4586726b41e28ad4ec1f830ea00101b910b4d2f88368782174b0:eyJzZWxlY3RlZExpbmVDb3VudCI6NzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc1NjM5ZDFjYzRlNzE2NmUyYzlhYjNhM2Y4YTllMmIwMzNjYjcxNDZiYWU2MWU1YzZkOWM4YjIwYzEzYTNlZDciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMyMzA3MzdhMjFmYWIzYjUzMjU2OWUxNGJkYTkyMzc0YjQ4NDc4NGNhZWZhOTgyZDIzYjU0ZjRhNjhjNDc4YTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk0NmZmMzU1ZGZmZDExNTNiMDQ2NzhiMGIzMDVjNDBhNmU0MDNmYjk1YzEzNDUxNzZlODRmNTEzZTQyZmFiNjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjVjNTZmYTBhMzEzZjc0ZGRkZTRkMWM2M2UxY2RmMGJhMWExMDQ4ZTY3NmQ4OTI0YTZjOTNjYmEyMjc4MTNiNDYifQ"
- }
- ]
- },
- {
- "id": "claim_13b0caedf05f4f34b2d369323d87c866",
- "statement": "Issue auto-labeling (auto-label-by-package.yml) parses Package section from issue body supporting both dropdown and checkbox formats, maps package names to labels via JSON mapping table, and adds/removes labels to match selections.",
- "evidence": [
- {
- "resource": "repo://.github/workflows/auto-label-by-package.yml#L21-L100",
- "version": "repo-lines-v1:sha256:fca7a2ef5c5deb22252ab3af123e2380ec861fcd17f0a9cef1c1bd4f9f5f1403:eyJzZWxlY3RlZExpbmVDb3VudCI6ODAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRiYjA1ZmE0YjY4NTVmNDc1YTc0NDA0OTljN2JhZjNiZjk3OWMzNWZiYWNkZDhmZGU1ZTlhMTgzOGQyMTUzN2EiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMwMThjMzQ3MmE5ZDMxNWIyNTllNDQyNDMxNzRhMDQyYTNiZjk4ZjQ1ZDUyNjg3YWFlZGExNDgyNDVmYWNiMTAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE0NGJiNTllOGRlZWUxOTAxZDNjMWM3YTIyZjM2MDU3OGRkNTUwOTU1OGM0MzA2NzU0OTg0MzU3NWUyYTFjZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQ5MjU0ZTEzNzQ3YzczYzAyNDZhNWRjNzg3MTNiMGU0NmZmNTQwMTdiZjRiMjQ3NGUwNmEzMGZkY2U0MDllODIifQ"
+ "version": "repo-lines-v1:sha256:1c86a362fb57aaaecfadc02baa2e94d89c96e28c57287ad431c1cad8a0f304b4:eyJzZWxlY3RlZExpbmVDb3VudCI6NzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc1NjM5ZDFjYzRlNzE2NmUyYzlhYjNhM2Y4YTllMmIwMzNjYjcxNDZiYWU2MWU1YzZkOWM4YjIwYzEzYTNlZDciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMyMzA3MzdhMjFmYWIzYjUzMjU2OWUxNGJkYTkyMzc0YjQ4NDc4NGNhZWZhOTgyZDIzYjU0ZjRhNjhjNDc4YTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk0NmZmMzU1ZGZmZDExNTNiMDQ2NzhiMGIzMDVjNDBhNmU0MDNmYjk1YzEzNDUxNzZlODRmNTEzZTQyZmFiNjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjVjNTZmYTBhMzEzZjc0ZGRkZTRkMWM2M2UxY2RmMGJhMWExMDQ4ZTY3NmQ4OTI0YTZjOTNjYmEyMjc4MTNiNDYifQ"
}
]
},
@@ -154,7 +144,7 @@
"evidence": [
{
"resource": "repo://.github/workflows/openwiki-update.yml#L1-L77",
- "version": "repo-lines-v1:sha256:bd561d495ac81334fdfcf2b4984cd8b328074ef526f45bb4f2fc5e6598f4c75d:eyJzZWxlY3RlZExpbmVDb3VudCI6NzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA2MDI3ODdhZjZkY2MwODM0ZGUxMjFjYmIxY2I5NWY5NDU5YjcyMWVhYjAzNDlmMTA1MDFiOTk2YzFjNzdmZmYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM2NzE4ZjA2N2I1ZTVjMWYwOTkxYTZlNzQ3MjZmZTJhMjNkMjY0MzQ1ZTA4ZTRlYWQwNGZhZjczYzI3ZWQ0NDMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
+ "version": "repo-lines-v1:sha256:757a0464c4bfa6e90bebe84d82e084b32564b2dee926089427ab634568fd0b0f:eyJzZWxlY3RlZExpbmVDb3VudCI6NzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA2MDI3ODdhZjZkY2MwODM0ZGUxMjFjYmIxY2I5NWY5NDU5YjcyMWVhYjAzNDlmMTA1MDFiOTk2YzFjNzdmZmYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM2NzE4ZjA2N2I1ZTVjMWYwOTkxYTZlNzQ3MjZmZTJhMjNkMjY0MzQ1ZTA4ZTRlYWQwNGZhZjczYzI3ZWQ0NDMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
}
]
},
@@ -233,10 +223,30 @@
"version": "repo-lines-v1:sha256:39b10ceaaebbaea1eb3723c5cc264252f9516a3a822661b57df893a804b4cc06:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg3YTRhMTcyY2EwZWE3M2I4ZjBiZjRiMTNkYmY2NzgwODY4ZGQ0OWY0OWUxMTg2ZGVkMWIzYjI1MTJjMGJlOTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY5NDE2ZTA5Zjc4YmEzMTZjMDMyNTY4MjEzYjg1NWVlNzU2ZTQxNTY1ZDkxOGYwOTUxOWM4MWZkNjIwZjQwNjAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjAyNzhiMTRiZmE0YWQ5YWM1ZTg5Mjc3NGU5MWZiY2U1N2Q0MDFkYTc1ZWIzZWRhYmFjNjYzNGU5MTdjNTY4NWYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImNmNmYzOThhM2YzMjczNzdiZDM4NGE3YWZjMDRiMTRjMGI4ZGUzZTQyNTk1MDZiNmNlNzUzNWI4MGQ3YjY3MWQifQ"
}
]
+ },
+ {
+ "id": "claim_4517e15f74ed46219d24bee38d7aca20",
+ "statement": "Issue auto-labeling (auto-label-by-package.yml) parses Package section from issue body supporting both dropdown and checkbox formats, maps package names to labels via JSON mapping table, and adds/removes labels to match selections.",
+ "evidence": [
+ {
+ "resource": "repo://.github/workflows/auto-label-by-package.yml#L21-L117",
+ "version": "repo-lines-v1:sha256:e6a1cf9c930f0a6cceac2ed8f7e1e1a53ceab5ad207bb57e033cecbf97960a50:eyJzZWxlY3RlZExpbmVDb3VudCI6OTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRiYjA1ZmE0YjY4NTVmNDc1YTc0NDA0OTljN2JhZjNiZjk3OWMzNWZiYWNkZDhmZGU1ZTlhMTgzOGQyMTUzN2EiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1MjJjNDJjZDE5YzZkMDNkODA4YzQ1MjcyMDU1MjgyNWI3ZWExYzViNDkxYjIxODUxMWNhYzc0MTVjZjlkOWIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE0NGJiNTllOGRlZWUxOTAxZDNjMWM3YTIyZjM2MDU3OGRkNTUwOTU1OGM0MzA2NzU0OTg0MzU3NWUyYTFjZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_767e7bdf7bf2427f9be93fc8e28880c0",
+ "statement": "PR title linting (pr_lint.yml) enforces Conventional Commits 1.0.0 format on pull request titles, rejecting empty scope parentheses and validating type/scope combinations (feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert, release, hotfix) against allowed scopes including core, langchain, anthropic, openai, and cross-cutting concerns (infra, deps, partners).",
+ "evidence": [
+ {
+ "resource": "repo://.github/workflows/pr_lint.yml#L54-L129",
+ "version": "repo-lines-v1:sha256:c471cb5fa38ddbdddb9877794899351fac37019114d3b43a7fd58dd3dbf401ea:eyJzZWxlY3RlZExpbmVDb3VudCI6NzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNhY2ZmOWJkYTJhMDFlZTYzMjgxZmI3YzEzYzczODUxMzBjYjlmNDExYWM1ZTU4NDIwNmIxYTJmNWQxODM3YzMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM5ZTBkZWNmMzZiNTUwY2YyMjJiZTJiYzE3ZDUxYTg1MTYzZWM0Nzc2YjZiYTY2ZjU5OGM4MTBhOWIyYzI3ODkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjY5Yzc1MTJkNGI5ZDVmN2I2YjUzOWUzZWM3MjliZGMyNjg2NzQwMWRhY2NiZjFlZjZlNzM5ZDYxOTVjMmViMzkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
+ }
+ ]
}
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/composability.json b/openwiki/.claims/composability.json
index 6b8e595a12..1c7d107e01 100644
--- a/openwiki/.claims/composability.json
+++ b/openwiki/.claims/composability.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:2686a50367f151aef17fad64706fe0e5bb3d6d279febeecbac7d3760d2d17424",
+ "pageVersion": "sha256:b1feac445c4494398af24cf9d3767e68ffd5c1d3882b408e3e3c515d1a5f906e",
"claims": [
{
"id": "claim_51e65b4f126f42d986b2766ee964d991",
@@ -159,10 +159,62 @@
"version": "repo-lines-v1:sha256:dcb170b588e742a6b114ec378abf0fe9adc59525cecfedf62848d5e95203bb96:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgyMGI0NTNmNWUwYzkyZDVmNmMyNTFhNWVhMTk2MGQ3MmYzYmQwNzk1NmFlODU3ZGEyMGUzMWE4OGM1NTk2OWYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZmNDZkNzQ5OGExYTZiYjQ5MDJlMzhkMjcwZDI0YmFmNjczODcwMThmNzM1YWUyNmU1ZTI0YmE0OTJlMmMzODQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjAzMjBjM2ZhOTJjODlmZTA3YjYzZjI3Y2Y2MzY2ZmNiNjM3YTZmNGI5M2E3ODAxMTIwZTU0NGQ5MzVkNGMwZDQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUwMWJiYmQwMjVkMTZmMjE0MzM1NWI0NGQ3MzQ1OWQ3MWQxODM5OTJlOGI3NTE2NWMxOTAxZjMxMTg0ZWYxODEifQ"
}
]
+ },
+ {
+ "id": "claim_274df276f4164f0986482705d658ad40",
+ "statement": "RunnableSequence creates a callback hierarchy where each step is marked as a child run using run_manager.get_child(f'seq:step:{i + 1}'), and configuration context including callbacks, tags, and metadata flows through each step via patch_config while preserving parent context.",
+ "evidence": [
+ {
+ "resource": "repo://libs/core/langchain_core/runnables/base.py#L3447-L3456",
+ "version": "repo-lines-v1:sha256:d0e7a92d9bb4a4987f765dbcc982dfbb7cbbaec050279f5f19bc2d7009abfef9:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ0YzBmNTAyZmExMzg1NDI4MThmMTkwMGZhNzcxZDRlN2JhZTU1YWRhZDAwZWQ1NzdkMTYzODM4M2JlYzU3MTAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2MDljZGZiZmUyOGNjYzdkMDUwNzBhZTQzYjczZWRlNzRkMmQwNTdmYThlNTE1MmQ0MzI5NTRhYzc1YWY0ZDUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjViYzliOWZhYzZiMzE1NGQwZjJmZWE1ZGYyNzliNTM0ZDUwM2NhNzA4MTdlZDI3MDEzZjhiOGQzNTdlMWM1YWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdhZmFmY2EzOWQwNGE0NjRiOWJiZmI0NDFmOTliMzlkMzUyNjY2YzE0ZGQxYmZlMzU2N2I4MjlmNDc4ZmU3YjgifQ"
+ },
+ {
+ "resource": "repo://libs/core/langchain_core/runnables/base.py#L3486-L3496",
+ "version": "repo-lines-v1:sha256:4d9bf0584cfa7573fd2f441840f6971314a47a6f3acf08dc5af80c2de1f5354f:eyJzZWxlY3RlZExpbmVDb3VudCI6MTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ0YzBmNTAyZmExMzg1NDI4MThmMTkwMGZhNzcxZDRlN2JhZTU1YWRhZDAwZWQ1NzdkMTYzODM4M2JlYzU3MTAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE4MzliNjRjZGI1M2NiNDMyZGUyMjUyZTQyNDk3ZGE5M2JkZDA5MDY2ZTQ0YjA4ZDQyNDY4NzhlYzFlMzhlYzkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjViYzliOWZhYzZiMzE1NGQwZjJmZWE1ZGYyNzliNTM0ZDUwM2NhNzA4MTdlZDI3MDEzZjhiOGQzNTdlMWM1YWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijc1NjliNjdkOWJjNmQ0NzQ3ZjY0YzNkN2M4MzNiNTVhMmJkN2Y1NGI1ZmMzM2Q5NWQ1NWVkZmY4MTNjMTA2OTkifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_ebc1bd417f0b442198f6e66629796024",
+ "statement": "RunnableParallel applies the same input to each branch concurrently; in callback traces, each branch key becomes a separate child run via run_manager.get_child(f'map:key:{key}').",
+ "evidence": [
+ {
+ "resource": "repo://libs/core/langchain_core/runnables/base.py#L4164-L4174",
+ "version": "repo-lines-v1:sha256:5bf1f50f53bb8f8e1a3c05c41d993c9fed86dfeb782eccd07cb1bf59f43a56de:eyJzZWxlY3RlZExpbmVDb3VudCI6MTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI4YTQ3YWY2YjM4YTliMzJhYmQyYmViYmZmNmU4NGEzMGE2Nzk4OWMxNjU3ODJlMmVhNGFlNzg5NWI0MmMzMjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjUxMDM0ODFjNTdkMGYwZGMwZjc2Y2QyY2M4YjM2MDRjNGU4Mjk2ZGE0MTIyYWRkMTllODE3NDVkYzdlMzMxYTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJkZWI1ZDYxMTQ2MjAxYjFmOGQ5OTM3MzU1NzNjYjdhYmZlOWJjNzJkYTU0ZmFhMTJiMjk3ZDdkZjM4OTA3YjEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYxN2Q4MDFkMTc2ODY4Y2JlOGM4NWQ0YzY3M2U4YjJlOWU4NDk1ZmVmYWUzNGU2Njc1NjhmYjBiZDhjMmJhM2UifQ"
+ },
+ {
+ "resource": "repo://libs/core/langchain_core/runnables/base.py#L4219-L4226",
+ "version": "repo-lines-v1:sha256:ac18e058dcc4a58e25df6dac933d7af8d6c098c931c190f2f5ce29352e420617:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMjhhNDdhZjZiMzhhOWIzMmFiZDJiZWJiZmY2ZTg0YTMwYTY3OTg5YzE2NTc4MmUyZWE0YWU3ODk1YjQyYzMyMCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNTEwMzQ4MWM1N2QwZjBkYzBmNzZjZDJjYzhiMzYwNGM0ZTgyOTZkYTQxMjJhZGQxOWU4MTc0NWRjN2UzMzFhNiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiN2M4NDBlMTdjY2E5NjQyMjI1OTViYzYwNWQ3NjM3YWY0YTNmMTgxODQ3ODVlNmYwMDY1OWFhMzQ3ZTI4ZWRlMiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNjE3ZDgwMWQxNzY4NjhjYmU4Yzg1ZDRjNjczZThiMmU5ZTg0OTVmZWZhZTM0ZTY2NzU2OGZiMGJkOGMyYmEzZSJ9"
+ }
+ ]
+ },
+ {
+ "id": "claim_a0da484e66e343cf987c435a2a26e448",
+ "statement": "RunnableWithFallbacks wraps a runnable and fallbacks, trying the primary runnable first and sequentially attempting each fallback in order if an exception matching exceptions_to_handle occurs; it supports exception_key to pass the exception to fallbacks via the input dict.",
+ "evidence": [
+ {
+ "resource": "repo://libs/core/langchain_core/runnables/fallbacks.py#L164-L200",
+ "version": "repo-lines-v1:sha256:611b9639bec84a186374e367c3baee2de35ee00c89219030dbd95db4606b233b:eyJzZWxlY3RlZExpbmVDb3VudCI6MzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ0ZGE5MzUwMDE5ZGMxZTY2NzQ1MjY0Mzg3MzE2MTk5NzIyNWU5Y2U2MDEwN2FmN2I2NGY4NDBkZGVjZmRhNGYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjY3NTA0NDQwYWI1OTRhZWY0OTAzYzdlZWZiZTUwOWZhYjJmOGI0ZjY3MWE2OTlmNWJmZmU3ZmVjZDZiMTQ0Y2MiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNiODAzNzNmZDEyMWZkMzY0MDc4YjdkY2M4ZjRmZThlNWMzYWZjZTI2NTQ5ZTExODUzZmU3NDk2MjE0NWIwNDciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE2NWNiNmI1OWViYjcxYjE5NWRkZjBiNDU2NDdhNDhjYmI5MjRhOWFlMWRlMTIzZDU5NzgyMzVhOTc4NTI5YTYifQ"
+ },
+ {
+ "resource": "repo://libs/core/langchain_core/runnables/fallbacks.py#L37-L105",
+ "version": "repo-lines-v1:sha256:9a355b343c4f10e10c0c09d470c2a5af5537c95c3099117cc8463831a0c11916:eyJzZWxlY3RlZExpbmVDb3VudCI6NjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZjZTk5NmEzNTY1YmNjYTgwNzA3NjA0NjMxZTY5NzhlNjM5ZmQxOTJiMTg3NGYxOWI1YmNjNDFhZmY1NDAwYmUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2YTcxNTI1NzJlZTg0ZjEwOTA2Yzc0YjlmMmE5MjQzNGRkYWIwZTNjNDI4MTNiMDRlNTk3ZWZjZWM5NTFiMjYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJlYjkxZDk0MWU1MDQyNWVjN2E4ZTBhMjFkMmE1MmZjNWQ5OTM5MWY3OWJiN2NmOGU1N2MyNmVmNjkyNGU3NGYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUwMWJiYmQwMjVkMTZmMjE0MzM1NWI0NGQ3MzQ1OWQ3MWQxODM5OTJlOGI3NTE2NWMxOTAxZjMxMTg0ZWYxODEifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_fc2ef09032cc48cbb7fb1ddcc920cbe0",
+ "statement": "The with_fallbacks method on any Runnable returns a RunnableWithFallbacks instance that tries the original runnable followed by each fallback in order, with control over which exceptions to handle and optional exception passing to fallbacks.",
+ "evidence": [
+ {
+ "resource": "repo://libs/core/langchain_core/runnables/base.py#L2188-L2264",
+ "version": "repo-lines-v1:sha256:98f8c09434deaeab4fa002aff9e2811f173ab68db004fa38ae7ed50afc6c8c63:eyJzZWxlY3RlZExpbmVDb3VudCI6NzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE5ZjdjYjFlODMyZDUyOGZjNjFkOGU5YTg1NzYyNmVmYWRmNDI1NDlhY2YwMzU0YzVkYjMwYzU1M2E5MzQ5ZTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MDlhNTNhNjE4ZDAyOGUxZDMwMDBjMGE3YWJjZWVjYmU1ZmIzN2Y0ZTUxMWVmZTQ2NjQzZmFkNmU2Njg3MmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA3ODQ4NzIyMWE5ZGZiYTkxYzJmNjcyY2JkYmNiOGRhZjRlMDBhZjc2ZWM2NjFmNTI3M2NjOTZhMzMxYzNlNjIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM5NTkzNDRiYjIzMGEzZDZiM2M1ZWFhNWMwYzg3NzEyNTFhYzU2YzliZjJjOWVjNmViMmJiYTBiNTEzYjhiZmMifQ"
+ }
+ ]
}
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/dev-commands.json b/openwiki/.claims/dev-commands.json
index 70ac36df65..8588f59093 100644
--- a/openwiki/.claims/dev-commands.json
+++ b/openwiki/.claims/dev-commands.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:7dd5ad8767d8a3f658ed06a962ccaafe416623877d4864ce71de856a4ae7b52f",
+ "pageVersion": "sha256:32352b68e37cee65505e27ca047f9eae0c2eafb8dac60d1409c4d33b563955f8",
"claims": [
{
"id": "claim_42b2b3c1ac6e4a938efa7b2651c79b81",
@@ -177,6 +177,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/integration-tests.json b/openwiki/.claims/integration-tests.json
index 24f2f9a695..2782748a51 100644
--- a/openwiki/.claims/integration-tests.json
+++ b/openwiki/.claims/integration-tests.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:8bf3d528d2fe2628f24d10c54b6445ad11f8ec7abae99049815d037c83fdaf08",
+ "pageVersion": "sha256:0ead306fee0715430d8afdedcbb61944f51e57df48168d9394fc2c03d21f7c45",
"claims": [
{
"id": "claim_2b394255185b4645a1dcf0e8c628a197",
@@ -179,6 +179,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/mcp-integration.json b/openwiki/.claims/mcp-integration.json
index ef563972da..d2b5424c3b 100644
--- a/openwiki/.claims/mcp-integration.json
+++ b/openwiki/.claims/mcp-integration.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:39684cc4e8be6978f803b85b99406b6a877eaf9e8c8b964279a413f854340751",
+ "pageVersion": "sha256:87c4080ea30d8947623f0ded2435da98571f131a134392f5faece5d6fbfcd460",
"claims": [
{
"id": "claim_a20f2f32ba21436d869cf463fc4e93f6",
@@ -15,8 +15,8 @@
"version": "repo-lines-v1:sha256:8c8f286728fc9aa7955ce4e7a05920a6a04a6800acbb6d7e328ba2f703cef134:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFkM2M5ZGRjYWQ1MjNiMDZjOWQwY2RhYjRhYzUxODA3MWYzNjMzMzViNDk0NzFmNmNmNWQ2YTE2ZjNhNzE0ZmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkwMWMwYThiZDk4NzRhNDBkMzFkYmYxMDdiMGEzNTQ5MTQ5ODIzNTJkMDY5ZWVmNDcyNDNiZDExZWY3ZjYzNjIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjM3Mjk5ZGUzODI4MDM3NjcxYWE1YjJlZjhiYjAxNWY3YmM4MWQ0MTU1NWE4ZjNmNDY0ZGI0M2YxZThlNGM0NDYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhjYTZiZmFkYzc2OWJmYmM0ZDI2NmExMTI2MmIxMzhkMzdmZDEzZDg2MDk1MDE3YThmNjdmYzE2MDNlZWJlYjMifQ"
},
{
- "resource": "repo://libs/langchain_v1/langchain/mcp/tools.py#L212-L282",
- "version": "repo-lines-v1:sha256:00a655fa2836605e00b588e1d4ac8d16290e6182e8caa5fa76c26a2a925ffeac:eyJzZWxlY3RlZExpbmVDb3VudCI6NzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc5YmFiYmE2Yzc5NzMwZWZlNTY1ZTM0OTFjMGNkOWMzNWM0NGQ1YzJjMTg1MjEyYmVkMmYwMTdiMDg1NWNiNzAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwYzFmMTg4ZjE0MmVkN2E4MjQ2ODBiMjA3MTcyYzU1MTliYzYxNGE0OGZkYTdjZjE2N2VkYjhkZGY3OTk1NmMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNiYmRmMTVlYzYwZTVlOTkzZTBiODA0NDBlOGY0ZmUzYTE5YTAxYmUxYjk5ZmI5YTQwMjVhMGE2YTMwMzkxYTYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImExYTVkMGU3ZWNjMzc0YTIxNmM5ZTAzNzZhZGZjNGE1YWUxOWQzZTRhYTMwNTBmNDA4NDkzNjRiNDJkN2Y1OWEifQ"
+ "resource": "repo://libs/langchain_v1/langchain/mcp/tools.py#L234-L304",
+ "version": "repo-lines-v1:sha256:fce2dd0bf57a5f61654308ff25d42ba9d12733f5fe1b2ce344394adb108bdeab:eyJzZWxlY3RlZExpbmVDb3VudCI6NzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc5YmFiYmE2Yzc5NzMwZWZlNTY1ZTM0OTFjMGNkOWMzNWM0NGQ1YzJjMTg1MjEyYmVkMmYwMTdiMDg1NWNiNzAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwYzFmMTg4ZjE0MmVkN2E4MjQ2ODBiMjA3MTcyYzU1MTliYzYxNGE0OGZkYTdjZjE2N2VkYjhkZGY3OTk1NmMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZkYjI4Yzk1ZTQ0ODE2MmYyN2IzYWM1NjY5ZThmMjU0NTllMjkyMzViZTIyOTFhZGMyNzEzMzkzYzQ3YzAxNGMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImExYTVkMGU3ZWNjMzc0YTIxNmM5ZTAzNzZhZGZjNGE1YWUxOWQzZTRhYTMwNTBmNDA4NDkzNjRiNDJkN2Y1OWEifQ"
}
]
},
@@ -65,12 +65,12 @@
"version": "repo-lines-v1:sha256:ebd4cd817c5920d623327b25456b1d194e5982d18b3fce449afaefc0b41bae70:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU0NTdmNTg5MzQ4NmEwNDQ1ODczOWU2MjhjNjk3NzAyODFhODJiNDA1YWU2ZjA5NjNmNGU3ZWExY2RhYWMwODUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgxMGFkODQ2ZTg0ZTI3ZmRjM2UwZTI0ZWUzMjQyOGNhYTVhYjNmNmI4MWQyN2RkZDNlNjkyNzg1NzQ4MWUyZjAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk2N2NjNTIxYWM0Y2EzMjExNDBmODliNjlhNTM4NjcwYzE2Y2FiYTQ5MjA2YzFkOGU2NTgwOGYxNjNkZDc5NjIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNiY2E1N2M2MTQ4MGQ3NzVhMDNhODE4MmJkMTE1OGYwOWRhOWIzYjE4M2Y4NGMyOWYxOTRlNjBjMzIxNmVkOTQifQ"
},
{
- "resource": "repo://libs/langchain_v1/langchain/mcp/tools.py#L212-L282",
- "version": "repo-lines-v1:sha256:00a655fa2836605e00b588e1d4ac8d16290e6182e8caa5fa76c26a2a925ffeac:eyJzZWxlY3RlZExpbmVDb3VudCI6NzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc5YmFiYmE2Yzc5NzMwZWZlNTY1ZTM0OTFjMGNkOWMzNWM0NGQ1YzJjMTg1MjEyYmVkMmYwMTdiMDg1NWNiNzAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwYzFmMTg4ZjE0MmVkN2E4MjQ2ODBiMjA3MTcyYzU1MTliYzYxNGE0OGZkYTdjZjE2N2VkYjhkZGY3OTk1NmMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNiYmRmMTVlYzYwZTVlOTkzZTBiODA0NDBlOGY0ZmUzYTE5YTAxYmUxYjk5ZmI5YTQwMjVhMGE2YTMwMzkxYTYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImExYTVkMGU3ZWNjMzc0YTIxNmM5ZTAzNzZhZGZjNGE1YWUxOWQzZTRhYTMwNTBmNDA4NDkzNjRiNDJkN2Y1OWEifQ"
+ "resource": "repo://libs/langchain_v1/langchain/mcp/tools.py#L234-L304",
+ "version": "repo-lines-v1:sha256:fce2dd0bf57a5f61654308ff25d42ba9d12733f5fe1b2ce344394adb108bdeab:eyJzZWxlY3RlZExpbmVDb3VudCI6NzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc5YmFiYmE2Yzc5NzMwZWZlNTY1ZTM0OTFjMGNkOWMzNWM0NGQ1YzJjMTg1MjEyYmVkMmYwMTdiMDg1NWNiNzAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwYzFmMTg4ZjE0MmVkN2E4MjQ2ODBiMjA3MTcyYzU1MTliYzYxNGE0OGZkYTdjZjE2N2VkYjhkZGY3OTk1NmMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZkYjI4Yzk1ZTQ0ODE2MmYyN2IzYWM1NjY5ZThmMjU0NTllMjkyMzViZTIyOTFhZGMyNzEzMzkzYzQ3YzAxNGMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImExYTVkMGU3ZWNjMzc0YTIxNmM5ZTAzNzZhZGZjNGE1YWUxOWQzZTRhYTMwNTBmNDA4NDkzNjRiNDJkN2Y1OWEifQ"
},
{
- "resource": "repo://libs/langchain_v1/langchain/mcp/tools.py#L259-L272",
- "version": "repo-lines-v1:sha256:6573322ab6d14f91e4fd0986c45e0a37c1d687b3909ac46e82d21dd9bbb2d793:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdhYWFiNGRiNjY2MWUwZDNkOWJiYzgwMzVlZTVjNTU2NmQzZWZkYjBiYTM5N2VlM2MyYzkyMTYxYjkzZWJhMzAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU5Y2QzNWQ4ZTgyNzQ1MmJmZWRlMzAzZjI0MzgzNGM5MmY5NmZkMWFkMTBmOTE3NzZjNzJhNDEyNDYxZDg5YTUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE1NjFkNGU0NzQwNWIxNzI4MGE1MGEyNjhkYWY5MmJmMzQ3NDZiY2Q3OTQzMjI4MTFhMGU1OGIxMGYzNGJkYWYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE2ODBhZjU5MDM2NWU1N2MzMjkwZDEzOGZhZmJiNGViNzk4NzcyODdhMjNmMjRlYTg1MDcxMDJlNGM4YzI1YTcifQ"
+ "resource": "repo://libs/langchain_v1/langchain/mcp/tools.py#L283-L294",
+ "version": "repo-lines-v1:sha256:64b3833602383e0ddab4d063b0f1ce723fcad3dfa63f43f5ecec3910a1f8a642:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBkMDA1NjNlNmExYjExMjExOTY4NzI1NGEyMWUwYmVjMWQ5NWVjN2MyYzYxZDE2MWY5NDFiMDRlNzAyNDNjMTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU5Y2QzNWQ4ZTgyNzQ1MmJmZWRlMzAzZjI0MzgzNGM5MmY5NmZkMWFkMTBmOTE3NzZjNzJhNDEyNDYxZDg5YTUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNlN2NlNWY0ODk0OTU2ZTM4MzI4ZmE1MDU1ZWM3MWU2ODA0MjE1OTc4Zjk4NjAzZGIyY2Y3MTVhMDVlMzYxMjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE2ODBhZjU5MDM2NWU1N2MzMjkwZDEzOGZhZmJiNGViNzk4NzcyODdhMjNmMjRlYTg1MDcxMDJlNGM4YzI1YTcifQ"
}
]
},
@@ -235,12 +235,12 @@
"statement": "Tool result format is content_and_artifact: content blocks (text, image, file) go to model, structured_content goes to separate artifact field. MCP errors become ToolMessage with status=error carrying server message; transport errors raise.",
"evidence": [
{
- "resource": "repo://libs/langchain_v1/examples/mcp/tool_errors.py#L1-L41",
- "version": "repo-lines-v1:sha256:7f88654ed5e0d53508fbf92475ce8ec1eea9017dd24a75c720a33d70a4ae8fe8:eyJzZWxlY3RlZExpbmVDb3VudCI6NDEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM5MDFlMGNjMWU0MjFlZjhkNDYwZTcwNTQzMmEzYzBlNjY3YmY1N2M5NGM5ZDljZWJlZDk0MGRjMjZmZThhNGUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRiYTVjMWYxOTA4NjFlODRlZWYyOTc1MjYyNTlkYzRkNjA2M2FlYmQ5YjA5ZDY1NTk4ZmZmNWRjODMzMjJkNmEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNkNDEzNDBjYzIzOWExNTljZTliNjAyMmU5ZjYzMjI4MzJlMmVhZDc2Y2FlOWU0NzU0ZDIxMGViOGZiNmQ1ZTgifQ"
+ "resource": "repo://libs/langchain_v1/examples/mcp/tool_errors.py#L1-L45",
+ "version": "repo-lines-v1:sha256:997e5b2a848dffa58711f3e5a228edc751c66ee7aabcceb9fd5d5ae701583214:eyJzZWxlY3RlZExpbmVDb3VudCI6NDUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM5MDFlMGNjMWU0MjFlZjhkNDYwZTcwNTQzMmEzYzBlNjY3YmY1N2M5NGM5ZDljZWJlZDk0MGRjMjZmZThhNGUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2YTI0YThmMTQ4ODQ1OTNjYmEyYThkZjBjNTVmMzdkZWRmMmUwYTAzNzNkZjViMmEyN2I2OTIxYmFjYWMwZTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
},
{
- "resource": "repo://libs/langchain_v1/langchain/mcp/tools.py#L274-L282",
- "version": "repo-lines-v1:sha256:4217f28aa4d1d1e13256366f82a3f12ce385c70ea8464a19e62d633e1dba9883:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNmVjYjhlYmNlMzdmOWI1YTg5MTlhMDc4YTgzODhmNTE2YjJkOTFiZThiODdiODA5ZjdlNzQ1OWM3Zjc5ZWQzZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMzBjMWYxODhmMTQyZWQ3YTgyNDY4MGIyMDcxNzJjNTUxOWJjNjE0YTQ4ZmRhN2NmMTY3ZWRiOGRkZjc5OTU2YyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZWFlOTNjM2JjZjMxYzY5MDdmNjRjODYwZDU2NWE5MzgxY2Y3ZWQwNmFkOGY0YmZjZTIyMTZkZGM2MDMyNTdjYyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYTFhNWQwZTdlY2MzNzRhMjE2YzllMDM3NmFkZmM0YTVhZTE5ZDNlNGFhMzA1MGY0MDg0OTM2NGI0MmQ3ZjU5YSJ9"
+ "resource": "repo://libs/langchain_v1/langchain/mcp/tools.py#L296-L304",
+ "version": "repo-lines-v1:sha256:6e90ddd50d0d124c954df55c0e2ecba75774c6b70e4f63c35d98ff5a69f13112:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNmVjYjhlYmNlMzdmOWI1YTg5MTlhMDc4YTgzODhmNTE2YjJkOTFiZThiODdiODA5ZjdlNzQ1OWM3Zjc5ZWQzZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMzBjMWYxODhmMTQyZWQ3YTgyNDY4MGIyMDcxNzJjNTUxOWJjNjE0YTQ4ZmRhN2NmMTY3ZWRiOGRkZjc5OTU2YyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZWFlOTNjM2JjZjMxYzY5MDdmNjRjODYwZDU2NWE5MzgxY2Y3ZWQwNmFkOGY0YmZjZTIyMTZkZGM2MDMyNTdjYyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYTFhNWQwZTdlY2MzNzRhMjE2YzllMDM3NmFkZmM0YTVhZTE5ZDNlNGFhMzA1MGY0MDg0OTM2NGI0MmQ3ZjU5YSJ9"
},
{
"resource": "repo://libs/langchain_v1/langchain/mcp/tools.py#L59-L69",
@@ -251,6 +251,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/messages.json b/openwiki/.claims/messages.json
index 245e0bdc8c..33ea4e36ed 100644
--- a/openwiki/.claims/messages.json
+++ b/openwiki/.claims/messages.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:7e1f2bf23c2f051eac9a9adf14ea571ffc8481dd90f220634bb732a545971a5a",
+ "pageVersion": "sha256:0a36ceb2f165da2e8002795df9b6130b952184dc8b95bb5a8f79c888e4c3ab73",
"claims": [
{
"id": "claim_cd426b48afb54e54a30a82b280ab266d",
@@ -207,6 +207,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-08T08:27:09.597Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/middleware.json b/openwiki/.claims/middleware.json
index aad3871400..ff3f01e4ec 100644
--- a/openwiki/.claims/middleware.json
+++ b/openwiki/.claims/middleware.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:dc648f1612a1d33054c8fbb196b66361684e441ad6fbf9af3cb5df1777a4a402",
+ "pageVersion": "sha256:59f149479aecc8ce5f7e0d000a58fe4d061773c476c8a2f2a0264d6fd5ddf814",
"claims": [
{
"id": "claim_6ce968382a514edb90e74830ccdebef7",
@@ -125,12 +125,12 @@
"statement": "HumanInTheLoopMiddleware uses after_model hook to intercept AIMessage tool_calls and send HITLRequest (with ActionRequest list and ReviewConfig list) to a human via langgraph.interrupt(); decisions (approve, edit, reject, respond) modify or filter tool calls before execution; edit decision revises tool arguments, reject sends ToolMessage with user feedback, respond skips execution and returns synthetic ToolMessage with human's answer.",
"evidence": [
{
- "resource": "repo://libs/langchain_v1/langchain/agents/middleware/human_in_the_loop.py#L217-L276",
- "version": "repo-lines-v1:sha256:2764bf666b6b99a2710ca974140ec12a6d6aff0a99a588b97024223dff9f3d3d:eyJzZWxlY3RlZExpbmVDb3VudCI6NjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYxNWRmMmI2MDc2NjFmM2ZhMjRlMzNjMjA2YTJlMTU2YmUyNmMwZDJmOWZkNTVjOGFlZTk0OTBiYmIxN2Y5NzciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc1ZDRkMjAyOTQ3MDFmZjkwYjkyNzg5OWMwMmIwZjg4MGU4Yzc4NzMxNDg2MGQxNGJiYTQ2YmY3NjFlYTZjNjgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjAyYjI1NzhkODVmMDU0N2ZhOTE3ZGE3YjE4ZDIwNzg5OTE4MjlhNTM4MmM3OTEyOGJlMTZmNmYxMDg4ZjdhYjUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBkMzk2MjgxZmIwMWQyYmJhZjI2MjY3OWFlNWEzOWRlYzY1YWMwODI2ZWVlZGQxZWYwMDU0OTdhN2ZhMGI2Y2MifQ"
+ "resource": "repo://libs/langchain_v1/langchain/agents/middleware/human_in_the_loop.py#L427-L525",
+ "version": "repo-lines-v1:sha256:d5b7ad81526ab0894786de5e15377062824c5abe2a939e57d2e3181282bfbb71:eyJzZWxlY3RlZExpbmVDb3VudCI6OTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjUzZTAxMDE1M2ZkZjExNWY2NWJhMDc2M2QxMjMwYmFiMDVlZGJlMmVlZjAzMTNmN2QwNWMzMDdiYTYwY2MyOGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQ0ZjFkY2I1ZGY0ZmVjZjljOTFkZjUzYWFkNGZmZTMyY2RlNjU0OTlmNmUyMGI2YTZjMTk0ZTgwODU3ZjM4ODYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY5NDIwYTZkZGJmYjhhNWJmZTJhODIxMWU2NjMxODRiZWNhOWI1ZTM3Y2RhYWE5MTZjYjc2YzUyNWY0MWQ1MWQifQ"
},
{
- "resource": "repo://libs/langchain_v1/langchain/agents/middleware/human_in_the_loop.py#L405-L492",
- "version": "repo-lines-v1:sha256:429c16826e242b9ccaf9dca3d6505ac7391120daab38cfc33c3ec3d77f0120c6:eyJzZWxlY3RlZExpbmVDb3VudCI6ODgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjUzZTAxMDE1M2ZkZjExNWY2NWJhMDc2M2QxMjMwYmFiMDVlZGJlMmVlZjAzMTNmN2QwNWMzMDdiYTYwY2MyOGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhiNTJiNDgzZjcxM2I4N2JkODBiODExMzZhZDYwMDczYmJhYzgyZmNhZWMyMWU1MDk5ZDE2M2RkN2ZhMGE0YzUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQ0ZjFkY2I1ZGY0ZmVjZjljOTFkZjUzYWFkNGZmZTMyY2RlNjU0OTlmNmUyMGI2YTZjMTk0ZTgwODU3ZjM4ODYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY5NDIwYTZkZGJmYjhhNWJmZTJhODIxMWU2NjMxODRiZWNhOWI1ZTM3Y2RhYWE5MTZjYjc2YzUyNWY0MWQ1MWQifQ"
+ "resource": "repo://libs/langchain_v1/langchain/agents/middleware/human_in_the_loop.py#L541-L577",
+ "version": "repo-lines-v1:sha256:48e15a5cb6fc7b73beba33b6dacd10da9d0c18d97848d6bb9d4aef9bb9474e14:eyJzZWxlY3RlZExpbmVDb3VudCI6MzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRkMGZkOTI4ZjAxZjZmOGJlNzNkNDYzZWUzOWIwZWFkMDc0ZTYwYzE1ZDczMjBiNDJhYWUxM2Q2OTA3Njg5ZjIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQ3ODdmOTg4ZTQxYjVlOGEzY2M5Njk0N2JkNDQzYjE4NjFkNjI5ZjYxMjBiNDhmZDY5Yzg4NGI1MjhiZDc3NjUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQ3OTQwMWU1ZTg4ZDViNTIwYzRmYWM5ZTAxOTcyNDdhZmJmNzEzYzhlZmExMzBlOWFjM2M4ODFmYWIwY2EyZTEifQ"
}
]
},
@@ -199,6 +199,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-08T08:27:09.597Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/model-initialization.json b/openwiki/.claims/model-initialization.json
index 5e619051f2..3bd8b40c1d 100644
--- a/openwiki/.claims/model-initialization.json
+++ b/openwiki/.claims/model-initialization.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:0ff4006082d29f33169349313c83cc890f4fafd73f0a3df4a51cf88689471825",
+ "pageVersion": "sha256:a2984365361bea3650236ef43c48d193ac444b15257fef3ea6110d04c3580210",
"claims": [
{
"id": "claim_189e539212e149fdb6d26bfac3426a8c",
@@ -46,7 +46,7 @@
},
{
"id": "claim_b11a1705a5cd44ea88dd0a9a4565a98d",
- "statement": "_BUILTIN_PROVIDERS is a dictionary mapping provider keys to tuples of (module_path, class_name, creator_func) for 37 built-in providers including openai, anthropic, bedrock, google_vertexai, azure_openai, cohere, groq, mistralai, ollama, and others. The registry includes fallback logic for ollama (tries langchain_community) and special creators for huggingface (from_model_id), ibm (model_id), and langsmith (gateway config).",
+ "statement": "_BUILTIN_PROVIDERS is a dictionary mapping provider keys to tuples of (module_path, class_name, creator_func) for 32 built-in providers including openai, anthropic, bedrock, google_vertexai, azure_openai, cohere, groq, mistralai, ollama, and others. The registry includes fallback logic for ollama (tries langchain_community) and special creators for huggingface (from_model_id), ibm (model_id), and langsmith (gateway config).",
"evidence": [
{
"resource": "repo://libs/langchain_v1/langchain/chat_models/base.py#L56-L120",
@@ -177,6 +177,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/openai-provider.json b/openwiki/.claims/openai-provider.json
index 6c4ccdf51a..28fc584b1d 100644
--- a/openwiki/.claims/openai-provider.json
+++ b/openwiki/.claims/openai-provider.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:012f8bbb76f0fc9e8cf5796d4dd6a558d1ac45e1248a500804c3dd6342401ccf",
+ "pageVersion": "sha256:9cf9b71623f99687ab1cf0779e86f4be9c781731b7ab13fdab1b710a1372e78e",
"claims": [
{
"id": "claim_347664eb68464142b558791c7a95093f",
@@ -11,8 +11,8 @@
"version": "repo-file-v1:sha256:d08e06dea1f954a477fa8951e2a8387a10396d07b92a3a60fdced307c136a84f"
},
{
- "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L2799-L2900",
- "version": "repo-lines-v1:sha256:2d8081ad2ca1015a79c313cb0513c30f843560a31c19eb962e55f5edaac7b72a:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAyLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJkOTBkYTg3MTNlNzU1ZjU1MmQ1YmIzNWY3YjJmOGUwMGU3YjA0MzY1Yzc2YWI4MmE3NDRmMGU1OTVlMjA2MDYyIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMGNhZTNkYzI3OGY2NDlhYWFlYjE5ZDdhMTBjODYzNjQyNTIzZjhlZjAwYzkxODUzNjEzNGRiMGM0Mzk4NDU0IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJiM2RmMmFjZjA2ZThjM2YwM2M3MTM1YzZlOGFjNWE5Y2E1NDMyYWJlMDZhNzRhY2EwZmRkOWE1M2EwMDhmOTg3IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIwMjVmNzA0OWQ5NmQyY2Y4MWE5NjA5Y2NkMDgxMDg0ZmE5OGRhYWIyM2QyMmIxYzMwMjI5MWY3ODhhNjRmM2E0In0"
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L2829-L3750",
+ "version": "repo-lines-v1:sha256:d7750e52d840b4379fd892a656237cba6bf7af6d95a997b2485fb55d937139ec:eyJzZWxlY3RlZExpbmVDb3VudCI6OTIyLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJkOTBkYTg3MTNlNzU1ZjU1MmQ1YmIzNWY3YjJmOGUwMGU3YjA0MzY1Yzc2YWI4MmE3NDRmMGU1OTVlMjA2MDYyIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJiOTk3OTkzN2Q3ZGUxOTkyNzZjM2I3YzVkMTJkZWM2ODJhZTBmOTVjNTliZjA2OTlhNGI2OTRhZDg1ZWQxMTVhIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJiM2RmMmFjZjA2ZThjM2YwM2M3MTM1YzZlOGFjNWE5Y2E1NDMyYWJlMDZhNzRhY2EwZmRkOWE1M2EwMDhmOTg3IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJmZmFjMjQ1YTViMDZkOGVmNGVkYWI3MmY5MjYzOGM3MTA2NGQzMjNlOGYyOTI4ODA1YWZiYTkyMzZlYzE0MWNjIn0"
}
]
},
@@ -125,10 +125,140 @@
"version": "repo-lines-v1:sha256:14ebffc7bca9e6fda843b3932b482d6ffbf0487c1f74f9bfbb871bb591a6cbc1:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwMWZkYTIxNjI4MGFjNjg0ZmI1ZGQ4NjIxYmE5NTJiMjU3YzhjZTVlMDExM2U2N2JjMTJkZDBlZGU1ZTg2MGMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImEzMDNlY2RkNGE0ZDEwZjE5YzczZmQ0MmZkMTI0MzdmZDMzNTRhODI2ODE2MDVkYTUyNTVhOTdhMzkwNjhkYmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjU1YjZlODcwNmI0MzA0N2YyYTZkYjY3ZjEzMjYzODU5NTYwNGU2N2YzNjk2Njg3NmNlMDE1OGYwMDUzZTZiZDEifQ"
}
]
+ },
+ {
+ "id": "claim_32bd96aa13d7497aaa57a1ab4854ffc7",
+ "statement": "ChatOpenAI automatically switches between Chat Completions API and Responses API based on model name, parameters, and explicit configuration; Responses API is used when reasoning, context_management, truncation, include, or use_previous_response_id are specified, or when model name starts with 'gpt-5' (pro variants) or model is 'codex'.",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L1924-L1941",
+ "version": "repo-lines-v1:sha256:3e78692a1e3b0ba179962add5d178415cd42ad5fcc7014aeb09f387a97cc53fd:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVmNmVmYTZmY2MxYmM0NWZmNGVjODg4OWNiNjE4MTAzMzg1ZmMzZDYzMzA3ZTIyZmE2NTI5ODliMWFkZDEyYjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc2ZGE1NmY0NTM5MTk3NjQ1ZTcwYWEzNjdhN2RiMzkwNWFkOWFkODVhMjk0YmFkYWIwNzIzMWNjYTc2ZjQwYWQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjFiNDE4YzYyMjIwNmFlMmZlYTY0YzcyOGY3YzU2YWUyZmVjMDUxZjdkOGY1OTBlNTEyMjA2NmRmNmVhNzRiMzkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJkYjlmM2E4NmRlMTA4YTAwN2YzNWQxZjVlZWE4ZGM2ZmVmY2EyMzIyZjgyYTZmMGIzNDhhNWFkMGQ1MTljOWMifQ"
+ },
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L704-L707",
+ "version": "repo-lines-v1:sha256:82a296d139f47c53b4a1ab656ffeec75782c9412c8bc0365fa0ad828f8ddf817:eyJzZWxlY3RlZExpbmVDb3VudCI6NCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNjVmZDUyNjAyNTIxYjEzMWNjOTI0Y2VkZjhlMmNjZTI2NWNjOWE2ZjNlZWJhMGZkZTE5M2NkZjY5MTAyZWRlMCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiOTE3ZGQ2OWFhNGNmZWU0YzQ4NDkwNDQ4ZjA0ZmQxYWI1MjRjYTdjMzU3Y2FlNjFkMDk4NTdmOTU2ZjI3MzRjYyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYTk4YjA2M2Q5YjQ3ZTY1Mzc5NjI1NTcyY2NlMTk3NjY5ZDU3NjdlMTJjMThiZTA3NTY1MmI4Y2Q5ODFjZThkNSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNGI3MmM5NmVjZmNiZWZiNTNlZjIxY2YxNmEzZTZkMzEwY2QzZDk5NjI1YTVkMGE2MjFjNDM4NDBhMDMxYzcxOSJ9"
+ }
+ ]
+ },
+ {
+ "id": "claim_8c65009ac17447729064bb15abaa8729",
+ "statement": "Responses API supports streaming reasoning for reasoning models, structured output with tools, context management via context_management parameter for automatic message compaction, truncation strategy control, and previous response tracking via use_previous_response_id for conversation continuity.",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L1206-L1241",
+ "version": "repo-lines-v1:sha256:a8bb36529055ff53fdae31695bffcb6d5bc3944aeba5f9e75cf51a8a2d5e2ae5:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ5YmQyOTMzNzBkZWUyYzk3NGFiZDM2ZmRjMmUwM2IwNjgxNTIzMWRlZmY1MzE0MWEzZjI2M2FhYzY2Y2UyOGEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFhMGZiZWQ0OGZmMzE4MWMxNmZiMTI0ODcxNDkzOWFiOTI3NmI4ZGUyZWU3MzJmOWM5NWRlNDRjMjhlODEwNzAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImEwYzA1NTc4OTUwNzI1ODcyOWUwNzAxMzhkZTc2NDk1NmVkZGFiZDUzNzhmMGQyY2JkMDdiOWU3Y2JhMWM0ZjEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM0Y2I3MmU2NTQwODc1MzM1MTk2NTIyM2ZhZjA5YWQ3YzUwOGFjMGI4ZWMyMGQzMWY5ODRmMzFlMWY4N2VhZjEifQ"
+ },
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L909-L932",
+ "version": "repo-lines-v1:sha256:41814211db4dd232ffa77a0d6d3398934a0d1c7d612c1624c73a8163939dfe23:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg1MzU4MmE1ZDZkMWZjM2ExODgwNTg4ODZhYjAzOTZhYzg3ODdiYmMzZTM2MTYzODVlZDQzNDE2ZWU0Zjg4OGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2YTcxNTI1NzJlZTg0ZjEwOTA2Yzc0YjlmMmE5MjQzNGRkYWIwZTNjNDI4MTNiMDRlNTk3ZWZjZWM5NTFiMjYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU2Yjc1OWJhMDVmM2NhYWE1YjQxNzIwMDYwNzNhODgyNGMwZDdjM2IyNzhmNzFlOGI1ZTg5NDFkNzkxYjJiMTYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU1NGVjNzc5MTU0YTFkMzg2MTU2M2M4ZjViZTYzNGRkYTBhNWNmOWQ5OGZhNmM3YTBiZmUxMjlhNzJhYzgwZjcifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_c741b92393a24960933927e07e430816",
+ "statement": "ChatOpenAI maps OpenAI SDK exceptions to LangChain's standardized error hierarchy: AuthenticationError -> ModelAuthenticationError, PermissionDeniedError -> ModelPermissionDeniedError, BadRequestError (context_length_exceeded) -> ContextOverflowError, RateLimitError -> ModelRateLimitError, NotFoundError -> ModelNotFoundError, APIError -> ModelAPIError, APIConnectionError -> ModelConnectionError, APITimeoutError -> ModelTimeoutError.",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L612-L677",
+ "version": "repo-lines-v1:sha256:14658e6226d5972c8dfcd35ee5e68818fc2fb2d5615c55bf07435c5692bebb20:eyJzZWxlY3RlZExpbmVDb3VudCI6NjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhkMzYzNjVkODZhZWJmMTI1NzA4NGRjZThlNDUyNmQxNTYyY2QwZmU1NWU0MWU2NmE1ZjdiOTQ2YWM2ZWEwMjciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdmYmIyM2Q0ODg5ZjE4NGI1MWM0YThkYjliZDVjOGFhOWQ3NDc5YWJhNDdhMzMzNzcwMzI2M2M4MTZlNzY4YjYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjYwYWY5NzFkMjcyODdmZjk3NzYzZjBmZGI2MzJmNDZmM2VlMjNhZmNkYjQwNzcyNWUzZTU0OGM4OTg3MTY1Y2QiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjEwM2MwYzBjYjJkY2IyZGY2NmRlODQ4OTFmMWYxM2MwMDVkNmJhZGM4ODZlODhmZjI5MzBlMmNkYTU0Yjc0OGIifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_526c35034a134a5ca6f38a2b9c1175fc",
+ "statement": "Automatic retries for transient failures (429, 500-599) are configured via max_retries parameter; request timeout is controlled via timeout parameter (float or tuple of connect/read timeouts).",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L816-L822",
+ "version": "repo-lines-v1:sha256:718975f36eb81f71aeeb2c0f225af901bd7cd251b227e2763e704280a8354a24:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiOWQ5MGZlZTM0ZGFiMGI2ZmFiNTkwNDI3MmM5MjdjNWYwMTg3MjMxMjJhZjI0Yjk1ZTc3ZTEwYTJjYWQ4ZjhhMCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYTZhNzE1MjU3MmVlODRmMTA5MDZjNzRiOWYyYTkyNDM0ZGRhYjBlM2M0MjgxM2IwNGU1OTdlZmNlYzk1MWIyNiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiODU3MTVjNzMxNDg2YWFkNDBjZjMxZjkxY2RiZjIwMDU1MTdiYmMyYzA0Y2YwYzdjMDc5NGNkMTEwM2MzNDU2MiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYjgyNjNlODIzNjQ1ZDZjNGJjMWJiZTEzMDFjMDc2MmQ2Y2QwMzIzYmQzNWYyYmQ4NzkzZDk1NDY3NDY0ZDEzOCJ9"
+ },
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L841-L842",
+ "version": "repo-lines-v1:sha256:926de5c3c86a9294d7224138eff3c672ec662e0c156f8f52da034baf6a183122:eyJzZWxlY3RlZExpbmVDb3VudCI6MiwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNzhkYmY0YmFmODJhOTVmMDJkYmRkYWQ2YjY5YTMxZDg5ZjAzNjgyNGViZGE1NmJhY2FkYjI5ZTVkN2E1Y2VjOCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNjkxZTg4MDlmODRjZGNhMDZmNjY2NGQzMzJmZDk5NjQyMDk4YmI2MjZhMmE0MjNlZTdkNWU3MzQxYjllNGM1MiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZjJlY2RiYzNhN2I2MDNkZTM0NmRmZGE2MmY4YjJiOTdjYjZjYjA2ZmJkNDhkNTAwZjc3MWU3MDU0MGU2ZGExYiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiZTgyNzNmN2I0NjAyYWY1ZWQzMjlkMDU3NjkyYzBiZWI5YjM5ZDQwMWViMDllYWY2ZjMwMTBhNmU5NjQ5NTgwYyJ9"
+ }
+ ]
+ },
+ {
+ "id": "claim_8a2e099cfba141ab9fc85d0e16bc731d",
+ "statement": "BaseChatOpenAI initialization resolves API authentication from parameters/environment variables/callables, builds HTTP clients (sync and async) with optional socket options, registers model profiles, validates parameters like stream_chunk_timeout, and initializes OpenAI client instances.",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L1254-L1259",
+ "version": "repo-lines-v1:sha256:eb0e57bafb26e9cc000c8a15ea3591aeddc99ab35d2a64304d5224784a743455:eyJzZWxlY3RlZExpbmVDb3VudCI6NiwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiOTU1ZDNmNGY2YmU3NGM5NjgyNWJmZTFlNWRkZmMxOTYyMjVlZGVlMGIzYWRkNThjNjMyOGMxNDhhY2I2ZTIxOSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMjUzZWExODU0ZjM0ZWM2ZWU0ZGE5YzAzNTRjZDBhNGEzNGY0MmZhNDJkYTZjY2Q2ZGEzMThiZGY2MjE2M2ViNiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmE4OTk5YTlhZmU3YTdlMDRhOTQ1NGE2YmE3MTQzY2YzNzYzYWMwNzY2YjBhMWQ2MmM3OGNlNGFiNzkzODUxMyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNTJkNGM4MTkyMDgyNjY1ZGQ5MGRmYzUzNGJkMWVjMjJiOWE2MmYzYjZmNTk1M2ExMzc3MTU3ZmQzNjYyODg2MyJ9"
+ },
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L715-L732",
+ "version": "repo-lines-v1:sha256:4f37b02fe8bea277c794e5b3e72e4e4bd51a41ff1022cb3cee530a010157b073:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIwYWIyNjQwNjA4YTZlZGJhZGE4MDJlYTdlYzA1NjYxM2JhOTFhY2Q5ZTdhOGIwZjcxOGRmODQ1Yjg4YzBlMDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjliY2FkYzRlMjljMmM0NWUyOTI5NjcwZmZiNGJiNDZiY2JjNDRlYWIzNTAyNzAzNWJmNDVmYjFiMTdiYzU1ZDUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYxNWNhNjgzZTRiMDU3NTFlNjIxZjIzN2Y0NDNkYjc0MDI3Y2NkYTNhMDgxMzBiNGY1MTE2Y2Y4YmYzODI4OTUifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_2fe26ad78d9648d88ef5c1ef3fa22b68",
+ "statement": "When an async callable is provided for api_key, the sync client is not available; sync methods (invoke, stream) raise ValueError, requiring use of async methods (ainvoke, astream) instead.",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L1605-L1613",
+ "version": "repo-lines-v1:sha256:0d71a780173bd1a4489f6b543d90004f4d3f0f111d32814132308d89827f73a1:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiOGIwYjlhMWVlYTVjZTNjOTgyN2NiODdmZmYyNWJiNzBjY2Y3NzYxNjgyZDk1OGNjZTBmNzMyZDkxMTZiNzMxZiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMjVhYmE0Mjg3Y2RiOTU2MWQ0ZTFiMjI0NTM4ZTI1MmFhYjQwNzRkMTQyMjhiNzY0NDkyMGZlZDU1ODk3YzU0MSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMWM3MDQwNGViNzQwZDIyNWI2NmI3ZjQ1MTI1ZTU0ZDBmYmZkYzY1ODk0MDEzZTM2OTYxZTg4NDI3Y2MyOTcxNSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYmJlYWJiNjM3ZDhhMDdhNTA3Zjg4ODU3MDZhN2YxYTZhYTE1NzUzNjE3NjljODk4ZmRjYmI1NTI5YTllYTJjOCJ9"
+ }
+ ]
+ },
+ {
+ "id": "claim_80d965910e2d424f8526f864c8f3cb1d",
+ "statement": "AzureChatOpenAI is a subclass of BaseChatOpenAI that inherits all ChatOpenAI functionality (tool calling, structured output, streaming, vision) but with Azure-specific authentication (azure_endpoint, api_key, azure_ad_token), endpoint routing via azure_deployment, and API versioning (api_version distinct from model version).",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/azure.py#L37-L100",
+ "version": "repo-lines-v1:sha256:1a48dd86b02b19c7a4b58181504f3e9226e1e3eaeb984873c284d04c5e2b013b:eyJzZWxlY3RlZExpbmVDb3VudCI6NjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRlNzllYTJiMDA4NDM1NjlmOGJjZDMwY2IwNWQ0NTE4ZGQxMThlMWUxOGRjYTBkYTA4NWFiODhhNmIxYWEzMjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2ZWY2ZDQ3NjI3Yzk4YzFjYWFkYTM4MDMzZDQzZTEyYzE5YTA3OTNiN2E5OTNjNWUwYTdmZDdlNjRiMmNmNTQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE2ODVjNmRmMDBmNzZhYzBiYWM3ODYyMDRlZjIxMzFiYmNmMzY2NzJhMDc4NWExY2Y5ZTE2OGM5NjU3NzM0NmQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMyZWMxMDczNTVkNDk2ZmMzYWMwMDQ3ZDUyMTI2MjQ3NjYzZjViNmIzMTQ3MDlhY2U2ODAwZjU1YzEzZWUzMzIifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_fdcf536a8a03424185ad7ae6d5215610",
+ "statement": "AzureChatOpenAI responses include Azure-specific metadata: prompt_filter_results and content_filter_results in response_metadata detailing content safety filtering for hate speech, self-harm, sexual content, and violence.",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/azure.py#L152-L172",
+ "version": "repo-lines-v1:sha256:5e8d741926523803a539f79ae153fb4a5ca0f627046ad21a15d2a63ee5f50519:eyJzZWxlY3RlZExpbmVDb3VudCI6MjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhhMjgyOWJmNWQ2NDEyNmQ2ZTBmN2E1NDIzNDc1ZDU3MDA5ZWVkMTk2NTJlNDIxZTAzNzMyMWU0MGMzNjhmYTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI1M2Q0ZDc4MWI2OWNmNTYxNWIyMGExZWI1Mzg4MDFlMmYwMjU4NzFhOTEzZWRmMGQxMzJhMzkyNDE3ODBiMGYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImIxMmVmODQ3OWFkMGY1ZTkyMzVmZDc0MTFiYTUxNzVmNjY0ZjIzY2M2YTg0MTA3NmM5YWIzZWI4ODExNmUyZTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU0OTRlMTUwZjJhYmVmYzE4ODI2ZDM0MTBjZGQwNDFhYTY0MzI5MzUwZmVkOGY2MmUxNDIxNGI1ZjRmNmQ3YmIifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_5636b23e82694eb7a7783e02d60452ab",
+ "statement": "ChatOpenAI converts LangChain message types (HumanMessage, AIMessage, SystemMessage, ToolMessage) to OpenAI API format and back; output is AIMessage with content, tool_calls, invalid_tool_calls, additional_kwargs (audio, function_call), response_metadata (token usage, finish reason, system fingerprint, logprobs), and usage_metadata (standardized token counts).",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L217-L281",
+ "version": "repo-lines-v1:sha256:adf75f5a37024e890e20a5b780ca4de846af6fa2f0ae26cbd5c286493e19ea04:eyJzZWxlY3RlZExpbmVDb3VudCI6NjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRlOTRiYmJkZTFhNTc4ZTU0MDk3NjZmZjRhOTc3ODU2YzU4MmNkZDBiZDU5MzhkMDcxZDdkNjY2YTRkMzU2NjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQyNDJmZmEwNDkzOWY2ZGQ3NDdlMzc0ZTMyNjU0MDc4ZDBiZDA1ZWNlODYyMTg0N2EzNTMzZmY4ZTFkNTJiMzAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjBlYzQyOTU5MTY5N2YyNDg0N2RkNWQ1Yzk2ZDM2ZDRiZDU2NzVmMzZhNDY3YWNhNjZkMjRiNzZiYzU0MDEyYjciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZkMTJmNDFjMWY1ZGFhMmM1NWMyNzI5NDg1ZDAwN2ZjMTg4YzBiMjBjNmViZmMwMzdlM2MwMGRmZWJmNGUwNTcifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_3caff63b9a194d83a4feca3784c64c79",
+ "statement": "For multi-modal content, ChatOpenAI formats content blocks per API requirements; Chat Completions API filters certain block types (thinking, tool_use), while Responses API expands support for reasoning, computer use, file search.",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L304-L326",
+ "version": "repo-lines-v1:sha256:6cd902fc919094ac7918459a836e31a99d75d17d7ed2346180e909177edbf419:eyJzZWxlY3RlZExpbmVDb3VudCI6MjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjUwMzZiYzBjODRjODlmZmMyYmNiZDg3YzA4OTE0YTRmNzJjYTY5YTE0OTYyZTlhMTIxOTExZDIwZmVjY2RhOTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRhOGE1ZTU5NzYzOGZiYzZlMGZkMDJlYTZhMTA1OWU4ZGVjNWJiY2FhNzI2ZDJiMzllM2UzMjg2YTcxN2EyYTkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImFjZjc2NmFmOTQwZjVhNDYwMjMzNDZmY2YzNmEyMWYyOGViYmUyMjUxMWE4MmFhN2MyNzUzYzMyOGU0ZmM1ZGUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImEwNjI4MDJmZTZkNGE3YjQzOWNhNzg5ZDE2MTlhZmMzMjg0ZTI1ZTlhMTQwZGVlNDI3YmM5YjU0ZThlMWI4YjUifQ"
+ },
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L329-L350",
+ "version": "repo-lines-v1:sha256:8a2daaa3c8c8db699cb10fef0f8f2f525c09602dc0e497d7603c7d6aaaadb468:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYwNTUwZDY1YWNhYjg5YmE1MWYwMjJlMGQ5MTg3Yjg2ZWI2ZGE1NWY4MGQzMzI4MzJhYWE4ZTYxMjJjZGU4ZTgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlkOGE5ZTljMzI1MjgyMGM2NWE4MTY1MjBiOGRiNDkzMjI4MDg0OWVjOGM3ZDJlYjYyNzJhZmRmZWJlMDU5YzMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQyYmY3NDA3MDljNGU2MzM0NjVlZWE4YTU0N2UzOGYyODc4NzcyM2RjODAzYzliYzMxOGFkY2VmODVjOTMzNGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImRjYzE1YzJiNTMzYjBmZTZlYWExZTA0NTk0MGM0YmQ3YzdmYTQ4MTFkMTE4NTlhMjhmM2Q2NjU1ZDQzMjJlNTcifQ"
+ }
+ ]
+ },
+ {
+ "id": "claim_da74740d79ff48be8b14b5d1660ccd31",
+ "statement": "ChatOpenAI can be subclassed to customize behavior via overriding _generate, _stream, _agenerate, _astream methods; custom middleware can be added via RunnablePassthrough, RunnableLambda, or decorator patterns.",
+ "evidence": [
+ {
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L715-L724",
+ "version": "repo-lines-v1:sha256:4796c14704f049c8340f8cb74976a7f9e7af36bb8fbf9250e8c163d7a4124e0d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIwYWIyNjQwNjA4YTZlZGJhZGE4MDJlYTdlYzA1NjYxM2JhOTFhY2Q5ZTdhOGIwZjcxOGRmODQ1Yjg4YzBlMDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjliY2FkYzRlMjljMmM0NWUyOTI5NjcwZmZiNGJiNDZiY2JjNDRlYWIzNTAyNzAzNWJmNDVmYjFiMTdiYzU1ZDUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhhODNkNzQxZTM3NWRlNGMzMWI3Yzc4Mzg3YzdjN2UyNzUxZWY4NTU5MWE3ZWE3ZjkwYzNmN2E3NTQ5NTQ0ZmUifQ"
+ }
+ ]
}
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-08T08:27:09.597Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/partner-pattern.json b/openwiki/.claims/partner-pattern.json
index 47b5ee8b92..f6134270f2 100644
--- a/openwiki/.claims/partner-pattern.json
+++ b/openwiki/.claims/partner-pattern.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:91706aa194d34ce5f993646f2d7f280fff4b4ac0424ec2e7a1da4f8e3b132469",
+ "pageVersion": "sha256:a9f7a265ce85fd5e15600ae575ae1c12481b5b898b690c3ee514ae559e803619",
"claims": [
{
"id": "claim_7c2a1600fd294471a122d693305b38f8",
@@ -88,19 +88,23 @@
},
{
"id": "claim_a7fa4aec0f874ffaa86e9395f1870be7",
- "statement": "Provider packages reside in /libs/partners/provider_name/ with a langchain_provider_name module containing chat_models/base.py, data/ with profiles and augmentations, tests/ for unit and integration tests, and standard files: pyproject.toml, Makefile, README, LICENSE, uv.lock. The pyproject.toml specifies langchain-core>=1.6.0,<2.0.0, provider SDK dependencies with pinned versions (e.g., openai>=2.45.0,<4.0.0), and test dependencies including langchain-tests>=1.1.9,<2.0.0 with version constraints. Local packages are referenced via [tool.uv.sources].",
+ "statement": "Provider packages reside in /libs/partners/provider_name/ with a langchain_provider_name module containing chat_models/base.py (or chat_models.py at module root), data/ with profiles and augmentations, tests/ for unit and integration tests, and standard files: pyproject.toml, Makefile, README, LICENSE, uv.lock. The pyproject.toml specifies langchain-core>=1.6.2,<2.0.0, provider SDK dependencies with pinned versions (e.g., openai>=2.45.0,<4.0.0, anthropic>=0.120.0,<2.0.0), and test dependencies including langchain-tests>=1.1.9,<2.0.0 with version constraints. Local packages are referenced via [tool.uv.sources].",
"evidence": [
{
- "resource": "repo://libs/partners/anthropic/langchain_anthropic/chat_models.py",
- "version": "repo-file-v1:sha256:9831dd1180be8af8ddf618464b43d860b9b8303e9eccced056772a922fff28b1"
+ "resource": "repo://libs/partners/anthropic/langchain_anthropic/chat_models.py#L1-L100",
+ "version": "repo-lines-v1:sha256:338b9bdc04085758983bd4c6a24730d8861f1c2f8cfe48d493e2e165bbc272e2:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAwLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIxNTBhNDllZmI2N2JmMzZhNTk4OGExOGYwZTEzMDQ3NDBjMDY3NTRhYWIzMzMwNWIxZDE3ZTkxY2NiMWYyODhmIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MCwicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJiNzQ2NDFjZTZlYWMxZWRjZDI0OWMzYzhlZDk3OTg5YmEwMzM3ODA1MTNiNTAzNGIwODQwM2ViNzU0YjBmZDhlIn0"
},
{
- "resource": "repo://libs/partners/openai/langchain_openai/chat_models/__init__.py",
- "version": "repo-file-v1:sha256:b69d77fd9aa09cdc548568ae5103af5800deaaf4e2742b2ca8516e99e9a3b4bb"
+ "resource": "repo://libs/partners/anthropic/pyproject.toml#L1-L75",
+ "version": "repo-lines-v1:sha256:8e6851fb865851f6cc45a8aa28876785c935a22ab0560b217e017d0ec20a357f:eyJzZWxlY3RlZExpbmVDb3VudCI6NzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA0NTY5OTQ2YWM5YmJlN2NiMmNkZWMzZjhiZWNmMzQzNzUwYzU4YjliMzIxZWMyMTk1YmZiYWFiMmFhOGM0YmEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZiMDE3Mzg1ZmQyMmE2MDkxY2IwMDhjZWNjMDNmNjU1Y2FiMTIxYzZiOGM1MGIwYjc4MjkwMTA0OGI5MzcwMmIifQ"
},
{
- "resource": "repo://libs/partners/openai/pyproject.toml#L1-L76",
- "version": "repo-lines-v1:sha256:617ae86c97bfd7aaef35b7606632f412df8392c530d1baa48df1e71d67e1fc86:eyJzZWxlY3RlZExpbmVDb3VudCI6NzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA0NTY5OTQ2YWM5YmJlN2NiMmNkZWMzZjhiZWNmMzQzNzUwYzU4YjliMzIxZWMyMTk1YmZiYWFiMmFhOGM0YmEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM3ZmUwMjFkZWU4YWRkY2MzZjFmNWUyOTdmM2FlNjhlZjM2MTg0MTg2ZTZkNDA4OTFlMTExZmFhYTMzMzUyMjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjU3OGYwNmRkZWNjMGE3NzdiODYzNTZmMTE4OTQ1ZjdjMWM4YWM2MWEwMTk4MTEyMTZkNWNjOWJjYmE1ZmNjMjcifQ"
+ "resource": "repo://libs/partners/openai/langchain_openai/chat_models/__init__.py#L1-L5",
+ "version": "repo-lines-v1:sha256:6e49204d09a688bd514537f77292e5e52a5dead315b87c27cbc707a8ed771945:eyJzZWxlY3RlZExpbmVDb3VudCI6NSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYTQ2YzllZmI2M2QyOWI5ZGViNDA4NDBiMDI0MGUxMmM0N2NlNDNmZWU0NmMwNGYxYWE4N2U1ZWVhODU0ODUwMCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMDFiYTQ3MTljODBiNmZlOTExYjA5MWE3YzA1MTI0YjY0ZWVlY2U5NjRlMDljMDU4ZWY4Zjk4MDVkYWNhNTQ2YiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjAsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjEsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMjZkMjAyZmFmYmI0ZGEzYWU4OGFhYTkwMzcxNDgwODg5NDZhMzFkZDYzNzhlZjNjZmIzOGVhYWQ0MzE4NGE3MCJ9"
+ },
+ {
+ "resource": "repo://libs/partners/openai/pyproject.toml#L1-L79",
+ "version": "repo-lines-v1:sha256:d2297c341b722f293f689bbd991eac2064f6fd2e8d47d13aa69ac62ca8535cae:eyJzZWxlY3RlZExpbmVDb3VudCI6NzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA0NTY5OTQ2YWM5YmJlN2NiMmNkZWMzZjhiZWNmMzQzNzUwYzU4YjliMzIxZWMyMTk1YmZiYWFiMmFhOGM0YmEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE5MTM1YzNkMmQ3ZDc5ZmQ5OGEwZTM2Y2MxNDhlZmMzODQyZTUyMzBiNWM1NmRhOTg3ZWQwNGQ3ZGNhMmQyMjIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM5MjE4ZjVjMDQ1Y2ZmYTFmZDEzZmM4YjU2MDA3NTNiYmVjZmU5NDlhYzhhZWNiNWE4MTQ2MzQwNDFiMzIyZDAifQ"
}
]
},
@@ -157,6 +161,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-09T08:26:28.144Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/prompts.json b/openwiki/.claims/prompts.json
index 869b37049a..567c2742ec 100644
--- a/openwiki/.claims/prompts.json
+++ b/openwiki/.claims/prompts.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:5f946f7b6b3214808e71060f1626dc4100caf473eb5e0186d8064f20219062b9",
+ "pageVersion": "sha256:39306f0c76011ccf01aff4ac460b8d8856130f40f1e6fcdbd46b70dbadcc2ea2",
"claims": [
{
"id": "claim_06ad6af0140b4318b25f43272f89e77f",
@@ -179,6 +179,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/quickstart.json b/openwiki/.claims/quickstart.json
index 58f4a6267a..d6e78e7bcd 100644
--- a/openwiki/.claims/quickstart.json
+++ b/openwiki/.claims/quickstart.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:6bab4df1cbe8d024002542007ec45a1d17f5dd4d9454cb66bda120674fd4b44e",
+ "pageVersion": "sha256:9c31e9e0ffb9f9920564d97d148a4ce321992784b3cf1812b69ebbf6da91b331",
"claims": [
{
"id": "claim_7425c73f5e4c4667b8babba66c3663a0",
@@ -12,7 +12,7 @@
},
{
"resource": "repo://libs/langchain_v1/langchain/__init__.py",
- "version": "repo-file-v1:sha256:ca83a85cf943caecb4b09073ad78355112742393ccc133451a10def0be7cb84a"
+ "version": "repo-file-v1:sha256:e7680a85a05a3ad8ed60341318de40d8d22e7981cb927d4e6a01c6b934ae61a7"
},
{
"resource": "repo://libs/partners/openai/langchain_openai/__init__.py",
@@ -60,7 +60,7 @@
"evidence": [
{
"resource": "repo://libs/langchain_v1/langchain/agents/factory.py",
- "version": "repo-file-v1:sha256:2e1855c669ed50df9795b1f73ca690d7664d0ef58a1c4080d0f6504076ebea97"
+ "version": "repo-file-v1:sha256:ecbb580ed4083a985a40c71735aa0eafb58d3a00ac74d2e511ab14a3aa3d37b1"
},
{
"resource": "repo://libs/langchain_v1/langchain/agents/middleware/__init__.py",
@@ -92,7 +92,7 @@
},
{
"resource": "repo://libs/core/pyproject.toml#L1-L40",
- "version": "repo-lines-v1:sha256:5e1d9552eb39d47f9a70517f02b7414108ba8be8e9aabc8ef24645203c0f2a77:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA0NTY5OTQ2YWM5YmJlN2NiMmNkZWMzZjhiZWNmMzQzNzUwYzU4YjliMzIxZWMyMTk1YmZiYWFiMmFhOGM0YmEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNmYmFjZWMwM2JkMzE5ZWYyZjAyZWVkN2E3OTVmYzI5YmRkNTU4Mzc5NmUxNzFkYTY3YWM2M2Q1ODllYzZiMTgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImVhYTRhNzU4ZTI4ZDhlZjI1MDA5ZDM1YjBhZTM1ZWU0ODRiMjc5OWVjNmIzMmRiMDY4YjFiNmJjYjg2OTQyNDkifQ"
+ "version": "repo-lines-v1:sha256:1a8a302b4bf3b1092a0e14ad96ea8ec9d6a5361de8b1c6a53b4266ca96c60778:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA0NTY5OTQ2YWM5YmJlN2NiMmNkZWMzZjhiZWNmMzQzNzUwYzU4YjliMzIxZWMyMTk1YmZiYWFiMmFhOGM0YmEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNmYmFjZWMwM2JkMzE5ZWYyZjAyZWVkN2E3OTVmYzI5YmRkNTU4Mzc5NmUxNzFkYTY3YWM2M2Q1ODllYzZiMTgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImVhYTRhNzU4ZTI4ZDhlZjI1MDA5ZDM1YjBhZTM1ZWU0ODRiMjc5OWVjNmIzMmRiMDY4YjFiNmJjYjg2OTQyNDkifQ"
}
]
},
@@ -152,7 +152,7 @@
"evidence": [
{
"resource": "repo://libs/langchain_v1/langchain/agents/factory.py",
- "version": "repo-file-v1:sha256:2e1855c669ed50df9795b1f73ca690d7664d0ef58a1c4080d0f6504076ebea97"
+ "version": "repo-file-v1:sha256:ecbb580ed4083a985a40c71735aa0eafb58d3a00ac74d2e511ab14a3aa3d37b1"
}
]
},
@@ -183,6 +183,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-09T08:26:28.144Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/runnables.json b/openwiki/.claims/runnables.json
index f518c6fde7..ee3bfc950b 100644
--- a/openwiki/.claims/runnables.json
+++ b/openwiki/.claims/runnables.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:2785275fb70363fa2ba7b5c6b351f08d2bb5de58d88dec14a5c66d33f670ea88",
+ "pageVersion": "sha256:43b55d032e5cecd3932f068ab29da7e40eecc0b82ef05698892de9e03d0d0b1a",
"claims": [
{
"id": "claim_c00f8ff82e09494a9cdfb9149dda319c",
@@ -63,6 +63,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/source-map.json b/openwiki/.claims/source-map.json
index 9ec4be61ba..1984afafec 100644
--- a/openwiki/.claims/source-map.json
+++ b/openwiki/.claims/source-map.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:6ca0ee06a5fc2963191e151712a4fe1c0427cf4f7d2015ee0cdca292742929dd",
+ "pageVersion": "sha256:abcbcb06c5c3c07ec9e8a552348709b6dce0f36436642407e9738f6b62dfdf4c",
"claims": [
{
"id": "claim_c71edae5b0f64c8fa79c17ef1aca0f6b",
@@ -8,7 +8,7 @@
"evidence": [
{
"resource": "repo://libs/langchain_v1/langchain/agents/factory.py",
- "version": "repo-file-v1:sha256:2e1855c669ed50df9795b1f73ca690d7664d0ef58a1c4080d0f6504076ebea97"
+ "version": "repo-file-v1:sha256:ecbb580ed4083a985a40c71735aa0eafb58d3a00ac74d2e511ab14a3aa3d37b1"
}
]
},
@@ -98,7 +98,7 @@
"evidence": [
{
"resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py",
- "version": "repo-file-v1:sha256:256282e30b6d13913942b1f8986320537d42da90f7d6118c7790270c953f8229"
+ "version": "repo-file-v1:sha256:df3ce3629a9ebd4b1d09cba0b36b0f97f94eafd6f5bd4f2c69a51745236120db"
}
]
},
@@ -164,31 +164,31 @@
},
{
"resource": "repo://libs/core/pyproject.toml",
- "version": "repo-file-v1:sha256:8b952b55cca56e6372ca84df87708a13ecdf617b5bff9e322d749b46156d20c2"
+ "version": "repo-file-v1:sha256:41dd3fe38070b0a7ebacf5cee2db04df126ffe46c8b6bad14624a0782602df43"
},
{
"resource": "repo://libs/langchain_v1/pyproject.toml",
- "version": "repo-file-v1:sha256:0603b7b9a70d40e53ad2ebf8eeecab8636c471895728511b2e5685b6bd232aa8"
+ "version": "repo-file-v1:sha256:700d28cde27314b5dd63f55f1c693046d5520a1c0e3ffd02db349349dbde69a7"
}
]
},
{
"id": "claim_458d709b604149fa8fb9639025882358",
- "statement": "LangChain uses a three-layer architecture: langchain-core (v1.6.2) for base abstractions, langchain (v1.4.0) for orchestration and agents, and partners for provider-specific implementations, enabling model interoperability and independent release cycles.",
+ "statement": "LangChain uses a three-layer architecture: langchain-core (v1.6.3) for base abstractions, langchain (v1.4.2) for orchestration and agents, and partners for provider-specific implementations, enabling model interoperability and independent release cycles.",
"evidence": [
{
"resource": "repo://libs/core/pyproject.toml",
- "version": "repo-file-v1:sha256:8b952b55cca56e6372ca84df87708a13ecdf617b5bff9e322d749b46156d20c2"
+ "version": "repo-file-v1:sha256:41dd3fe38070b0a7ebacf5cee2db04df126ffe46c8b6bad14624a0782602df43"
},
{
"resource": "repo://libs/langchain_v1/pyproject.toml",
- "version": "repo-file-v1:sha256:0603b7b9a70d40e53ad2ebf8eeecab8636c471895728511b2e5685b6bd232aa8"
+ "version": "repo-file-v1:sha256:700d28cde27314b5dd63f55f1c693046d5520a1c0e3ffd02db349349dbde69a7"
}
]
}
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-08T08:27:09.597Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/streaming.json b/openwiki/.claims/streaming.json
index 2a439663a6..7514c34adc 100644
--- a/openwiki/.claims/streaming.json
+++ b/openwiki/.claims/streaming.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:a438de3bacc6da5a8e98bfd85d8e6f3a947deaf987bccf74fa6efdf166987bb6",
+ "pageVersion": "sha256:ec819a268f32b4dad0eea63143f3c3fcc73f653ada7bfcc8e8403918648926a7",
"claims": [
{
"id": "claim_87d5d462354440a7bccb6dbe992c60d3",
@@ -113,6 +113,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/structured-output.json b/openwiki/.claims/structured-output.json
index 9e8a623104..4c1fbe7b68 100644
--- a/openwiki/.claims/structured-output.json
+++ b/openwiki/.claims/structured-output.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:94885a8043502300eae424ea3f016be44eb925bbaf0ad6297fdd741c3280ee69",
+ "pageVersion": "sha256:3fc2f1b0796f339129190c568b93de04bf6a248be8c1b4328a0030d5264642da",
"claims": [
{
"id": "claim_150a5dc8a9c14fc19c3597a746649ba0",
@@ -197,6 +197,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/tools.json b/openwiki/.claims/tools.json
index 1812f51f15..828ec68ac2 100644
--- a/openwiki/.claims/tools.json
+++ b/openwiki/.claims/tools.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:f95633f03549fc6949b4ba8fc5d1bd13a03843a429ff10fa3284ae68f6ffce88",
+ "pageVersion": "sha256:f96ced3ef3413e627abd981c0b444191037c10e2b3ddb823115c03be7ac10618",
"claims": [
{
"id": "claim_72f3312a1c4a494889542dc6efdbf940",
@@ -215,6 +215,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.claims/unit-tests.json b/openwiki/.claims/unit-tests.json
index 7697411ef7..4504f61edb 100644
--- a/openwiki/.claims/unit-tests.json
+++ b/openwiki/.claims/unit-tests.json
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
- "pageVersion": "sha256:7f15b0e6bb2c95e703a2e0c8f6fe04091727b2cb26ae3a3260124cd43f1394e0",
+ "pageVersion": "sha256:ec2b85809adb37d687222c6c15a81c5fba81b7c81ad0de26ad5250a61798fbd9",
"claims": [
{
"id": "claim_bdde90f4e5f6413f8214fe7e80b66a9a",
@@ -14,7 +14,7 @@
},
{
"id": "claim_20d69ecaf7e34bfd922eda9176b4adba",
- "statement": "The conftest.py blockbuster fixture (autouse=True) prevents blocking I/O in async code by registering allowed blocking calls in specific functions like os.stat in langchain_core/_api/internal.py and os.path.abspath in runnables/base.py.",
+ "statement": "The conftest.py blockbuster fixture (autouse=True) prevents blocking I/O in async code by registering allowed blocking calls: os.stat and os.path.abspath in langchain_core/_api/internal.py (is_caller_internal) and langchain_core/runnables/base.py (__repr__); os.stat and io.TextIOWrapper.read in langsmith/client.py (_default_retry_config); and all functions in freezegun/api.py (_get_cached_module_attributes).",
"evidence": [
{
"resource": "repo://libs/core/tests/unit_tests/conftest.py#L12-L32",
@@ -189,6 +189,6 @@
],
"verification": {
"by": "openwiki/0.5.0",
- "at": "2026-09-03T15:18:34.589Z"
+ "at": "2026-09-21T08:30:16.745Z"
}
}
diff --git a/openwiki/.last-update.json b/openwiki/.last-update.json
index f3ad5192f1..5949b0d6ea 100644
--- a/openwiki/.last-update.json
+++ b/openwiki/.last-update.json
@@ -1,7 +1,7 @@
{
- "updatedAt": "2026-09-09T08:30:25.024Z",
+ "updatedAt": "2026-09-21T08:56:43.384Z",
"command": "update",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
"model": "claude-haiku-4-5",
"status": "complete",
"language": "en"
diff --git a/openwiki/.page-manifest.json b/openwiki/.page-manifest.json
index 0f3b37374a..f4f47919f5 100644
--- a/openwiki/.page-manifest.json
+++ b/openwiki/.page-manifest.json
@@ -2,165 +2,165 @@
"schemaVersion": 1,
"pages": {
"/openwiki/agent-execution.md": {
- "pageVersion": "sha256:bd16b5e2d2f508d0aba8962fb1e836569b2a9af1615a3ec3a278948b6b703043",
+ "pageVersion": "sha256:6d2dd5c14c9fd39233694a1e55b4834368b448da97791dd15f15bc0543d0a4ad",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/agent-factory.md": {
- "pageVersion": "sha256:861e60569112cc57094912804e603c9cd7bd4162df709645dd543bb46b2cca3f",
+ "pageVersion": "sha256:2c73027e4ac35b6bafe1b1e6da66b81ecdbdfdd7c36522eee378830a21a33af5",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/architecture.md": {
- "pageVersion": "sha256:955c0c402efcda6052d84d4421645bd6720847d59e4d25c1c4ac40bec2d68e2a",
+ "pageVersion": "sha256:e2eaa0a82ef06f6bae3ab2af47341b9267a702975bbde4e2512ea2fc13086df9",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "cb0ae1f9-02ab-4f92-9981-eeb48c091794",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/callbacks.md": {
- "pageVersion": "sha256:1bc36cc5d9a9fd1c9ab60ccb76938f7eb0d0722738953a69f474fe7e532f2a78",
+ "pageVersion": "sha256:438fb8bb5d1224fb820ab31d6d0c8e16554980cf2e3e713ee995f9925142b53f",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "cb0ae1f9-02ab-4f92-9981-eeb48c091794",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/chat-models.md": {
- "pageVersion": "sha256:67dc4d64315fbd418d3cdd7cd0f5500ae8f6059c10d263e69dfedd8e7d3a8338",
+ "pageVersion": "sha256:5fe640d3b1fec48eebaf85f24ff73909b2f78e628131169dd37d3ea97895e8a2",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "cb0ae1f9-02ab-4f92-9981-eeb48c091794",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/ci-workflows.md": {
- "pageVersion": "sha256:8af0cd4e2f4fde3bbeaa007c68ac7b8049bd352e75e6455e2b7896818da707cc",
+ "pageVersion": "sha256:99120eb4274fdb568b343816c5a26e10c7e18e8f7307515fd2c70607b21f5f12",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/composability.md": {
- "pageVersion": "sha256:2686a50367f151aef17fad64706fe0e5bb3d6d279febeecbac7d3760d2d17424",
+ "pageVersion": "sha256:b1feac445c4494398af24cf9d3767e68ffd5c1d3882b408e3e3c515d1a5f906e",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/dev-commands.md": {
- "pageVersion": "sha256:7dd5ad8767d8a3f658ed06a962ccaafe416623877d4864ce71de856a4ae7b52f",
+ "pageVersion": "sha256:32352b68e37cee65505e27ca047f9eae0c2eafb8dac60d1409c4d33b563955f8",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/integration-tests.md": {
- "pageVersion": "sha256:8bf3d528d2fe2628f24d10c54b6445ad11f8ec7abae99049815d037c83fdaf08",
+ "pageVersion": "sha256:0ead306fee0715430d8afdedcbb61944f51e57df48168d9394fc2c03d21f7c45",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/mcp-integration.md": {
- "pageVersion": "sha256:39684cc4e8be6978f803b85b99406b6a877eaf9e8c8b964279a413f854340751",
+ "pageVersion": "sha256:87c4080ea30d8947623f0ded2435da98571f131a134392f5faece5d6fbfcd460",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/messages.md": {
- "pageVersion": "sha256:7e1f2bf23c2f051eac9a9adf14ea571ffc8481dd90f220634bb732a545971a5a",
+ "pageVersion": "sha256:0a36ceb2f165da2e8002795df9b6130b952184dc8b95bb5a8f79c888e4c3ab73",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "cb0ae1f9-02ab-4f92-9981-eeb48c091794",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/middleware.md": {
- "pageVersion": "sha256:dc648f1612a1d33054c8fbb196b66361684e441ad6fbf9af3cb5df1777a4a402",
+ "pageVersion": "sha256:59f149479aecc8ce5f7e0d000a58fe4d061773c476c8a2f2a0264d6fd5ddf814",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "cb0ae1f9-02ab-4f92-9981-eeb48c091794",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/model-initialization.md": {
- "pageVersion": "sha256:0ff4006082d29f33169349313c83cc890f4fafd73f0a3df4a51cf88689471825",
+ "pageVersion": "sha256:a2984365361bea3650236ef43c48d193ac444b15257fef3ea6110d04c3580210",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/openai-provider.md": {
- "pageVersion": "sha256:012f8bbb76f0fc9e8cf5796d4dd6a558d1ac45e1248a500804c3dd6342401ccf",
+ "pageVersion": "sha256:9cf9b71623f99687ab1cf0779e86f4be9c781731b7ab13fdab1b710a1372e78e",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "cb0ae1f9-02ab-4f92-9981-eeb48c091794",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/partner-pattern.md": {
- "pageVersion": "sha256:91706aa194d34ce5f993646f2d7f280fff4b4ac0424ec2e7a1da4f8e3b132469",
+ "pageVersion": "sha256:a9f7a265ce85fd5e15600ae575ae1c12481b5b898b690c3ee514ae559e803619",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "4e2863b2-b3c1-42c3-aa09-e3dfe9f97230",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/prompts.md": {
- "pageVersion": "sha256:5f946f7b6b3214808e71060f1626dc4100caf473eb5e0186d8064f20219062b9",
+ "pageVersion": "sha256:39306f0c76011ccf01aff4ac460b8d8856130f40f1e6fcdbd46b70dbadcc2ea2",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/quickstart.md": {
- "pageVersion": "sha256:6bab4df1cbe8d024002542007ec45a1d17f5dd4d9454cb66bda120674fd4b44e",
+ "pageVersion": "sha256:9c31e9e0ffb9f9920564d97d148a4ce321992784b3cf1812b69ebbf6da91b331",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "4e2863b2-b3c1-42c3-aa09-e3dfe9f97230",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/runnables.md": {
- "pageVersion": "sha256:2785275fb70363fa2ba7b5c6b351f08d2bb5de58d88dec14a5c66d33f670ea88",
+ "pageVersion": "sha256:43b55d032e5cecd3932f068ab29da7e40eecc0b82ef05698892de9e03d0d0b1a",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/source-map.md": {
- "pageVersion": "sha256:6ca0ee06a5fc2963191e151712a4fe1c0427cf4f7d2015ee0cdca292742929dd",
+ "pageVersion": "sha256:abcbcb06c5c3c07ec9e8a552348709b6dce0f36436642407e9738f6b62dfdf4c",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "cb0ae1f9-02ab-4f92-9981-eeb48c091794",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/streaming.md": {
- "pageVersion": "sha256:a438de3bacc6da5a8e98bfd85d8e6f3a947deaf987bccf74fa6efdf166987bb6",
+ "pageVersion": "sha256:ec819a268f32b4dad0eea63143f3c3fcc73f653ada7bfcc8e8403918648926a7",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/structured-output.md": {
- "pageVersion": "sha256:94885a8043502300eae424ea3f016be44eb925bbaf0ad6297fdd741c3280ee69",
+ "pageVersion": "sha256:3fc2f1b0796f339129190c568b93de04bf6a248be8c1b4328a0030d5264642da",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/tools.md": {
- "pageVersion": "sha256:f95633f03549fc6949b4ba8fc5d1bd13a03843a429ff10fa3284ae68f6ffce88",
+ "pageVersion": "sha256:f96ced3ef3413e627abd981c0b444191037c10e2b3ddb823115c03be7ac10618",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
},
"/openwiki/unit-tests.md": {
- "pageVersion": "sha256:7f15b0e6bb2c95e703a2e0c8f6fe04091727b2cb26ae3a3260124cd43f1394e0",
+ "pageVersion": "sha256:ec2b85809adb37d687222c6c15a81c5fba81b7c81ad0de26ad5250a61798fbd9",
"completedBy": "openwiki/0.5.0",
- "completedRunId": "b9d6bfc2-1d6c-4466-8f2b-ecd535b3e562",
- "gitHead": "22f3421aeedec55962f712a34d86d9683bf6cf59",
- "sourceFingerprint": "sha256:7d02f65fe28bf14669a654005944df05ee23fa0081c27bfb0afd490004a42e85"
+ "completedRunId": "b3b076e4-223a-43d1-ac8c-958e47dcce50",
+ "gitHead": "4af7ab8fcb98c2dc211d9e34cddedffa23eba4d9",
+ "sourceFingerprint": "sha256:042d8ad53fccb9afd22a3388076cc9bc06ada167fbdd921c32643978ae650484"
}
}
}
diff --git a/openwiki/agent-execution.md b/openwiki/agent-execution.md
index 7878b83550..5a33721b20 100644
--- a/openwiki/agent-execution.md
+++ b/openwiki/agent-execution.md
@@ -5,13 +5,13 @@ description: Traces the runtime lifecycle of an agent from user input through mo
tags: [agent-execution, control-flow, state-machine, loop-control, tool-dispatch, middleware, langchain]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-71e882e1ac9757ea8e959a7c
resource: repo://libs/langchain_v1/langchain/agents/factory.py
- id: openwiki-source-03e8ca0eebe37feda8566793
resource: repo://libs/langchain_v1/langchain/agents/middleware/types.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
---
## Overview
@@ -200,12 +200,12 @@ After the model is invoked, the graph checks whether to dispatch tools:
### Tools-to-Model Decision (_make_tools_to_model_edge)
-After tool execution completes:
+After tool execution completes, the conditional edge determines the next step:
-1. **No AIMessage**: If the message list is corrupted, jump to model for recovery.
+1. **No AIMessage**: If the message list is corrupted or empty, route back to the model for recovery.
2. **Return Direct Tools**: If all executed client-side tools have `return_direct=True`, exit the loop immediately.
3. **Structured Output Executed**: If any executed tool is a structured output tool, exit (the response is ready).
-4. **Default**: Continue the loop, jumping back to `before_model` so the model can process tool results.
+4. **Default**: Continue the loop, routing back to `before_model` (or `model` if no middleware) so the model can process tool results.
### Model-to-Model Decision (_make_model_to_model_edge)
@@ -220,11 +220,11 @@ When structured output tools are configured but no regular tools exist, the mode
The loop terminates when any of these are true:
- Model does not call any tools (`tool_calls` is empty).
-- Model jumps via middleware to `'end'`.
-- All pending tool calls are structured output tool calls (response is ready).
-- A structured output tool is executed (response is ready).
-- A tool with `return_direct=True` is executed.
-- An explicit exception is raised and not caught.
+- Middleware explicitly sets `jump_to='end'` in `before_model` or `after_model`.
+- A structured output tool is executed (its result is parsed into `state['structured_response']`).
+- A tool with `return_direct=True` is executed (after tool execution phase).
+- `state['structured_response']` is populated (after a model invocation with structured output tools).
+- An unhandled exception is raised during model invocation or tool execution.
## Tool Execution
diff --git a/openwiki/agent-factory.md b/openwiki/agent-factory.md
index b8f21f4934..3604c12dde 100644
--- a/openwiki/agent-factory.md
+++ b/openwiki/agent-factory.md
@@ -1,10 +1,11 @@
---
type: "Reference"
-title: "Create a basic agent"
-openwiki_generated: true
+title: "Agent Factory and create_agent"
+description: "The agent factory constructs state machines that orchestrate conversation flow between a language model, tool execution, and middleware layers. The create_agent function handles tool binding, structured output, state schema resolution, and graph compilation."
+tags: [agents, factory, state-machine, middleware, langgraph]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-71e882e1ac9757ea8e959a7c
resource: repo://libs/langchain_v1/langchain/agents/factory.py
@@ -14,10 +15,9 @@ sources:
resource: repo://libs/langchain_v1/langchain/agents/middleware/_trace_policy.py
- id: openwiki-source-03e8ca0eebe37feda8566793
resource: repo://libs/langchain_v1/langchain/agents/middleware/types.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
---
-
## Overview
The **Agent Factory** is the foundational entry point for building LangChain agents. The `create_agent` function constructs a compiled LangGraph state machine that orchestrates conversation flow between a language model, tool execution, and pluggable middleware layers. It handles tool binding, structured output, state schema resolution, and middleware composition automatically, allowing developers to focus on business logic while the factory manages the complex graph construction and execution model.
@@ -47,32 +47,33 @@ for chunk in agent.stream(inputs, stream_mode="updates"):
## Agent Architecture
-The agent factory constructs a **state machine graph** with the following structure:
+The agent factory constructs a **state machine graph** with nodes for model invocation, tool execution, and middleware hooks. The graph processes messages in a loop until a stopping condition is met.
-
-```text
-graph TD
- START["START"] --> ENTRY["Entry Node
(before_agent)"]
- ENTRY --> LOOP_ENTRY["Loop Entry
(before_model | model)"]
- LOOP_ENTRY --> MODEL["Model Node
(LLM Call)"]
- MODEL --> AFTER_MODEL["After Model
(middleware)"]
- AFTER_MODEL --> ROUTER{Has Tool Calls?}
+```mermaid
+flowchart TD
+ START([START]) --> ENTRY["Entry Node
(before_agent or before_model or model)"]
+ ENTRY --> LOOP["Loop Entry
(before_model or model)"]
+ LOOP --> MODEL["Model Node
(LLM Call)"]
+ MODEL --> AFTER["After Model
(after_model middleware)"]
+ AFTER --> ROUTER{Has Tool Calls?}
+ ROUTER -->|No| EXIT["Exit Node
(after_agent or END)"]
ROUTER -->|Yes| TOOLS["Tools Node
(Execute Tools)"]
- ROUTER -->|No| EXIT["Exit Node
(after_agent)"]
- TOOLS --> TOOLS_ROUTER{Tool Direct Return?}
- TOOLS_ROUTER -->|No| LOOP_ENTRY
- TOOLS_ROUTER -->|Yes| EXIT
- EXIT --> END["END"]
+ TOOLS --> CHECK{Exit?}
+ CHECK -->|return_direct or
structured_output| EXIT
+ CHECK -->|No| LOOP
+ EXIT --> END([END])
```
+Agent execution flow showing middleware hooks at each stage.
+
**Key Nodes:**
-- **Entry Node**: Runs `before_agent` hooks once at the start of the conversation.
-- **Loop Entry**: Begins each iteration of the model → tool loop. Runs `before_model` middleware.
+- **Entry Node**: Runs before_agent hooks once at start, then before_model hooks if present, else proceeds to model.
+- **Loop Entry**: Marks the beginning of the model-tool iteration loop. Tools loop back here after execution (unless exit conditions are met).
- **Model Node**: Calls the language model with messages and system prompt. Handles structured output parsing.
-- **After Model**: Runs `after_model` hooks after model output (runs each loop iteration).
-- **Tools Node**: Executes tools returned by the model. Skipped if no tools are defined.
-- **Exit Node**: Runs `after_agent` hooks once at the end of the conversation.
+- **After Model**: Runs after_model hooks after model output (runs each loop iteration).
+- **Tools Node**: Executes tools returned by the model. Only added if tools are defined. Skipped if model returns no tool calls.
+- **Exit Node**: Runs after_agent hooks once at end, then exits the graph.
## Core Concepts
@@ -334,8 +335,8 @@ Tools are registered at agent creation. Supported formats:
2. Conditional routing checks for pending tool calls (not yet executed).
3. **ToolNode** batches pending calls and executes them in parallel (or sequentially, depending on config).
4. Execution results are wrapped in `ToolMessage`s and added to state.
-5. Loop back to model unless:
- - A tool with `return_direct=True` was executed
+5. Loop back to loop_entry node unless:
+ - All executed tools have `return_direct=True`
- A structured output tool was executed
- No pending tool calls remain
diff --git a/openwiki/architecture.md b/openwiki/architecture.md
index 368112958d..c927380ec9 100644
--- a/openwiki/architecture.md
+++ b/openwiki/architecture.md
@@ -3,9 +3,6 @@ type: "System Architecture"
title: "LangChain System Architecture"
description: "High-level decomposition of the LangChain framework into three layers: langchain-core (abstractions), langchain (orchestration and agents), and partners (provider integrations), showing dependencies, component responsibilities, and extension boundaries."
tags: [architecture, core, langchain, partners, orchestration, runnable, abstractions, layered-architecture]
-verified:
- - by: openwiki/0.5.0
- at: 2026-09-08T08:27:09.597Z
sources:
- id: openwiki-source-c52037e7b642f7ac5a7642a8
resource: repo://libs/core/langchain_core/language_models/chat_models.py
@@ -37,7 +34,10 @@ sources:
resource: repo://libs/partners/README.md
- id: openwiki-source-7da6afe7fe64c6589cf1fed0
resource: repo://libs/README.md
-generated: { by: "openwiki/0.5.0", at: "2026-09-08T08:27:09.597Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
+verified:
+ - by: openwiki/0.5.0
+ at: 2026-09-21T08:30:16.745Z
---
## Overview
@@ -60,8 +60,8 @@ Users typically import from `langchain` (the actively maintained package) to acc
graph TB
User["User Applications"]
- User -->|imports from| LangChain["langchain
(Orchestration & Agents)
v1.4.0"]
- User -->|may use directly| Core["langchain-core
(Base Abstractions)
v1.6.2"]
+ User -->|imports from| LangChain["langchain
(Orchestration & Agents)
v1.4.2"]
+ User -->|may use directly| Core["langchain-core
(Base Abstractions)
v1.6.3"]
LangChain -->|depends on| Core
LangChain -->|depends on| LangGraph["LangGraph
(State Graph Engine)"]
@@ -292,9 +292,9 @@ The core layer (langchain-core) is intentionally minimal and stable. Orchestrati
## Versioning and Release Policy
-- **langchain-core** (`v1.6.2`): Stable base abstractions. Major version bumps are rare and announced in advance. Deprecations carry multiple minor versions of notice. This is the "least-moving" part of the ecosystem.
+- **langchain-core** (`v1.6.3`): Stable base abstractions. Major version bumps are rare and announced in advance. Deprecations carry multiple minor versions of notice. This is the "least-moving" part of the ecosystem.
-- **langchain** (`v1.4.0`): Main user-facing package. Minor versions may add new agent patterns, middleware types, or orchestration improvements. Patch versions fix bugs. Requires specific langchain-core version (e.g., `>=1.6.0,<2.0.0`).
+- **langchain** (`v1.4.2`): Main user-facing package. Minor versions may add new agent patterns, middleware types, or orchestration improvements. Patch versions fix bugs. Requires specific langchain-core version (e.g., `>=1.6.3,<2.0.0`).
- **langchain-classic** (`v1.0.8`): Legacy package for backward compatibility. Provides old chains, `langchain-community` re-exports, and deprecated APIs. New projects should use `langchain` instead.
diff --git a/openwiki/callbacks.md b/openwiki/callbacks.md
index 7cdafe1d70..ed45c6d5b8 100644
--- a/openwiki/callbacks.md
+++ b/openwiki/callbacks.md
@@ -5,7 +5,7 @@ description: "Document the callback handler architecture, integration with runna
tags: ["callbacks", "observability", "handlers", "tracing", "streaming", "langsmith"]
verified:
- by: openwiki/0.5.0
- at: 2026-09-08T08:27:09.597Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-c9313cf42f0120d86b20245f
resource: repo://libs/core/langchain_core/callbacks/base.py
@@ -23,7 +23,7 @@ sources:
resource: repo://libs/core/langchain_core/runnables/config.py
- id: openwiki-source-bfd8b1aa6ad00852a2e99762
resource: repo://libs/core/langchain_core/tracers/context.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
---
@@ -39,13 +39,12 @@ The system is built on a hierarchical run structure where parent-child relations
**BaseCallbackHandler** (`repo://libs/core/langchain_core/callbacks/base.py#L496-L546`) is the base class for all callback implementations. It inherits from multiple mixins that define event methods for different operation types:
-- **LLMManagerMixin**: `on_llm_start`, `on_llm_new_token`, `on_llm_end`, `on_llm_error`, `on_stream_event`
-- **ChainManagerMixin**: `on_chain_start`, `on_chain_end`, `on_chain_error`
-- **ToolManagerMixin**: `on_tool_start`, `on_tool_end`, `on_tool_error`
-- **RetrieverManagerMixin**: `on_retriever_start`, `on_retriever_end`, `on_retriever_error`
-- **AgentManagerMixin**: `on_agent_action`, `on_agent_finish`
+- **LLMManagerMixin**: `on_llm_new_token`, `on_llm_end`, `on_llm_error`, `on_stream_event`
+- **ChainManagerMixin**: `on_chain_end`, `on_chain_error`, `on_agent_action`, `on_agent_finish`
+- **ToolManagerMixin**: `on_tool_end`, `on_tool_error`
+- **RetrieverManagerMixin**: `on_retriever_end`, `on_retriever_error`
- **RunManagerMixin**: `on_text`, `on_retry`, `on_custom_event`
-- **CallbackManagerMixin**: start methods for all operation types
+- **CallbackManagerMixin**: `on_llm_start`, `on_chat_model_start`, `on_chain_start`, `on_tool_start`, `on_retriever_start`
Every handler also supports `raise_error` and `run_inline` attributes to control error propagation and execution context.
@@ -408,7 +407,7 @@ class LLMOnlyHandler(BaseCallbackHandler):
return True # Skip all retriever events
```
-Available properties: `ignore_llm`, `ignore_chain`, `ignore_agent`, `ignore_tool`, `ignore_retriever`, `ignore_retry`, `ignore_chat_model`, `ignore_custom_event`.
+Available properties: `ignore_llm`, `ignore_chain`, `ignore_agent`, `ignore_retriever`, `ignore_retry`, `ignore_chat_model`, `ignore_custom_event`.
## Custom Event Dispatch
diff --git a/openwiki/chat-models.md b/openwiki/chat-models.md
index b9c7f51544..22fd0018f3 100644
--- a/openwiki/chat-models.md
+++ b/openwiki/chat-models.md
@@ -5,7 +5,7 @@ description: "Document BaseChatModel protocol, input/output handling, streaming,
tags: [chat-models, llm-integration, streaming, structured-output, model-capabilities]
verified:
- by: openwiki/0.5.0
- at: 2026-09-08T08:27:09.597Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-132f3183693cd9cf79d029a5
resource: repo://libs/core/langchain_core/language_models/base.py
diff --git a/openwiki/ci-workflows.md b/openwiki/ci-workflows.md
index adc2a0f7a5..b45ddd44ad 100644
--- a/openwiki/ci-workflows.md
+++ b/openwiki/ci-workflows.md
@@ -2,9 +2,6 @@
type: "Reference"
title: "CI/CD Workflows: GitHub Actions and Release Process"
openwiki_generated: true
-verified:
- - by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
sources:
- id: openwiki-source-34e57b5a3a0c875639ab72a7
resource: repo://.github/scripts/check_diff.py
@@ -28,7 +25,12 @@ sources:
resource: repo://.github/workflows/openwiki-update.yml
- id: openwiki-source-f8781d847f6481a966a44a68
resource: repo://.github/workflows/pr_labeler.yml
-generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+ - id: openwiki-source-12805fbf767dc2a3e238645e
+ resource: repo://.github/workflows/pr_lint.yml
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
+verified:
+ - by: openwiki/0.5.0
+ at: 2026-09-21T08:30:16.745Z
---
@@ -237,6 +239,19 @@ Fires when issues are opened or edited:
3. Adds/removes labels to match selected package(s)
4. Supports both dropdown (single) and checkbox (multi-select) formats
+### PR Title Linting (`pr_lint.yml`)
+
+Enforces Conventional Commits 1.0.0 format on all pull request titles:
+
+- **Format**: `[optional scope]: ` (e.g., `feat(core): add multi-tenant support`)
+- **Allowed types**: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert, release, hotfix
+- **Optional scope**: Scopes for specific packages (core, langchain, anthropic, openai, etc.) or cross-cutting concerns (infra, deps)
+- **Breaking changes**: Append `!` after type/scope (e.g., `feat!: remove deprecated API`)
+- **Release commits**: Must be `release(scope): x.y.z` format
+- **Validation**: Uses `amannn/action-semantic-pull-request` with empty scope rejection
+
+Empty scope parentheses are rejected; PR must either omit parentheses (no scope) or provide a valid scope.
+
### PR Labeling (`pr_labeler.yml`)
Unified PR labeler applying size, file-based, title-based, and contributor classification:
diff --git a/openwiki/composability.md b/openwiki/composability.md
index a4da4512f1..45ef1ae5db 100644
--- a/openwiki/composability.md
+++ b/openwiki/composability.md
@@ -1,18 +1,21 @@
---
-type: "Reference"
-title: "Dict syntax creates a RunnableParallel"
-openwiki_generated: true
+type: "Concept"
+title: "Composability and LCEL Chains"
+description: "How Runnable components compose through LCEL operators, creating reusable workflows with automatic async, batch, and streaming support."
+tags: ["composability", "LCEL", "runnables", "chaining", "operators"]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-a1981e868973f6fd7f71e12e
resource: repo://libs/core/langchain_core/runnables/base.py
- id: openwiki-source-48e94bbe49ab4f33ba87e9cb
resource: repo://libs/core/langchain_core/runnables/branch.py
+ - id: openwiki-source-f9f4c1dc4f9cdf80d824ce15
+ resource: repo://libs/core/langchain_core/runnables/fallbacks.py
- id: openwiki-source-de6c904bd0171642bd50f6d9
resource: repo://libs/core/langchain_core/runnables/router.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
---
@@ -249,6 +252,105 @@ Every method has an async counterpart:
Async methods integrate with the callback system and execute concurrency-aware batching via `asyncio.gather`.
+## Variable Binding and Context Flow
+
+In composed chains, data flows through steps along with execution context. Each step receives the output of the previous step as its input.
+
+### Context Propagation
+
+When a chain invokes, **`RunnableSequence`** creates a callback hierarchy for tracing:
+- Each step is marked as a child run using `run_manager.get_child(f"seq:step:{i + 1}")`
+- Callbacks, tags, and metadata flow through the chain via `RunnableConfig`
+- `patch_config` updates the config for each step while preserving parent context
+
+```python
+from langchain_core.runnables import RunnableLambda
+
+# Context flows through each step
+step1 = RunnableLambda(lambda x: x + 1)
+step2 = RunnableLambda(lambda x: x * 2)
+chain = step1 | step2
+
+# Invoke with tracing config
+result = chain.invoke(
+ 5,
+ config={
+ "run_name": "my_chain",
+ "callbacks": [my_tracer],
+ "tags": ["prod"],
+ }
+)
+# Each step runs with inherited config while reporting to callbacks
+```
+
+### Dict Composition and Key Selection
+
+When using dict syntax in a sequence, each dict key becomes a separate branch context:
+
+```python
+chain = step1 | {
+ "result_a": step2,
+ "result_b": step3,
+}
+
+# Output combines results from both branches
+output = chain.invoke(input) # {'result_a': ..., 'result_b': ...}
+```
+
+Each branch (`result_a`, `result_b`) appears as a separate child run in the callback trace.
+
+## Fallback Patterns
+
+Fallbacks provide resilience by retrying with alternative Runnables when one fails.
+
+### Fallback at Component Level
+
+```python
+from langchain_core.runnables import RunnableLambda
+
+primary_llm = ChatOpenAI(model="gpt-4")
+fallback_llm = ChatAnthropic(model="claude-3-sonnet")
+
+resilient_llm = primary_llm.with_fallbacks(
+ [fallback_llm],
+ exceptions_to_handle=(APIConnectionError,),
+)
+
+output = resilient_llm.invoke("What is composability?")
+# Uses primary_llm; falls back to fallback_llm if APIConnectionError occurs
+```
+
+### Fallback at Chain Level
+
+```python
+# Construct a chain with fallback
+chain_with_fallback = (
+ prompt
+ | resilient_llm
+ | parser
+).with_fallbacks([
+ RunnableLambda(lambda x: "Service unavailable")
+])
+
+output = chain_with_fallback.invoke({"topic": "composability"})
+# If the entire chain fails, returns fallback response
+```
+
+### Multiple Fallbacks
+
+Fallbacks are tried in order until one succeeds:
+
+```python
+model = ChatOpenAI().with_fallbacks([
+ ChatAnthropic(), # Try second
+ ChatClaude(), # Try third
+ ChatCohere(), # Try fourth
+ RunnableLambda(default_response), # Final fallback
+])
+```
+
+The chain tries each fallback sequentially until one returns successfully or all are exhausted.
+
## Chaining Patterns
### Common Pattern: Prompt → Model → Parser
diff --git a/openwiki/dev-commands.md b/openwiki/dev-commands.md
index 2bdd310e02..6158a46cfd 100644
--- a/openwiki/dev-commands.md
+++ b/openwiki/dev-commands.md
@@ -5,7 +5,7 @@ description: "Quick reference for uv, make, lint, test, and type-checking comman
tags: [development, build, testing, linting, typing, uv, make, pre-commit, local-setup]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-4d1645cb6317345817452838
resource: repo://.pre-commit-config.yaml
diff --git a/openwiki/index.md b/openwiki/index.md
index 8b399080cd..f4df55c0a1 100644
--- a/openwiki/index.md
+++ b/openwiki/index.md
@@ -5,12 +5,12 @@ okf_version: "0.2"
# Files
- [Agent Execution Flow and Loop Control](agent-execution.md) - Traces the runtime lifecycle of an agent from user input through model invocation, tool dispatch, and loop termination conditions, with detailed state management and middleware integration points.
-- [Create a basic agent](agent-factory.md)
+- [Agent Factory and create_agent](agent-factory.md) - The agent factory constructs state machines that orchestrate conversation flow between a language model, tool execution, and middleware layers. The create_agent function handles tool binding, structured output, state schema resolution, and graph compilation.
- [LangChain System Architecture](architecture.md) - High-level decomposition of the LangChain framework into three layers: langchain-core (abstractions), langchain (orchestration and agents), and partners (provider integrations), showing dependencies, component responsibilities, and extension boundaries.
- [Callback System and Handler Integration](callbacks.md) - Document the callback handler architecture, integration with runnables and chat models, and patterns for tracking execution events, streaming, and instrumentation.
- [Chat Model Interface and Lifecycle](chat-models.md) - Document BaseChatModel protocol, input/output handling, streaming, and integration points with callbacks and model profiling.
- [CI/CD Workflows: GitHub Actions and Release Process](ci-workflows.md)
-- [Dict syntax creates a RunnableParallel](composability.md)
+- [Composability and LCEL Chains](composability.md) - How Runnable components compose through LCEL operators, creating reusable workflows with automatic async, batch, and streaming support.
- [Development Commands and Local Setup](dev-commands.md) - Quick reference for uv, make, lint, test, and type-checking commands in the LangChain monorepo, including environment setup, pre-commit hooks, and testing workflows.
- [Integration Testing: Live API Tests and VCR Cassettes](integration-tests.md) - How to write integration tests that call real model APIs with VCR cassette recording for CI compatibility, including environment setup, cassette management, and parameterization patterns.
- [Bearer token](mcp-integration.md)
@@ -25,5 +25,5 @@ okf_version: "0.2"
- [Source Map: Repository File Organization](source-map.md) - Quick reference for locating code by topic, mapping LangChain concepts to their implementation paths across the monorepo including core abstractions, agents, middleware, partners, and configuration files.
- [Streaming: Token-by-Token Output](streaming.md) - How streaming works across LLM components and chains, token-by-token delivery via AIMessageChunk, callback integration, and memory/latency tradeoffs.
- [AutoStrategy (recommended)](structured-output.md)
-- [Form 1: No arguments (name from function)](tools.md)
+- [Tools and Tool Binding](tools.md) - LangChain's tool system enables agents and language models to execute structured actions through schema-aware components with automatic validation, error handling, and callback integration.
- [Unit Testing: Strategies and Patterns](unit-tests.md) - How to write unit tests for langchain-core and langchain components using pytest, fixtures, mocking, and standard test classes from langchain-tests.
diff --git a/openwiki/integration-tests.md b/openwiki/integration-tests.md
index 9632ed0758..055a8bab20 100644
--- a/openwiki/integration-tests.md
+++ b/openwiki/integration-tests.md
@@ -5,7 +5,7 @@ description: "How to write integration tests that call real model APIs with VCR
tags: [integration-tests, vcr, cassettes, api-testing, pytest, ci-cd, model-testing]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-bcf7be66f36f862f639f3c7a
resource: repo://libs/langchain_v1/tests/integration_tests/conftest.py
diff --git a/openwiki/mcp-integration.md b/openwiki/mcp-integration.md
index 479be62d87..d28d8ad9c2 100644
--- a/openwiki/mcp-integration.md
+++ b/openwiki/mcp-integration.md
@@ -2,9 +2,6 @@
type: "Reference"
title: "Bearer token"
openwiki_generated: true
-verified:
- - by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
sources:
- id: openwiki-source-6d1e3478d5b63988ee177552
resource: repo://libs/langchain_v1/examples/mcp/auth_bearer.py
@@ -31,6 +28,9 @@ sources:
- id: openwiki-source-4715c337e9b93b9d00846133
resource: repo://libs/langchain_v1/langchain/mcp/tools.py
generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+verified:
+ - by: openwiki/0.5.0
+ at: 2026-09-21T08:30:16.745Z
---
diff --git a/openwiki/messages.md b/openwiki/messages.md
index 7749534a50..f8c6db6da8 100644
--- a/openwiki/messages.md
+++ b/openwiki/messages.md
@@ -5,7 +5,7 @@ description: "Document the message abstraction, standardized content blocks for
tags: [messages, content-blocks, chat-models, streaming, multimodal, provider-adapters]
verified:
- by: openwiki/0.5.0
- at: 2026-09-08T08:27:09.597Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-77dc1fb726463969f9d53658
resource: repo://libs/core/langchain_core/messages/ai.py
diff --git a/openwiki/middleware.md b/openwiki/middleware.md
index 3598adc207..a30f51de89 100644
--- a/openwiki/middleware.md
+++ b/openwiki/middleware.md
@@ -3,9 +3,6 @@ type: "Reference"
title: "Agent Middleware: Composable Request/Response Processing"
description: "Document the middleware system for agents, including lifecycle hooks, HITL approval, error handling, retry logic, and middleware composition patterns for intercepting and modifying agent behavior."
tags: [agent-middleware, request-interception, composition, error-handling, human-in-the-loop]
-verified:
- - by: openwiki/0.5.0
- at: 2026-09-08T08:27:09.597Z
sources:
- id: openwiki-source-71e882e1ac9757ea8e959a7c
resource: repo://libs/langchain_v1/langchain/agents/factory.py
@@ -18,6 +15,9 @@ sources:
- id: openwiki-source-03e8ca0eebe37feda8566793
resource: repo://libs/langchain_v1/langchain/agents/middleware/types.py
generated: { by: "openwiki/0.5.0", at: "2026-09-08T08:27:09.597Z" }
+verified:
+ - by: openwiki/0.5.0
+ at: 2026-09-21T08:30:16.745Z
---
## Overview
diff --git a/openwiki/model-initialization.md b/openwiki/model-initialization.md
index 94bb74dc34..8030e731fb 100644
--- a/openwiki/model-initialization.md
+++ b/openwiki/model-initialization.md
@@ -5,11 +5,11 @@ description: Factory function for instantiating chat models from provider string
tags: [chat-models, factory-pattern, initialization, model-parameters, configuration, provider-registry]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-c479d4fffee5cf62576699e4
resource: repo://libs/langchain_v1/langchain/chat_models/base.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
---
## Overview
@@ -124,7 +124,7 @@ If inference fails and `model_provider` is not provided, a `ValueError` lists su
The `_BUILTIN_PROVIDERS` dictionary maps provider names to module paths, class names, and instantiation functions. Each entry is a tuple: `(module_path, class_name, creator_func)`.
-**Representative Entries** (repo://libs/langchain_v1/langchain/chat_models/base.py#L56-L97):
+**All 32 Built-in Providers** (repo://libs/langchain_v1/langchain/chat_models/base.py#L56-L97):
| Provider | Package | Class | Module | Notes |
|---|---|---|---|---|
@@ -134,6 +134,7 @@ The `_BUILTIN_PROVIDERS` dictionary maps provider names to module paths, class n
| `azure_ai` | `langchain-azure-ai` | `AzureAIOpenAIApiChatModel` | `langchain_azure_ai.chat_models` | Submodule import |
| `google_vertexai` | `langchain-google-vertexai` | `ChatVertexAI` | `langchain_google_vertexai` | |
| `google_genai` | `langchain-google-genai` | `ChatGoogleGenerativeAI` | `langchain_google_genai` | |
+| `google_anthropic_vertex` | `langchain-google-vertexai` | `ChatAnthropicVertex` | `langchain_google_vertexai.model_garden` | Anthropic via Google Vertex |
| `anthropic_bedrock` | `langchain-aws` | `ChatAnthropicBedrock` | `langchain_aws` | Bedrock-hosted Anthropic |
| `bedrock` | `langchain-aws` | `ChatBedrock` | `langchain_aws` | Generic Bedrock models |
| `bedrock_converse` | `langchain-aws` | `ChatBedrockConverse` | `langchain_aws` | Bedrock Converse API |
@@ -144,6 +145,7 @@ The `_BUILTIN_PROVIDERS` dictionary maps provider names to module paths, class n
| `huggingface` | `langchain-huggingface` | `ChatHuggingFace` | `langchain_huggingface` | Uses `from_model_id()` |
| `ibm` | `langchain-ibm` | `ChatWatsonx` | `langchain_ibm` | Uses `model_id=` param |
| `litellm` | `langchain-litellm` | `ChatLiteLLM` | `langchain_litellm` | |
+| `meta` | `langchain-meta` | `ChatMetaModel` | `langchain_meta` | |
| `mistralai` | `langchain-mistralai` | `ChatMistralAI` | `langchain_mistralai` | |
| `nvidia` | `langchain-nvidia-ai-endpoints` | `ChatNVIDIA` | `langchain_nvidia_ai_endpoints` | |
| `ollama` | `langchain-ollama` | `ChatOllama` | `langchain_ollama` | Fallback to `langchain_community` |
@@ -152,6 +154,7 @@ The `_BUILTIN_PROVIDERS` dictionary maps provider names to module paths, class n
| `together` | `langchain-together` | `ChatTogether` | `langchain_together` | |
| `upstage` | `langchain-upstage` | `ChatUpstage` | `langchain_upstage` | |
| `xai` | `langchain-xai` | `ChatXAI` | `langchain_xai` | |
+| `baseten` | `langchain-baseten` | `ChatBaseten` | `langchain_baseten` | |
| `langsmith` | `langchain-openai` | `ChatOpenAI` | `langchain_openai` | Routes via LangSmith gateway |
**Design notes:**
diff --git a/openwiki/openai-provider.md b/openwiki/openai-provider.md
index 16b607ae62..665c57c42c 100644
--- a/openwiki/openai-provider.md
+++ b/openwiki/openai-provider.md
@@ -5,15 +5,17 @@ description: "ChatOpenAI integration for OpenAI's Chat Completions and Responses
tags: ["openai", "chat-models", "tool-calling", "structured-output", "vision", "azure"]
verified:
- by: openwiki/0.5.0
- at: 2026-09-08T08:27:09.597Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-1e66a9da38565f8901e651f4
resource: repo://libs/partners/openai/langchain_openai/__init__.py
+ - id: openwiki-source-f32b395707eda97cd743f4e5
+ resource: repo://libs/partners/openai/langchain_openai/chat_models/azure.py
- id: openwiki-source-738512768ef81ae009b097ac
resource: repo://libs/partners/openai/langchain_openai/chat_models/base.py
- id: openwiki-source-74e5bef080f1af7da12371cf
resource: repo://libs/partners/openai/langchain_openai/data/_profiles.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-08T08:27:09.597Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
---
## Overview
@@ -34,7 +36,7 @@ The OpenAI integration (`langchain-openai`) provides production-ready chat model
**Package**: `repo://libs/partners/openai/langchain_openai/`
-**Main Class**: `repo://libs/partners/openai/langchain_openai/chat_models/base.py#L2823-L2920`
+**Main Class**: `repo://libs/partners/openai/langchain_openai/chat_models/base.py#L2829-L3750`
**Exports**: `repo://libs/partners/openai/langchain_openai/__init__.py`
@@ -175,6 +177,33 @@ model = ChatOpenAI(
response = await model.ainvoke("Hi")
```
+## BaseChatOpenAI and Initialization
+
+`ChatOpenAI` inherits from `BaseChatOpenAI`, which is a base class shared with `AzureChatOpenAI`. On initialization, `BaseChatOpenAI`:
+
+1. **Resolves API authentication** from parameters, environment variables, or callables
+2. **Builds HTTP clients** (sync and async) with optional socket options for connection management
+3. **Registers model profiles** for capability metadata
+4. **Validates parameters** like `stream_chunk_timeout` (negative values fall back to defaults with warnings)
+5. **Initializes OpenAI client instances** (`self.client`, `self.async_client`) using the OpenAI SDK
+
+**Client Initialization Details:**
+
+- **Sync client** (`self.client`): Built from sync `httpx.Client` or created internally. Required for sync `invoke()` and `stream()` methods.
+- **Async client** (`self.async_client`): Built from async `httpx.AsyncClient` or created internally. Required for async `ainvoke()` and `astream()` methods.
+- **Root clients** (`self.root_client`, `self.root_async_client`): Cached OpenAI client instances used for actual API calls.
+
+If an **async callable** is provided for `api_key`, the sync client is not available, and sync methods raise `ValueError`. Use async methods instead:
+
+```python
+async def get_key() -> str:
+ return await fetch_secret()
+
+model = ChatOpenAI(model="gpt-4o", api_key=get_key)
+# await model.ainvoke(...) works
+# model.invoke(...) raises ValueError
+```
+
## Model Profiles and Capabilities
Model profiles are auto-generated metadata that describe model capabilities. They are stored in `repo://libs/partners/openai/langchain_openai/data/_profiles.py` and retrieved via the `ModelProfileRegistry`.
@@ -200,6 +229,67 @@ model = ChatOpenAI(model="gpt-4o")
# Profiles are used internally by LangChain for capability checks
```
+## Responses API
+
+`ChatOpenAI` automatically switches between the Chat Completions API and the Responses API based on the model, parameters, and configuration. The **Responses API** provides enhanced features including:
+
+- **Streaming reasoning** for reasoning models (e.g., o1-preview)
+- **Structured output with tools** alongside reasoning
+- **Context management** (message compaction) via `context_management` parameter
+- **Truncation strategy** control via `truncation` parameter
+- **Reasoning parameters** (effort, summary) via `reasoning` dict
+- **Previous response tracking** via `use_previous_response_id` parameter
+
+**Automatic API Selection**: The Responses API is automatically used when:
+- Model name starts with `gpt-5` (pro variants) or contains `codex`
+- `use_responses_api=True` is explicitly set
+- `reasoning` or `context_management` parameters are provided
+- `truncation` or `include` parameters are set
+- `use_previous_response_id=True` is set
+- Model name starts with `gpt-6` and tools are provided
+
+**Explicit Control:**
+
+```python
+# Force Responses API
+model = ChatOpenAI(model="gpt-4o", use_responses_api=True)
+
+# Force Chat Completions API
+model = ChatOpenAI(model="gpt-4o", use_responses_api=False)
+
+# Auto-detect (default)
+model = ChatOpenAI(model="gpt-4o", use_responses_api=None)
+```
+
+**Responses API with Reasoning:**
+
+```python
+model = ChatOpenAI(
+ model="o1-preview",
+ use_responses_api=True,
+ reasoning={
+ "effort": "high",
+ "summary": "detailed"
+ }
+)
+
+response = model.invoke("Analyze this complex system design")
+# Response includes reasoning content and analysis
+```
+
+**Context Management (Responses API only):**
+
+```python
+model = ChatOpenAI(
+ model="gpt-4o",
+ use_responses_api=True,
+ context_management=[
+ {"type": "auto", "min_tokens": 1000}
+ ]
+)
+# Model will automatically drop older messages to fit context window
+```
+
## Vision Support
Vision is supported on models like `gpt-4-vision`, `gpt-4o`, and `gpt-4-turbo`. Images can be provided as:
@@ -576,7 +666,7 @@ asyncio.run(stream_response())
If a chunk doesn't arrive within the timeout, `StreamChunkTimeoutError` is raised. This is distinct from `httpx` read timeout—it measures silence between *parsed chunks*, not inter-byte silence.
-## Error Handling
+## Error Handling and Retries
`ChatOpenAI` maps OpenAI SDK exceptions to LangChain's standardized error hierarchy:
@@ -585,23 +675,72 @@ If a chunk doesn't arrive within the timeout, `StreamChunkTimeoutError` is raise
| `AuthenticationError` | `ModelAuthenticationError` | Invalid API key |
| `PermissionDeniedError` | `ModelPermissionDeniedError` | API key lacks permissions |
| `BadRequestError` (context_length_exceeded) | `ContextOverflowError` | Input exceeds model's context window |
+| `BadRequestError` (response_format validation) | `ModelInvalidRequestError` | Invalid schema for structured output |
| `RateLimitError` | `ModelRateLimitError` | Rate limit exceeded |
| `NotFoundError` | `ModelNotFoundError` | Model doesn't exist or isn't available |
| `APIError` / `InternalServerError` | `ModelAPIError` | OpenAI server error |
| `APIConnectionError` | `ModelConnectionError` | Network connectivity issue |
| `APITimeoutError` | `ModelTimeoutError` | Request timeout |
-**Example:**
+**Error Handling Example:**
```python
-from langchain_core.exceptions import ContextOverflowError, ModelAuthenticationError
+from langchain_core.exceptions import (
+ ContextOverflowError,
+ ModelAuthenticationError,
+ ModelRateLimitError,
+ ModelTimeoutError,
+)
+
+model = ChatOpenAI(model="gpt-4o")
try:
- response = model.invoke(very_long_message)
+ response = model.invoke(messages)
except ContextOverflowError as e:
print(f"Message too long: {e}")
except ModelAuthenticationError as e:
print(f"Auth failed: {e}")
+except ModelRateLimitError as e:
+ print(f"Rate limited, retry later")
+except ModelTimeoutError as e:
+ print(f"Request timed out")
+```
+
+**Retry Configuration:**
+
+Automatic retries for transient failures are configured via `max_retries` (default: None). The OpenAI SDK automatically retries on certain transient errors (429, 500-599 status codes):
+
+```python
+model = ChatOpenAI(
+ model="gpt-4o",
+ max_retries=3, # Retry up to 3 times on transient failures
+ timeout=30.0 # Request timeout in seconds
+)
+
+# Or with tuple for separate connect/read timeouts
+model = ChatOpenAI(
+ model="gpt-4o",
+ timeout=(10.0, 30.0) # (connect_timeout, read_timeout)
+)
+```
+
+**Stream Chunk Timeout (Async Streaming):**
+
+When async streaming stalls between parsed chunks (not keepalive), a `StreamChunkTimeoutError` is raised:
+
+```python
+from langchain_openai import StreamChunkTimeoutError
+
+model = ChatOpenAI(
+ model="gpt-4o",
+ stream_chunk_timeout=60.0 # Timeout per chunk
+)
+
+try:
+ async for chunk in model.astream("Hello"):
+ print(chunk.content, end="")
+except StreamChunkTimeoutError as e:
+ print(f"Stream stalled: {e}")
```
## Advanced Configuration
@@ -659,9 +798,65 @@ model = ChatOpenAI(
)
```
+## Message Handling and Generation
+
+### Message Conversion
+
+`ChatOpenAI` converts LangChain message types to OpenAI's API format and back:
+
+**Input message types** (converted to OpenAI format):
+- `HumanMessage`: user role
+- `AIMessage`: assistant role (with tool_calls and additional_kwargs)
+- `SystemMessage`: system role (or "developer" if marked with `__openai_role__`)
+- `ToolMessage`: tool role (with tool_call_id)
+- `FunctionMessage`: function role (legacy)
+
+**Output**: `AIMessage` with:
+- `content`: Text response
+- `tool_calls`: List of `ToolCall` objects if model called tools
+- `invalid_tool_calls`: Malformed tool calls that couldn't be parsed
+- `additional_kwargs`: Audio data (if audio output enabled), function_call (legacy), etc.
+- `response_metadata`: token usage, finish reason, system fingerprint, logprobs, etc.
+- `usage_metadata`: Standardized usage counts (input_tokens, output_tokens, total_tokens)
+
+### Generation Flow
+
+1. **Input normalization**: Convert string or message list to `ChatPromptValue`
+2. **Message formatting**: Format content blocks (text, images, tool use markers) per API requirements
+3. **Payload construction**: Build request dict with model, messages, parameters, tools, response_format, etc.
+4. **API selection**: Determine Chat Completions vs Responses API based on model and parameters
+5. **API call**: Invoke OpenAI SDK (sync or async)
+6. **Response parsing**: Extract message content, tool calls, usage, metadata
+7. **Message creation**: Wrap in `AIMessage` with all metadata
+8. **Callback firing**: Invoke LLM callbacks for logging, streaming, etc.
+
+### Content Block Handling
+
+When messages contain multi-modal content (text + images, text + tool references), `ChatOpenAI` formats them per API requirements:
+
+```python
+from langchain_core.messages import HumanMessage
+
+# Multi-modal message
+message = HumanMessage(
+ content=[
+ {"type": "text", "text": "Analyze this chart"},
+ {
+ "type": "image_url",
+ "image_url": {"url": "https://example.com/chart.png", "detail": "high"}
+ }
+ ]
+)
+
+response = model.invoke([message])
+```
+
+For **Chat Completions API**, certain content block types are filtered (e.g., `thinking`, `tool_use`).
+For **Responses API**, content blocks are expanded to support reasoning, computer use, file search, etc.
+
## Azure OpenAI Integration
-`AzureChatOpenAI` is a specialized subclass for Azure OpenAI deployments. It uses different authentication and endpoint configuration than standard `ChatOpenAI`.
+`AzureChatOpenAI` is a specialized subclass for Azure OpenAI deployments. It inherits all `ChatOpenAI` functionality (tool calling, structured output, streaming, vision) but with Azure-specific authentication, endpoint routing, and response metadata handling.
### Azure Setup
@@ -674,6 +869,7 @@ pip install -U langchain-openai
export AZURE_OPENAI_API_KEY="your-api-key"
export AZURE_OPENAI_ENDPOINT="https://your-resource-name.openai.azure.com/"
+export OPENAI_API_VERSION="2024-05-01-preview" # Optional; can be passed to constructor
```
### Basic Usage
@@ -682,50 +878,111 @@ export AZURE_OPENAI_ENDPOINT="https://your-resource-name.openai.azure.com/"
from langchain_openai import AzureChatOpenAI
model = AzureChatOpenAI(
- azure_deployment="your-deployment",
+ azure_deployment="my-deployment",
api_version="2024-05-01-preview",
temperature=0,
max_tokens=None,
)
response = model.invoke("What is 2 + 2?")
+print(response.usage_metadata) # Token counts
```
### Key Azure Parameters
-- **`azure_deployment`** (`str`): Name of Azure OpenAI deployment
-- **`api_version`** (`str`): Azure OpenAI REST API version (distinct from model version). See [versions](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#rest-api-versioning).
-- **`model`** (`str`): Underlying OpenAI model name (for tracing and token counting, does not affect completion)
-- **`model_version`** (`str`): Model version (e.g., `'0125'`, `'0125-preview'`) for token counting
+**Authentication & Endpoint:**
+
+- **`azure_deployment`** (`str`): Name of the Azure OpenAI deployment. Sets the request URL to `/deployments/{azure_deployment}`.
+- **`azure_endpoint`** (`str`): Full Azure endpoint URL (e.g., `https://resource-name.openai.azure.com/`). Auto-inferred from `AZURE_OPENAI_ENDPOINT` env var.
+- **`api_key`** (`str | Callable`): Azure API key. Auto-inferred from `AZURE_OPENAI_API_KEY` env var.
+- **`azure_ad_token`** (`str`): Azure Active Directory token (alternative to API key).
+- **`api_version`** (`str`): Azure OpenAI REST API version (distinct from model version). Examples: `"2024-05-01-preview"`, `"2024-02-15-preview"`. See [API versions](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#rest-api-versioning).
+
+**Model Configuration (for tracing & token counting only):**
+
+- **`model`** (`str`): Underlying OpenAI model name (e.g., `"gpt-4o"`, `"gpt-35-turbo"`). Does **not** affect completion; uses `azure_deployment` instead.
+- **`model_version`** (`str`): Model version (e.g., `'0125'`, `'0125-preview'`) for token counting.
+
+**Other Parameters:**
+
+All standard `ChatOpenAI` parameters are supported: `temperature`, `max_tokens`, `top_p`, `frequency_penalty`, `presence_penalty`, `timeout`, `max_retries`, `streaming`, `logprobs`, etc.
### Azure Response Example
+Azure includes additional metadata in responses:
+
```python
-# response includes Azure-specific metadata
+model = AzureChatOpenAI(azure_deployment="my-deployment", api_version="2024-05-01-preview")
response = model.invoke("Translate to French: Hello")
-# response includes:
-# - usage_metadata: token counts
-# - response_metadata with:
-# - prompt_filter_results: content safety filtering info
-# - finish_reason
-# - logprobs (if requested)
-# - content_filter_results: safety filtering details
+print(response.usage_metadata)
+# {'input_tokens': 28, 'output_tokens': 6, 'total_tokens': 34}
+
+print(response.response_metadata)
+# {
+# 'token_usage': {
+# 'completion_tokens': 6, 'prompt_tokens': 28, 'total_tokens': 34
+# },
+# 'model_name': 'gpt-4o',
+# 'system_fingerprint': 'fp_...',
+# 'prompt_filter_results': [...], # Content safety filtering
+# 'content_filter_results': {...}, # Safety categorization
+# 'finish_reason': 'stop',
+# }
+```
+
+**Content Safety Filtering**: Azure includes `prompt_filter_results` and `content_filter_results` in `response_metadata`, detailing filtering for hate speech, self-harm, sexual content, and violence.
+
+### Azure Tool Calling
+
+Tool calling with `AzureChatOpenAI` works identically to `ChatOpenAI`:
+
+```python
+from pydantic import BaseModel, Field
+
+class GetWeather(BaseModel):
+ '''Get current weather'''
+ location: str = Field(description="City and state, e.g. Boston, MA")
+
+model = AzureChatOpenAI(azure_deployment="my-deployment", api_version="2024-05-01-preview")
+model_with_tools = model.bind_tools([GetWeather])
+response = model_with_tools.invoke("What's the weather in Boston?")
+print(response.tool_calls)
```
### Azure Streaming
+Streaming with `AzureChatOpenAI` includes all standard features (callbacks, chunk timeouts, token usage in chunks):
+
```python
model = AzureChatOpenAI(
- azure_deployment="your-deployment",
+ azure_deployment="my-deployment",
api_version="2024-05-01-preview",
- streaming=True
+ streaming=True,
+ stream_chunk_timeout=60.0
)
for chunk in model.stream("Translate to French: Hello"):
print(chunk.content, end="")
```
+### Azure Structured Output
+
+All `with_structured_output()` methods are supported:
+
+```python
+from pydantic import BaseModel
+
+class Translation(BaseModel):
+ french: str
+ confidence: float
+
+model = AzureChatOpenAI(azure_deployment="my-deployment", api_version="2024-05-01-preview")
+structured = model.with_structured_output(Translation, method="json_schema")
+result = structured.invoke("Translate to French: Hello world")
+print(result.french)
+```
+
## Model Name Examples
**Current recommended models:**
@@ -739,16 +996,39 @@ Check [OpenAI models page](https://platform.openai.com/docs/models) for current
## Testing
-Unit tests are located in `repo://libs/partners/openai/tests/unit_tests/chat_models/`.
+Unit and integration tests are located in `repo://libs/partners/openai/tests/`.
-Key test files:
-- `repo://libs/partners/openai/tests/unit_tests/chat_models/test_base.py`: Main ChatOpenAI tests
-- `repo://libs/partners/openai/tests/unit_tests/chat_models/test_client_utils.py`: Client utilities
+### Unit Tests
+
+Key unit test files:
+- `repo://libs/partners/openai/tests/unit_tests/chat_models/test_base.py`: Main ChatOpenAI tests including:
+ - API initialization and parameter validation
+ - Message conversion and content block handling
+ - Error handling and exception mapping
+ - Tool calling and structured output methods
+ - Streaming with callbacks
+- `repo://libs/partners/openai/tests/unit_tests/chat_models/test_base_standard.py`: Standard test suite for ChatOpenAI (Chat Completions API)
+- `repo://libs/partners/openai/tests/unit_tests/chat_models/test_responses_standard.py`: Standard test suite for Responses API
- `repo://libs/partners/openai/tests/unit_tests/chat_models/test_azure.py`: Azure-specific tests
+- `repo://libs/partners/openai/tests/unit_tests/chat_models/test_client_utils.py`: Client utilities (socket options, proxies, HTTP clients)
-**Test structured output:**
+### Integration Tests
+
+Integration tests with real API calls are in `repo://libs/partners/openai/tests/integration_tests/chat_models/`.
+
+### Standard Test Suite
+
+Both `ChatOpenAI` (Chat Completions) and Responses API inherit standard test suites from `langchain-tests` to validate:
+- Basic invoke and streaming
+- Tool calling semantics
+- Structured output conformance
+- Callback integration
+- Token counting accuracy
+
+**Example unit test:**
```python
+import pytest
from langchain_openai import ChatOpenAI
from pydantic import BaseModel
@@ -756,12 +1036,117 @@ class TestSchema(BaseModel):
name: str
value: int
-def test_with_structured_output():
+@pytest.mark.asyncio
+async def test_structured_output_function_calling():
model = ChatOpenAI(model="gpt-4o")
structured = model.with_structured_output(TestSchema, method="function_calling")
- # Invoke and verify output is TestSchema instance
+ result = await structured.ainvoke("Return {name: 'test', value: 42}")
+ assert isinstance(result, TestSchema)
+ assert result.name == "test"
+ assert result.value == 42
+
+@pytest.mark.asyncio
+async def test_streaming_with_callback():
+ from langchain_core.callbacks import StreamingStdOutCallbackHandler
+
+ model = ChatOpenAI(model="gpt-4o", streaming=True)
+ chunks = []
+ async for chunk in model.astream("Hello", config={"callbacks": []}):
+ chunks.append(chunk)
+ assert len(chunks) > 0
```
+## Extension and Customization
+
+### Subclassing BaseChatOpenAI
+
+Advanced use cases can subclass `BaseChatOpenAI` to customize behavior:
+
+```python
+from langchain_openai.chat_models.base import BaseChatOpenAI
+from langchain_core.outputs import ChatResult
+
+class CustomChatOpenAI(BaseChatOpenAI):
+ """Custom OpenAI wrapper with additional logging."""
+
+ custom_param: str = "default"
+
+ def _generate(self, messages, stop=None, run_manager=None, **kwargs):
+ # Custom pre-processing
+ print(f"Custom param: {self.custom_param}")
+
+ # Call parent
+ result = super()._generate(messages, stop=stop, run_manager=run_manager, **kwargs)
+
+ # Custom post-processing
+ result.llm_output["custom_field"] = "custom_value"
+
+ return result
+
+# Use custom class
+model = CustomChatOpenAI(model="gpt-4o", custom_param="my_value")
+response = model.invoke("Hello")
+```
+
+### Middleware and Hooks
+
+Custom middleware can be added via `RunnablePassthrough`, `RunnableLambda`, or decorator patterns:
+
+```python
+from langchain_core.runnables import RunnablePassthrough, RunnableLambda
+
+def log_input(input_val):
+ print(f"User input: {input_val}")
+ return input_val
+
+def log_output(output):
+ print(f"Model output: {output.content}")
+ return output
+
+model = ChatOpenAI(model="gpt-4o")
+chain = (
+ RunnableLambda(log_input)
+ | model
+ | RunnableLambda(log_output)
+)
+
+response = chain.invoke("What is 2+2?")
+```
+
+### Custom Client Configuration
+
+For advanced network control, provide fully configured httpx clients:
+
+```python
+import httpx
+from langchain_openai import ChatOpenAI
+
+http_client = httpx.Client(
+ timeout=httpx.Timeout(30.0),
+ limits=httpx.Limits(max_connections=5, max_keepalive_connections=2),
+ verify=certifi.where(),
+)
+
+http_async_client = httpx.AsyncClient(
+ timeout=httpx.Timeout(30.0),
+ limits=httpx.Limits(max_connections=5, max_keepalive_connections=2),
+)
+
+model = ChatOpenAI(
+ model="gpt-4o",
+ http_client=http_client,
+ http_async_client=http_async_client,
+)
+```
+
+## Known Limitations and Considerations
+
+1. **Sync callable API keys**: If `api_key` is a sync callable, async methods still work, but they resolve the key in an executor thread.
+2. **Provider-specific fields**: Non-OpenAI fields in responses (e.g., from vLLM, DeepSeek) are not preserved. Use provider-specific packages instead.
+3. **Responses API limitations**: Not all Chat Completions parameters are supported in Responses API (e.g., `n` is not supported).
+4. **Structured output schema validation**: The `json_schema` method requires schemas to meet OpenAI's supported-schemas constraints.
+5. **Azure API version coupling**: Azure requires explicit `api_version` and ties it to feature availability (e.g., structured output only in newer versions).
+
## Related Pages
- `/openwiki/model-initialization.md`: Factory function `init_chat_model()` for provider-agnostic model selection
diff --git a/openwiki/partner-pattern.md b/openwiki/partner-pattern.md
index 6c7415ae9f..2fbdbfea25 100644
--- a/openwiki/partner-pattern.md
+++ b/openwiki/partner-pattern.md
@@ -3,9 +3,6 @@ type: Integration Pattern
title: Adding a New Chat Model Provider
description: Step-by-step guide to integrate a new LLM provider into LangChain's monorepo, including package structure, ChatModel implementation, streaming, function calling, structured output, and standard tests. Covers message conversion, error handling, model profiles, and optional advanced API modes like Responses API.
tags: [chat-models, provider-integration, llm, function-calling, structured-output, streaming]
-verified:
- - by: openwiki/0.5.0
- at: 2026-09-09T08:26:28.144Z
sources:
- id: openwiki-source-c52037e7b642f7ac5a7642a8
resource: repo://libs/core/langchain_core/language_models/chat_models.py
@@ -21,6 +18,8 @@ sources:
resource: repo://libs/partners/anthropic/langchain_anthropic/data/_profiles.py
- id: openwiki-source-d14c2b8060843a8a89b74733
resource: repo://libs/partners/anthropic/langchain_anthropic/data/profile_augmentations.toml
+ - id: openwiki-source-04e3ac4f56ff2adb2b02de7d
+ resource: repo://libs/partners/anthropic/pyproject.toml
- id: openwiki-source-8641a971af4f11b852966d77
resource: repo://libs/partners/openai/langchain_openai/chat_models/__init__.py
- id: openwiki-source-3bc725a9a39d534be6f46d18
@@ -37,7 +36,10 @@ sources:
resource: repo://libs/partners/openai/tests/unit_tests/chat_models/test_responses_standard.py
- id: openwiki-source-025cad4ae99967890152b7e0
resource: repo://libs/standard-tests/README.md
-generated: { by: "openwiki/0.5.0", at: "2026-09-09T08:26:28.144Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
+verified:
+ - by: openwiki/0.5.0
+ at: 2026-09-21T08:30:16.745Z
---
## Overview
@@ -106,7 +108,7 @@ requires-python = ">=3.10.0,<4.0.0"
version = "0.1.0"
dependencies = [
- "langchain-core>=1.6.0,<2.0.0", # Required: base LangChain
+ "langchain-core>=1.6.2,<2.0.0", # Required: base LangChain
"provider-client-library>=2.45.0,<4.0.0", # Provider's own SDK (pinned version)
"certifi>=2024.6.2", # SSL certificates
]
diff --git a/openwiki/prompts.md b/openwiki/prompts.md
index d3e917a02e..46175b5655 100644
--- a/openwiki/prompts.md
+++ b/openwiki/prompts.md
@@ -5,7 +5,7 @@ description: "Prompt templates define message sequences and variable substitutio
tags: [prompt, template, few-shot, example-selection, variable-substitution, structured-output]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-1f4e0a5b877db4f050f2a34c
resource: repo://libs/core/langchain_core/example_selectors/base.py
diff --git a/openwiki/quickstart.md b/openwiki/quickstart.md
index 9cae8bd42d..1787d4a9ba 100644
--- a/openwiki/quickstart.md
+++ b/openwiki/quickstart.md
@@ -40,10 +40,10 @@ sources:
resource: repo://libs/partners/openai/langchain_openai/__init__.py
- id: openwiki-source-48ce5ee900993294d349b4e8
resource: repo://libs/standard-tests/langchain_tests/__init__.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-09T08:26:28.144Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
verified:
- by: openwiki/0.5.0
- at: 2026-09-09T08:26:28.144Z
+ at: 2026-09-21T08:30:16.745Z
---
## Welcome to LangChain Development
@@ -52,6 +52,8 @@ LangChain is the agent engineering platform—a framework for building LLM-power
**New to the repo?** Start with [Installation & Setup](#installation--setup), then jump to [Quick Navigation](#quick-navigation-to-major-areas) to find what you need to work on.
+**Want a complete tour?** See [Architecture Overview](/openwiki/architecture.md) for system design, [Dev Commands](/openwiki/dev-commands.md) for detailed CLI reference, and [Source Map](/openwiki/source-map.md) to locate code by topic.
+
## Monorepo Overview
LangChain is organized as a **three-layer architecture** in `/libs/`:
@@ -104,12 +106,15 @@ brew install uv
Then sync all dependencies in your package:
```bash
-# From any libs/ subdirectory, install all groups (test, lint, type, dev)
+# From any libs/ subdirectory, install all groups (test, lint, type, typing, dev)
uv sync --all-groups
# Or install only what you need
-uv sync --group test # For running tests
-uv sync --group lint # For ruff/mypy
+uv sync --group test # For running tests
+uv sync --group test_integration # For integration tests with VCR cassettes
+uv sync --group lint # For ruff formatting
+uv sync --group typing # For mypy type checking
+uv sync --group dev # For dev tools (Jupyter, setuptools, etc.)
```
### Pre-Commit Hooks
@@ -173,9 +178,26 @@ make format_diff
```
**Tools used:**
-- **ruff**: Fast Python linter and formatter (replaces black, isort, flake8)
-- **mypy**: Static type checker
-- Both are run via `uv run --group lint`
+- **ruff**: Fast Python linter and formatter (replaces black, isort, flake8). Run via `uv run --group lint`
+- **mypy**: Static type checker. Run via `uv run --group typing`
+- Both are integrated into pre-commit hooks and make targets
+
+### Run Integration Tests
+
+Integration tests call real model APIs with recorded responses (VCR cassettes):
+
+```bash
+# From any package directory
+make integration_tests
+
+# Run a specific integration test
+make integration_tests TEST_FILE=tests/integration_tests/test_specific.py
+
+# Record new cassettes (requires API credentials in .env)
+make integration_tests RECORD=true
+```
+
+See [Integration Testing](/openwiki/integration-tests.md) for detailed cassette management.
### Full Local Validation
@@ -192,6 +214,12 @@ Or in one line:
cd libs/core && make format lint test
```
+For integration tests as well:
+
+```bash
+cd libs/langchain_v1 && make format lint test integration_tests
+```
+
## Quick Navigation to Major Areas
Use the table below to route to detailed documentation:
diff --git a/openwiki/runnables.md b/openwiki/runnables.md
index 9ed3d2687e..2c40cbd701 100644
--- a/openwiki/runnables.md
+++ b/openwiki/runnables.md
@@ -5,7 +5,7 @@ description: "Explain the Runnable protocol and how it enables composable chaini
tags: [runnable, lcel, composition, invoke, stream, batch, async, chaining]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-a1981e868973f6fd7f71e12e
resource: repo://libs/core/langchain_core/runnables/base.py
diff --git a/openwiki/source-map.md b/openwiki/source-map.md
index f2e1d813a5..6786f3ad4d 100644
--- a/openwiki/source-map.md
+++ b/openwiki/source-map.md
@@ -44,10 +44,10 @@ sources:
resource: repo://libs/partners/openai/langchain_openai/chat_models/base.py
- id: openwiki-source-bd29e79613d5f366a00068f5
resource: repo://libs/standard-tests/langchain_tests/base.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-08T08:27:09.597Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
verified:
- by: openwiki/0.5.0
- at: 2026-09-08T08:27:09.597Z
+ at: 2026-09-21T08:30:16.745Z
---
## Overview
@@ -89,7 +89,7 @@ This page provides a quick reference for locating code by topic in the LangChain
```
/libs/
-├── core/ # langchain-core: Base abstractions (v1.6.2)
+├── core/ # langchain-core: Base abstractions (v1.6.3)
│ ├── langchain_core/
│ │ ├── language_models/ # BaseChatModel and language model abstractions
│ │ ├── messages/ # Message types and content blocks
@@ -106,7 +106,7 @@ This page provides a quick reference for locating code by topic in the LangChain
│ ├── Makefile
│ └── pyproject.toml
│
-├── langchain_v1/ # langchain: Orchestration and agents (v1.4.0)
+├── langchain_v1/ # langchain: Orchestration and agents (v1.4.2)
│ ├── langchain/
│ │ ├── agents/
│ │ │ ├── factory.py # Agent factory and graph construction
@@ -266,8 +266,8 @@ The `BaseTool` in `repo://libs/core/langchain_core/tools/base.py` provides:
```
User Applications
- ├─→ langchain (v1.4.0)
- │ ├─→ langchain-core (v1.6.2)
+ ├─→ langchain (v1.4.2)
+ │ ├─→ langchain-core (v1.6.3)
│ └─→ LangGraph (state machines)
│
├─→ langchain-core (direct use)
diff --git a/openwiki/streaming.md b/openwiki/streaming.md
index 0c09a7dfb3..ba4ce18fd9 100644
--- a/openwiki/streaming.md
+++ b/openwiki/streaming.md
@@ -5,7 +5,7 @@ description: "How streaming works across LLM components and chains, token-by-tok
tags: [streaming, token-streaming, llm-output, chat-models, callbacks, astream, real-time-feedback]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-c9313cf42f0120d86b20245f
resource: repo://libs/core/langchain_core/callbacks/base.py
@@ -19,7 +19,7 @@ sources:
resource: repo://libs/core/langchain_core/messages/ai.py
- id: openwiki-source-a1981e868973f6fd7f71e12e
resource: repo://libs/core/langchain_core/runnables/base.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
---
## Overview
@@ -38,31 +38,36 @@ Streaming flows through chains—prompts, models, output parsers, and other runn
### Control Flow
-1. **Check if streaming is implemented**: `_should_stream()` determines whether the model supports streaming. If not, `stream()` falls back to `invoke()` and yields one complete result.
+1. **Check if streaming is implemented**: `_should_stream()` determines whether the model supports streaming. It checks:
+ - Whether `_stream()` is implemented on the model (not inherited from base)
+ - Whether streaming is explicitly disabled via `disable_streaming`, `stream=False`, or `streaming=False` on the model
+ - Whether an explicit `stream=True` kwarg is passed
+ - Whether a streaming callback handler is attached to the model
+
+ If streaming is not supported, `stream()` falls back to `invoke()` and yields one complete result cast to `AIMessageChunk`.
-2. **Initialize callbacks**: A `CallbackManager` is configured from the provided `RunnableConfig`, binding callbacks, tags, and metadata.
+2. **Initialize callbacks**: A `CallbackManager` is configured from the provided `RunnableConfig`, binding callbacks, tags, and metadata for tracing and observability.
-3. **Fire on_chat_model_start**: The callback lifecycle begins with `on_chat_model_start`, signaling that LLM invocation is beginning.
+3. **Fire on_chat_model_start**: The callback lifecycle begins with `on_chat_model_start`, signaling that LLM invocation is beginning. This event is fired before the first token is yielded.
-4. **Iterate model chunks**: For each `ChatGenerationChunk` from the underlying `_stream()` implementation:
- - The chunk's message ID is set to a unique run ID if not already present.
- - Response metadata (model provider, latency, etc.) is computed and attached.
+4. **Acquire rate limit**: If a rate limiter is attached to the model, `stream()` acquires a permit before beginning, blocking until the rate limit allows.
+
+5. **Iterate model chunks**: For each `ChatGenerationChunk` from the underlying `_stream()` implementation:
+ - The chunk's message ID is set to a unique run ID (prefixed with `LC_ID_PREFIX`) if not already present, ensuring traceability.
+ - Response metadata (model provider, latency, token usage, etc.) is computed and attached via `_gen_info_and_msg_metadata()`.
+ - If the model's output version is "v1" (content-block structured format), content is transformed to content blocks and indexed.
- **on_llm_new_token is fired** with the chunk's content and the full chunk object, allowing callbacks to observe or buffer each token.
- - The chunk message is cast to `AIMessageChunk` and yielded immediately.
- - Chunks are accumulated for later aggregation.
+ - The chunk message is cast to `AIMessageChunk` and yielded immediately to the caller.
+ - Chunks are accumulated in memory for later aggregation.
-5. **Yield final "last" chunk**: After the model finishes, if output_version is v1 (content-block format), an empty chunk with `chunk_position="last"` is yielded. This signals to parsers and consumers that the stream is complete and that tool_call_chunks should be finalized.
+6. **Yield final "last" chunk**: After the model finishes, if no explicit `chunk_position="last"` was set, an empty chunk with `chunk_position="last"` is yielded. This signals to parsers and consumers that the stream is complete and that `tool_call_chunks` should be finalized into complete `tool_calls`.
-6. **Callback lifecycle closes**: If successful, `on_llm_end` fires with a merged `ChatGeneration` containing all chunks. If an exception occurs, `on_llm_error` fires with partial accumulation.
+7. **Callback lifecycle closes**: If successful, `on_llm_end` fires with a merged `ChatGeneration` containing all chunks. If an exception occurs, `on_llm_error` fires with partial accumulation, allowing callbacks to observe failures before the exception is re-raised.
### Fallback Behavior
If the model does not implement streaming (checked via `_should_stream(async_api=False)`), `stream()` delegates to `invoke()` and yields a single result cast to `AIMessageChunk`. This ensures all models provide a consistent streaming interface, even if only non-streaming invoke is available.
-### Rate Limiting
-
-If a rate limiter is attached to the model, `stream()` acquires a permit before beginning, blocking until the rate limit allows.
-
## Asynchronous Streaming: astream()
**Location**: `repo://libs/core/langchain_core/language_models/chat_models.py#L858-L991`
@@ -74,7 +79,23 @@ If a rate limiter is attached to the model, `stream()` acquires a permit before
- Iterates via `async for chunk in self._astream(...)`
- Acquires rate limit via `await self.rate_limiter.aacquire(blocking=True)`
-The async streaming protocol is identical to sync: yield chunks immediately, fire callbacks per token, finalize tool call chunks on the "last" signal.
+The async streaming protocol is identical to sync: check `_should_stream(async_api=True)`, initialize callbacks, yield chunks immediately as they arrive, fire callbacks per token, finalize tool call chunks on the "last" signal.
+
+### Async/Await Patterns
+
+Applications using `astream()` should consume the async iterator in a loop:
+
+```python
+async for chunk in model.astream(messages):
+ # Process chunk immediately
+ print(chunk.content, end="", flush=True)
+
+# OR collect chunks for later processing
+chunks = []
+async for chunk in model.astream(messages):
+ chunks.append(chunk)
+final_message = sum(chunks) # Merge via + operator
+```
## AIMessageChunk: Incremental Content
@@ -84,14 +105,38 @@ The async streaming protocol is identical to sync: yield chunks immediately, fir
### Structure
-- **content**: String or list of content blocks. During streaming, each chunk contains only the new token(s) or delta for that step.
-- **tool_call_chunks**: List of `ToolCallChunk` objects (incomplete tool calls being streamed). These are progressively updated as arguments arrive.
-- **chunk_position**: Optional sentinel; when set to `"last"`, indicates the final chunk in the stream, triggering finalization of tool calls and reasoning blocks.
-- **response_metadata**: Model-specific metadata (latency, model_provider, usage counters, etc.) attached by the streaming handler.
+- **content**: String or list of content blocks (when `output_version="v1"`). During streaming, each chunk contains only the new token(s) or delta for that step. Content accumulates across chunks: text chunks concatenate, JSON chunks may append partial objects or arrays.
+- **tool_call_chunks**: List of `ToolCallChunk` objects (incomplete tool calls being streamed). These are progressively updated as the model produces call ID, function name, and argument JSON. Arguments are accumulated and parsed incrementally via `parse_partial_json()`.
+- **chunk_position**: Optional sentinel; when set to `"last"`, indicates the final chunk in the stream, triggering finalization of tool calls and reasoning blocks. When this chunk is aggregated, `tool_call_chunks` are parsed into complete `tool_calls` and `invalid_tool_calls` via the `init_tool_calls()` validator.
+- **response_metadata**: Model-specific metadata (latency, model_provider, usage counters, finish reason, etc.) attached by the streaming handler. Metadata is merged across chunks, with usage counts summed.
### Merging and Aggregation
-Streaming chunks accumulate via the `+` operator, which merges content, concatenates tool_call arguments, and combines metadata. A complete `AIMessage` with finalized `tool_calls` (not chunks) is reconstructed when chunks are merged or when the "last" signal is received.
+Streaming chunks accumulate via the `+` operator (implemented in `add_ai_message_chunks()`), which:
+
+1. **Merges content**: Text content is concatenated; structured content blocks are merged according to block type.
+2. **Concatenates tool_call arguments**: Arguments from tool_call_chunks are appended progressively, enabling incremental JSON parsing.
+3. **Combines metadata**: Response metadata and usage counts are merged; for duplicated keys, later values override (except usage, which is summed).
+4. **Preserves chunk_position**: If any chunk in the merge has `chunk_position="last"`, the result marks position as "last", triggering tool call finalization.
+5. **Selects best ID**: The chunk ID is chosen by rank: provider-assigned (non-`LC_*` prefixed) > `LC_run_*` > `lc_*` auto IDs.
+
+A complete `AIMessage` with finalized `tool_calls` (not chunks) is reconstructed when chunks are merged or when the "last" signal is received:
+
+```python
+# Accumulate chunks
+chunks = []
+async for chunk in model.astream(messages):
+ chunks.append(chunk)
+
+# Merge all chunks into one message
+final_message = chunks[0]
+for chunk in chunks[1:]:
+ final_message = final_message + chunk
+
+# tool_calls are now complete ToolCall objects, not ToolCallChunk
+for tool_call in final_message.tool_calls:
+ print(tool_call["name"], tool_call["args"])
+```
## Callback Integration: on_llm_new_token
@@ -114,9 +159,11 @@ def on_llm_new_token(
) -> Any:
```
-- **token**: The string token or list of content blocks (when output_version="v1").
-- **chunk**: The full `ChatGenerationChunk` carrying metadata, message ID, response metadata, and tool_call_chunks.
-- **run_id**: Unique identifier for this streaming run, used for tracing and correlation.
+- **token**: The string token or list of content blocks (when output_version="v1"). For text streaming, this is a single word or subword; for structured output, this is a list of content block dicts with `type`, `text`, `reasoning`, `tool_call_chunk`, etc.
+- **chunk**: The full `ChatGenerationChunk` carrying metadata, message ID, response metadata, and tool_call_chunks. This allows callbacks to inspect the complete chunk structure, not just the token.
+- **run_id**: Unique identifier for this streaming run, used for tracing and correlation with parent operations.
+- **parent_run_id**: ID of the parent run (chain or agent) that invoked this model.
+- **tags**: Inheritable tags from the calling context, useful for filtering or routing callbacks.
### Example: Stream to stdout
@@ -133,7 +180,20 @@ for chunk in model.stream(
pass # callback prints each token to stdout
```
-The `StreamingStdOutCallbackHandler` implements `on_llm_new_token` to write tokens to `sys.stdout`, making streaming output visible in real-time.
+The `StreamingStdOutCallbackHandler` implements `on_llm_new_token` to write tokens to `sys.stdout` immediately, making streaming output visible in real-time without buffering.
+
+### Custom Streaming Callbacks
+
+Create custom callbacks by subclassing `BaseCallbackHandler`:
+
+```python
+from langchain_core.callbacks import BaseCallbackHandler
+
+class MyStreamingCallback(BaseCallbackHandler):
+ def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
+ # Send token to WebSocket, log to database, etc.
+ websocket.send_json({"token": token})
+```
## Streaming Through Chains
@@ -143,18 +203,21 @@ Streaming flows through chains composed of runnables (prompts, models, parsers).
**Location**: `repo://libs/core/langchain_core/runnables/base.py#L1194-L1235`
-By default, `Runnable.stream()` yields one full output from `invoke()`. Subclasses that support streaming override `stream()` or `transform()` to yield chunks.
+By default, `Runnable.stream()` yields one full output from `invoke()`. Subclasses that support streaming override `stream()` or `transform()` to yield chunks. The `transform()` method is the core streaming interface: it accepts an iterator of inputs and yields an iterator of outputs, enabling stateful transformations.
### Streaming through RunnableSequence
**Location**: `repo://libs/core/langchain_core/runnables/base.py#L3075-L3320`
`RunnableSequence` (a chain created with the `|` operator) automatically supports streaming if:
-1. **All upstream components implement transform**: The `transform()` method maps streaming input to streaming output.
+
+1. **All upstream components implement transform**: The `transform()` method maps streaming input to streaming output, enabling end-to-end streaming without buffering.
2. **The last component produces chunks**: Output parsers and models implement `transform()` to yield partial results.
If any component does not implement `transform()`, streaming begins only after that component completes (blocking point). Multiple blocking components create multiple buffering points, but the final output still streams from the last component if it supports streaming.
+**Important**: `RunnableLambda` does not implement `transform()` by default, so it acts as a blocking component. For custom logic with streaming, subclass `Runnable` and override `transform()`.
+
### Streaming Example: Model → Parser
```python
@@ -170,177 +233,133 @@ for chunk in chain.stream("What is 2+2?"):
print(chunk, end="", flush=True)
```
-When `model.stream()` yields chunks, the parser's `transform()` (or default `stream()`) consumes each chunk and yields its transformation. Text parsers may yield tokens directly; JSON parsers yield partial JSON objects as they become parseable.
+When `model.stream()` yields chunks, the parser's `transform()` (inherited from `BaseTransformOutputParser`) consumes each chunk and yields its transformation. Text parsers (like `StrOutputParser`) extract text from `AIMessageChunk` and yield strings directly; JSON parsers yield partial JSON objects as they become parseable via `parse_partial_json()`.
+
+### Streaming Mechanics: _transform_stream_with_config
+
+**Location**: `repo://libs/core/langchain_core/runnables/base.py#L2502-L2599`
+
+The `_transform_stream_with_config()` helper manages streaming with callbacks. It:
+
+1. **Tees the input iterator** so the first element can be inspected for tracing without consuming it.
+2. **Fires on_chain_start** before the transformer begins, signaling the start of a streaming chain operation.
+3. **Invokes the transformer function** with the remaining input iterator and child callbacks.
+4. **Yields chunks immediately** as the transformer produces them, enabling responsive streaming.
+5. **Accumulates outputs** for the on_chain_end callback, optionally merging chunks via `+` if supported.
+6. **Fires on_chain_end or on_chain_error** at completion, providing final merged output or exception context.
+
+This mechanism ensures streaming callbacks fire for each chunk and that parent run managers know when a chain's streaming is complete.
## Streaming via stream_events: ChatModelStream
**Location**: `repo://libs/core/langchain_core/language_models/chat_model_stream.py`
-For advanced use cases requiring detailed event granularity, `BaseChatModel.stream_events(version="v3")` returns a `ChatModelStream` object that exposes **typed projection properties** (`.text`, `.tool_calls`, `.usage`, `.reasoning`, `.output`) which accumulate events as they arrive.
+For advanced use cases requiring detailed event granularity, `BaseChatModel.stream_events(version="v3")` returns a `ChatModelStream` object that exposes **typed projection properties** (`.text`, `.tool_calls`, `.usage`, `.reasoning`, `.output`) which accumulate protocol events as they arrive.
-This is distinct from simple token streaming and is useful for applications needing structured, event-by-event visibility into reasoning, tool calls, and other protocol events. The `ChatModelStream` also fires `on_stream_event` callbacks for each protocol event, not just tokens.
+### Structured Event Streaming
+
+Unlike token streaming (`stream()`), which yields tokens, `stream_events()` yields **protocol events**—structured objects representing model state changes:
+
+- **text-delta**: Incremental text generation
+- **reasoning-delta**: Incremental reasoning/thinking content (when supported)
+- **tool_call_chunk**: Partial tool call with accumulated arguments
+- **usage**: Token usage update (input, output, cached, etc.)
+
+### Pull-Based Backpressure
+
+The `ChatModelStream` and its projections (`.text`, `.tool_calls`, etc.) implement **pull-based backpressure** via the `SyncProjection` and `AsyncProjection` classes. When a consumer reads from a projection and catches up to the buffer:
+
+1. The projection calls `_request_more()` to pull additional events from the producer (the model/graph).
+2. The producer resumes and generates the next batch of events.
+3. The projection buffers events and yields them to the consumer.
+
+This backpressure mechanism prevents unbounded memory growth: the producer only generates events as the consumer requests them. Unlike callback-driven streaming (which delivers all tokens as fast as the model produces them), pull-based streaming allows the consumer to set the pace.
+
+**Example: Consuming with backpressure**
+
+```python
+# Pull events on demand; producer waits if no consumer is pulling
+for event in model.stream_events(messages, version="v3"):
+ if should_stop_early():
+ break # Producer stops; no buffered events accumulate
+ process_event(event)
+
+# Or consume a specific projection with type safety
+stream = model.stream_events(messages, version="v3")
+for text_delta in stream.text: # Only text events
+ print(text_delta)
+```
## Memory and Latency Trade-offs: stream() vs invoke()
### invoke()
-- **Latency**: Waits for the entire model response before returning.
-- **Memory**: No intermediate storage required; only the final message is held.
-- **Responsiveness**: Blocks the calling thread/coroutine until complete.
-- **Use case**: Batch processing, when a complete response is needed upfront.
+- **Latency**: Waits for the entire model response before returning. Introduces latency equal to the full model generation time.
+- **Memory**: No intermediate storage required; only the final message is held in memory.
+- **Responsiveness**: Blocks the calling thread/coroutine until complete. Users see no output until the response is fully generated.
+- **Use case**: Batch processing, when a complete response is needed upfront before proceeding to the next step.
### stream()
-- **Latency**: Yields the first token as soon as available; responsive to user.
-- **Memory**: Requires buffering of accumulated chunks if the caller collects them.
-- **Responsiveness**: Non-blocking; enables progressive display.
+- **Latency**: Yields the first token as soon as available; responsive to user. Time to first token (TTFT) is minimized.
+- **Memory**: Requires buffering of accumulated chunks if the caller collects them. However, because chunks are yielded immediately, the caller can process and discard each chunk without holding the entire response.
+- **Responsiveness**: Non-blocking; enables progressive display. Users see output appearing in real-time.
- **Use case**: Web UIs, console applications, user-facing interactions where real-time feedback improves UX.
+### Streaming Does Not Add Latency
+
In practice, streaming does not add significant latency compared to invoke; the model produces tokens at the same rate. The difference is **when tokens are delivered to the caller**. Stream delivery is preferable for interactive applications because users see output appearing in real-time rather than a blank screen until the full response is ready.
-## Integration Patterns
+### Backpressure and Memory Implications
-### Real-time Console Output
+When streaming with `stream()`:
-```python
-from langchain_core.callbacks import StreamingStdOutCallbackHandler
+- **Callback-driven delivery**: Tokens are yielded as fast as the model produces them. If the caller is slow to consume, tokens accumulate in the accumulator list within `stream()` until the loop ends or yields.
+- **No unbounded growth**: The chunk accumulator is only used for the final `on_llm_end` callback; chunks are yielded immediately before accumulating. Thus, memory overhead is proportional to the response size, not model speed.
+- **Consumer pacing**: Slow consumers (e.g., writing to disk) do not create backpressure; they simply process tokens as yielded.
-callback = StreamingStdOutCallbackHandler()
-for _ in model.stream(
- messages,
- config=RunnableConfig(callbacks=[callback])
-):
- pass # Tokens are printed as they arrive
-```
+When streaming with `stream_events()` (v3):
-### Accumulate Streamed Output
+- **Pull-based backpressure**: The producer (model/graph) only generates events as the consumer requests them via the projection iterator. This naturally paces the producer to the consumer.
+- **Bounded buffering**: The projection buffers events only until the consumer reads them. A slow consumer will naturally slow the producer, preventing unbounded memory growth.
+- **Multiple independent consumers**: Multiple `for` loops over different projections (e.g., `.text` and `.tool_calls`) can replay all events from the buffer, supporting diverse consumption patterns without re-running the model.
-```python
-result = ""
-for chunk in model.stream(messages):
- result += chunk.content or ""
-print(result) # Final complete response
-```
+## Streaming in Agent Execution
-### Custom Callback for Application Logic
+Agents can stream their execution via `stream_events(version="v3")` on the agent graph returned by `create_agent()`. This allows observing:
-```python
-from langchain_core.callbacks import BaseCallbackHandler
+- **Tool calls**: Projected via `.tool_calls`, tracking which tools are called and their arguments as they accumulate.
+- **Tool outputs**: Deltas from tool execution, including streaming outputs from tools that emit output deltas.
+- **Messages**: The full conversation history as it evolves.
+- **Subgraphs**: When agents invoke sub-agents (via tools that call inner agents), subgraph handles expose their own projections for nested visibility.
-class MyCallback(BaseCallbackHandler):
- def on_llm_new_token(self, token, **kwargs):
- # React to each token (e.g., update UI, log, rate-limit)
- self.buffer.append(token)
+**Stream modes** (langgraph):
-for _ in model.stream(
- messages,
- config=RunnableConfig(callbacks=[MyCallback()])
-):
- pass
-```
+- **"updates"**: Yields node updates—which node ran and what state it produced.
+- **"values"**: Yields full state snapshots after each node completes.
+- **"messages"**: Yields only message updates.
+- **"custom"**: User-defined stream events fired by tools or middleware via `emit()` or `runtime.emit_output_delta()`.
-### Async Streaming in Web Framework
+Agent streaming enables real-time visibility into loop execution and tool interaction without blocking on the full agent run.
-```python
-async def chat_endpoint(messages):
- async for chunk in model.astream(messages):
- # Yield to HTTP client as server-sent event
- yield f"data: {chunk.content}\n\n"
-```
+## Best Practices for Streaming
-## Lifecycle and Error Handling
+1. **Flush output immediately**: When displaying streaming output in web or terminal, flush buffers after each chunk to ensure immediate visibility.
-### Successful Stream
+2. **Handle partial JSON carefully**: JSON parsers should use `parse_partial_json()` to extract complete structures from partial JSON as tokens arrive, rather than waiting for the full response.
-1. `on_chat_model_start` fires
-2. For each chunk: `on_llm_new_token` fires
-3. `on_llm_end` fires with merged `ChatGeneration`
+3. **Merge chunks for final use**: If you need the complete response, collect chunks and merge them via `+`:
+ ```python
+ chunks = [chunk for chunk in model.stream(messages)]
+ final = chunks[0]
+ for chunk in chunks[1:]:
+ final = final + chunk
+ ```
-### Stream with Error
+4. **Use callbacks for side effects**: Implement `on_llm_new_token` for logging, metrics, and webhooks rather than processing each yielded chunk in the loop. Callbacks decouple application logic from streaming concerns.
-1. `on_chat_model_start` fires
-2. For each chunk before error: `on_llm_new_token` fires
-3. Error occurs in `_stream()` or callback
-4. `on_llm_error` fires with partial chunks aggregated
-5. Exception is re-raised to caller
+5. **Respect backpressure**: When using `stream_events()`, let the consumer pace the producer. Don't artificially speed up event generation.
-### Cleanup
+6. **Disable streaming selectively**: For long-running operations or when you need predictable latency, use `invoke()` instead of `stream()`, or pass `stream=False` to override the default.
-When a stream exits (via break, exception, or normal completion), any buffered chunks are merged and callbacks finalize the run. Async streaming also closes async generators via `aclose()` if present.
-
-## Extension Points
-
-### Custom Streaming Implementation
-
-Subclasses of `BaseChatModel` override `_stream()` and/or `_astream()` to implement model-specific streaming:
-
-```python
-class MyModel(BaseChatModel):
- def _stream(
- self,
- messages: list[BaseMessage],
- stop: list[str] | None = None,
- **kwargs: Any,
- ) -> Iterator[ChatGenerationChunk]:
- # Yield ChatGenerationChunk for each token
- for token in model_api.stream(messages, stop=stop, **kwargs):
- yield ChatGenerationChunk(message=AIMessageChunk(content=token))
-```
-
-The `stream()` method handles callbacks, merging, and lifecycle; subclasses only implement the core streaming loop.
-
-### Custom Output Parser Transform
-
-Output parsers can override `transform()` to stream partial results:
-
-```python
-class MyParser(BaseGenerationOutputParser[T]):
- def transform(
- self,
- input: Iterator[str | BaseMessage],
- config: RunnableConfig | None = None,
- **kwargs: Any,
- ) -> Iterator[T]:
- buffer = ""
- for chunk in input:
- buffer += chunk.content or ""
- # Attempt partial parsing
- if partial := self.parse_result([Generation(text=buffer)], partial=True):
- yield partial
-```
-
-This allows parsers to yield progressively more complete results as tokens arrive.
-
-## Configuration and Operations
-
-### Disabling Streaming
-
-Models respect the `stream=False` parameter or a falsy check in `_should_stream()`. Calling `invoke()` directly bypasses streaming even if the model supports it.
-
-### Configuring Callbacks
-
-```python
-config = RunnableConfig(
- callbacks=[StreamingStdOutCallbackHandler()],
- tags=["user-interaction"],
- metadata={"session_id": "..."},
-)
-for chunk in model.stream(messages, config=config):
- pass
-```
-
-Callbacks, tags, and metadata propagate through the callback lifecycle.
-
-### Async Streaming
-
-Use `astream()` in async contexts and `await` on async callbacks:
-
-```python
-async for chunk in model.astream(messages):
- # Process chunks asynchronously
- await handle_chunk(chunk)
-```
-
-## Conclusion
-
-Streaming is central to building responsive LangChain applications. By yielding output token-by-token and firing callbacks per token, streaming enables real-time user feedback without sacrificing performance. The protocol is consistent across models, chains, and parsers, making it easy to compose streaming operations and observe output at any level of the application stack.
+7. **Test both sync and async paths**: Streaming behavior may differ between `stream()` and `astream()` depending on model implementation and callback executors. Test both for your use case.
diff --git a/openwiki/structured-output.md b/openwiki/structured-output.md
index 5638acd933..f8d186ed97 100644
--- a/openwiki/structured-output.md
+++ b/openwiki/structured-output.md
@@ -4,7 +4,7 @@ title: "AutoStrategy (recommended)"
openwiki_generated: true
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-71e882e1ac9757ea8e959a7c
resource: repo://libs/langchain_v1/langchain/agents/factory.py
diff --git a/openwiki/tools.md b/openwiki/tools.md
index 323cf372c3..c848861b56 100644
--- a/openwiki/tools.md
+++ b/openwiki/tools.md
@@ -1,10 +1,11 @@
---
type: "Reference"
-title: "Form 1: No arguments (name from function)"
-openwiki_generated: true
+title: "Tools and Tool Binding"
+description: "LangChain's tool system enables agents and language models to execute structured actions through schema-aware components with automatic validation, error handling, and callback integration."
+tags: ["tool", "agent", "schema", "runnable", "execution"]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-9861ba5cf0c42c142cf732f9
resource: repo://libs/core/langchain_core/messages/tool.py
@@ -18,10 +19,9 @@ sources:
resource: repo://libs/core/langchain_core/tools/simple.py
- id: openwiki-source-b816e651a5890bde13cf8013
resource: repo://libs/core/langchain_core/tools/structured.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
---
-
## Overview
LangChain's tool system enables agents and language models to execute structured actions by converting Python functions and Runnables into schema-aware components. Tools form the core execution mechanism for agentic workflows, providing automatic argument validation, error handling, and integration with callback systems.
diff --git a/openwiki/unit-tests.md b/openwiki/unit-tests.md
index 544f1d46d0..35568833b9 100644
--- a/openwiki/unit-tests.md
+++ b/openwiki/unit-tests.md
@@ -5,7 +5,7 @@ description: "How to write unit tests for langchain-core and langchain component
tags: [unit-tests, pytest, testing, fixtures, mocking, chat-models, tools, embeddings, type-checking, mypy]
verified:
- by: openwiki/0.5.0
- at: 2026-09-03T15:18:34.589Z
+ at: 2026-09-21T08:30:16.745Z
sources:
- id: openwiki-source-8f1875229ad4a704c8e20a06
resource: repo://libs/core/Makefile
@@ -33,7 +33,7 @@ sources:
resource: repo://libs/standard-tests/langchain_tests/unit_tests/embeddings.py
- id: openwiki-source-a6b31954b6df57580d0f3ed0
resource: repo://libs/standard-tests/langchain_tests/unit_tests/tools.py
-generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" }
+generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" }
---
## Overview
@@ -248,10 +248,24 @@ The root `conftest.py` in `tests/unit_tests/` provides shared fixtures and pytes
def blockbuster() -> Iterator[BlockBuster]:
"""Blockbuster fixture prevents blocking I/O in async code."""
with blockbuster_ctx("langchain_core") as bb:
- # Allow blocking in specific functions (e.g., internal API checks)
+ # Allow specific blocking operations in specific locations
bb.functions["os.stat"].can_block_in(
"langchain_core/_api/internal.py", "is_caller_internal"
+ ).can_block_in(
+ "langchain_core/runnables/base.py", "__repr__"
+ ).can_block_in(
+ "langsmith/client.py", "_default_retry_config"
)
+ bb.functions["os.path.abspath"].can_block_in(
+ "langchain_core/_api/internal.py", "is_caller_internal"
+ ).can_block_in(
+ "langchain_core/runnables/base.py", "__repr__"
+ )
+ bb.functions["io.TextIOWrapper.read"].can_block_in(
+ "langsmith/client.py", "_default_retry_config"
+ )
+ for bb_function in bb.functions.values():
+ bb_function.can_block_in("freezegun/api.py", "_get_cached_module_attributes")
yield bb
```