I think this should be preferred over https://github.com/pydantic/pydantic/pull/6915, mostly because the implementation there involves duplicating the list of types in the union, and generally seems more fragile.

I've opened as draft until docs/tests are added, hoping @sydney-runkle can help get this across the line tomorrow.
Add CallableDiscriminator and Tag. I think this should be preferred over https://github.com/pydantic/pydantic/pull/6915, mostly because the implementation there involves duplicating the list of types in the union, and generally seems more fragile.

I've opened as draft until docs/tests are added, hoping @sydney-runkle can help get this across the line tomorrow.
"""
Check that all `Usage docs` tags in docstrings link to the latest version of pydantic.
"""
import re
import sys
from pathlib import Path

ROOT_DIR = Path(__file__).parent.parent
PYDANTIC_DIR = ROOT_DIR / 'pydantic'
version_file = PYDANTIC_DIR / 'version.py'


version = re.search(rb"VERSION = '(.*)'", version_file.read_bytes()).group(1)
version_major_minor = b'.'.join(version.split(b'.')[:2])
expected_base = b'https://docs.pydantic.dev/' + version_major_minor + b'/'

paths = sys.argv[1:]
error_count = 0
for path_str in paths:
    path = ROOT_DIR / path_str
    b = path.read_bytes()

    changed = 0

    def sub(m: re.Match) -> bytes:
        global changed
        if m.group(2) != expected_base:
            changed += 1
            return m.group(1) + expected_base
        else:
            return m.group(0)

    b = re.sub(rb'(""" *usage.docs: *)(https://.+?/.+?/)', sub, b, flags=re.I)
    if changed:
        error_count += changed
        path.write_bytes(b)
        plural = 's' if changed > 1 else ''
        print(f'{path_str:50} {changed} usage docs link{plural} updated')

if error_count:
    sys.exit(1)

"""
Check that all `Usage docs` tags in docstrings link to the latest version of pydantic.
"""
import re
import sys
from pathlib import Path

ROOT_DIR = Path(__file__).parent.parent
PYDANTIC_DIR = ROOT_DIR / 'pydantic'
version_file = PYDANTIC_DIR / 'version.py'


version = re.search(rb"VERSION = '(.*)'", version_file.read_bytes()).group(1)
version_major_minor = b'.'.join(version.split(b'.')[:2])
expected_base = b'https://docs.pydantic.dev/' + version_major_minor + b'/'

paths = sys.argv[1:]
error_count = 0
for path_str in paths:
    path = ROOT_DIR / path_str
    b = path.read_bytes()

    changed = 0

    def sub(m: re.Match) -> bytes:
        global changed
        if m.group(2) != expected_base:
            changed += 1
            return m.group(1) + expected_base
        else:
            return m.group(0)

    b = re.sub(rb'(""" *usage.docs: *)(https://.+?/.+?/)', sub, b, flags=re.I)
    if changed:
        error_count += changed
        path.write_bytes(b)
        plural = 's' if changed > 1 else ''
        print(f'{path_str:50} {changed} usage docs link{plural} updated')

if error_count:
    sys.exit(1)
