Heuristic:Cohere ai Cohere python ToolCallV2 Auto UUID Override
| Knowledge Sources | |
|---|---|
| Domains | Compatibility, Tool_Use |
| Last Updated | 2026-02-15 14:00 GMT |
Overview
The SDK monkey-patches `ToolCallV2.__init__` at import time to auto-generate a UUID for the `id` field when not provided, ensuring backward compatibility.
Description
The Cohere API requires each `ToolCallV2` to have a unique `id` field for correlating tool calls with tool results. However, older SDK versions did not require this field. To maintain backward compatibility, the SDK applies a runtime monkey patch via `overrides.py` that intercepts `ToolCallV2.__init__` and injects `str(uuid.uuid4())` as a default `id` when none is provided. This runs at module import time before any user code can instantiate `ToolCallV2`.
A second override patches `EmbedByTypeResponseEmbeddings.__getattr__` to allow accessing fields by their alias names (e.g., `embeddings.float` instead of `embeddings.float_`), working around Python reserved keyword conflicts.
Usage
This heuristic is relevant when:
- Constructing ToolCallV2 objects manually without providing an `id` field
- Debugging tool call correlation issues in multi-turn conversations
- Extending the SDK with custom overrides (follow the same pattern)
- Understanding import-time behavior (the patch runs when `cohere` is imported)
The Insight (Rule of Thumb)
- Action: Do not worry about providing `id` when creating `ToolCallV2` objects; the SDK auto-generates UUIDs.
- Value: Default `id = str(uuid.uuid4())` injected before Pydantic validation.
- Trade-off: The monkey patch modifies generated code behavior at runtime. If Fern regenerates `ToolCallV2` with a different `__init__` signature, the patch may break.
- Pattern: Override generated code via `overrides.py:run_overrides()`, never modify generated files directly.
Reasoning
The SDK is primarily generated by Fern, so directly modifying generated type files would be lost on regeneration. The `overrides.py` pattern provides a stable extension point. Auto-generating UUIDs prevents breaking changes for users upgrading from older SDK versions where `id` was not required, while still satisfying the API's requirement for unique tool call identifiers.
Code Evidence
Monkey patch from `overrides.py:37-59`:
def make_tool_call_v2_id_optional(cls):
"""
Override ToolCallV2 to make the 'id' field optional with a default UUID.
This ensures backward compatibility with code that doesn't provide an id.
We wrap the __init__ method to inject a default id before Pydantic validation runs.
"""
original_init = cls.__init__
def patched_init(self, /, **data):
"""Patched __init__ that injects default id if not provided."""
if 'id' not in data:
data['id'] = str(uuid.uuid4())
original_init(self, **data)
cls.__init__ = patched_init
return cls
Import-time execution from `overrides.py:62-80`:
def run_overrides():
"""
These are overrides to allow us to make changes to generated code
without touching the generated files themselves.
Should be used judiciously!
"""
# Override to allow access to aliases in EmbedByTypeResponseEmbeddings
setattr(EmbedByTypeResponseEmbeddings, "__getattr__", allow_access_to_aliases)
from . import ToolCallV2
make_tool_call_v2_id_optional(ToolCallV2)
# Run overrides immediately at module import time
run_overrides()