From f8e555affe8cf5a1129bd2fedbace669816ea63e Mon Sep 17 00:00:00 2001 From: npentrel <5212232+npentrel@users.noreply.github.com> Date: Wed, 14 Oct 2026 08:57:23 +0000 Subject: [PATCH] docs: update OpenWiki --- openwiki/.claims/agent-execution.json | 4 +- openwiki/.claims/agent-factory.json | 4 +- openwiki/.claims/architecture.json | 22 +-- openwiki/.claims/callbacks.json | 4 +- openwiki/.claims/chat-models.json | 8 +- openwiki/.claims/ci-workflows.json | 26 ++- openwiki/.claims/composability.json | 4 +- openwiki/.claims/dev-commands.json | 4 +- openwiki/.claims/integration-tests.json | 4 +- openwiki/.claims/mcp-integration.json | 4 +- openwiki/.claims/messages.json | 4 +- openwiki/.claims/middleware.json | 4 +- openwiki/.claims/model-initialization.json | 4 +- openwiki/.claims/openai-provider.json | 30 ++- openwiki/.claims/partner-pattern.json | 24 +-- openwiki/.claims/prompts.json | 4 +- openwiki/.claims/quickstart.json | 14 +- openwiki/.claims/runnables.json | 18 +- openwiki/.claims/source-map.json | 22 +-- openwiki/.claims/streaming.json | 4 +- openwiki/.claims/structured-output.json | 4 +- openwiki/.claims/tools.json | 30 +-- openwiki/.claims/unit-tests.json | 4 +- openwiki/.last-update.json | 4 +- openwiki/.page-manifest.json | 184 +++++++++--------- openwiki/agent-execution.md | 2 +- openwiki/agent-factory.md | 8 +- openwiki/architecture.md | 12 +- openwiki/callbacks.md | 2 +- openwiki/chat-models.md | 6 +- openwiki/ci-workflows.md | 6 +- openwiki/composability.md | 2 +- openwiki/dev-commands.md | 138 ++++++++----- openwiki/index.md | 4 +- openwiki/integration-tests.md | 2 +- openwiki/mcp-integration.md | 26 +-- openwiki/messages.md | 112 +++++++---- openwiki/middleware.md | 2 +- openwiki/model-initialization.md | 2 +- openwiki/openai-provider.md | 213 ++++++++++++++++++++- openwiki/partner-pattern.md | 20 +- openwiki/prompts.md | 2 +- openwiki/quickstart.md | 12 +- openwiki/runnables.md | 50 +++-- openwiki/source-map.md | 14 +- openwiki/streaming.md | 2 +- openwiki/structured-output.md | 2 +- openwiki/tools.md | 6 +- openwiki/unit-tests.md | 42 +++- 49 files changed, 738 insertions(+), 387 deletions(-) diff --git a/openwiki/.claims/agent-execution.json b/openwiki/.claims/agent-execution.json index fff64734e3..715e4fc9f7 100644 --- a/openwiki/.claims/agent-execution.json +++ b/openwiki/.claims/agent-execution.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:c36ed3bfa6acfdaf33179bd7cf4a4811864ccff80181c5c88b46227be3eacc14", + "pageVersion": "sha256:81264e686d67c7a4b08ba2d1980731154909cbb6657bc4ecb3920a03df40456f", "claims": [ { "id": "claim_601f8ad960a04f2195c35dab22235db1", @@ -251,6 +251,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/agent-factory.json b/openwiki/.claims/agent-factory.json index 79c53c54fd..63fe179873 100644 --- a/openwiki/.claims/agent-factory.json +++ b/openwiki/.claims/agent-factory.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:a04138ae1db4de18f11689760a882c8412eab3e79b77dcabedd87303f75ae572", + "pageVersion": "sha256:fbb8827277ac542366a4898e635ce9a34e19af5a436e5f1a75da23ed97304def", "claims": [ { "id": "claim_0d3a898647bd4d1d9c08eb386919394b", @@ -225,6 +225,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/architecture.json b/openwiki/.claims/architecture.json index d5f67333a3..58576db197 100644 --- a/openwiki/.claims/architecture.json +++ b/openwiki/.claims/architecture.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:4e5d2dc911c53cb5d796f0244aaee6dc3ae8591c91102231eb609ef62c10c4cb", + "pageVersion": "sha256:7091aa50ffc0302db10da76f28851336789bf1450a01de466128e6810d5c6113", "claims": [ { "id": "claim_d872799ce6874d76b63667fe912b7616", @@ -26,11 +26,11 @@ }, { "id": "claim_bf4afec1395b4acbbf413fe2928daab6", - "statement": "langchain-core (v1.6.5) provides the stable base abstractions including Runnable protocol, BaseChatModel, message types, tools, prompts, and callbacks.", + "statement": "langchain-core (v1.6.10) 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-L80", - "version": "repo-lines-v1:sha256:65a0c403c83c5df34f9fc75ad98dc0c9a24934c7d222476e9f7c20fc4c6b7d57:eyJzZWxlY3RlZExpbmVDb3VudCI6ODAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE1ZDFjY2U5NjgzYzRiOGE0NjJhN2Q0NDBjYjk2ZGE3NDk3YWQ2NDYwNTE0ZjNkYWI0NDlmZjgzMzllYjY5ZjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZhZmJhMDUyN2MzOTUzYzRiNmUwZTViNTczOWJhODM2MTJmODA1M2JjZGM5NDY2NzMwMTkzY2QxZDU5MGI0MDgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQ5M2U5NDRhMjBlY2I2ZWEwODAyMzIzMTgyYzdmZGRlZDYxMDlhZThlMjI5OWU0YjRmZjlkM2I3NDRlMTI4YmEifQ" + "version": "repo-lines-v1:sha256:ba9d984ba61f2037c7e0519267eec98949cf93062190c60eb672d8a69084d14c:eyJzZWxlY3RlZExpbmVDb3VudCI6NzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE1ZDFjY2U5NjgzYzRiOGE0NjJhN2Q0NDBjYjk2ZGE3NDk3YWQ2NDYwNTE0ZjNkYWI0NDlmZjgzMzllYjY5ZjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZhZmJhMDUyN2MzOTUzYzRiNmUwZTViNTczOWJhODM2MTJmODA1M2JjZGM5NDY2NzMwMTkzY2QxZDU5MGI0MDgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQ5M2U5NDRhMjBlY2I2ZWEwODAyMzIzMTgyYzdmZGRlZDYxMDlhZThlMjI5OWU0YjRmZjlkM2I3NDRlMTI4YmEifQ" }, { "resource": "repo://libs/core/langchain_core/runnables/base.py#L1-L80", @@ -38,13 +38,13 @@ }, { "resource": "repo://libs/core/pyproject.toml#L24-L24", - "version": "repo-lines-v1:sha256:341a73a1ff04d0266d8ca55a921f5e7a17e064312d5de57952ee36efd10e4712:eyJzZWxlY3RlZExpbmVDb3VudCI6MSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMzQxYTczYTFmZjA0ZDAyNjZkOGNhNTVhOTIxZjVlN2ExN2UwNjQzMTJkNWRlNTc5NTJlZTM2ZWZkMTBlNDcxMiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMzQxYTczYTFmZjA0ZDAyNjZkOGNhNTVhOTIxZjVlN2ExN2UwNjQzMTJkNWRlNTc5NTJlZTM2ZWZkMTBlNDcxMiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmRmYWFiMzNiMmUzYTUwMTM3NmZlODIxNDNkNzBmNmVkYjMyNWI4YWMzYWI5MDUwYTg0OTgwN2ZmM2FhZGI3NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOGEyM2RmNzFkODljMGE5NmUzNWFhZjk1ZTdjZTllYTczYTRiN2FlZjQyNDZjN2Q3YzAzZjhlM2EwMTJiZjliNSJ9" + "version": "repo-lines-v1:sha256:a513cf691b33030a674d61e7e7bf4f0571d51429b311a90117c59fe0f0284453:eyJzZWxlY3RlZExpbmVDb3VudCI6MSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYTUxM2NmNjkxYjMzMDMwYTY3NGQ2MWU3ZTdiZjRmMDU3MWQ1MTQyOWIzMTFhOTAxMTdjNTlmZTBmMDI4NDQ1MyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYTUxM2NmNjkxYjMzMDMwYTY3NGQ2MWU3ZTdiZjRmMDU3MWQ1MTQyOWIzMTFhOTAxMTdjNTlmZTBmMDI4NDQ1MyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmRmYWFiMzNiMmUzYTUwMTM3NmZlODIxNDNkNzBmNmVkYjMyNWI4YWMzYWI5MDUwYTg0OTgwN2ZmM2FhZGI3NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOGEyM2RmNzFkODljMGE5NmUzNWFhZjk1ZTdjZTllYTczYTRiN2FlZjQyNDZjN2Q3YzAzZjhlM2EwMTJiZjliNSJ9" } ] }, { "id": "claim_54ce93defa3a454f9a4a03bc2d6ef614", - "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.", + "statement": "langchain (v1.4.5) 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", @@ -56,7 +56,7 @@ }, { "resource": "repo://libs/langchain_v1/pyproject.toml#L24-L30", - "version": "repo-lines-v1:sha256:d8e1c5f75040cfa3188a9a7e6abf8cfc24c193fd8c27702c948bcd5a1682c341:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNWMxNTQwYWEzYzEyYzlmNjMxNDQxNDZmNTU3ZTQyOTAyMGNkMDhhYWM0ZDQzZThhNzQ1MDI2NjBjZGNkZjlhYiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZjk0MTZlMDlmNzhiYTMxNmMwMzI1NjgyMTNiODU1ZWU3NTZlNDE1NjVkOTE4ZjA5NTE5YzgxZmQ2MjBmNDA2MCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmRmYWFiMzNiMmUzYTUwMTM3NmZlODIxNDNkNzBmNmVkYjMyNWI4YWMzYWI5MDUwYTg0OTgwN2ZmM2FhZGI3NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDQyZWY1NmY0YTJjOWRmNjRkZDllM2VmMDBjZmZhYjIxNzM3ZjA1MWFjNTZjNzNkMGM2YTA3NDk0NDI2OGVhZSJ9" + "version": "repo-lines-v1:sha256:7145bb018ee135a76de614d63df60e11ca78e3ffd63901e2a725c90982dbaf62:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYmNmYzcxZDQxN2IxZWFmNDkxODQ4MjdjM2M0NWFjOWFiNGU4Y2MyNmIxYjJkZjc0OWY1Yjc1MzE5NTZkN2NjZSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZjk0MTZlMDlmNzhiYTMxNmMwMzI1NjgyMTNiODU1ZWU3NTZlNDE1NjVkOTE4ZjA5NTE5YzgxZmQ2MjBmNDA2MCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmRmYWFiMzNiMmUzYTUwMTM3NmZlODIxNDNkNzBmNmVkYjMyNWI4YWMzYWI5MDUwYTg0OTgwN2ZmM2FhZGI3NSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDQyZWY1NmY0YTJjOWRmNjRkZDllM2VmMDBjZmZhYjIxNzM3ZjA1MWFjNTZjNzNkMGM2YTA3NDk0NDI2OGVhZSJ9" } ] }, @@ -65,12 +65,8 @@ "statement": "Partner packages (langchain-openai, langchain-anthropic, etc.) implement core abstractions (BaseChatModel, embeddings, tools) and depend only on langchain-core, enabling independent release cycles.", "evidence": [ { - "resource": "repo://libs/partners/README.md", - "version": "repo-file-v1:sha256:104a04a55977ae78550d262f195ad3b51ddbbf9f321318e17c39376aa2c683bb" - }, - { - "resource": "repo://libs/partners/openai/langchain_openai/__init__.py", - "version": "repo-file-v1:sha256:d08e06dea1f954a477fa8951e2a8387a10396d07b92a3a60fdced307c136a84f" + "resource": "repo://libs/partners/openai/langchain_openai/__init__.py#L1-L22", + "version": "repo-lines-v1:sha256:5673ccbe8f53267c2027dd390051424928a6e1e744c2f8c8a418960a29dccf4d:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVkM2U5NWUyOTU2ZGIwZjBiZTEwYTU5MzJmNjM1NDJmNGY5YzExMGRiYmU5NjViYzAxNmI1NDAwZTZmNjQxNjgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY5NDE2ZTA5Zjc4YmEzMTZjMDMyNTY4MjEzYjg1NWVlNzU2ZTQxNTY1ZDkxOGYwOTUxOWM4MWZkNjIwZjQwNjAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ" }, { "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L1-L50", @@ -149,6 +145,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-29T08:28:34.635Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/callbacks.json b/openwiki/.claims/callbacks.json index 2175228df5..c63dc1f4fc 100644 --- a/openwiki/.claims/callbacks.json +++ b/openwiki/.claims/callbacks.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:08c495ccfb12ed0a79d3e0791c2a12f86cb4b7732c6de698b6b1a8bcc71b7718", + "pageVersion": "sha256:348f725c5c3feafcf7903b6e0e5146891feca698ce269723429c78e680fbbe89", "claims": [ { "id": "claim_1870ae33ffdb41fa87eaee4125620240", @@ -207,6 +207,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/chat-models.json b/openwiki/.claims/chat-models.json index ea83e671b6..5a8eb6c1ea 100644 --- a/openwiki/.claims/chat-models.json +++ b/openwiki/.claims/chat-models.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:0cd7a2ec4f34f1d485e9a9337aa08d82714284546d8ce04609d9de1a0f58d76e", + "pageVersion": "sha256:c62620141d5f4676c15e369b90c60199538a87fd9e83bd78e2881d886153d6bf", "claims": [ { "id": "claim_d2cdcf05dd4149bb9ea0a5fb0d1568d8", @@ -86,7 +86,7 @@ "evidence": [ { "resource": "repo://libs/core/langchain_core/language_models/chat_models.py#L1892-L2206", - "version": "repo-lines-v1:sha256:8875e363badb600e00e7b80f354fca72b52ecd03e88a1c87cc770026fe10e7cc:eyJzZWxlY3RlZExpbmVDb3VudCI6MzE1LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIwMzVhNGQ1NGU3ZGUxYTdmYjE3YjU4OTllNWFkMjMwMWMwZGEwODlhOGVkYmMxMWU4N2NlOGViNzFiMzcwMGZkIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI3NzJmOTY5NWM3NDY3Yzc0NzczYzljZTdmYzQyOWM1ZDBkMGU0ODdmM2M1MWQxNWQ2NjY4YTNkMjQwNzJiYjk1IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJjMTQyMzMyMGQ3N2NlMTg4MDY2OTBlZmRiOGUwOWZjNmU3MjZiODVmYjRkN2U2YTU1MTBiNWIxZGI0MDgzYWNmIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI3NTg3OTY0N2FmZDExNGM1MTI3Y2Q1Y2ViNzcyODRjMjNiNzBkYTE5NDJhNGE2NzU0NDRkNmNhZjEyY2MzZTM0In0" + "version": "repo-lines-v1:sha256:60f446cfa6d5a704979492c4b23ffe652b1d8487f68751f3b1ae536151e73a42:eyJzZWxlY3RlZExpbmVDb3VudCI6MzE1LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIwMzVhNGQ1NGU3ZGUxYTdmYjE3YjU4OTllNWFkMjMwMWMwZGEwODlhOGVkYmMxMWU4N2NlOGViNzFiMzcwMGZkIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI3NzJmOTY5NWM3NDY3Yzc0NzczYzljZTdmYzQyOWM1ZDBkMGU0ODdmM2M1MWQxNWQ2NjY4YTNkMjQwNzJiYjk1IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJjMTQyMzMyMGQ3N2NlMTg4MDY2OTBlZmRiOGUwOWZjNmU3MjZiODVmYjRkN2U2YTU1MTBiNWIxZGI0MDgzYWNmIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI3NTg3OTY0N2FmZDExNGM1MTI3Y2Q1Y2ViNzcyODRjMjNiNzBkYTE5NDJhNGE2NzU0NDRkNmNhZjEyY2MzZTM0In0" } ] }, @@ -134,7 +134,7 @@ }, { "resource": "repo://libs/core/langchain_core/language_models/model_profile.py#L13-L150", - "version": "repo-lines-v1:sha256:497a9318b6379350b195e046e266ed2e8ccd7b0e2c69aaa337f7eab0811059ea:eyJzZWxlY3RlZExpbmVDb3VudCI6MTM4LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJmNjk0ZmRmZTIzOTgzZmQ5N2JiYTViODMwNTAzMWE4ZTU0ZjBkOWQ2YzhjMTI2ZDVlNzI5MjY3MmQzMDJjZWE0IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI2MjAwOTdlNGFhNTAwNjhiYTE1N2Y5YTI3MzlmYWQ4Njk5NWUxZTBjZGNjZGFkYzU4OTdjMjAzNGM3NGQzZWZhIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI3Yzc0YzNlNWEzZDZjZDA1MTQ4NmU5YjRmNTQ3YzBlMjc3Mjk4NmUzOWQ4YmRkZDQ0MjU5OGUzZjQwZWJmZDhlIn0" + "version": "repo-lines-v1:sha256:ba838e00524406cc697097d348207004e09ea4b5fc7214450d165d245de65b61:eyJzZWxlY3RlZExpbmVDb3VudCI6MTU4LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJmNjk0ZmRmZTIzOTgzZmQ5N2JiYTViODMwNTAzMWE4ZTU0ZjBkOWQ2YzhjMTI2ZDVlNzI5MjY3MmQzMDJjZWE0IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI2MjAwOTdlNGFhNTAwNjhiYTE1N2Y5YTI3MzlmYWQ4Njk5NWUxZTBjZGNjZGFkYzU4OTdjMjAzNGM3NGQzZWZhIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI3Yzc0YzNlNWEzZDZjZDA1MTQ4NmU5YjRmNTQ3YzBlMjc3Mjk4NmUzOWQ4YmRkZDQ0MjU5OGUzZjQwZWJmZDhlIn0" } ] }, @@ -389,6 +389,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/ci-workflows.json b/openwiki/.claims/ci-workflows.json index cc136c7982..c84fcc1c61 100644 --- a/openwiki/.claims/ci-workflows.json +++ b/openwiki/.claims/ci-workflows.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:584d7590d927cbab7fd482a36eefe6d6e23c985471086ac9d270b7e2506ebb96", + "pageVersion": "sha256:6e61b448ea29ff9cea8b26db551f62724199fcfac3518c5bf37d3271ce0a784a", "claims": [ { "id": "claim_cb5fe3f72803497eac3f09ebf02d97cd", @@ -106,15 +106,23 @@ }, { "id": "claim_5ef1eed172f74ac6ab61e4128ed815e8", - "statement": "Integration tests (integration_tests.yml) run daily (1 PM UTC) with matrix over Python 3.10 and 3.14 against 9 default partner libraries (OpenAI, Anthropic, Fireworks, etc.), receive 30+ API credential environment variables, and serialize per-package tests via concurrency locks to prevent credential conflicts.", + "statement": "Integration tests (integration_tests.yml) run daily (1 PM UTC) with matrix over Python 3.10 and 3.14 against 9 default partner libraries (OpenAI, Anthropic, Fireworks, Groq, MistralAI, XAI, Google VertexAI, Google GenAI, AWS), receive 30+ API credential environment variables, and serialize per-package tests via concurrency locks to prevent credential conflicts.", "evidence": [ { - "resource": "repo://.github/workflows/integration_tests.yml#L152-L250", - "version": "repo-lines-v1:sha256:8b13d0714f4249cf34f163a21b2100013dbd521889e5b0aabc0ab66ff1980f79:eyJzZWxlY3RlZExpbmVDb3VudCI6OTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjZTUzNjI0Nzk1ZDA0YmIxMjI2ZjI1NTgxOGUxNmRlZWZhMGU1ZTVlODYxN2I3MDZkMjAyNzA5MWYxMGE3ZWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNkNGQwMzc4MWVmYzEwM2VkMTMzNTk1YWFlMjlmYzI4NDdmMTBkYmQ1MjAzMWFhMTZiNmYzYTI0ODdjNDA5OTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE3ODljMzlkMGFiNzhkOWFjNzRjNDBiODEzZGRiNGNkYmRlMTc5Mjk0OTY4M2VhYzVmZTZiYjkyMDgwZTc2OGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRiNjU0ZGI5YTFhZjZiYTQ1MDQ2NDViODQxNWM5ODZjOTlmMmMzYTU1YTUyMzgwN2IwMmRhZDllMjM1Y2Q5OGQifQ" + "resource": "repo://.github/workflows/integration_tests.yml#L166-L173", + "version": "repo-lines-v1:sha256:87376cb95ee6da8fb5edcfc3f9e5da9495077e1b701f4d1ed18dfb2ebcd73dfd:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNzQyNTM1NGUxYTM0MDU1MTM1N2Q5MTA0ZDNmMzU2YTcwMWViYjI5ZmFiM2NlODFjYzNiMmUwZTFmYjU5N2MyZSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZjU3OGVlOWQ2NzgyNGM0MDMyNTcxNTk5OTM1NGRmNjBiOTE4MjMxZTcxNzhhMDJkZTdiOGU4MTQwZTQ3MjdkMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNjU5YjdlYTEyNTRlOGYyZTkyNDEyYmU4ODJjN2RlNWEwMTE1MzAwNmVkOWM3ZGQwOWU3ZWU4Mzg4MjBjMDJlYyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiZWViMGZjM2YwZjVmNzY4NjdiZTM5NDIxMDNjYTNlMDYxOGZhNThlMWRjYzg1NmIzOWM4M2NmOTZlY2I2MzY1OSJ9" }, { - "resource": "repo://.github/workflows/integration_tests.yml#L56-L173", - "version": "repo-lines-v1:sha256:1a8edf16cffab1fed529e43b9a7cbacb77d936c43c70e0101b5774bbd60da086:eyJzZWxlY3RlZExpbmVDb3VudCI6MTE4LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI5Mjg4NDBhNmI3ZTYwMzAzZDg3YmU0ZDRkODJhNTBiMzMyODQyOTBkZWM0ZTM0MjhkNDdkOTNmYmVmZDFjNTkwIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJhM2M4NzQwMDg5NmU4Mzg5Njk2M2RjM2M3ZjBlZDU1ZDVjOTJlNGUyNzI0M2QyMDk0NWQ5NjhkMzdmZWExZDk5IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJjNjhjNjBmMmRiMTY1NGJlMDI3NzQ2MDJmMGFlNDU1N2FlNjM2ZTNiYzU3NTI0ZGJlMDMyYTNmYjlkMjVmMjFkIn0" + "resource": "repo://.github/workflows/integration_tests.yml#L283-L332", + "version": "repo-lines-v1:sha256:900a60aead2972db0353ed363b557a30d11d0a5ab3d2bcf580de742486a05a5b:eyJzZWxlY3RlZExpbmVDb3VudCI6NTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdiMDc4NDhhNDM2NjY1NmIyYmE2MTk3YmUwMmI5MjA4MTQ1NDZmOWQ5YWQwYjUzMzllNGMyNmEyYzk0NjUxMTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc4MjE0NTY4MjI2OWRjYzU4NGIxYjAwZTkzMDJhZDVmODViZTZlYzQ0MDljOTM1ZDRlMDhlNDFhNTljOTc5MTQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQyNWEzMTYxYTJhMWJjZTc2NWExMmNkMjIzNmNlYzY3MGJhMmI0ZGUyNDdiMWY1MzA1MmM3NzNjZmU0ZDZkNzYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImFlMjZmYmNhOGExNmNhOWEwYjkyNTkzMDkwNTBjNTdiNzc1N2MzYzNkNmQzMGY4ZjViZTQ2ZjMxYzhjNDRjOTkifQ" + }, + { + "resource": "repo://.github/workflows/integration_tests.yml#L57-L74", + "version": "repo-lines-v1:sha256:385268068ddc42b0c0450284406f4b64c3e71c1dfd537e7c0676794f1e3af19c:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkyODg0MGE2YjdlNjAzMDNkODdiZTRkNGQ4MmE1MGIzMzI4NDI5MGRlYzRlMzQyOGQ0N2Q5M2ZiZWZkMWM1OTAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg0N2MzN2U1YTdmZjQzOGE3Y2MwOWY2OGZjN2I5YWNlMDAyZjNiYjUyMTQ4MzExNDZiZWQ4NmZiZjZmMmRhZTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImEzYzg3NDAwODk2ZTgzODk2OTYzZGMzYzdmMGVkNTVkNWM5MmU0ZTI3MjQzZDIwOTQ1ZDk2OGQzN2ZlYTFkOTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjA4YmZlOTcyOTMzZTAyNmYyMGViZGI5ZGY4MzRkYzU3Y2U0NWFkZDUxM2UzMGY3MTBlNDgxNTRmZWU2MDgwNzYifQ" + }, + { + "resource": "repo://.github/workflows/integration_tests.yml#L89-L151", + "version": "repo-lines-v1:sha256:fc827401abc66b423868383727b1e2475d9a8df7a9587877813528871229563c:eyJzZWxlY3RlZExpbmVDb3VudCI6NjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4ZGY2YTQ1OTI4Yzc3YzQ1ZmFlNTFlZjdlY2Q4Mzg2NzQ3Njk2ZWZhYTFjNDZlOTA3M2U5ZWU5NDY4ZDhjZDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI2NjcyZjczNmQ1ZGQwYWFmOGRiNDUxMGFlZDgzYjdmYmQ3NjhkYTM3NDAzYzA1MTZkOTA5NTEwOWMwNDU4NjQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjZkZTg1YWQxMTcwODVjYTZjNzVmODIyYTY0NTdkZGI1YjY2OTFmNWVjMmFlNDA0MTliYzk2ZDkyNWMzNmUxYzMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJhOWM3OGU5OWExMDAwODNjNWY0ZjFjZTgwYjZkOTczYmY3ZWU2MWQzYWRjYjllZWViOTZkMTlhMzllOTk5OGEifQ" } ] }, @@ -123,8 +131,8 @@ "statement": "Integration tests handle external repositories (google-genai, google-vertexai, langchain-aws) by checking them out separately and reorganizing into local partner directories, with special per-package install logic for overlaying local editable core and standard-tests packages.", "evidence": [ { - "resource": "repo://.github/workflows/integration_tests.yml#L179-L248", - "version": "repo-lines-v1:sha256:1c86a362fb57aaaecfadc02baa2e94d89c96e28c57287ad431c1cad8a0f304b4:eyJzZWxlY3RlZExpbmVDb3VudCI6NzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc1NjM5ZDFjYzRlNzE2NmUyYzlhYjNhM2Y4YTllMmIwMzNjYjcxNDZiYWU2MWU1YzZkOWM4YjIwYzEzYTNlZDciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMyMzA3MzdhMjFmYWIzYjUzMjU2OWUxNGJkYTkyMzc0YjQ4NDc4NGNhZWZhOTgyZDIzYjU0ZjRhNjhjNDc4YTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk0NmZmMzU1ZGZmZDExNTNiMDQ2NzhiMGIzMDVjNDBhNmU0MDNmYjk1YzEzNDUxNzZlODRmNTEzZTQyZmFiNjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjVjNTZmYTBhMzEzZjc0ZGRkZTRkMWM2M2UxY2RmMGJhMWExMDQ4ZTY3NmQ4OTI0YTZjOTNjYmEyMjc4MTNiNDYifQ" + "resource": "repo://.github/workflows/integration_tests.yml#L176-L249", + "version": "repo-lines-v1:sha256:a0f04d92b51f5c8ed170be006ca145c7afa83bb992659647c7de7bd6684abcbe:eyJzZWxlY3RlZExpbmVDb3VudCI6NzQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRjNGU4ZGEzZjZhYTI4YWY2OGFjMzFjMTdiYzQzMWIzMjIzNTg1MGIzMTYzMjg3NmEzNDMyNzcwYmQ2NmU1YzUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMyMzA3MzdhMjFmYWIzYjUzMjU2OWUxNGJkYTkyMzc0YjQ4NDc4NGNhZWZhOTgyZDIzYjU0ZjRhNjhjNDc4YTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUwY2EzNzkyNWMxNDVhYTJhZjRhYTA2MmZjOWIyYzY2YmQzZmYwYmZjODM2MWFkMWMzYTNhY2ViYzQwZjgyNzQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjVjNTZmYTBhMzEzZjc0ZGRkZTRkMWM2M2UxY2RmMGJhMWExMDQ4ZTY3NmQ4OTI0YTZjOTNjYmEyMjc4MTNiNDYifQ" } ] }, @@ -247,6 +255,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/composability.json b/openwiki/.claims/composability.json index 000a0fee76..0ab7e755cf 100644 --- a/openwiki/.claims/composability.json +++ b/openwiki/.claims/composability.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:08b16574d155fea41f84c89a32fa0f8c6c34fcf5a6f640ab81d2d0dd5f796884", + "pageVersion": "sha256:c58ab7c4d16cee547bf4250f067e943f861afcf009181b1af84182254e948441", "claims": [ { "id": "claim_51e65b4f126f42d986b2766ee964d991", @@ -215,6 +215,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/dev-commands.json b/openwiki/.claims/dev-commands.json index 2f9646b409..a53c4d01bb 100644 --- a/openwiki/.claims/dev-commands.json +++ b/openwiki/.claims/dev-commands.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:0ec51ab0fa47477f5eb49c0577be6cd4558b283f0a678cd572dc0f65f65db57a", + "pageVersion": "sha256:5a07bb80f3e69723067219fecf1eda3ec6807a0c19eb98b0e5397285d259f2ea", "claims": [ { "id": "claim_42b2b3c1ac6e4a938efa7b2651c79b81", @@ -177,6 +177,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/integration-tests.json b/openwiki/.claims/integration-tests.json index d84c2f7114..6a2ff97f76 100644 --- a/openwiki/.claims/integration-tests.json +++ b/openwiki/.claims/integration-tests.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:7a27a082b6fe0666d7a3e17b00aac82017d7095d7cc66a084355eb8c5f47b347", + "pageVersion": "sha256:af5a49335ac9f3cd232d7df5ba927e90bfa67722cf5370c32c5ebc66ce68161d", "claims": [ { "id": "claim_2b394255185b4645a1dcf0e8c628a197", @@ -197,6 +197,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/mcp-integration.json b/openwiki/.claims/mcp-integration.json index 08fb925303..7ef8dce4be 100644 --- a/openwiki/.claims/mcp-integration.json +++ b/openwiki/.claims/mcp-integration.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:aa9e35da19127c337d9ca84bffab4b5b80d9cc78063469ee9a65827d4867d36c", + "pageVersion": "sha256:54a975d1802bfca8a160f86cb1d74464f33cf2e6afdfb4d07e5ecfa9b0b08967", "claims": [ { "id": "claim_a20f2f32ba21436d869cf463fc4e93f6", @@ -251,6 +251,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/messages.json b/openwiki/.claims/messages.json index 9143708136..6379dc38ed 100644 --- a/openwiki/.claims/messages.json +++ b/openwiki/.claims/messages.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:9a300b45af58ddf5b9c8a669d194b5ea592a85e27837e6b2066229dd7d924556", + "pageVersion": "sha256:496104cb138f76ea96a0f08f8e92dc1f206dc48a2c44dd5ca18a339db094a0ef", "claims": [ { "id": "claim_cd426b48afb54e54a30a82b280ab266d", @@ -219,6 +219,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/middleware.json b/openwiki/.claims/middleware.json index 56ff62d7b2..c539d2a3dc 100644 --- a/openwiki/.claims/middleware.json +++ b/openwiki/.claims/middleware.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:292ef3af03c17963611499165f6045b27db7700b522fb3d608fb027272c23f40", + "pageVersion": "sha256:21ceece9610c7b5294544a537361c31583e840416bb08ae692018822be9b2dbc", "claims": [ { "id": "claim_6ce968382a514edb90e74830ccdebef7", @@ -199,6 +199,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/model-initialization.json b/openwiki/.claims/model-initialization.json index 6f768d2036..8186cef6f0 100644 --- a/openwiki/.claims/model-initialization.json +++ b/openwiki/.claims/model-initialization.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:bd811dcc6b70cbe1b135d1ae06d5196272d0742d1df5c7491d4adfa89cf21a9a", + "pageVersion": "sha256:83e54c3c6b1a8cfeba8a475086654757006b936e4e50ce1a7de2c494bc278d27", "claims": [ { "id": "claim_189e539212e149fdb6d26bfac3426a8c", @@ -181,6 +181,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/openai-provider.json b/openwiki/.claims/openai-provider.json index 86811e208a..546e0e8b2e 100644 --- a/openwiki/.claims/openai-provider.json +++ b/openwiki/.claims/openai-provider.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:05e90b9de166a5a7213cee462a99c10236b8c8eba605f2b5a856779baad552a6", + "pageVersion": "sha256:d107de765a91057a6bbfc414008f58d54389ab03a3b8606c1eb64424fd76a6e4", "claims": [ { "id": "claim_347664eb68464142b558791c7a95093f", @@ -8,7 +8,7 @@ "evidence": [ { "resource": "repo://libs/partners/openai/langchain_openai/__init__.py", - "version": "repo-file-v1:sha256:d08e06dea1f954a477fa8951e2a8387a10396d07b92a3a60fdced307c136a84f" + "version": "repo-file-v1:sha256:5673ccbe8f53267c2027dd390051424928a6e1e744c2f8c8a418960a29dccf4d" }, { "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py#L2904-L4266", @@ -255,10 +255,34 @@ "version": "repo-lines-v1:sha256:4796c14704f049c8340f8cb74976a7f9e7af36bb8fbf9250e8c163d7a4124e0d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIwYWIyNjQwNjA4YTZlZGJhZGE4MDJlYTdlYzA1NjYxM2JhOTFhY2Q5ZTdhOGIwZjcxOGRmODQ1Yjg4YzBlMDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjliY2FkYzRlMjljMmM0NWUyOTI5NjcwZmZiNGJiNDZiY2JjNDRlYWIzNTAyNzAzNWJmNDVmYjFiMTdiYzU1ZDUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhhODNkNzQxZTM3NWRlNGMzMWI3Yzc4Mzg3YzdjN2UyNzUxZWY4NTU5MWE3ZWE3ZjkwYzNmN2E3NTQ5NTQ0ZmUifQ" } ] + }, + { + "id": "claim_4a5ffbff1faa4ea9b95ed6c97dbb8b6f", + "statement": "OpenAIDecisions is a RunnableSerializable for the OpenAI Decisions API that asks typed questions (Predicate probabilities, Choice selections, Score ratings) over text or images in a single request, returning DecisionResponse with answer types, probabilities, confidence scores, and token usage.", + "evidence": [ + { + "resource": "repo://libs/partners/openai/langchain_openai/decisions/base.py#L37-L100", + "version": "repo-lines-v1:sha256:67c26060eb2224762a1d962d0aafe1044d544fb78f825c4fe23b147e4042037d:eyJzZWxlY3RlZExpbmVDb3VudCI6NjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ5NDA2YWZiY2ZlNjYyMTgxOGU1M2E3OWU2NzU5MzYxNTAxNmE0Y2IyZWUzYTI2M2U5MGYwNDlmZDU4ZGNiOWQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2ZWY2ZDQ3NjI3Yzk4YzFjYWFkYTM4MDMzZDQzZTEyYzE5YTA3OTNiN2E5OTNjNWUwYTdmZDdlNjRiMmNmNTQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjYyMDA5N2U0YWE1MDA2OGJhMTU3ZjlhMjczOWZhZDg2OTk1ZTFlMGNkY2NkYWRjNTg5N2MyMDM0Yzc0ZDNlZmEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjIzZWM5NjE3YmYwYTdiMjY4YzUwMWNhN2VlMzgyYmQ1MmVhZDU4ZWFiNDJiMzZlMzA2OWY0MTg0NjIwZDE0ZjAifQ" + }, + { + "resource": "repo://libs/partners/openai/langchain_openai/decisions/types.py", + "version": "repo-file-v1:sha256:f7f9be7956993aa282e865b042ac860c7ea1ca0a9295e24f32d8159aaf2b55cc" + } + ] + }, + { + "id": "claim_11816c94968f4c8b990f3545126dc4cd", + "statement": "OpenAIAutoModeMiddleware is beta agent middleware that uses the Decisions API to classify tool calls as risky (probability >= 0.5) or low-risk, blocking risky calls with error ToolMessages before execution. It handles media fallback when images are oversized and bypasses classification for unregistered tools.", + "evidence": [ + { + "resource": "repo://libs/partners/openai/langchain_openai/middleware/auto_mode.py#L64-L80", + "version": "repo-lines-v1:sha256:fe98fc79bd8d77e58d88c2a453c84a0e0a746cfc79806da1f28923903b478d27:eyJzZWxlY3RlZExpbmVDb3VudCI6MTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ5NDA2YWZiY2ZlNjYyMTgxOGU1M2E3OWU2NzU5MzYxNTAxNmE0Y2IyZWUzYTI2M2U5MGYwNDlmZDU4ZGNiOWQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYzZTA2NmMzYTU5MzM5Mzg0YjdiNDc2NDUxNzIyNjFhYWY0YWM0NTA0MTVjYzE3NDUyNzI4MzY3NDliN2YxMWUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE5OGIwNjNkOWI0N2U2NTM3OTYyNTU3MmNjZTE5NzY2OWQ1NzY3ZTEyYzE4YmUwNzU2NTJiOGNkOTgxY2U4ZDUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjEwZTI5MGI5OWQxNDVlMmNiMmQ5ZGNkMTU3Y2FmMGJiZWNlMzQxYjRkNDY1YTExMTFlMzIzODcyNWEyMjIyMmMifQ" + } + ] } ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/partner-pattern.json b/openwiki/.claims/partner-pattern.json index a1b2453b6e..83510ac8dd 100644 --- a/openwiki/.claims/partner-pattern.json +++ b/openwiki/.claims/partner-pattern.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:b5987885a9e21b5c669db5477471ac853eb2514d5dba1d3d3d716f04037745ff", + "pageVersion": "sha256:0cafdc57a1ea39300467eb33a589bdd3fcf8cb839347904bcc673cb9ae2257b7", "claims": [ { "id": "claim_7c2a1600fd294471a122d693305b38f8", @@ -18,7 +18,7 @@ "evidence": [ { "resource": "repo://libs/core/langchain_core/language_models/chat_models.py#L284-L2400", - "version": "repo-lines-v1:sha256:cdf77a3db35dd154ae26e7d5825099290e4a9d5499a0b0abe672652de89234a6:eyJzZWxlY3RlZExpbmVDb3VudCI6MjExNywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMTAwNTcxZDA4NTFjMTIyMTUzYTNiMDExNTE1NTI4ZjlhNDM3MGRmZWY3YTMxZGYzNTZlOGQ3OWNjMjA4NDE1MSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiN2FlNWM2NTk3ODNiYTg5NjVmNjIxOTY1MjBmNjE5ZmI3YWM2ZDk4NGI0N2Q4ODM1Yzc3NDA2OGRmZDIzNGUxNSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZTU2NWNmODYzMGNkNjlkYmRiMDQ4ODQ3MWYzMzYxZjc0MzM3NTQyMDI0MWVhMDUyM2U5MzA4MWQyZmM3MWZjMiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYjZkNWFjNjk4NzhlM2NmMTQ1YmVmZGYwZjVhMmNiN2RiYWI1YzFhMGNhYWZmYmRjMGM1ZTM2OGRlMzgyYjFlYiJ9" + "version": "repo-lines-v1:sha256:582aaeefcfe8393d36db0f5f2987e1ed0fdc11e53012e53d5f6e328004cc1189:eyJzZWxlY3RlZExpbmVDb3VudCI6MjExNywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMTAwNTcxZDA4NTFjMTIyMTUzYTNiMDExNTE1NTI4ZjlhNDM3MGRmZWY3YTMxZGYzNTZlOGQ3OWNjMjA4NDE1MSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiN2FlNWM2NTk3ODNiYTg5NjVmNjIxOTY1MjBmNjE5ZmI3YWM2ZDk4NGI0N2Q4ODM1Yzc3NDA2OGRmZDIzNGUxNSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZTU2NWNmODYzMGNkNjlkYmRiMDQ4ODQ3MWYzMzYxZjc0MzM3NTQyMDI0MWVhMDUyM2U5MzA4MWQyZmM3MWZjMiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYjZkNWFjNjk4NzhlM2NmMTQ1YmVmZGYwZjVhMmNiN2RiYWI1YzFhMGNhYWZmYmRjMGM1ZTM2OGRlMzgyYjFlYiJ9" }, { "resource": "repo://libs/partners/anthropic/langchain_anthropic/chat_models.py#L1-L150", @@ -59,12 +59,12 @@ "version": "repo-lines-v1:sha256:dbedddc099ce70c40b79d35eb746c3a255a751cd7631d2e06a7b930e65689aab:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJiOTY2Mjk3MTE5MWYzZjdkMGU4NWE3Mjk1NmZkNDk0YWQ3NDAwYzVlNTNiODRkMjM0NjVmNzYwYWU4NjI4MjciLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImMwYjQ1MWFmZTFhMmNlMDE1YTM4ZTcwYWEwMGFkNDYxYjY2ZjNhZTEwNWFkYTgxMGI1MjRjMTExMDdlYTU4Y2EiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjA4MWRjNjYwMWM3ZDZmYTUzNjBhMzRjMTk2NjcwZjQ1NWQwNGVjYzg3YTZhMGJkMDU3ZjU1NzFmNDI3NmQ5MGUifQ" }, { - "resource": "repo://libs/partners/anthropic/langchain_anthropic/data/_profiles.py#L1-L80", - "version": "repo-lines-v1:sha256:3ab056844cd9b42e3d93edeab31c0682b96f523f9d9b59282403f8276facffa1:eyJzZWxlY3RlZExpbmVDb3VudCI6ODAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjJhMzc2OTFhYWUwNGYwNGE4MWY2ODU4YWVlYWFhODEyNGJlMzIxOWE4Y2JlODBlZGIwMDhiNDVmNTBhZmRlNjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI1M2FhYzA0YTg2ZjQ2YzJkNDJlNmNkNDQzYTUzOTRiMjc3NTYyMTU2MDE2MmU5MzY5NTQ3NWM5MDg4N2QxZWYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImIxNjk2ODFlNTQ4NzRiODk2ZDVlNWVkNzczZjI2ZGI1NjBjNzFiNDQzMTkzYTNjZDc5YWRlZWY2NmVlODg0OGMifQ" + "resource": "repo://libs/partners/anthropic/langchain_anthropic/data/_profiles.py#L18-L54", + "version": "repo-lines-v1:sha256:5816506f2f584cbd5f742da79af5b1e066ce6a612730015cd8f7c2485e183cf7:eyJzZWxlY3RlZExpbmVDb3VudCI6MzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ2OGM2ZTA0MGZiZjAyMTliNGE2NzNmM2ZlNDZiMGRkNzExZTM5ZGYzYTI5OTNmNWRiOTNlODNlY2YxOTBkYWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFmMGNkYjk3MmE3YmZiN2VkMjQ2ZjlmZjY3MjM4NWU1NWY0OTY4ZmMxMTA0M2RjNWI2ODRkNTFkZmEzMWRiY2IiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk0MzYwZTZmOTk2OGM3NmQ1MmEyYTZlYzkyYWFkZTExNmRhM2E3ZTg3NjYzOTY1ZDQzZWNiMjA4ZDA4MTE3ZjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjAxNWNiNWI5ZWMzYjhiMTZhZWE4ZThmNWQ5Y2VkZWVlMTVlZDVkYjA0YjAzNDZhOTcxNWQ2NDA4ZmVlNGIzZTAifQ" }, { "resource": "repo://libs/partners/anthropic/langchain_anthropic/data/profile_augmentations.toml#L1-L50", - "version": "repo-lines-v1:sha256:9458ec3ea6be6458305d952e8a58aa6d7333a82663f9b3cee0ae45caf0d101ec:eyJzZWxlY3RlZExpbmVDb3VudCI6NTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZmZDM5YTg2ZGFjNGIzYzEzYjk3MWY4YWE2ZDY5NGE0MWRjMzQxZmI3ZTBjNjEzMjMwYmRjNTVhNzIzNGY2MTIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImNhYWEyY2RhODcxNTcyODQxMWE3NTk1NzI3YjAwZjhmZjEwY2U3Y2YxMTFlZTVlMDg3MTI4ZjRmNDBiZTYzMWIifQ" + "version": "repo-lines-v1:sha256:0e97fecc27c6511c631152dbc7e0b769d5da59c0a954e32a176ef29287ef5a21:eyJzZWxlY3RlZExpbmVDb3VudCI6NTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZmZDM5YTg2ZGFjNGIzYzEzYjk3MWY4YWE2ZDY5NGE0MWRjMzQxZmI3ZTBjNjEzMjMwYmRjNTVhNzIzNGY2MTIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQyODYzNzQ2ZTdhMjcwZjQ3Mzc2YWRkZTIzYzhjMGM3ZmFhODg0N2FmMDg0YzUzYjQ0ZDJiZTcxNTRhYTlkZmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkxOGExMTVmNDU2YWNiNjJjMDgzMjNhYTAzMzlkMDM1YWNmOTEwMGJiNTljNTgwYmQwOTAwM2IzZjA0MGI0MjkifQ" } ] }, @@ -84,15 +84,15 @@ }, { "id": "claim_a7fa4aec0f874ffaa86e9395f1870be7", - "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].", + "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.10,<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#L1-L150", - "version": "repo-lines-v1:sha256:029b83ec3b02ad423217217e74b2d81d7fe59f641be07f5c6e78478ab074ca1e:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUwLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIxNTBhNDllZmI2N2JmMzZhNTk4OGExOGYwZTEzMDQ3NDBjMDY3NTRhYWIzMzMwNWIxZDE3ZTkxY2NiMWYyODhmIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJiYTJmOWYwYjU4YTM5Y2ZjMjcyNzliZDJjYjZkZTlmYzM2M2ViNDUwMTY0NTU4ZjJiMjAzMTkyOGI1MTkzMjdkIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MCwicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJhYzU3YTBiYmU1N2UyMTY1NjMwNDk4ZjBkYTM3MWI2MGExY2QzMGVkMTcyZGZjNzNiZDI4NzU5MTc5OGUzZTVlIn0" + "resource": "repo://libs/partners/anthropic/langchain_anthropic/chat_models.py#L1-L100", + "version": "repo-lines-v1:sha256:502f993a9d1ac1ea937c1ce25d63c38881cddb2c93d12d3c9a2ced5efe626fa0:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAwLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIxNTBhNDllZmI2N2JmMzZhNTk4OGExOGYwZTEzMDQ3NDBjMDY3NTRhYWIzMzMwNWIxZDE3ZTkxY2NiMWYyODhmIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJkMzI4MzRhYWZiNmI4NTkzNmRhZjQwN2E2N2I4OTdkMzVhMzRjZDJkNTFiMmYxNzgyNWUzZjJkNWQ1NTJjNTRhIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MCwicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJmODRkYWFlMzc5NzhjOThhODI2NTRjYWMyMzVmYjk2YjlhMmEwMDM1M2Q1ZDIzYjZlOWFjYTNmNjFhNDVlOWQzIn0" }, { - "resource": "repo://libs/partners/anthropic/pyproject.toml#L25-L71", - "version": "repo-lines-v1:sha256:497ea4c7368c7ec03e721e9b4edd0ad3720565bd66e4d43aa4e75025305d8bca:eyJzZWxlY3RlZExpbmVDb3VudCI6NDcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFkOTVmNWU5ZWRlMDE4MTYwNDNjMDc5N2FjZThkYTJhYzRlOTlhOGE2YTYxMGZhOTg1NzBlZjM0YjkzNTYxMDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM3ZmUwMjFkZWU4YWRkY2MzZjFmNWUyOTdmM2FlNjhlZjM2MTg0MTg2ZTZkNDA4OTFlMTExZmFhYTMzMzUyMjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjBiNzNjMzMyMmYyN2NkM2E5MTNiMjY4ZjliNThlMzBiZDU3MzMxNTA5NzI4ZGYwNzU2OGIxMWM1OTEyZTZlZGMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjU3OGYwNmRkZWNjMGE3NzdiODYzNTZmMTE4OTQ1ZjdjMWM4YWM2MWEwMTk4MTEyMTZkNWNjOWJjYmE1ZmNjMjcifQ" + "resource": "repo://libs/partners/anthropic/pyproject.toml#L25-L72", + "version": "repo-lines-v1:sha256:568cbb86fa055d50b6a7c0168021c9642c894de7dee0a929bb3c2375888a966a:eyJzZWxlY3RlZExpbmVDb3VudCI6NDgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFkOTVmNWU5ZWRlMDE4MTYwNDNjMDc5N2FjZThkYTJhYzRlOTlhOGE2YTYxMGZhOTg1NzBlZjM0YjkzNTYxMDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA0ZTc0YTU5M2NiMGU4YWRhNGNkMDg2NWRhZTQwMjhhZDkyMDhlNjgyMjUwN2Q5ZTI4ODRhOTBjZDdjZTBhZDkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjIyNDY1MzUwMzMwMjA1Mzk2MjAxZjUzNWZlYTUwZDQ2ZGYwZjM5OWNiMGY3NjFhZTY1NTg0N2ZiMTNhYTg2OTgifQ" }, { "resource": "repo://libs/partners/openai/langchain_openai/chat_models/__init__.py#L1-L6", @@ -100,7 +100,7 @@ }, { "resource": "repo://libs/partners/openai/pyproject.toml#L25-L82", - "version": "repo-lines-v1:sha256:85b9044ae1f60a626d0fa52a602b424571f92cc42d6d46237d7590bc73be5ac4:eyJzZWxlY3RlZExpbmVDb3VudCI6NTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFkOTVmNWU5ZWRlMDE4MTYwNDNjMDc5N2FjZThkYTJhYzRlOTlhOGE2YTYxMGZhOTg1NzBlZjM0YjkzNTYxMDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM3ZmUwMjFkZWU4YWRkY2MzZjFmNWUyOTdmM2FlNjhlZjM2MTg0MTg2ZTZkNDA4OTFlMTExZmFhYTMzMzUyMjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI4YTIzZWVmMWY4MDkxZjM0OTE1MjQ3OTliNTVkMmNjZDUyYWU3OTYyZDJkY2MwOGYxM2ExNDk0ZWNkNmMwOTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjU3OGYwNmRkZWNjMGE3NzdiODYzNTZmMTE4OTQ1ZjdjMWM4YWM2MWEwMTk4MTEyMTZkNWNjOWJjYmE1ZmNjMjcifQ" + "version": "repo-lines-v1:sha256:bb5087680131e07788c1dad0f3b8e375bf611868ea89c026abd07dd8be80cb8b:eyJzZWxlY3RlZExpbmVDb3VudCI6NTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFkOTVmNWU5ZWRlMDE4MTYwNDNjMDc5N2FjZThkYTJhYzRlOTlhOGE2YTYxMGZhOTg1NzBlZjM0YjkzNTYxMDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM3ZmUwMjFkZWU4YWRkY2MzZjFmNWUyOTdmM2FlNjhlZjM2MTg0MTg2ZTZkNDA4OTFlMTExZmFhYTMzMzUyMjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjI1MzhmNDY1OTFiN2ZiODczY2E5YWQzYmQ0YzlkOThlMzU3YTc3ZjE0OTY0ZjJhNDg2YjNjM2JhOTI2NmNlZTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjU3OGYwNmRkZWNjMGE3NzdiODYzNTZmMTE4OTQ1ZjdjMWM4YWM2MWEwMTk4MTEyMTZkNWNjOWJjYmE1ZmNjMjcifQ" } ] }, @@ -157,6 +157,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/prompts.json b/openwiki/.claims/prompts.json index 92002eef6c..3da597013c 100644 --- a/openwiki/.claims/prompts.json +++ b/openwiki/.claims/prompts.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:479c5428fb5c4d5a6a9cb84f2f11bf8a578e6af0b1f5e1208f47fa98d0f563df", + "pageVersion": "sha256:5d1117f1ebf618a2351f93e0390b6c54e3be6de8e0565482db74e2b370d8590f", "claims": [ { "id": "claim_06ad6af0140b4318b25f43272f89e77f", @@ -179,6 +179,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/quickstart.json b/openwiki/.claims/quickstart.json index f2282763a4..71a85f3da2 100644 --- a/openwiki/.claims/quickstart.json +++ b/openwiki/.claims/quickstart.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:6585fb7a1172592cbaf6a865841096f09424e36447d24d244974094163c16746", + "pageVersion": "sha256:327ee3328a1c9139a10f8880f81156482ec4dc5f1ae127bd8d48ef840eed38ba", "claims": [ { "id": "claim_7425c73f5e4c4667b8babba66c3663a0", @@ -12,11 +12,11 @@ }, { "resource": "repo://libs/langchain_v1/langchain/__init__.py", - "version": "repo-file-v1:sha256:56c4a355b80b98c270b27051036f19ab2b81c58fdecbc1539f76b4ad7a92ff6d" + "version": "repo-file-v1:sha256:f1b1753df8bc91613d3309e2dc261ab8e5880e0d44993cb2113f01ba93cbf13c" }, { "resource": "repo://libs/partners/openai/langchain_openai/__init__.py", - "version": "repo-file-v1:sha256:d08e06dea1f954a477fa8951e2a8387a10396d07b92a3a60fdced307c136a84f" + "version": "repo-file-v1:sha256:5673ccbe8f53267c2027dd390051424928a6e1e744c2f8c8a418960a29dccf4d" } ] }, @@ -30,7 +30,7 @@ }, { "resource": "repo://libs/core/langchain_core/language_models/chat_models.py", - "version": "repo-file-v1:sha256:a2c769b852868ee63985025e519a25bb988b8c987f5958033c7c97d832a70d11" + "version": "repo-file-v1:sha256:7377a3e0d534d6fe9835cb35e39fc2bf7614ae2be26eb5664a0767dfb002cb03" }, { "resource": "repo://libs/core/langchain_core/messages/__init__.py", @@ -78,7 +78,7 @@ "evidence": [ { "resource": "repo://libs/partners/openai/langchain_openai/__init__.py", - "version": "repo-file-v1:sha256:d08e06dea1f954a477fa8951e2a8387a10396d07b92a3a60fdced307c136a84f" + "version": "repo-file-v1:sha256:5673ccbe8f53267c2027dd390051424928a6e1e744c2f8c8a418960a29dccf4d" } ] }, @@ -162,7 +162,7 @@ "evidence": [ { "resource": "repo://libs/partners/openai/langchain_openai/__init__.py", - "version": "repo-file-v1:sha256:d08e06dea1f954a477fa8951e2a8387a10396d07b92a3a60fdced307c136a84f" + "version": "repo-file-v1:sha256:5673ccbe8f53267c2027dd390051424928a6e1e744c2f8c8a418960a29dccf4d" }, { "resource": "repo://libs/standard-tests/langchain_tests/__init__.py", @@ -183,6 +183,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-29T08:28:34.635Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/runnables.json b/openwiki/.claims/runnables.json index b1dc714849..50d623dc10 100644 --- a/openwiki/.claims/runnables.json +++ b/openwiki/.claims/runnables.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:63c281f9b8fd8ffc2ad68e300601c05fb591f640021b20b792942a4702f0f776", + "pageVersion": "sha256:a524dbeefdf1c2a2c12980bcf02c20e9aa0756f401fd8e786e994363be361bd4", "claims": [ { "id": "claim_c00f8ff82e09494a9cdfb9149dda319c", @@ -44,25 +44,25 @@ }, { "id": "claim_1be267e88ee646bb91d7c39ccd0ad127", - "statement": "RunnableBranch selects one branch based on condition evaluation and RunnableRetry adds retry logic with exponential backoff, while RunnableWithFallbacks tries fallback runnables sequentially on failure; these enable error handling and conditional control flow.", + "statement": "RunnableBranch selects one branch based on condition evaluation and RunnableRetry adds retry logic with exponential backoff and jitter, while RunnableWithFallbacks tries fallback runnables sequentially on failure; these enable error handling and conditional control flow in chains.", "evidence": [ { - "resource": "repo://libs/core/langchain_core/runnables/branch.py#L43-L290", - "version": "repo-lines-v1:sha256:77b53fbabf2bdae2e052b15b90650cf13e0e2d73221231eb5f782f4a5b5445ed:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQ4LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJhMWIxNzY1NTk3Nzk0MDIzYzI1ZGNhOTMzMGQ2MDQ5NTQ3MjkyNzMwY2Q2MGVmZWE4YjVhZDljZTM4ZmY0NDliIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlOWMwNDUwMTVhMDNhZjc2Mjk2MzRlMDZlOWJlM2Y4OGIyNDI2YWI1YTM3ZmU5MGIyODJiZThmN2YxY2Y3N2RmIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIwYzExNTkyYTEzMjczNWJlODI0OTA4OWQ3MWFhMGJlN2VmNmQ2MDQ5MjczNDQ4NDM0YTI4MmJkNGQ1NTBlMDM5In0" + "resource": "repo://libs/core/langchain_core/runnables/branch.py#L43-L457", + "version": "repo-lines-v1:sha256:24324443e8f8ac34f3d5aebc43f4703de91e12b81b28f644a79e7ecd813d46b0:eyJzZWxlY3RlZExpbmVDb3VudCI6NDE1LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJhMWIxNzY1NTk3Nzk0MDIzYzI1ZGNhOTMzMGQ2MDQ5NTQ3MjkyNzMwY2Q2MGVmZWE4YjVhZDljZTM4ZmY0NDliIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI4MzYyNzFhODc0YTc1MzIzMTAzNjFmNjljZTM4YjFlN2NiZWRlNDRjMWY2MDMyYjYwNDM4MWMxYzNhOTg1N2Y5IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlOWMwNDUwMTVhMDNhZjc2Mjk2MzRlMDZlOWJlM2Y4OGIyNDI2YWI1YTM3ZmU5MGIyODJiZThmN2YxY2Y3N2RmIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MCwiZm9sbG93aW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1In0" }, { - "resource": "repo://libs/core/langchain_core/runnables/fallbacks.py#L37-L590", - "version": "repo-lines-v1:sha256:5a9f0c0e55d40ef5e37229535b9d3b42ed1860dee6a6511d13934e69d3f272c2:eyJzZWxlY3RlZExpbmVDb3VudCI6NTU0LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJmY2U5OTZhMzU2NWJjY2E4MDcwNzYwNDYzMWU2OTc4ZTYzOWZkMTkyYjE4NzRmMTliNWJjYzQxYWZmNTQwMGJlIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMzI0ZDkwNTM1YThiN2IwMzBmMzQyMDZmYjY5ODQzODMyY2UyOWY5NGY5Yjg0MDE1NDRlYmZhZWIxMGViODE0IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJiZWI5MWQ5NDFlNTA0MjVlYzdhOGUwYTIxZDJhNTJmYzVkOTkzOTFmNzliYjdjZjhlNTdjMjZlZjY5MjRlNzRmIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI1MGE3ODA3YzdjNjVkMDhkOGU3NmE0Y2Y3MTg4MDAyOGQ0NTUyMTM5YTU1NjY3OTRkMmI0ZjdhOGIzZWFmNWNmIn0" + "resource": "repo://libs/core/langchain_core/runnables/fallbacks.py#L37-L600", + "version": "repo-lines-v1:sha256:ef33641cfbc6ca0aa6451ced7e366f194b6dcd4fa3c36591610b103076e4f127:eyJzZWxlY3RlZExpbmVDb3VudCI6NTY0LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJmY2U5OTZhMzU2NWJjY2E4MDcwNzYwNDYzMWU2OTc4ZTYzOWZkMTkyYjE4NzRmMTliNWJjYzQxYWZmNTQwMGJlIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIxMWE0NTUyOWY4MTY5MmIzOGRmNDI4ZjVjOTQ3YmE2YTZjMGMxNGM5MWQ5NGQ0ZDc5MThhNGY0ZjA4MDgzZjRhIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJiZWI5MWQ5NDFlNTA0MjVlYzdhOGUwYTIxZDJhNTJmYzVkOTkzOTFmNzliYjdjZjhlNTdjMjZlZjY5MjRlNzRmIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI3OGQ3Y2RlYmNhNTQ1YWVhNTJjZTNiYWU2ZjdjYTI0MjJmNGIwYmY3NjMwNzE0NGZiZjc3NDI2Yzc2MzQ0M2RkIn0" }, { - "resource": "repo://libs/core/langchain_core/runnables/retry.py#L48-L379", - "version": "repo-lines-v1:sha256:1b700122b4e165b35c1cd4ebb40cf1f94cc295b88b3cd0fddce894867cb3a9cd:eyJzZWxlY3RlZExpbmVDb3VudCI6MzMyLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJjZGUzZTljM2Y2MWE5NGFhNDczNmNlM2Q5NmY3YzAwMTI0NTc0ZmYxZGNlYWU0OTc1OGFiNTAzZTA5YzE5NDhhIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwYTU1MzRjMGZhOTgzZDdjYjE5Nzc4ZTFlNmNkZDM1ZGE3NzMwOWVlZjY0Yjc4ZGFlN2ZhODZhNGYyNGE2N2RjIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI4Njk4NWE0NmYyN2U0YTUzNmVkNzhhY2QyOTgyNjRhM2IyODZhMzUxNTcxMzk3MTQyYWQwMjc1OTNlMWI1MGRhIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MCwiZm9sbG93aW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1In0" + "resource": "repo://libs/core/langchain_core/runnables/retry.py#L50-L383", + "version": "repo-lines-v1:sha256:80697f4e6f6920921b133ef7ee35f827aa2837837a30f7a8d276c5ee326075ab:eyJzZWxlY3RlZExpbmVDb3VudCI6MzM0LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJjZGUzZTljM2Y2MWE5NGFhNDczNmNlM2Q5NmY3YzAwMTI0NTc0ZmYxZGNlYWU0OTc1OGFiNTAzZTA5YzE5NDhhIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI1OTA5YTUzYTYxOGQwMjhlMWQzMDAwYzBhN2FiY2VlY2JlNWZiMzdmNGU1MTFlZmU0NjY0M2ZhZDZlNjY4NzJmIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI4Njk4NWE0NmYyN2U0YTUzNmVkNzhhY2QyOTgyNjRhM2IyODZhMzUxNTcxMzk3MTQyYWQwMjc1OTNlMWI1MGRhIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI2NTlmYWY5YjI5NDg3MDA5NDczOTNmNzE4YzJhM2Q2N2U4OGI2OTdjMDVhZmVhYTA2ZDc2NjdlMDcyMGRiNDQ3In0" } ] } ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/source-map.json b/openwiki/.claims/source-map.json index fdbc6da28f..bdec2615fd 100644 --- a/openwiki/.claims/source-map.json +++ b/openwiki/.claims/source-map.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:adec3cd933f5d85a378acc68a23f5f2251c4fbdd90ad0cb72dbb7b21df531c03", + "pageVersion": "sha256:bba823e5a60183d630934876977d0890edfd8ecb024ef928870cd073e69eeac7", "claims": [ { "id": "claim_c71edae5b0f64c8fa79c17ef1aca0f6b", @@ -28,7 +28,7 @@ "evidence": [ { "resource": "repo://libs/core/langchain_core/language_models/chat_models.py", - "version": "repo-file-v1:sha256:a2c769b852868ee63985025e519a25bb988b8c987f5958033c7c97d832a70d11" + "version": "repo-file-v1:sha256:7377a3e0d534d6fe9835cb35e39fc2bf7614ae2be26eb5664a0767dfb002cb03" } ] }, @@ -48,7 +48,7 @@ "evidence": [ { "resource": "repo://libs/core/langchain_core/runnables/base.py", - "version": "repo-file-v1:sha256:35840ef0581e472f34bb15d172ea90ed8e35aaf447a4e6d0104df97cca5dd8d0" + "version": "repo-file-v1:sha256:4cdcf9f699860ef49c02fe75339cdd8f302f050fa108b625f9a18d84cf3367ba" } ] }, @@ -58,7 +58,7 @@ "evidence": [ { "resource": "repo://libs/core/langchain_core/tools/base.py", - "version": "repo-file-v1:sha256:259da69b2ca5e171f4cc58acec2190352e7091f4d96a20158ce51feed4a78a02" + "version": "repo-file-v1:sha256:a2f7b4f18aaa3f6db1399f224f6303691cb46ac3b9ba36bf1aa87704a504edd1" } ] }, @@ -98,7 +98,7 @@ "evidence": [ { "resource": "repo://libs/partners/openai/langchain_openai/chat_models/base.py", - "version": "repo-file-v1:sha256:5d1eeed0593e3bd6c199b08a0a75ad74f2e1ae70eafaf423faf58fe32e7e9ede" + "version": "repo-file-v1:sha256:d8d23495e729779f3e8d96a158104d2b326c6588509ca8f1fca1bdde0a5da434" } ] }, @@ -164,31 +164,31 @@ }, { "resource": "repo://libs/core/pyproject.toml", - "version": "repo-file-v1:sha256:f2e32a43158f1a189ce6d1941ab80ba4bd2069c2f4e8018f026e9c7ce011634c" + "version": "repo-file-v1:sha256:cbf42626e903c72623f91808ca89a0aa93ead4e0bdf3d9240212be6485625e2f" }, { "resource": "repo://libs/langchain_v1/pyproject.toml", - "version": "repo-file-v1:sha256:7d66e582e815b6daed6df16445381ec6ff42b79855878c50207fb7a010f53203" + "version": "repo-file-v1:sha256:6f07e1f2db1b7d469d12aa6d517022005dd739cbd52cdda90b61bceb89d5dd1a" } ] }, { "id": "claim_458d709b604149fa8fb9639025882358", - "statement": "LangChain uses a three-layer architecture: langchain-core (v1.6.5) for base abstractions, langchain (v1.4.3) 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.10) for base abstractions, langchain (v1.4.5) 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:f2e32a43158f1a189ce6d1941ab80ba4bd2069c2f4e8018f026e9c7ce011634c" + "version": "repo-file-v1:sha256:cbf42626e903c72623f91808ca89a0aa93ead4e0bdf3d9240212be6485625e2f" }, { "resource": "repo://libs/langchain_v1/pyproject.toml", - "version": "repo-file-v1:sha256:7d66e582e815b6daed6df16445381ec6ff42b79855878c50207fb7a010f53203" + "version": "repo-file-v1:sha256:6f07e1f2db1b7d469d12aa6d517022005dd739cbd52cdda90b61bceb89d5dd1a" } ] } ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-29T08:28:34.635Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/streaming.json b/openwiki/.claims/streaming.json index a14801c226..c258feed2e 100644 --- a/openwiki/.claims/streaming.json +++ b/openwiki/.claims/streaming.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:48ea385d8432c2a0ff1d100837e0ca311a3ea341fe2963834d7c8eec9590d019", + "pageVersion": "sha256:3e004e39807784341f25e3fcf7502c4d0640d15e766fada985ab2ecca4d19043", "claims": [ { "id": "claim_87d5d462354440a7bccb6dbe992c60d3", @@ -201,6 +201,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/structured-output.json b/openwiki/.claims/structured-output.json index 604768197d..6ddb2ca198 100644 --- a/openwiki/.claims/structured-output.json +++ b/openwiki/.claims/structured-output.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:f21e3e28f4b0f6a2e1676685bc07733d58f0c614276dc01afd01919fa0c76167", + "pageVersion": "sha256:e73fbba294c6a74e1cfbd3eea75bd2b6d8e03f149b94501e87f9b524a37e17de", "claims": [ { "id": "claim_150a5dc8a9c14fc19c3597a746649ba0", @@ -197,6 +197,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/tools.json b/openwiki/.claims/tools.json index 8061dac5d1..ecf439ad17 100644 --- a/openwiki/.claims/tools.json +++ b/openwiki/.claims/tools.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:6d374dc19fc3e275ddb3c6c5f639ddf83e7304cc9f64e70f5096f9a137f28e6e", + "pageVersion": "sha256:f4fe732c0b9dff529c4cd900eab031c90dd8bb2fc3e48bb48ae2d0d6332fd8a8", "claims": [ { "id": "claim_72f3312a1c4a494889542dc6efdbf940", @@ -63,16 +63,16 @@ "statement": "Tool execution via run() and arun() follows a lifecycle of configuration merging, input parsing with _parse_input() and _to_args_and_kwargs(), injected argument re-injection, function invocation within callback context, ToolMessage formatting if tool_call_id provided, and error handling per handle_tool_error and handle_validation_error configuration.", "evidence": [ { - "resource": "repo://libs/core/langchain_core/tools/base.py#L1009-L1135", - "version": "repo-lines-v1:sha256:059b4e3df79409c57dad310dd370fef936b4aa587fb63db8ad5cb88235049b94:eyJzZWxlY3RlZExpbmVDb3VudCI6MTI3LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIwMDhjZDk3OTY5Yjk0ZjdjYWJkOWFiODUyY2RlY2RjOWNlOTllNTJkNzJlYzFjZDE4YjhhZWNhMjlhOWUyYmUyIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI4MjBlN2JiNmFkMzZjNjE5YWIxZjJiM2MyYjQzNTVjNjFlNWI1NTc3MmM4MmU2NGU1YmVkZmZkZDQ5YzQzNzMxIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI0ZDg5MjM5YTEwYTAwMTRmMjM0ZTE3MjM3NWQxMWZkZWFmNjdjNWFhNzJjZjFkYTMzMjMxMWQ3NGJiNjEwMTBhIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJjMTIxMzUwY2E0NmI3Yjc0OWVkZTdlYTBhNmFhYmQ1ZGFjYWNmYmJkMTdmOGRkZTZjMjZmMmRkN2UyN2IxYjkxIn0" + "resource": "repo://libs/core/langchain_core/tools/base.py#L1047-L1135", + "version": "repo-lines-v1:sha256:472a29de2ca12f49917b1e100c68b3f65b2cf72aa578cae0d82d89f7f68f6bf2:eyJzZWxlY3RlZExpbmVDb3VudCI6ODksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhhM2Y5Y2JlMDE5ZjA4NjIzMzc0ZDQxYTdmZmViMzlhYTVmYTBjODI2MTVhNzVmZDc4YjdjZmI2MTA5ZmQ1MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgyMGU3YmI2YWQzNmM2MTlhYjFmMmIzYzJiNDM1NWM2MWU1YjU1NzcyYzgyZTY0ZTViZWRmZmRkNDljNDM3MzEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVmYjgzNTdlYmU5Mjc1ZjA4MGIwNjQzZmQ1MWJiNjEzNDE2MzE1MTdlNWFjNzFkYTZiOTRjZDUyZmJhMTEyMDYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMxMjEzNTBjYTQ2YjdiNzQ5ZWRlN2VhMGE2YWFiZDVkYWNhY2ZiYmQxN2Y4ZGRlNmMyNmYyZGQ3ZTI3YjFiOTEifQ" }, { - "resource": "repo://libs/core/langchain_core/tools/base.py#L1137-L1267", - "version": "repo-lines-v1:sha256:854816111f0fb475b9f84e2bc52f8f88e9c26c40b84501fd02508b5f90ce9290:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMxLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI5ODg4Y2RmM2VjMDJlMzlhNjkwZWFiZTY2MzYzMjE2Yzc5MWZiYWU4Yzc5NjllM2VjYmY3ZGVmN2YyY2Y2NzYzIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI0ZWVmNTIxMTkxYWNjMzY2NDcyMzI3MDk0NjZiOGY0ZDhhYjk3YTgwZjI5NDE2Y2UxYjY5MmYxNTQ0OGRiZmY3IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI1OTczOTkzMWU5NWZjNTZmNDE2MWE3YjI4ZjYxZTQ1ODE4MGQ1OWNjNWNjNWIwYzcyNDczOTdiMWRkYzM4MDczIn0" + "resource": "repo://libs/core/langchain_core/tools/base.py#L1175-L1266", + "version": "repo-lines-v1:sha256:abe1246fbcd7e069cd5aae58ed8c152578905c0f0be9e304712776a172ad4981:eyJzZWxlY3RlZExpbmVDb3VudCI6OTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1ZWQ2NzkyYTdmNzVlZmNkYzU4NzkxMDJjOWE5YmRmZjE4ZTkxMzg3N2FkNTY3NWFmYjI1ZDllZDIyMDkxMTMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgyMGU3YmI2YWQzNmM2MTlhYjFmMmIzYzJiNDM1NWM2MWU1YjU1NzcyYzgyZTY0ZTViZWRmZmRkNDljNDM3MzEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVmYjgzNTdlYmU5Mjc1ZjA4MGIwNjQzZmQ1MWJiNjEzNDE2MzE1MTdlNWFjNzFkYTZiOTRjZDUyZmJhMTEyMDYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU0N2NhNTAwMzhhMDc0Yjk0MzA4Yjk5N2QxYzM5YTJkMTkxYmM1Y2RlNWIyNjNjNzEyMTQ5NGRhZTg2MzViMTEifQ" }, { - "resource": "repo://libs/core/langchain_core/tools/base.py#L778-L906", - "version": "repo-lines-v1:sha256:04f6f62a960788f753ff83bee3995df9648ff89bc098bfb6acac65b701821bec:eyJzZWxlY3RlZExpbmVDb3VudCI6MTI5LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI0NmQ0ZjFiZmY3NDNjZjQzOTA5MTIyYzM2NGE0OGFkMGNmNjliMjQwZDI1ZDI4NjMxY2JkZDg5YzhiNjFkZTRmIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJiODEzMTQ0MmE3ZTU3MDgyZGFjN2MyZDZkNjliM2M1OGFkYTY1MWQ2NGQzNzNkZjRhMjU3NjliYWQ2NWEyNjA4IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiIyMWQzMDhjYWMzMDI2YThlMjgwYjhhNmRhN2EyY2Y3YTQ3OGQzYTg5OGI5ZGEzNDE4MWZlOTIyNTZiY2ZlMjIwIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJjN2YzMzFhYzgwNDBmMjU3MjQ0YjZmNDRlNjYyNmVhYmU0ZDk0ZTVjZjcyZTNmMjI5MDRkN2I2MDQxZjJjYmIzIn0" + "resource": "repo://libs/core/langchain_core/tools/base.py#L970-L1008", + "version": "repo-lines-v1:sha256:57579819aff142426f6b65f6891787e6bba66ee2e2cd82ea4e49a07b5c65f6f6:eyJzZWxlY3RlZExpbmVDb3VudCI6MzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAzNmU5YjNlMzRhM2Y1MDU1ZTRjMzYzZDZhMDgzNWRlNzY1OTJhMTMwN2Y0ZDMyZjcwMGU3MDRiYjNlNGE0YjgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI2YTU0YTJkMzJjNjAzMDA2MzFiOTUzZDZiMWUwZGRkMjg5MWM3YjdjNDk3NzFhYmRhNjM1NWJmOWVkOWNjMDUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdlZDUyODk5YTQyMTdhODE3ZjZjMjIxNzIzOTVhZDc0ZjMwZTdhMDI5ZGVjOTg2M2MzZmQzZjMyNDZmZmI3NmQifQ" } ] }, @@ -86,7 +86,7 @@ }, { "resource": "repo://libs/core/langchain_core/tools/structured.py#L93-L186", - "version": "repo-lines-v1:sha256:e6e8e5ab99b794875b0596a1326b0f368375525e5ec9b29633f590cb20ea1744:eyJzZWxlY3RlZExpbmVDb3VudCI6OTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYwNGEyZmU0N2EzYTE0MzZkZGMwMWQ0ZTE3YWU4ZjhhZjBjYjNjYTY2ZTQ1NmU4N2VkODQ1ZjU4YjYwYTA2ZjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU0YzE2NjhlYzljZjAyZjcxYjY5YjUyMzg5YTUzYjNiZjU2ZDNiOWJlYmUxNWNlM2UxMGJiZDczNWY1ZWFjNjEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZiYzU3OWMxM2QzZTY4YzQ0ODUyOGZlYWMyYWUyNjE0OTI0OWQ0NDdkY2I3Y2VmMjU4ZmU4Mjk2YzgxOTUxMjUifQ" + "version": "repo-lines-v1:sha256:74c39bf0ebcb6d8ee7bd414a795d17701b688ed82da6e05bb81fe110e1cf077e:eyJzZWxlY3RlZExpbmVDb3VudCI6OTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYwNGEyZmU0N2EzYTE0MzZkZGMwMWQ0ZTE3YWU4ZjhhZjBjYjNjYTY2ZTQ1NmU4N2VkODQ1ZjU4YjYwYTA2ZjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU0YzE2NjhlYzljZjAyZjcxYjY5YjUyMzg5YTUzYjNiZjU2ZDNiOWJlYmUxNWNlM2UxMGJiZDczNWY1ZWFjNjEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZiYzU3OWMxM2QzZTY4YzQ0ODUyOGZlYWMyYWUyNjE0OTI0OWQ0NDdkY2I3Y2VmMjU4ZmU4Mjk2YzgxOTUxMjUifQ" } ] }, @@ -165,16 +165,16 @@ "statement": "Injected arguments via InjectedToolArg, InjectedToolCallId, or ToolRuntime annotations are excluded from tool_call_schema, identified via _get_injected_args_keys_from_signature(), re-injected during _parse_input() from tool metadata or invocation context, and filtered from callback inputs via _filter_injected_args().", "evidence": [ { - "resource": "repo://libs/core/langchain_core/tools/base.py#L1617-L1677", - "version": "repo-lines-v1:sha256:dcab87fe71f4a411f9d524cd735c89ab16217f98395dcb732ebf6f12833dda41:eyJzZWxlY3RlZExpbmVDb3VudCI6NjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEyMTY5NWVjZjVjN2UzY2NjYjcwOTExMzA4ZmUzMjlmNzAyMjBmMDVlMGUxZTA1Zjk4OWU2OGQ0MmY4MWM0ODgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjliOGNiZjRkNWU4MGJiZTVlNDhjNTdmNGZjYjczNTY3M2Q2MDc3NDBiNDJhN2FiNmM5MjM2ZTM3MmE5ZjUzZTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFhNTQ5YzAyZmNlMGQ0OGZiYTdmOWJiOWUwNjBkZWVhM2M2NDk4MjkwYzA3YTc5MjM4ZDZiMDVlNGVjN2RkNjMifQ" + "resource": "repo://libs/core/langchain_core/tools/base.py#L1618-L1676", + "version": "repo-lines-v1:sha256:fdadaa5c20d25d41d0c73e201c255280ff28ab1bb8313f43ba264ab45c0d904b:eyJzZWxlY3RlZExpbmVDb3VudCI6NTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZhNzkyNWZmZTI4ZTQzNjBjYjg0ZmNkZGIxZTY3ZDg5NDAyMzczOTM5MmY0OGVkNTIwMjZlNDUwYmM3ODg0Y2UiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM3YmU0ZDkzMzE5OWZhZTM3OGFjYjg4ZDg5ZjE4YjVhNTVjMTEwNDk4MzA3ZjBiMzZiNDg4NjNjYTljMDg5MjQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVlMGZkOGE4NDM0OTU0MmE3MTNkNDMwY2IzMzkxMWE2ODIzNGVmNzdlMjg5NTlhMDdjYmVmMGZhNGEzYzFlZWIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjM1MDVjMmYyNGQzOTM0ZDc3Y2VhNTQxZWQwNTgxZWVjNmZhODA1MzBlMTg2YjBiZGUxODM5NTc2M2FmYzc3YTAifQ" }, { - "resource": "repo://libs/core/langchain_core/tools/base.py#L889-L906", - "version": "repo-lines-v1:sha256:b2e83b0b3bcb95fc5a63d147e373b195ea832440fcb5cecad373b0acb51f88b6:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM1OTU0ODBjMDk1NjhmODkyY2JlNzI5ZjdkZjBiNWJlYzMyMjk5YjczYjNjYTQ4ZWQ2MjhmOTExNmY3YjNmZWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI4MTMxNDQyYTdlNTcwODJkYWM3YzJkNmQ2OWIzYzU4YWRhNjUxZDY0ZDM3M2RmNGEyNTc2OWJhZDY1YTI2MDgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA5YWUwMmE1MjBmZjdhYzVhMGZhYWUzM2YwMmZhNmFmMDFlNWZmYTM5Y2VkYWE0YmE4ZDRhNGIzYTQyYzFhNzkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM3ZjMzMWFjODA0MGYyNTcyNDRiNmY0NGU2NjI2ZWFiZTRkOTRlNWNmNzJlM2YyMjkwNGQ3YjYwNDFmMmNiYjMifQ" + "resource": "repo://libs/core/langchain_core/tools/base.py#L779-L906", + "version": "repo-lines-v1:sha256:bb354cfb46604b1a06006019bb04423215b8adeb86fd1ea6bdf4756449488c90:eyJzZWxlY3RlZExpbmVDb3VudCI6MTI4LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJjYWRkNDk2YjI0YTI0NTMxMWQ4M2QxZTFlMjI3Mjk0MWQwM2NiM2JlMmUzMTU1ZDgyZjI2MjM4ZTI1NzRmMmI5IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJiODEzMTQ0MmE3ZTU3MDgyZGFjN2MyZDZkNjliM2M1OGFkYTY1MWQ2NGQzNzNkZjRhMjU3NjliYWQ2NWEyNjA4IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJhNjE4NjFiYjRiMjNkMzJlNTQ2ZTI4YzMzYzVhYjUwY2JjMmFlODU1ZTY4YTdmYjBiY2ZkZDhkYWNlNWI4Y2IxIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJjN2YzMzFhYzgwNDBmMjU3MjQ0YjZmNDRlNjYyNmVhYmU0ZDk0ZTVjZjcyZTNmMjI5MDRkN2I2MDQxZjJjYmIzIn0" }, { - "resource": "repo://libs/core/langchain_core/tools/base.py#L934-L969", - "version": "repo-lines-v1:sha256:305049d91b4db5ab081bd739dd9ccbaff19928e8b2b5cbea83ab799e52278299:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZmMDc5ZjYxZTBkYmVhYjliNTI1ZmM4ZDEzY2RmZGU1YTQzZjhiM2NjOTg3MmFmNDI5MmY1ZmMzNGUyMmM5YmUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI3NDQ3NWZhMzFkNTNkNWIxMmNlZmE0ODE5MmE1OGY1YjA1NGRkOTkzOGI3MjMzYWI5OGU1YzU2ODQ4ZGY3YjQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMyYjA5YzMzMTVjMDYyNTZiMjZlZjIyM2E3OTFiYWFmMzYzMjU0NjY3ZDI0MTJmNzU1NWY2ZmJmNGIzYWVkNGYifQ" + "resource": "repo://libs/core/langchain_core/tools/base.py#L934-L968", + "version": "repo-lines-v1:sha256:9c957ccf11b9e761c60599354c52a06085fbaa680c74534b7be4720987c60a75:eyJzZWxlY3RlZExpbmVDb3VudCI6MzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZmMDc5ZjYxZTBkYmVhYjliNTI1ZmM4ZDEzY2RmZGU1YTQzZjhiM2NjOTg3MmFmNDI5MmY1ZmMzNGUyMmM5YmUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiMzI3YzY4YTEzZDc5YTdiODUxZTJjNjQyNjRlMmVlMmRmMDdjOTU3OTVlNTEwZTBlMmZmMTNkM2EwMmFhMDAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI3NDQ3NWZhMzFkNTNkNWIxMmNlZmE0ODE5MmE1OGY1YjA1NGRkOTkzOGI3MjMzYWI5OGU1YzU2ODQ4ZGY3YjQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxNGJkYzY0YWVlMDcxYmJiY2VkNTYxZWE4MDM4MDQzNjQ2NWJiZTAzNWY0YWZlNjIwMjA4ZjMyYjhjNzViOWEifQ" } ] }, @@ -215,6 +215,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.claims/unit-tests.json b/openwiki/.claims/unit-tests.json index 8022362281..5261f7c59c 100644 --- a/openwiki/.claims/unit-tests.json +++ b/openwiki/.claims/unit-tests.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "pageVersion": "sha256:0b30f28f261bdfcaa70879e3939ef3edfa29912261c6ab720c39bd340ea91064", + "pageVersion": "sha256:cb4d736da514d28259e8d67cd5dc28b631525abe045536a728fcc0f6748488e0", "claims": [ { "id": "claim_bdde90f4e5f6413f8214fe7e80b66a9a", @@ -253,6 +253,6 @@ ], "verification": { "by": "openwiki/0.5.0", - "at": "2026-09-28T08:35:20.640Z" + "at": "2026-10-14T08:27:24.310Z" } } diff --git a/openwiki/.last-update.json b/openwiki/.last-update.json index 7f77924688..b3b6e050d3 100644 --- a/openwiki/.last-update.json +++ b/openwiki/.last-update.json @@ -1,7 +1,7 @@ { - "updatedAt": "2026-09-29T08:33:44.890Z", + "updatedAt": "2026-10-14T08:57:22.900Z", "command": "update", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", "model": "claude-haiku-4-5", "status": "complete", "language": "en" diff --git a/openwiki/.page-manifest.json b/openwiki/.page-manifest.json index 1dcf81af80..be1680dee3 100644 --- a/openwiki/.page-manifest.json +++ b/openwiki/.page-manifest.json @@ -2,165 +2,165 @@ "schemaVersion": 1, "pages": { "/openwiki/agent-execution.md": { - "pageVersion": "sha256:c36ed3bfa6acfdaf33179bd7cf4a4811864ccff80181c5c88b46227be3eacc14", + "pageVersion": "sha256:81264e686d67c7a4b08ba2d1980731154909cbb6657bc4ecb3920a03df40456f", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/agent-factory.md": { - "pageVersion": "sha256:a04138ae1db4de18f11689760a882c8412eab3e79b77dcabedd87303f75ae572", + "pageVersion": "sha256:fbb8827277ac542366a4898e635ce9a34e19af5a436e5f1a75da23ed97304def", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/architecture.md": { - "pageVersion": "sha256:4e5d2dc911c53cb5d796f0244aaee6dc3ae8591c91102231eb609ef62c10c4cb", + "pageVersion": "sha256:7091aa50ffc0302db10da76f28851336789bf1450a01de466128e6810d5c6113", "completedBy": "openwiki/0.5.0", - "completedRunId": "d9730aab-b719-4f36-ad67-8e1131782cd9", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/callbacks.md": { - "pageVersion": "sha256:08c495ccfb12ed0a79d3e0791c2a12f86cb4b7732c6de698b6b1a8bcc71b7718", + "pageVersion": "sha256:348f725c5c3feafcf7903b6e0e5146891feca698ce269723429c78e680fbbe89", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/chat-models.md": { - "pageVersion": "sha256:0cd7a2ec4f34f1d485e9a9337aa08d82714284546d8ce04609d9de1a0f58d76e", + "pageVersion": "sha256:c62620141d5f4676c15e369b90c60199538a87fd9e83bd78e2881d886153d6bf", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/ci-workflows.md": { - "pageVersion": "sha256:584d7590d927cbab7fd482a36eefe6d6e23c985471086ac9d270b7e2506ebb96", + "pageVersion": "sha256:6e61b448ea29ff9cea8b26db551f62724199fcfac3518c5bf37d3271ce0a784a", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/composability.md": { - "pageVersion": "sha256:08b16574d155fea41f84c89a32fa0f8c6c34fcf5a6f640ab81d2d0dd5f796884", + "pageVersion": "sha256:c58ab7c4d16cee547bf4250f067e943f861afcf009181b1af84182254e948441", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/dev-commands.md": { - "pageVersion": "sha256:0ec51ab0fa47477f5eb49c0577be6cd4558b283f0a678cd572dc0f65f65db57a", + "pageVersion": "sha256:5a07bb80f3e69723067219fecf1eda3ec6807a0c19eb98b0e5397285d259f2ea", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/integration-tests.md": { - "pageVersion": "sha256:7a27a082b6fe0666d7a3e17b00aac82017d7095d7cc66a084355eb8c5f47b347", + "pageVersion": "sha256:af5a49335ac9f3cd232d7df5ba927e90bfa67722cf5370c32c5ebc66ce68161d", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/mcp-integration.md": { - "pageVersion": "sha256:aa9e35da19127c337d9ca84bffab4b5b80d9cc78063469ee9a65827d4867d36c", + "pageVersion": "sha256:54a975d1802bfca8a160f86cb1d74464f33cf2e6afdfb4d07e5ecfa9b0b08967", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/messages.md": { - "pageVersion": "sha256:9a300b45af58ddf5b9c8a669d194b5ea592a85e27837e6b2066229dd7d924556", + "pageVersion": "sha256:496104cb138f76ea96a0f08f8e92dc1f206dc48a2c44dd5ca18a339db094a0ef", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/middleware.md": { - "pageVersion": "sha256:292ef3af03c17963611499165f6045b27db7700b522fb3d608fb027272c23f40", + "pageVersion": "sha256:21ceece9610c7b5294544a537361c31583e840416bb08ae692018822be9b2dbc", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/model-initialization.md": { - "pageVersion": "sha256:bd811dcc6b70cbe1b135d1ae06d5196272d0742d1df5c7491d4adfa89cf21a9a", + "pageVersion": "sha256:83e54c3c6b1a8cfeba8a475086654757006b936e4e50ce1a7de2c494bc278d27", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/openai-provider.md": { - "pageVersion": "sha256:05e90b9de166a5a7213cee462a99c10236b8c8eba605f2b5a856779baad552a6", + "pageVersion": "sha256:d107de765a91057a6bbfc414008f58d54389ab03a3b8606c1eb64424fd76a6e4", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/partner-pattern.md": { - "pageVersion": "sha256:b5987885a9e21b5c669db5477471ac853eb2514d5dba1d3d3d716f04037745ff", + "pageVersion": "sha256:0cafdc57a1ea39300467eb33a589bdd3fcf8cb839347904bcc673cb9ae2257b7", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/prompts.md": { - "pageVersion": "sha256:479c5428fb5c4d5a6a9cb84f2f11bf8a578e6af0b1f5e1208f47fa98d0f563df", + "pageVersion": "sha256:5d1117f1ebf618a2351f93e0390b6c54e3be6de8e0565482db74e2b370d8590f", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/quickstart.md": { - "pageVersion": "sha256:6585fb7a1172592cbaf6a865841096f09424e36447d24d244974094163c16746", + "pageVersion": "sha256:327ee3328a1c9139a10f8880f81156482ec4dc5f1ae127bd8d48ef840eed38ba", "completedBy": "openwiki/0.5.0", - "completedRunId": "d9730aab-b719-4f36-ad67-8e1131782cd9", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/runnables.md": { - "pageVersion": "sha256:63c281f9b8fd8ffc2ad68e300601c05fb591f640021b20b792942a4702f0f776", + "pageVersion": "sha256:a524dbeefdf1c2a2c12980bcf02c20e9aa0756f401fd8e786e994363be361bd4", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/source-map.md": { - "pageVersion": "sha256:adec3cd933f5d85a378acc68a23f5f2251c4fbdd90ad0cb72dbb7b21df531c03", + "pageVersion": "sha256:bba823e5a60183d630934876977d0890edfd8ecb024ef928870cd073e69eeac7", "completedBy": "openwiki/0.5.0", - "completedRunId": "d9730aab-b719-4f36-ad67-8e1131782cd9", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/streaming.md": { - "pageVersion": "sha256:48ea385d8432c2a0ff1d100837e0ca311a3ea341fe2963834d7c8eec9590d019", + "pageVersion": "sha256:3e004e39807784341f25e3fcf7502c4d0640d15e766fada985ab2ecca4d19043", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/structured-output.md": { - "pageVersion": "sha256:f21e3e28f4b0f6a2e1676685bc07733d58f0c614276dc01afd01919fa0c76167", + "pageVersion": "sha256:e73fbba294c6a74e1cfbd3eea75bd2b6d8e03f149b94501e87f9b524a37e17de", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/tools.md": { - "pageVersion": "sha256:6d374dc19fc3e275ddb3c6c5f639ddf83e7304cc9f64e70f5096f9a137f28e6e", + "pageVersion": "sha256:f4fe732c0b9dff529c4cd900eab031c90dd8bb2fc3e48bb48ae2d0d6332fd8a8", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" }, "/openwiki/unit-tests.md": { - "pageVersion": "sha256:0b30f28f261bdfcaa70879e3939ef3edfa29912261c6ab720c39bd340ea91064", + "pageVersion": "sha256:cb4d736da514d28259e8d67cd5dc28b631525abe045536a728fcc0f6748488e0", "completedBy": "openwiki/0.5.0", - "completedRunId": "ba665f2e-3417-4c76-8a2d-52fa91daba8a", - "gitHead": "78a3cbcc6b5e7e39fafda5d7b8df384a4a2c821d", - "sourceFingerprint": "sha256:d50db7c94f2654ae0b9c748b8c9d27d56d1e14c87caf5477cea351ed43057038" + "completedRunId": "52661eab-da8b-4541-aaf8-382fc4ae92f8", + "gitHead": "8ace87e7a6493d41d4c61bb41a637052367b27f3", + "sourceFingerprint": "sha256:98dfc56036a619816e9e8080218aeea129573b8a4d94dd92c18ee8f393762623" } } } diff --git a/openwiki/agent-execution.md b/openwiki/agent-execution.md index a0fca146cc..3fe40cd586 100644 --- a/openwiki/agent-execution.md +++ b/openwiki/agent-execution.md @@ -5,7 +5,7 @@ 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-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z sources: - id: openwiki-source-71e882e1ac9757ea8e959a7c resource: repo://libs/langchain_v1/langchain/agents/factory.py diff --git a/openwiki/agent-factory.md b/openwiki/agent-factory.md index a236c388df..dc96cb3138 100644 --- a/openwiki/agent-factory.md +++ b/openwiki/agent-factory.md @@ -1,8 +1,8 @@ --- type: "Reference" -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] +title: "Agent Factory and Graph Construction" +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, graph node composition, and middleware registration." +tags: [agents, factory, state-machine, middleware, langgraph, graph-construction] sources: - id: openwiki-source-71e882e1ac9757ea8e959a7c resource: repo://libs/langchain_v1/langchain/agents/factory.py @@ -15,7 +15,7 @@ sources: generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- ## Overview diff --git a/openwiki/architecture.md b/openwiki/architecture.md index 2e7957efd6..72d1ef7d5a 100644 --- a/openwiki/architecture.md +++ b/openwiki/architecture.md @@ -34,10 +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-29T08:28:34.635Z" } +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-29T08:28:34.635Z + at: 2026-10-14T08:27:24.310Z --- ## 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.3"] - User -->|may use directly| Core["langchain-core
(Base Abstractions)
v1.6.5"] + User -->|imports from| LangChain["langchain
(Orchestration & Agents)
v1.4.5"] + User -->|may use directly| Core["langchain-core
(Base Abstractions)
v1.6.10"] 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.5`): 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.10`): 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.3`): 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** (`v1.4.5`): 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.10,<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 8b19786f28..ad618b117c 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-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z sources: - id: openwiki-source-c9313cf42f0120d86b20245f resource: repo://libs/core/langchain_core/callbacks/base.py diff --git a/openwiki/chat-models.md b/openwiki/chat-models.md index 6d8ba9fb7a..fe941e780b 100644 --- a/openwiki/chat-models.md +++ b/openwiki/chat-models.md @@ -3,9 +3,6 @@ type: "Architecture" title: "Chat Model Interface and Lifecycle" description: "Document BaseChatModel protocol, input/output handling, streaming, and integration points with callbacks and model profiling. Covers the init_chat_model() factory, provider registry, and model instantiation." tags: [chat-models, llm-integration, streaming, structured-output, model-capabilities, model-initialization] -verified: - - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z sources: - id: openwiki-source-132f3183693cd9cf79d029a5 resource: repo://libs/core/langchain_core/language_models/base.py @@ -18,6 +15,9 @@ sources: - id: openwiki-source-c479d4fffee5cf62576699e4 resource: repo://libs/langchain_v1/langchain/chat_models/base.py generated: { by: "openwiki/0.5.0", at: "2026-09-28T08:35:20.640Z" } +verified: + - by: openwiki/0.5.0 + at: 2026-10-14T08:27:24.310Z --- ## Overview diff --git a/openwiki/ci-workflows.md b/openwiki/ci-workflows.md index c20acc150b..f7c8d2e39d 100644 --- a/openwiki/ci-workflows.md +++ b/openwiki/ci-workflows.md @@ -3,9 +3,6 @@ type: "Reference" title: "CI/CD Workflows: GitHub Actions and Release Process" description: "LangChain's GitHub Actions-based CI/CD system automating testing, linting, and release management across a monorepo with intelligent change detection, parallel matrix testing, and strict release gates." tags: [ci-cd, github-actions, testing, linting, release, pypi, monorepo, automation] -verified: - - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z sources: - id: openwiki-source-34e57b5a3a0c875639ab72a7 resource: repo://.github/scripts/check_diff.py @@ -32,6 +29,9 @@ sources: - id: openwiki-source-12805fbf767dc2a3e238645e resource: repo://.github/workflows/pr_lint.yml generated: { by: "openwiki/0.5.0", at: "2026-09-28T08:35:20.640Z" } +verified: + - by: openwiki/0.5.0 + at: 2026-10-14T08:27:24.310Z --- # CI/CD Workflows: GitHub Actions and Release Process diff --git a/openwiki/composability.md b/openwiki/composability.md index 5c2d851bb3..a1e93191e4 100644 --- a/openwiki/composability.md +++ b/openwiki/composability.md @@ -15,7 +15,7 @@ sources: generated: { by: "openwiki/0.5.0", at: "2026-09-28T08:35:20.640Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- diff --git a/openwiki/dev-commands.md b/openwiki/dev-commands.md index 25580e6e19..6ae8c0d90b 100644 --- a/openwiki/dev-commands.md +++ b/openwiki/dev-commands.md @@ -20,10 +20,10 @@ sources: resource: repo://libs/Makefile - id: openwiki-source-a6e669bb11f217c6fbd06670 resource: repo://libs/partners/anthropic/Makefile -generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" } +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- ## Overview @@ -34,18 +34,19 @@ The LangChain Python monorepo uses `uv` for dependency management, `make` for ta ### Install Dependencies -Each package in `libs/` has its own `pyproject.toml` and `uv.lock`. Before running tests or making changes, set up dependencies: +Each package in `libs/` has its own `pyproject.toml` and `uv.lock`. Before running tests or making changes, set up dependencies. From within a package directory: ```bash -# Install all dependency groups (lint, typing, test, dev) +# Install all dependency groups (lint, typing, test, dev, test_integration) uv sync --all-groups # Or install only a specific group uv sync --group test uv sync --group lint +uv sync --group typing ``` -The `--all-groups` flag ensures you have tools for linting, type checking, and testing. See the [Contributing Guide in AGENTS.md](repo://AGENTS.md) for detailed development conventions and PR guidelines. +The `--all-groups` flag ensures you have tools for linting, type checking, testing, and integration testing. See the [Contributing Guide in AGENTS.md](repo://AGENTS.md) for detailed development conventions and PR guidelines. ### Pre-Commit Setup @@ -69,10 +70,10 @@ pre-commit run ruff --all-files The `.pre-commit-config.yaml` defines hooks that enforce: -- **Standard validation**: YAML/TOML syntax checking, proper file endings, no trailing whitespace +- **Standard validation**: YAML/TOML syntax checking (with custom tag support), proper file endings, no trailing whitespace - **Text normalization**: Fix curly quotes and non-standard spaces -- **Per-package format and lint**: Each package in `libs/` (core, langchain, partners/*) runs `make format lint` -- **Version consistency checks**: Ensure `pyproject.toml` versions match source code for `langchain-core`, `langchain`, and partner packages +- **Per-package format and lint**: Each package in `libs/` (core, langchain, standard-tests, text-splitters, and all partner packages) runs `make format lint` +- **Version consistency checks**: Ensure `pyproject.toml` versions match source code version files for `langchain-core`, `langchain` (langchain_v1), and all partner packages including anthropic, chroma, deepseek, exa, fireworks, groq, huggingface, mistralai, nomic, ollama, openai, openrouter, and perplexity These hooks automatically prevent commits that fail linting or have formatting issues. They use the same Makefiles documented below. @@ -88,7 +89,7 @@ make test cd libs/langchain_v1 && make test ``` -Unit tests live in `tests/unit_tests/` (no network calls allowed). The test target uses `pytest` with `xdist` for parallelization and socket restrictions to prevent accidental network calls. +Unit tests live in `tests/unit_tests/` and are restricted from making network calls. The test target uses `pytest` with `xdist` for parallel execution (via `pytest -n auto`) and socket restrictions (`--disable-socket --allow-unix-socket`) to prevent accidental network access. ### Run a Specific Test File @@ -102,17 +103,29 @@ uv run --group test pytest tests/unit_tests/agents/test_agent.py ### Integration Tests -Integration tests live in `tests/integration_tests/` and require network access and API keys. Run them separately: +Integration tests live in `tests/integration_tests/` and require network access and API keys. Run them separately with the test_integration dependency group: ```bash make integration_tests ``` -Some packages (like `langchain_v1`) use Docker services (PostgreSQL, Redis) for integration tests: +This uses `uv run --group test --group test_integration pytest tests/integration_tests`. + +**Special case: langchain_v1 with Docker services** + +The `langchain_v1` package runs unit tests against Docker services (PostgreSQL and Redis) for agent middleware tests. The `make test` target automatically manages the lifecycle: ```bash cd libs/langchain_v1 -make test # starts services, runs tests, stops services +make test # Starts services, runs tests, stops services +make test_fast # Skips Docker, uses in-memory services only (LANGGRAPH_TEST_FAST=1) +``` + +Service control can also be manual: + +```bash +make start_services # Start Docker containers +make stop_services # Stop Docker containers ``` ### Test in Watch Mode @@ -123,7 +136,7 @@ Auto-re-run tests as you edit code: make test_watch ``` -This uses `pytest-watcher` (via the `ptw` command) and updates snapshots automatically. +This uses `pytest-watcher` (via the `ptw` command with `--snapshot-update` flag) and automatically updates snapshots. In `langchain_v1`, watch mode also manages Docker services. ### Coverage Reports @@ -133,7 +146,12 @@ Generate code coverage reports: make coverage ``` -This produces `xml` and term-missing reports, useful for understanding untested code paths. +This produces `xml` and `term-missing:skip-covered` reports (via `--cov-report`), useful for understanding untested code paths. Some packages (like `langchain_v1`) provide specialized coverage targets: + +```bash +cd libs/langchain_v1 +make coverage_agents # Run agent middleware tests with coverage report +``` ## Linting and Formatting @@ -143,10 +161,11 @@ This produces `xml` and term-missing reports, useful for understanding untested make lint ``` -This runs three checks in order: -1. **Ruff check**: Linter for logical errors, naming conventions, and code smells -2. **Ruff format (diff)**: Format checking (does not modify files) -3. **Mypy**: Static type checking +This runs checks in order: +1. **Import linting**: Custom script validation via `./scripts/lint_imports.sh` +2. **Ruff check** (v0.15.0–0.17.0): Linter for logical errors, naming conventions, and code smells +3. **Ruff format (diff)**: Format checking (does not modify files) +4. **Mypy** (v2.1.0–2.2.0): Static type checking ### Format Code @@ -174,23 +193,21 @@ Run from within a package directory or from the repo root. Ruff processes Python ### Type Checking -Full type checking with mypy: - -```bash -mypy . -``` - -Or use the make target: +Full type checking with mypy (v2.1.0–2.2.0): ```bash +# Using make make type + +# Or directly with uv +uv run --all-groups mypy . ``` -This checks all Python files for type errors (e.g., incorrect argument types, missing type hints). Type checking can be slow for large packages; run it with: +This checks all Python files for type errors (e.g., incorrect argument types, missing type hints). Type checking can be slow for large packages; run it on specific modules for faster iteration: ```bash # Type check specific file or directory -mypy libs/core/langchain_core/runnables.py +mypy libs/langchain_v1/langchain/agents/agent.py ``` ## Testing a Single Package @@ -239,26 +256,28 @@ The `.pre-commit-config.yaml` includes `UV_FROZEN = true`, which prevents unexpe ## Make Commands Reference -All packages follow the same Makefile structure: +All packages follow the same Makefile structure. Core targets available in every package: | Command | Purpose | |---------|---------| -| `make test` | Run all unit tests (pytest) | +| `make help` | Display all available targets | +| `make test` | Run all unit tests (with socket restrictions) | | `make test TEST_FILE=` | Run tests in a specific file or directory | -| `make test_watch` | Run tests in watch mode (auto-rerun on changes) | -| `make integration_tests` | Run integration tests (requires API keys) | +| `make test_watch` | Run tests in watch mode (auto-rerun on file changes, auto-update snapshots) | | `make extended_tests` | Run only tests marked with `@pytest.mark.extended` | -| `make lint` | Run ruff check + ruff format --diff + mypy | +| `make integration_tests` | Run integration tests (requires API keys, full network access) | +| `make lint` | Run import linting + ruff check + ruff format --diff + mypy | +| `make lint_diff` | Lint only changed files (vs. master branch) | | `make format` | Apply ruff format and ruff check --fix | +| `make format_diff` | Format only changed files (vs. master branch) | | `make type` | Run mypy type checking | | `make coverage` | Run tests and generate coverage report | -| `make help` | Display all available targets | -Package-specific commands (see Makefiles in each directory): +Package-specific and extended targets (see `make help` or Makefiles in each directory): -- `langchain_v1`: `make test_fast`, `make coverage_agents`, `make start_services`, `make stop_services` -- `core`: `make check_imports`, `make benchmark` -- `partners/*`: `make test TEST_FILE=tests/integration_tests/` +- **langchain_v1**: `make test_fast` (skip Docker services), `make test_watch_extended`, `make coverage_agents` (middleware tests), `make start_services`, `make stop_services`, `make benchmark` +- **core**: `make check_imports`, `make benchmark`, `make test_profile`, `make lint_package`, `make lint_tests` +- **partners/***: Support `make test TEST_FILE=tests/integration_tests/` for partner-specific integration tests ## Common Workflows @@ -303,54 +322,75 @@ make format ### Linting a Changed File ```bash -# Lint only files changed in the current branch +# Lint only files changed in the current branch (vs. master) make lint_diff make format_diff ``` -These targets run on `git diff` output against `master`. +These targets identify Python and notebook files changed in the current branch and run the same linting/formatting checks on only those files. This speeds up iteration during active development. ### Type Checking Specific Modules ```bash -# Type check a module while developing +# Type check a single module or file while developing mypy libs/langchain_v1/langchain/agents/agent.py -# Type check tests (faster, uses test group) +# Type check only test files (faster, uses lint group) cd libs/langchain_v1 make lint_tests + +# Type check only the package source code +make lint_package ``` ## Environment Variables -The Makefiles use a few environment variables to control behavior: +The Makefiles use environment variables to control behavior: | Variable | Purpose | Default | |----------|---------|---------| -| `UV_FROZEN` | Prevent lock file changes during `uv sync` | `true` in Makefiles | -| `TEST_FILE` | Path to test file or directory | `tests/unit_tests/` | -| `PYTEST_EXTRA` | Extra pytest options | (empty) | -| `LANGGRAPH_TEST_FAST` | Use in-memory services instead of Docker | `1` (fast) or `0` (full) | +| `UV_FROZEN` | Prevent lock file changes during `uv sync` | `true` (exported in all Makefiles) | +| `TEST_FILE` | Path to test file or directory to run | `tests/unit_tests/` | +| `PYTEST_EXTRA` | Extra pytest command-line options | (empty) | +| `LANGGRAPH_TEST_FAST` | Use in-memory services instead of Docker (langchain_v1) | `0` (full Docker) in `make test`, `1` (in-memory) in `make test_fast` | +| `MYPY_CACHE` | Cache directory for mypy | `.mypy_cache` | -Example: Run fast tests with extra pytest verbosity: +Example usage: ```bash +# Run a specific test directory with verbosity make test PYTEST_EXTRA="-vv" TEST_FILE=tests/unit_tests/agents + +# Run fast tests in langchain_v1 without Docker services +cd libs/langchain_v1 +make test_fast # equivalent to: LANGGRAPH_TEST_FAST=1 make test ``` ## Troubleshooting ### Lock file out of sync +Lock files (`uv.lock`) pin exact dependency versions. If dependencies change or a lock is stale: + ```bash -# Regenerate lock +# Regenerate lock for a single package cd libs/ uv lock -# Or check if lock is up-to-date +# Or check if lock is up-to-date without regenerating uv lock --check + +# Regenerate locks for all core packages +cd libs +make lock + +# Verify all locks are up-to-date (CI check) +cd libs +make check-lock ``` +The Makefiles set `UV_FROZEN=true` to prevent accidental lock changes during regular `uv sync`. Always use the commands above when intentionally updating dependencies. + ### Dependencies not installed ```bash diff --git a/openwiki/index.md b/openwiki/index.md index 2354a7e3a9..721a2b1c07 100644 --- a/openwiki/index.md +++ b/openwiki/index.md @@ -5,7 +5,7 @@ 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. -- [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. +- [Agent Factory and Graph Construction](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, graph node composition, and middleware registration. - [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. Covers the init_chat_model() factory, provider registry, and model instantiation. @@ -17,7 +17,7 @@ okf_version: "0.2" - [Message Types and Content Representation](messages.md) - Document the message abstraction, standardized content blocks for multimodal LLM I/O, message hierarchy, and provider-specific block translators. - [Agent Middleware: Composable Request/Response Processing](middleware.md) - Comprehensive guide to the middleware composition system: hook types, typing, payload transformations, and practical examples for hooking into model calls, tool calls, and agent lifecycle. - [Chat Model Initialization with init_chat_model](model-initialization.md) - Factory function for instantiating chat models from provider strings with unified configuration and runtime model switching. -- [OpenAI Integration: ChatOpenAI and Azure Support](openai-provider.md) - ChatOpenAI integration for OpenAI's Chat Completions and Responses APIs, with support for tool calling, structured output, vision, streaming, and Azure deployment. +- [OpenAI Integration: ChatOpenAI and Azure Support](openai-provider.md) - ChatOpenAI integration for OpenAI's Chat Completions and Responses APIs, with support for tool calling, structured output, vision, streaming, Azure deployment, Decisions API, and safety middleware. - [Adding a New Chat Model Provider](partner-pattern.md) - 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. - [Prompt Templates and Few-Shot Learning](prompts.md) - Prompt templates define message sequences and variable substitution patterns for chat models. Few-shot learning selects examples dynamically to teach models by example. - [LangChain Repository Quick Start](quickstart.md) - Entry point for engineers: orient to the monorepo structure, run first tests, understand what to edit for common tasks, and route to major development areas. diff --git a/openwiki/integration-tests.md b/openwiki/integration-tests.md index 08f071d04d..509753e06b 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-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z sources: - id: openwiki-source-ff76574b014ac8b5c67560a6 resource: repo://libs/langchain_v1/tests/integration_tests/chat_models/test_base.py diff --git a/openwiki/mcp-integration.md b/openwiki/mcp-integration.md index 0cf0c84053..05e782a769 100644 --- a/openwiki/mcp-integration.md +++ b/openwiki/mcp-integration.md @@ -5,7 +5,7 @@ description: "MCPAdapter bridges MCP servers to LangChain agents, discovering to tags: [mcp, protocol, tools, adapter, integration, langgraph] verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z sources: - id: openwiki-source-6d1e3478d5b63988ee177552 resource: repo://libs/langchain_v1/examples/mcp/auth_bearer.py @@ -31,7 +31,7 @@ sources: resource: repo://libs/langchain_v1/langchain/mcp/elicitation.py - id: openwiki-source-4715c337e9b93b9d00846133 resource: repo://libs/langchain_v1/langchain/mcp/tools.py -generated: { by: "openwiki/0.5.0", at: "2026-09-28T08:35:20.640Z" } +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } --- ## Overview @@ -488,16 +488,16 @@ LangChain ships runnable examples in `examples/mcp/`: | Example | Shows | Model | Network | |---------|-------|:-----:|:-------:| -| `transports.py` | in-memory, stdio, HTTP transports | | | -| `remote_server.py` | public MCP server (DeepWiki) | ✅ | ✅ | -| `multi_server.py` | `MCPConfig` fleet with tool prefixing | ✅ | | -| `graph_factory.py` | per-user credentials in a graph factory | | | -| `protocol_eras.py` | legacy and modern era servers together | ✅ | | -| `tool_errors.py` | tool failure and model recovery | ✅ | | -| `elicitation.py` | server requesting user input mid-call | ✅ | | -| `destructive_interrupt.py` | gating destructive tools via metadata | ✅ | | -| `auth_bearer.py` | static bearer token | | | -| `auth_oauth.py` | OAuth 2.1 with dynamic client registration | | | +| `transports.py` | one adapter over in-memory, stdio, and HTTP | | | +| `remote_server.py` | pointing the adapter at a public MCP server (DeepWiki) | ✅ | ✅ | +| `multi_server.py` | several servers behind one adapter, tools prefixed per server | ✅ | | +| `graph_factory.py` | one long-lived adapter shared by every run of a langgraph dev graph | | | +| `protocol_eras.py` | one agent holding tools from both MCP protocol eras | ✅ | | +| `tool_errors.py` | a failing tool reaching the model so it can retry | ✅ | | +| `elicitation.py` | a server asking a human mid-call, via interrupt() | ✅ | | +| `destructive_interrupt.py` | gating destructive tools behind approval, from tool metadata | ✅ | | +| `auth_bearer.py` | a server behind a static bearer token | | | +| `auth_oauth.py` | a full OAuth 2.1 flow with dynamic client registration | | | Run examples with: @@ -507,6 +507,8 @@ export ANTHROPIC_API_KEY=... uv run examples/mcp/transports.py ``` +`remote_server.py` calls DeepWiki, a public MCP server, so it needs internet access. `auth_oauth.py` opens a browser tab; the demo authorization server auto-approves, so it redirects straight back. + ## Integration Points ### `create_agent` diff --git a/openwiki/messages.md b/openwiki/messages.md index f4f01fdb15..094f283791 100644 --- a/openwiki/messages.md +++ b/openwiki/messages.md @@ -26,10 +26,10 @@ sources: resource: repo://libs/core/langchain_core/messages/tool.py - id: openwiki-source-498a9586e021b126ab8a8b42 resource: repo://libs/core/langchain_core/messages/utils.py -generated: { by: "openwiki/0.5.0", at: "2026-09-08T08:27:09.597Z" } +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- ## Overview @@ -42,7 +42,7 @@ The key innovation is **content blocks**: instead of provider-specific schemas ( **Location**: `repo://libs/core/langchain_core/messages/base.py#L93-L180` -`BaseMessage` is the abstract base for all message types. Key fields: +`BaseMessage` is the abstract base for all message types, providing a serializable container for conversational I/O. Key fields: - **`content`**: `str | list[str | dict[Any, Any]]` Holds either plain text or a mixed list of strings (treated as text blocks) and dictionaries (content block dicts). @@ -91,7 +91,7 @@ A special message type for deleting other messages from conversation history. Ta ### Message Chunks and Streaming -**Location**: `repo://libs/core/langchain_core/messages/base.py#L450-L500` (BaseMessageChunk) +**Location**: `repo://libs/core/langchain_core/messages/ai.py#L418-L506` (AIMessageChunk) During streaming, models emit `AIMessageChunk` objects incrementally. These chunks are designed to be **mergeable**: when combined with `+`, they accumulate content, merge tool call chunks by index, and aggregate token usage. @@ -99,14 +99,14 @@ During streaming, models emit `AIMessageChunk` objects incrementally. These chun - **`tool_call_chunks`**: Partial tool call objects with nullable `name` and `args` (JSON string fragments). Chunks with the same `index` are merged during aggregation. - **`chunk_position`**: `"last"` on the final chunk, signaling completion triggers (e.g., parsing completed tool call chunks into full `tool_calls`). -**Chunk Aggregation via `add_ai_message_chunks()`** (`repo://libs/core/langchain_core/messages/ai.py#L652-L700`): +**Chunk Aggregation via `add_ai_message_chunks()`** (`repo://libs/core/langchain_core/messages/ai.py#L651-L731`): When merging `AIMessageChunk` objects with `+` or via the function: 1. **Content merging**: Concatenates string content; for list content, merges blocks preserving order. 2. **Tool call chunk merging**: Combines `tool_call_chunks` by `index` field, concatenating `name` and `args` strings where both chunks share the same index. -3. **Token usage aggregation**: Sums `usage_metadata` across chunks (input_tokens, output_tokens, per-category breakdowns). +3. **Token usage aggregation**: Sums `usage_metadata` across chunks (input_tokens, output_tokens, input_token_details, output_token_details) using the `add_usage()` function. 4. **Chunk position handling**: When `chunk_position="last"` (final chunk), accumulated `tool_call_chunks` are parsed via `parse_partial_json()` into complete `ToolCall` dicts. -5. **Server-side tool call completion**: When `chunk_position="last"` and `output_version="v1"`, `server_tool_call_chunk` blocks are parsed into `server_tool_call` blocks with complete `args` objects. +5. **Server-side tool call completion**: When `chunk_position="last"` and `output_version="v1"`, `server_tool_call_chunk` blocks are parsed into `server_tool_call` blocks with complete `args` objects (via `init_server_tool_calls()` validator). Example merge sequence: ```python @@ -282,7 +282,7 @@ All block types support an optional `extras: dict[str, Any]` field for provider- ### Accessing Content Blocks -**Location**: `repo://libs/core/langchain_core/messages/base.py#L199-L260` +**Location**: `repo://libs/core/langchain_core/messages/base.py#L199-L260` (BaseMessage); `repo://libs/core/langchain_core/messages/ai.py#L242-L304` (AIMessage override) The `content_blocks` property normalizes message content to a list of typed content block dicts: @@ -291,24 +291,32 @@ The `content_blocks` property normalizes message content to a list of typed cont def content_blocks(self) -> list[types.ContentBlock]: ``` -**Behavior**: +**BaseMessage Behavior** (`repo://libs/core/langchain_core/messages/base.py#L199-L260`): 1. If `content` is a string, wrap it as `{"type": "text", "text": content}`. 2. Parse list items: strings become text blocks, dicts with known `type` values are kept as-is, others become `{"type": "non_standard", "value": ...}`. -3. Attempt to unpack non-standard blocks through a series of provider-specific parsers (v0 blocks, Chat Completions format, Anthropic format, Google GenAI format, Bedrock format). -4. For `AIMessage`, check `response_metadata["model_provider"]` and use the provider's translator if registered (e.g., OpenAI, Anthropic). -5. Fall back to best-effort parsing if no translator exists. -6. For `AIMessage`, append `tool_calls` not already in content as tool call blocks. -7. Extract reasoning from `additional_kwargs["reasoning_content"]` if present (inserted at start of blocks list). +3. Attempt to unpack non-standard blocks through a series of provider-specific parsers (v0 blocks, Chat Completions format, Anthropic format, Google GenAI format, Bedrock Converse format). + +**AIMessage-specific override** (`repo://libs/core/langchain_core/messages/ai.py#L242-L304`): +1. Short-circuit: If `response_metadata["output_version"] == "v1"` and `content` is a list, assume it's already normalized and return directly. +2. Check `response_metadata["model_provider"]`: if set, use the registered provider translator to parse content. +3. Fall back to `BaseMessage.content_blocks` best-effort parsing if no translator exists or it raises `NotImplementedError`. +4. Append `tool_calls` not already in content as tool call blocks (comparing by ID to avoid duplication). +5. Extract reasoning from `additional_kwargs["reasoning_content"]` if present (inserted at start of blocks list). + +**AIMessageChunk-specific behavior** (`repo://libs/core/langchain_core/messages/ai.py#L445-L506`): +- Applies the same short-circuit and translator logic as `AIMessage`. +- Additionally, if `tool_call_chunks` exist and content is empty (not yet aggregated), adds `tool_call_chunk` blocks to the output. +- Same reasoning extraction as `AIMessage`. ## Block Translators: Adapting to Provider Formats -**Location**: `repo://libs/core/langchain_core/messages/block_translators/__init__.py` and provider modules +**Location**: `repo://libs/core/langchain_core/messages/block_translators/__init__.py#L23-L112` and provider modules Block translators convert between LangChain's standard blocks and provider-specific formats. Each provider module registers translator functions that are invoked when accessing `AIMessage.content_blocks` if `response_metadata["model_provider"]` matches. ### Registration System -**`register_translator`** and **`get_translator`**: +**`register_translator`** and **`get_translator`** (`repo://libs/core/langchain_core/messages/block_translators/__init__.py#L39-L70`): ```python def register_translator( provider: str, @@ -317,36 +325,37 @@ def register_translator( ) -> None ``` -Translators are stored in `PROVIDER_TRANSLATORS` and auto-initialized on module load via `_register_translators()`. +Translators are stored in `PROVIDER_TRANSLATORS` (a module-level dict) and auto-initialized on import via `_register_translators()`. The system calls the appropriate translator (`translate_content` for `AIMessage`, `translate_content_chunk` for `AIMessageChunk`) when `response_metadata["model_provider"]` is set and a matching translator is registered. ### Key Translators -**OpenAI** (`repo://libs/core/langchain_core/messages/block_translators/openai.py`) -Handles Chat Completions format: +**OpenAI** (`repo://libs/core/langchain_core/messages/block_translators/openai.py#L1-L80`) +Handles Chat Completions and Responses API formats: - Converts OpenAI's `image_url` blocks to standard `ImageContentBlock`. - Parses `tool_calls` (from function calling) into `ToolCall` blocks. - Supports Responses API with `input_audio`, `input_file`, and `input_image` types. -- `convert_to_openai_image_block()` and `convert_to_openai_data_block()` are public utilities used by models and integrations. +- Public utility functions: `convert_to_openai_image_block()` and `convert_to_openai_data_block()` handle conversion from standard blocks back to OpenAI format (used by models and integrations). -**Anthropic** (`repo://libs/core/langchain_core/messages/block_translators/anthropic.py`) -Handles Anthropic's format: +**Anthropic** (`repo://libs/core/langchain_core/messages/block_translators/anthropic.py#L1-L150`) +Handles Anthropic's message format: - Converts `document` blocks (with `source` field specifying type: `base64`, `url`, `file`, or `text`) to standard file/plaintext blocks. - Converts `image` blocks with various source types to `ImageContentBlock`. -- Populates `extras` with provider-specific fields like `cache_control`. +- Populates `extras` field with provider-specific metadata like `cache_control`. +- Uses `_populate_extras()` helper to capture unmapped provider fields without losing them. **Google GenAI and Google VertexAI** -Convert Google's format blocks to standard types. +Convert Google's format blocks to standard types via dedicated converters in `google_genai.py` and `google_vertexai.py`. **Bedrock (Classic) and Bedrock Converse** -Convert AWS Bedrock format blocks to standard types. +Convert AWS Bedrock format blocks to standard types via `bedrock.py` and `bedrock_converse.py`. **Groq** -Handles Groq's API response format. +Handles Groq's API response format via `groq.py`. **LangChain v0 (Backward Compatibility)** (`repo://libs/core/langchain_core/messages/block_translators/langchain_v0.py`) -Parses legacy `source_type`-based blocks (e.g., `{"type": "image", "source_type": "url", "url": "..."}`) into v1 blocks. This ensures old code that constructs messages with v0 block format still works. +Parses legacy `source_type`-based blocks (e.g., `{"type": "image", "source_type": "url", "url": "..."}`) into v1 blocks. This ensures old code that constructs messages with v0 block format still works. Triggered when the base `content_blocks` parser detects a `source_type` field. -**Auto-registration**: All translators are auto-initialized when the `block_translators` module loads via `_register_translators()`, which is called at module import time. External integrations can call `register_translator()` to add their own provider translators at runtime. +**Auto-registration**: All translators are auto-initialized when the `block_translators` module loads via `_register_translators()` (called at line 112 of `__init__.py`). This ensures provider translators are available whenever messages are used. External integrations can call `register_translator()` to add their own provider translators at runtime. ### Translation Flow in `content_blocks` @@ -358,29 +367,32 @@ When `AIMessage.content_blocks` is accessed: ## Message Manipulation Utilities -**Location**: `repo://libs/core/langchain_core/messages/utils.py` +**Location**: `repo://libs/core/langchain_core/messages/utils.py#L1-L100` The utils module provides helpers for working with messages: -**`get_buffer_string(messages, format="prefix")`** (`repo://libs/core/langchain_core/messages/utils.py#L287-L370`) +**`get_buffer_string(messages, format="prefix")`** (`repo://libs/core/langchain_core/messages/utils.py#L297-L525`) Converts a sequence of messages to a single string for logging, prompting, or debugging: -- **`format="prefix"`** (default): Role-prefixed format like `"Human: ...\nAI: ..."`. Multimodal content blocks are skipped; only text and `text` blocks included. -- **`format="xml"`**: XML-formatted output with `content` structure. Supports safe rendering of complex multimodal content (images, audio, video, reasoning, tool calls) with proper character escaping. Base64-encoded data is skipped. Useful when message content may contain role-like prefixes that could cause ambiguity. +- **`format="prefix"`** (default): Role-prefixed format like `"Human: ...\nAI: ..."`. Multimodal content blocks are skipped; only text content and `text` blocks are included. For `AIMessage`, appends stringified `tool_calls` if present. +- **`format="xml"`**: XML-formatted output with `content` structure. Provides safe rendering of complex multimodal content with proper character escaping (using `xml.sax.saxutils.escape()` and `quoteattr()`). Supports images (URL/file_id), audio, video, reasoning blocks, server tool calls, and server tool results. Base64-encoded data and data: URLs are skipped to avoid bloating output. Nested structure with `` and `` elements for AI messages with tool calls. Useful when message content may contain role-like prefixes that could cause ambiguity. -**`convert_to_messages` and `convert_to_openai_messages`** +**`convert_to_messages()` and `convert_to_openai_messages()`** Coerce various input formats (dicts, strings, `MessageLikeRepresentation` union) into typed message objects. **`filter_messages(messages, include_types=..., exclude_types=...)`** Filter a sequence of messages by type, name, or ID. -**`trim_messages(messages, max_tokens=..., strategy="..."`** -Truncate a message sequence to fit within a token budget, using various strategies (keep start, keep end, keep first/last, etc.). +**`trim_messages(messages, max_tokens=..., strategy="...")`** +Truncate a message sequence to fit within a token budget, using various strategies (keep start, keep end, keep first/last, etc.). Supports token counting via custom functions or shortcuts like `"approximate"`. **`merge_message_runs(messages)`** Deduplicate and merge consecutive messages of the same type (e.g., multiple `AIMessage`s in a row). **`message_chunk_to_message(chunk: BaseMessageChunk) -> BaseMessage`** -Convert a message chunk (or list of chunks) into a complete message. +Convert a message chunk (or list of chunks) into a complete message using `_chunk_to_msg()`. + +**`count_tokens_approximately(messages, chars_per_token=4.0, ...)`** (`repo://libs/core/langchain_core/messages/utils.py#L2257-L2410`) +Approximate token count for messages using character-to-token ratio and fixed penalties per image. Optionally scales by actual token counts from model responses. **`AnyMessage` Union Type** (`repo://libs/core/langchain_core/messages/utils.py#L86-L100`) ```python @@ -400,7 +412,7 @@ AnyMessage = Annotated[ Field(discriminator=Discriminator(_get_type)), ] ``` -A tagged union for Pydantic deserialization. Includes all message types and chunk variants. The `_get_type()` discriminator function extracts the `type` field from each message to route to the correct class during deserialization. +A discriminated union for Pydantic deserialization of messages. Includes all message types and chunk variants. The `_get_type()` discriminator function (defined at `repo://libs/core/langchain_core/messages/utils.py#L68-L83`) extracts the `type` field from each message to route to the correct class during deserialization. ## Content Representation: String vs. Block List @@ -452,6 +464,18 @@ For backward compatibility, `TextAccessor` supports both property and method acc Non-text blocks (images, audio, video, tool calls, reasoning) are automatically skipped when extracting text. +## Message Type Discrimination and Serialization + +**Location**: `repo://libs/core/langchain_core/messages/base.py#L117-L123` + +The `type` field uniquely identifies each message kind for serialization and deserialization. Standard types include: +- **Regular messages**: `"human"`, `"ai"`, `"system"`, `"tool"`, `"chat"`, `"function"`, `"remove"` +- **Chunk variants**: `"HumanMessageChunk"`, `"AIMessageChunk"`, `"SystemMessageChunk"`, `"ToolMessageChunk"`, `"ChatMessageChunk"`, `"FunctionMessageChunk"` + +The `AnyMessage` discriminated union in utils.py uses the `type` field via `_get_type()` to route deserialization to the correct class. + +**RemoveMessage**: A special message type (`repo://libs/core/langchain_core/messages/modifier.py#L8-L33`) used in agentic workflows to delete other messages from conversation history. Takes only an `id` parameter (the message ID to remove) and no content. Raises `ValueError` if content is provided during initialization. + ## Integration with Chat Models Chat models normalize message input and output using the message abstraction: @@ -504,9 +528,10 @@ The `response_metadata["output_version"]` field signals content normalization st - **`"v1"`**: Content is already normalized to v1 blocks (list of standard dicts). The `content_blocks` property returns content directly without re-parsing when: - `output_version == "v1"` **and** `content` is a list (not a string) - This short-circuit optimization avoids redundant parsing for model responses that already conform to v1 format. + - Condition checked in both `AIMessage.content_blocks()` (line 250-256) and `AIMessageChunk.content_blocks()` (line 448-458). - **`None` or absent**: Content requires normalization via provider translators and fallback parsing. -For `AIMessageChunk`, the v1 short-circuit is especially critical: even if `output_version="v1"`, if `content` is a string (e.g., text-only streaming), the content falls through to the provider translator to build `ContentBlock` dicts from `tool_call_chunks`. +For `AIMessageChunk`, the v1 short-circuit logic is especially nuanced: even if `output_version="v1"`, if `content` is a string (e.g., text-only streaming), the content falls through to the provider translator to build `ContentBlock` dicts from `tool_call_chunks`. This ensures streaming text is not silently dropped when tool calls exist. ## Example Workflows @@ -579,13 +604,16 @@ Custom provider integrations can register their own translator: ```python from langchain_core.messages.block_translators import register_translator +from langchain_core.messages import AIMessage, AIMessageChunk, content as types -def my_translate_content(msg: AIMessage) -> list[ContentBlock]: - # Custom logic +def my_translate_content(msg: AIMessage) -> list[types.ContentBlock]: + # Custom logic to parse provider-specific content + # Return list of standard content blocks pass -def my_translate_content_chunk(chunk: AIMessageChunk) -> list[ContentBlock]: - # Custom logic +def my_translate_content_chunk(chunk: AIMessageChunk) -> list[types.ContentBlock]: + # Custom logic for streaming chunks + # Return list of standard content blocks pass register_translator("my_provider", my_translate_content, my_translate_content_chunk) diff --git a/openwiki/middleware.md b/openwiki/middleware.md index 0c0a4d816c..ed5a040d7f 100644 --- a/openwiki/middleware.md +++ b/openwiki/middleware.md @@ -17,7 +17,7 @@ sources: generated: { by: "openwiki/0.5.0", at: "2026-09-28T08:35:20.640Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- ## Overview diff --git a/openwiki/model-initialization.md b/openwiki/model-initialization.md index b45e224c00..44fa80c842 100644 --- a/openwiki/model-initialization.md +++ b/openwiki/model-initialization.md @@ -9,7 +9,7 @@ sources: generated: { by: "openwiki/0.5.0", at: "2026-09-28T08:35:20.640Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- ## Overview diff --git a/openwiki/openai-provider.md b/openwiki/openai-provider.md index a04cb1e4b1..079bbcc4be 100644 --- a/openwiki/openai-provider.md +++ b/openwiki/openai-provider.md @@ -1,8 +1,8 @@ --- type: "ChatModel Integration" title: "OpenAI Integration: ChatOpenAI and Azure Support" -description: "ChatOpenAI integration for OpenAI's Chat Completions and Responses APIs, with support for tool calling, structured output, vision, streaming, and Azure deployment." -tags: ["openai", "chat-models", "tool-calling", "structured-output", "vision", "azure"] +description: "ChatOpenAI integration for OpenAI's Chat Completions and Responses APIs, with support for tool calling, structured output, vision, streaming, Azure deployment, Decisions API, and safety middleware." +tags: ["openai", "chat-models", "tool-calling", "structured-output", "vision", "azure", "decisions-api", "middleware"] sources: - id: openwiki-source-1e66a9da38565f8901e651f4 resource: repo://libs/partners/openai/langchain_openai/__init__.py @@ -12,10 +12,16 @@ sources: 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-28T08:35:20.640Z" } + - id: openwiki-source-b65307f1d05bd74532af2eee + resource: repo://libs/partners/openai/langchain_openai/decisions/base.py + - id: openwiki-source-122b01e9aef52272c0a77739 + resource: repo://libs/partners/openai/langchain_openai/decisions/types.py + - id: openwiki-source-22c4d13fc1ad9b58545a0abf + resource: repo://libs/partners/openai/langchain_openai/middleware/auto_mode.py +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- ## Overview @@ -29,6 +35,8 @@ The OpenAI integration (`langchain-openai`) provides production-ready chat model - **Vision** support for gpt-4-vision and gpt-4o models with image inputs - **Streaming tokens** via callback integration with per-chunk timeouts - **Model profiles** with capability metadata (input/output modalities, max tokens, tool support) +- **Decisions API** for typed questions (predicates, choices, scores) over text or images +- **Safety middleware** (OpenAI auto-mode) to classify and block risky tool calls **Core Principle**: `ChatOpenAI` targets [official OpenAI API specifications](https://github.com/openai/openai-openapi) only. Non-standard response fields added by third-party providers (e.g., `reasoning_content` on vLLM, `reasoning_details` on DeepSeek) are **not** extracted or preserved. For provider-specific features, use the corresponding provider-specific LangChain package (e.g., `ChatDeepSeek`, `ChatOpenRouter`). @@ -36,7 +44,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#L2904-L4266` +**Main Class**: `repo://libs/partners/openai/langchain_openai/chat_models/base.py#L2913-L4266` **Exports**: `repo://libs/partners/openai/langchain_openai/__init__.py` @@ -44,6 +52,8 @@ Related classes: - `BaseChatOpenAI`: Base implementation shared with Azure OpenAI - `AzureChatOpenAI`: Azure-specific subclass in `repo://libs/partners/openai/langchain_openai/chat_models/azure.py` - `OpenAI` (legacy): Completion-only model in `repo://libs/partners/openai/langchain_openai/llms/` +- `OpenAIDecisions`: Decisions API integration in `repo://libs/partners/openai/langchain_openai/decisions/base.py` +- `OpenAIAutoModeMiddleware`: Safety middleware in `repo://libs/partners/openai/langchain_openai/middleware/auto_mode.py` ## ChatOpenAI Class @@ -854,6 +864,196 @@ 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. +## Decisions API + +The **OpenAI Decisions API** enables typed questions over text or images. `OpenAIDecisions` is a LangChain `Runnable` that asks `Predicate` probabilities, `Choice` selections, and `Score` ratings in a single request, returning structured responses with confidence scores. + +### Overview + +The Decisions API is useful for: +- **Classification**: Route requests based on predicted intent or severity +- **Risk assessment**: Estimate probability of harmful content or risky actions +- **Sentiment/Quality scoring**: Rate text on custom dimensions +- **Multi-question analysis**: Ask multiple questions over the same input + +### Constructor and Configuration + +```python +from langchain_openai import OpenAIDecisions + +decisions = OpenAIDecisions( + model="gpt-6-luna", + api_key="your-api-key", # Inferred from OPENAI_API_KEY if omitted + base_url="https://api.openai.com/v1", # Optional; see base_url resolution + organization="your-org-id", # Inferred from OPENAI_ORG_ID if omitted + timeout=30.0, + max_retries=2, +) +``` + +**Parameters mirror ChatOpenAI**: `api_key`, `base_url`, `organization`, `timeout`, `max_retries`, `http_client`, `http_async_client`, `default_headers`, `default_query`. + +### Question Types + +The Decisions API supports three question types: + +```python +from langchain_openai.decisions import Predicate, Choice, Score, DecisionRequest + +# Predicate: Binary yes/no with probability +questions = { + "is_spam": Predicate( + instructions="Is this email spam?" + ), +} + +# Choice: Select from options +questions = { + "department": Choice( + instructions="Which team should handle this?", + choices={ + "billing": "Payment or subscription issues", + "technical": "Product bugs or errors", + "support": "General assistance", + } + ) +} + +# Score: Rate on a scale +questions = { + "urgency": Score( + instructions="How urgent is this request?", + levels=["Low", "Medium", "High", "Critical"] + ) +} +``` + +### Invocation + +```python +response = decisions.invoke( + { + "input": "My account is locked and I can't log in. Help ASAP!", + "questions": { + "urgency": Score( + instructions="Rate urgency", + levels=["Low", "Medium", "High", "Critical"] + ), + "is_billing": Predicate( + instructions="Is this a billing issue?" + ), + "department": Choice( + instructions="Route to department", + choices={"billing": "Billing", "technical": "Technical"} + ) + } + } +) + +print(response.scores["urgency"].score) # 3 (Critical) +print(response.predicates["is_billing"].probability) # 0.1 +print(response.choices["department"].choice) # "technical" +print(response.usage.input_tokens) # Token count +``` + +### Response Structure + +`DecisionResponse` contains: +- **`predicates`**: Dict of `PredicateAnswer` (probability, confidence) +- **`choices`**: Dict of `ChoiceAnswer` (selected choice, confidence, option_confidences) +- **`scores`**: Dict of `ScoreAnswer` (selected score index, confidence) +- **`refusals`**: List of `RefusalAnswer` if model refused any question +- **`usage`**: Token usage metadata + +### Async Support + +```python +response = await decisions.ainvoke( + { + "input": "...", + "questions": {...} + } +) +``` + +## Middleware: OpenAI Auto-Mode + +**OpenAI Auto-Mode** is a beta middleware that uses the Decisions API to classify tool calls as risky or low-risk, blocking risky calls before execution. It integrates with LangChain's agent execution system. + +### Overview + +`OpenAIAutoModeMiddleware` inspects each tool call request and asks a `Predicate` question: *"Would executing this tool be risky or insufficiently authorized?"* Calls with probability ≥ 0.5 are blocked; others execute normally. + +**Use cases:** +- Prevent unauthorized file/credential access +- Block destructive operations without user confirmation +- Gate external API calls in multi-step agents +- Implement approval workflows without human-in-the-loop overhead + +### Setup + +```python +from langchain.agents import create_agent +from langchain_openai.middleware import OpenAIAutoModeMiddleware + +# Define tools (e.g., file ops, API calls, etc.) +tools = [read_file, write_file, delete_file, call_external_api] + +auto_mode = OpenAIAutoModeMiddleware( + tools=tools, # Which tools to inspect + model="gpt-6-luna", + api_key="your-api-key", # Optional; inferred from OPENAI_API_KEY + instructions="Custom risk assessment prompt (optional)", + probability_threshold=0.5, # Block if P(risky) >= threshold +) + +agent = create_agent( + model=ChatOpenAI(model="gpt-4o"), + tools=tools, + middleware=[auto_mode], # Register middleware +) +``` + +### Behavior + +1. **Low-risk calls** (P < 0.5): Execute normally +2. **High-risk calls** (P ≥ 0.5): Return error `ToolMessage` without executing +3. **Unclassifiable requests**: Return refusal message (e.g., if Decisions API can't process images due to size) +4. **Unregistered tools**: Bypass classification and execute + +### Messages and Fallback + +When a tool call is blocked: +``` +"The tool call `delete_file` was blocked because it was classified as risky (probability: 0.78). The tool was not executed." +``` + +If classification fails (e.g., oversized image), a fallback prompt is sent to the Decisions API without media; if still refused: +``` +"The tool call `call_api` was blocked because its risk could not be assessed. The tool was not executed." +``` + +### Customization + +```python +auto_mode = OpenAIAutoModeMiddleware( + tools=[read_file, write_file], + model="gpt-6-luna", + instructions=( + "Assess risk strictly. Consider: credential access, external sharing, " + "destructive operations, and authorization level. Answer yes only if execution " + "would violate policy or user authorization." + ), + probability_threshold=0.6, # Higher threshold = fewer blocks +) +``` + +### Media Handling + +- **Base64 images**: Included in Decisions API request +- **Audio/video/files**: Replaced with placeholders (unsupported media types) +- **Oversized requests**: Retried without media on HTTP 413 + ## Azure OpenAI Integration `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. @@ -1146,6 +1346,8 @@ model = ChatOpenAI( 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). +6. **Decisions API beta**: OpenAI Decisions API is in beta; API signatures and behavior may change. +7. **Auto-Mode media filtering**: Audio/video/file content is replaced with placeholders; only base64 images are forwarded to Decisions API. ## Related Pages @@ -1154,3 +1356,4 @@ model = ChatOpenAI( - `/openwiki/messages.md`: Message types and content blocks (text, images, tool calls) - `/openwiki/partner-pattern.md`: Partner package patterns and extension points - `/openwiki/structured-output.md`: Structured output patterns and schema validation +- `/openwiki/middleware.md`: Agent middleware system for request/response interception diff --git a/openwiki/partner-pattern.md b/openwiki/partner-pattern.md index f5c17a1c85..94fe8bf461 100644 --- a/openwiki/partner-pattern.md +++ b/openwiki/partner-pattern.md @@ -36,10 +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-22T08:27:06.345Z" } +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- ## Overview @@ -108,7 +108,7 @@ requires-python = ">=3.10.0,<4.0.0" version = "0.1.0" dependencies = [ - "langchain-core>=1.6.2,<2.0.0", # Required: base LangChain + "langchain-core>=1.6.10,<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 ] @@ -633,7 +633,7 @@ Use the `langchain-model-profiles` CLI tool to refresh profiles from models.dev: uv add langchain-model-profiles # Install once globally or in dev dependencies # Refresh profiles for your provider -langchain-model-profiles refresh \ +langchain-profiles refresh \ --provider provider_name \ --data-dir ./langchain_provider_name/data ``` @@ -671,7 +671,6 @@ Create `tests/unit_tests/chat_models/test_standard.py` (reference: `/libs/standa from typing import Type -import pytest from langchain_core.language_models import BaseChatModel from langchain_tests.unit_tests import ChatModelUnitTests @@ -681,11 +680,11 @@ from langchain_provider_name import ChatProviderModel class TestProviderModelStandard(ChatModelUnitTests): """Standard unit tests for ChatProviderModel.""" - @pytest.fixture + @property def chat_model_class(self) -> Type[BaseChatModel]: return ChatProviderModel - @pytest.fixture + @property def chat_model_params(self) -> dict: """Parameters to instantiate the chat model. @@ -713,7 +712,6 @@ Create `tests/integration_tests/chat_models/test_standard.py`: from typing import Type -import pytest from langchain_core.language_models import BaseChatModel from langchain_tests.integration_tests import ChatModelIntegrationTests @@ -723,11 +721,11 @@ from langchain_provider_name import ChatProviderModel class TestProviderModelIntegration(ChatModelIntegrationTests): """Standard integration tests for ChatProviderModel.""" - @pytest.fixture + @property def chat_model_class(self) -> Type[BaseChatModel]: return ChatProviderModel - @pytest.fixture + @property def chat_model_params(self) -> dict: """Live API credentials (loaded from environment).""" return { @@ -894,7 +892,7 @@ Keep the provider SDK locked in `pyproject.toml` to prevent breaking changes. Re Run the CLI tool periodically to fetch new models from models.dev: ```bash -langchain-model-profiles refresh --provider provider_name --data-dir ./langchain_provider_name/data +langchain-profiles refresh --provider provider_name --data-dir ./langchain_provider_name/data ``` ### Testing diff --git a/openwiki/prompts.md b/openwiki/prompts.md index 8361c5eb5d..259b63342e 100644 --- a/openwiki/prompts.md +++ b/openwiki/prompts.md @@ -25,7 +25,7 @@ sources: generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- ## Overview diff --git a/openwiki/quickstart.md b/openwiki/quickstart.md index 9b9c1ecb3c..637454d1b7 100644 --- a/openwiki/quickstart.md +++ b/openwiki/quickstart.md @@ -3,9 +3,6 @@ type: "Getting Started" title: "LangChain Repository Quick Start" description: "Entry point for engineers: orient to the monorepo structure, run first tests, understand what to edit for common tasks, and route to major development areas." tags: [quickstart, getting-started, monorepo, setup, development, first-steps, cli-reference] -verified: - - by: openwiki/0.5.0 - at: 2026-09-29T08:28:34.635Z sources: - id: openwiki-source-4d1645cb6317345817452838 resource: repo://.pre-commit-config.yaml @@ -43,7 +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-29T08:28:34.635Z" } +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } +verified: + - by: openwiki/0.5.0 + at: 2026-10-14T08:27:24.310Z --- ## Welcome to LangChain Development @@ -60,8 +60,8 @@ LangChain is organized as a **three-layer architecture** in `/libs/`: ``` /libs/ -├── core/ # langchain-core (v1.6.5): Base abstractions (Runnable, BaseChatModel, tools, prompts, messages) -├── langchain_v1/ # langchain (v1.4.3): Agent orchestration, factory, middleware +├── core/ # langchain-core (v1.6.10): Base abstractions (Runnable, BaseChatModel, tools, prompts, messages) +├── langchain_v1/ # langchain (v1.4.5): Agent orchestration, factory, middleware ├── partners/ # Provider-specific integrations (OpenAI, Anthropic, Ollama, etc.) ├── standard-tests/ # Shared test suites for component conformance ├── text-splitters/ # Text splitting utilities diff --git a/openwiki/runnables.md b/openwiki/runnables.md index 249d51d4c9..425b355ab4 100644 --- a/openwiki/runnables.md +++ b/openwiki/runnables.md @@ -14,10 +14,10 @@ sources: resource: repo://libs/core/langchain_core/runnables/fallbacks.py - id: openwiki-source-ebe3f825462d0b4a14ee3717 resource: repo://libs/core/langchain_core/runnables/retry.py -generated: { by: "openwiki/0.5.0", at: "2026-09-03T15:18:34.589Z" } +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z --- ## Overview @@ -99,7 +99,13 @@ def stream( ### Asynchronous Methods -**`ainvoke(input, config=None)`** (`repo://libs/core/langchain_core/runnables/base.py#L908-L929`) is the async variant: +Async methods use one of two strategies: +1. **Native async**: Subclasses implement async methods directly (e.g., models with async API clients). +2. **Executor delegation**: Default implementations use `run_in_executor` to call sync methods in a thread pool, enabling async interfaces for sync-only components. + +All async methods respect `max_concurrency` from config to limit parallel execution. + +**`ainvoke(input, config=None)`** (`repo://libs/core/langchain_core/runnables/base.py#L909-L930`) is the async variant: ```python async def ainvoke( @@ -114,7 +120,7 @@ async def ainvoke( - **Default**: Delegates to sync `invoke` via `run_in_executor`. - **Subclasses override** for native async (e.g., async API calls). -**`abatch(inputs, config=None, return_exceptions=False)`** (`repo://libs/core/langchain_core/runnables/base.py#L1066-L1112`) batches async: +**`abatch(inputs, config=None, return_exceptions=False)`** (`repo://libs/core/langchain_core/runnables/base.py#L1067-L1113`) batches async: ```python async def abatch( @@ -125,15 +131,16 @@ async def abatch( return_exceptions: bool = False, **kwargs: Any | None, ) -> list[Output]: - """Default implementation runs ainvoke in parallel using asyncio.gather.""" + """Default implementation runs ainvoke in parallel using gather_with_concurrency.""" ``` -- Calls `ainvoke` for each input concurrently. -- Respects `max_concurrency` from config to limit parallelism. +- Calls `ainvoke` for each input concurrently via `gather_with_concurrency`. +- Respects `max_concurrency` from config to limit parallelism (respects semaphore for controlled concurrency). +- Config can be a single `RunnableConfig` (applied to all) or a list of per-input configs. **`abatch_as_completed(inputs, config=None, return_exceptions=False)`** yields completed async results as they finish. -**`astream(input, config=None)`** (`repo://libs/core/langchain_core/runnables/base.py#L1215-L1234`) is the async streaming variant: +**`astream(input, config=None)`** (`repo://libs/core/langchain_core/runnables/base.py#L1216-L1235`) is the async streaming variant: ```python async def astream( @@ -146,7 +153,7 @@ async def astream( ``` - **Default**: Yields one output from `ainvoke`. -- **Specialized** for streaming backends. +- **Specialized implementations** (e.g., chat models, streaming parsers) yield chunks as they arrive asynchronously. ### Schema Introspection @@ -259,7 +266,7 @@ sequence = RunnableSequence( ### Branching: RunnableBranch -**Location**: `repo://libs/core/langchain_core/runnables/branch.py#L43-L150` +**Location**: `repo://libs/core/langchain_core/runnables/branch.py#L43-L457` `RunnableBranch` selects and runs one of several branches based on a condition: @@ -306,7 +313,7 @@ router.invoke({"key": "math", "input": "2 + 2"}) # Uses math_chain ### Fallback and Retry -**Fallbacks**: `RunnableWithFallbacks` (`repo://libs/core/langchain_core/runnables/fallbacks.py#L37-L150`) +**Fallbacks**: `RunnableWithFallbacks` (`repo://libs/core/langchain_core/runnables/fallbacks.py#L37-L600`) ```python from langchain_core.runnables import RunnableWithFallbacks @@ -322,7 +329,7 @@ result = model.invoke("Hello") # Returns first successful result - Proceeds until one succeeds or all fail. - Optionally passes exceptions to fallbacks for adaptive recovery. -**Retry**: `RunnableRetry` (`repo://libs/core/langchain_core/runnables/retry.py#L48-L150`) +**Retry**: `RunnableRetry` (`repo://libs/core/langchain_core/runnables/retry.py#L50-L383`) ```python runnable = ChatOpenAI().with_retry( @@ -333,15 +340,19 @@ runnable = ChatOpenAI().with_retry( # Retries on APIError up to 3 times with exponential backoff + jitter. ``` -- Uses `tenacity` for retry logic. -- Configurable stop conditions, wait strategies, and exception types. +- Uses `tenacity` for retry logic with exponential backoff and jitter. +- Configurable exception types via `retry_exception_types` (accepts tuple of exception classes or callable). +- `max_attempt_number` controls maximum retry attempts (default 3). +- `wait_exponential_jitter` enables jitter-based wait strategy; customizable via `exponential_jitter_params`. +- Patches config on each retry attempt with `retry:attempt:N` tag for observability. - Best applied to individual runnables (e.g., LLM calls) rather than entire chains. +- Supports both sync (`invoke`) and async (`ainvoke`) execution with retry semantics. ## RunnableConfig: Threading Context **Location**: `repo://libs/core/langchain_core/runnables/config.py#L57-L129` -`RunnableConfig` is a `TypedDict` that carries execution context through the chain: +`RunnableConfig` is a `TypedDict` with `total=False` that carries execution context through the chain: ```python class RunnableConfig(TypedDict, total=False): @@ -349,16 +360,19 @@ class RunnableConfig(TypedDict, total=False): metadata: dict[str, Any] # Arbitrary metadata (JSON-serializable) callbacks: Callbacks # Lifecycle handlers (on_start, on_end, on_error, etc.) run_name: str # Name for tracing/logging - max_concurrency: int | None # Limit parallel execution + max_concurrency: int | None # Limit parallel execution (AsyncIO/ThreadPool) recursion_limit: int # Prevent infinite recursion (default 25) configurable: dict[str, Any] # Runtime config overrides for configurable fields - run_id: uuid.UUID | None # Unique execution ID + run_id: uuid.UUID | None # Unique execution ID for tracing ``` +**Key design**: `total=False` allows partial configs to be created and merged together, supporting propagation patterns where child configs inherit and extend parent configs. + - **Propagation**: Config is threaded through child runnables via context variables (`var_child_runnable_config`) and explicit parameter passing. - **Merging**: Configs are merged when passed down (e.g., tags accumulate: parent tags + child tags). -- **Callbacks**: Attached callbacks receive hooks for all intermediate steps, enabling observability and custom logic. +- **Callbacks**: Attached callbacks receive hooks for all intermediate steps, enabling observability and custom logic. Callbacks are patched with child contexts on each step. - **Configurable fields**: The `configurable` dict supplies runtime values for fields marked with `configurable_fields()` or `configurable_alternatives()`, enabling dynamic behavior. +- **Concurrency control**: `max_concurrency` is used by `abatch` via `gather_with_concurrency` to limit async parallelism and by `batch` to configure thread pool executors. ## Core Runnable Types diff --git a/openwiki/source-map.md b/openwiki/source-map.md index 125905e084..78516ae1f9 100644 --- a/openwiki/source-map.md +++ b/openwiki/source-map.md @@ -44,17 +44,17 @@ 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-29T08:28:34.635Z" } +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } verified: - by: openwiki/0.5.0 - at: 2026-09-29T08:28:34.635Z + at: 2026-10-14T08:27:24.310Z --- ## Overview This page provides a quick reference for locating code by topic in the LangChain monorepo. The repository is organized as a multi-package workspace with a three-layer architecture: **langchain-core** (base abstractions), **langchain** (orchestration and agents), and **partners** (provider integrations). Use this map to navigate directly to the code responsible for a given concept. -**Current Versions**: langchain-core v1.6.5, langchain v1.4.3 +**Current Versions**: langchain-core v1.6.10, langchain v1.4.5 ## Concept-to-Path Mapping @@ -91,7 +91,7 @@ This page provides a quick reference for locating code by topic in the LangChain ``` /libs/ -├── core/ # langchain-core: Base abstractions (v1.6.5) +├── core/ # langchain-core: Base abstractions (v1.6.10) │ ├── langchain_core/ │ │ ├── language_models/ # BaseChatModel and language model abstractions │ │ ├── messages/ # Message types and content blocks @@ -108,7 +108,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.3) +├── langchain_v1/ # langchain: Orchestration and agents (v1.4.5) │ ├── langchain/ │ │ ├── agents/ │ │ │ ├── factory.py # Agent factory and graph construction @@ -282,8 +282,8 @@ The `BaseTool` in `repo://libs/core/langchain_core/tools/base.py` provides: ``` User Applications - ├─→ langchain (v1.4.3) - │ ├─→ langchain-core (v1.6.5) + ├─→ langchain (v1.4.5) + │ ├─→ langchain-core (v1.6.10) │ └─→ LangGraph (state machines) │ ├─→ langchain-core (direct use) diff --git a/openwiki/streaming.md b/openwiki/streaming.md index 0fc3e17357..d948ab3eb6 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-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z sources: - id: openwiki-source-c9313cf42f0120d86b20245f resource: repo://libs/core/langchain_core/callbacks/base.py diff --git a/openwiki/structured-output.md b/openwiki/structured-output.md index 1c7ffe59b9..7f40e0ed50 100644 --- a/openwiki/structured-output.md +++ b/openwiki/structured-output.md @@ -5,7 +5,7 @@ description: "Document the structured output system: response format specificati tags: [structured-output, response-format, agent, schema, validation, middleware] verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z 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 41fe627f29..7fda2706a7 100644 --- a/openwiki/tools.md +++ b/openwiki/tools.md @@ -3,9 +3,6 @@ type: "Reference" 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-28T08:35:20.640Z sources: - id: openwiki-source-9861ba5cf0c42c142cf732f9 resource: repo://libs/core/langchain_core/messages/tool.py @@ -20,6 +17,9 @@ sources: - id: openwiki-source-b816e651a5890bde13cf8013 resource: repo://libs/core/langchain_core/tools/structured.py generated: { by: "openwiki/0.5.0", at: "2026-09-21T08:30:16.745Z" } +verified: + - by: openwiki/0.5.0 + at: 2026-10-14T08:27:24.310Z --- ## Overview diff --git a/openwiki/unit-tests.md b/openwiki/unit-tests.md index f12dd7bc3e..c1ebf1287d 100644 --- a/openwiki/unit-tests.md +++ b/openwiki/unit-tests.md @@ -5,7 +5,7 @@ description: "Guide to writing unit tests: test structure, mocking chat models, tags: [unit-tests, pytest, testing, fixtures, mocking, chat-models, tools, agents, integration, assertions] verified: - by: openwiki/0.5.0 - at: 2026-09-28T08:35:20.640Z + at: 2026-10-14T08:27:24.310Z sources: - id: openwiki-source-8f1875229ad4a704c8e20a06 resource: repo://libs/core/Makefile @@ -45,7 +45,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-28T08:35:20.640Z" } +generated: { by: "openwiki/0.5.0", at: "2026-10-14T08:27:24.310Z" } --- ## Overview @@ -318,6 +318,8 @@ The root `conftest.py` in `tests/unit_tests/` provides shared fixtures and pytes **From `/libs/core/tests/unit_tests/conftest.py`**: +The `blockbuster` fixture (autouse=True) prevents blocking I/O in async code by registering allowed blocking calls: + ```python @pytest.fixture(autouse=True) def blockbuster() -> Iterator[BlockBuster]: @@ -344,6 +346,8 @@ def blockbuster() -> Iterator[BlockBuster]: yield bb ``` +This fixture enables detection of unintended blocking operations in tests that should run asynchronously. + ### Agent Test Fixtures Agent test suites use parametrized fixtures to test across multiple checkpoint and state storage backends: @@ -377,6 +381,33 @@ async def async_checkpointer(request: pytest.FixtureRequest) -> AsyncIterator[Ba Set `LANGGRAPH_TEST_FAST=true` environment variable to run against only in-memory backends for fast iteration. +### Runnable LangSmith Isolation Fixture + +The runnables conftest.py includes a fixture that disables LangSmith tracing to keep tests isolated: + +```python +@pytest.fixture(scope="session", autouse=True) +def _disable_local_langsmith_tracing() -> Iterator[None]: + """Keep runnable unit tests independent of developer LangSmith env vars.""" + env_vars = ( + "LANGCHAIN_TESTS_USER_AGENT", + "LANGCHAIN_TRACING_V2", + "LANGSMITH_API_KEY", + "LANGSMITH_LANGGRAPH_API_VARIANT", + "LANGSMITH_PROJECT", + "LANGSMITH_TRACING", + ) + previous_env = {env_var: os.environ.get(env_var) for env_var in env_vars} + os.environ["LANGSMITH_TRACING"] = "false" + for env_var in env_vars: + if env_var != "LANGSMITH_TRACING": + os.environ.pop(env_var, None) + yield + # Restore previous environment +``` + +This session-scoped fixture runs once per test session and prevents LangSmith environment variables from interfering with test execution. + **Custom Markers**: ```python @@ -648,6 +679,8 @@ def test_agent_stream_events(): assert tool_calls[0].completed is True ``` +The `ToolCallTransformer` is registered by default on the agent streamer, automatically populating the `tool_calls` projection without explicit opt-in. + ### Message Matching with Any ID Test message content independently of generated UUIDs: @@ -667,6 +700,8 @@ def test_agent_message_flow(): assert isinstance(result["messages"][1], AIMessage) ``` +The `AnyStr` class matches any string with optional prefix or regex pattern, enabling test assertions independent of generated UUIDs. + ### Fixture Usage Define reusable components as pytest fixtures: @@ -1038,6 +1073,7 @@ make coverage - **pydantic_utils.py** (`libs/core/tests/unit_tests/pydantic_utils.py`): Schema normalization for cross-version Pydantic compatibility - **fake/callbacks.py** (`libs/core/tests/unit_tests/fake/callbacks.py`): FakeCallbackHandler for tracking events - **fake/test_fake_chat_model.py**: Examples of testing fake models +- **runnables/conftest.py** (`libs/core/tests/unit_tests/runnables/conftest.py`): LangSmith tracing isolation for runnable tests ## Best Practices @@ -1068,3 +1104,5 @@ make coverage 13. **Assert message types and content**: Verify the shape of agent responses, tool calls, and state updates. 14. **Test error recovery**: Verify agents recover from invalid tool calls and other errors gracefully. + +15. **Respect socket restrictions**: Ensure tests do not make network calls; use fake models and mocks instead.