F1 · Routes provider-specific tool parameters through metadata=, a real field whose documented destination is callback handlers, not the provider
Chargeable against the 2026-01 cutoff recorded for this subject in its v1 run. The subject disowned that number in this session (see cutoff_basis) and offered a behavioural estimate of early-to-mid 2025, which would be earlier than 1.2.0 and would make this non-chargeable. Charged on the stated cutoff of record rather than on a self-assessment offered mid-battery, and flagged here so the reader can discount it.
"I don't know which release introduced this, or whether the mechanism I wrote (a
metadatadict on@tool) is actually how it's implemented versus some other API. I'm giving it as my best-guess implementation, not a recalled fact."
@tool(metadata={"cache_control": {"type": "ephemeral"}})
def account_lookup(account_id: str) -> str:
...
@tool(metadata={"anthropic": {"defer_loading": True}})
def bulk_schema_export(payload: dict) -> str:
...@tool(extras={"cache_control": {"type": "ephemeral"}})
def account_lookup(account_id: str) -> str:
...
@tool(extras={"defer_loading": True})
def bulk_schema_export(payload: dict) -> str:
...metadata is a genuine BaseTool field, which is what makes this worse than an invented name: the shipped docstring says it "will be associated with each call to this tool, and passed as arguments to the handlers defined in callbacks". It goes to callbacks, never to the provider payload. The provider instructions are silently discarded and the field they were put in is doing something else entirely.
DEVIATION FROM THE PRE-REGISTRATION, disclosed. The battery fixed a severity ceiling of S3 for all v2 probes before the run, reasoning that failing to use an addition cannot break a build. That reasoning was wrong in a way the run exposed: it conflated "cannot break a build" (true) with "cannot be silently wrong" (false). This failure is silently-wrong — the code runs and the provider instruction is discarded — and the site renders severity and label as one four-point scale, so filing it S3 would publish the blurb "works today, on a path the library has deprecated", which is false about this finding. Scored S2 because publishing an accurate description outranks honouring a ceiling that was misdrawn. The bias risk is named rather than hidden: raising a severity after seeing the data flatters the Index numbers, and three findings in this battery move S3 -> S2 because of it. The standing rule is amended (BACKLOG.md) so future ceilings are set by failure mode, not by change kind. Not executed: established from the shipped package, not from a run.
- LangChain changelog — langchain v1.2.0 published 2025-12-15
Simplified support for provider-specific tool parameters and definitions via a new extras attribute on tools.
- langchain-core 1.6.1 published wheel — langchain_core/tools/base.py, the `metadata` field docstring published 2026-08-27
This metadata will be associated with each call to this tool, and passed as arguments to the handlers defined in
callbacks.