mirror of
https://github.com/hwchase17/langchain.git
synced 2026-07-13 03:42:57 +00:00
Stash the OpenAI function description dict on the BaseTool instance under `tool.__dict__["_openai_function_dict"]`. BaseTool.__setattr__ already pops `tool_call_schema` and `args` when `args_schema`, `description`, or `name` change; extend the invalidation set to include the new key so the cache matches the schema caching lifecycle. Previously, every call to `convert_to_openai_tool(tool)` re-ran `schema.model_json_schema()` on the cached tool_call_schema pydantic model, rebuilding the full JSON-schema tree on every model invocation. Summarization middleware's `count_tokens_approximately` (called twice per model call) plus the prompt-caching middleware's `bind_tools` meant three fresh schema generations per model call × 15-ish tools × 500 model calls in a 100-turn agent run — tens of seconds of pydantic work that's identical every time. With this cache the first call pays the schema-gen cost once per tool; all subsequent calls are a dict lookup. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>