breaking‑change‑radar.

cases / real-tf2bot-pydantic-v2

real-tf2bot-pydantic-v2

pydantic 1.10.7 2.0.0

A desktop chat-bot app pinned to pydantic==1.10.7. Two real v1 APIs in use against sixteen sites that only look like them.

grep-baseline
2 right 16 wrong 4 unjudged
<0.1s · $0.00
agent · deepseek-v4-flash-free
2 right 0 wrong
89.2s · $0.00

What each detector said

One row per (file, symbol) site — the unit the scorer compares on. Ground truth comes from the case's hand-written labels.

22 sites · 20 where a detector is wrong
  1. unlabeled config.py :Config grep-baseline flagged agent · deepseek-v4-flash-free silent
    4 matched lines · reasoning
      32  class Config(BaseModel):
     102  config: Optional[Config] = None
     120  buffered_fail_message("Config file is missing.", "LOG", level="ERROR")
     135  config = Config(**config_dict)
    grep-baseline conf 0.50

    'Config' is named in the release notes and appears in 8 place(s) in this repo. No check was made that these are real call sites.

  2. not broken config.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    1 matched line · reasoning
     128  config_dict: dict[str, str | None] = {
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  3. not broken config.py :json grep-baseline flagged agent · deepseek-v4-flash-free silent

    `import json` (stdlib) only.

    1 matched line · reasoning
       2  import json
    grep-baseline conf 0.50

    'BaseModel.json' is named in the release notes and appears in 16 place(s) in this repo. No check was made that these are real call sites.

  4. not broken modules/api/github.py :json grep-baseline flagged agent · deepseek-v4-flash-free silent

    stdlib `json.loads(response.content)`.

    2 matched lines · reasoning
       1  import json
      21  data = json.loads(response.content)
    grep-baseline conf 0.50

    'BaseModel.json' is named in the release notes and appears in 16 place(s) in this repo. No check was made that these are real call sites.

  5. not broken modules/api/llm/groq.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    1 matched line · reasoning
      16  if isinstance(settings, dict):
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  6. not broken modules/api/llm/openai.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    1 matched line · reasoning
      19  if isinstance(settings, dict):
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  7. not broken modules/api/llm/textgen_webui.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    1 matched line · reasoning
      19  if isinstance(settings, dict):
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  8. not broken modules/api/llm/textgen_webui.py :json grep-baseline flagged agent · deepseek-v4-flash-free silent

    requests `response.json()`, not a pydantic model.

    3 matched lines · reasoning
      16  headers = {"Content-Type": "application/json"}
      22  response = requests.post(uri, headers=headers, json=data, verify=False)
      25  data = response.json()["choices"][0]["message"]["content"]
    grep-baseline conf 0.50

    'BaseModel.json' is named in the release notes and appears in 16 place(s) in this repo. No check was made that these are real call sites.

  9. not broken modules/bans.py :json grep-baseline flagged agent · deepseek-v4-flash-free silent

    stdlib json.load/json.dump, plus the literal filename string "bans.json".

    6 matched lines · reasoning
       2  import json
       3  from json import JSONDecodeError
      17  self.__bans_filename = bans_file or "bans.json"
      26  self.banned_players_steamid3 = set(json.load(file))
      28  combo_logger.warning(f"Error parsing .json file [{e}].")
      54  json.dump(list(self.banned_players_steamid3), f)

    +1 more

    grep-baseline conf 0.50

    'BaseModel.json' is named in the release notes and appears in 16 place(s) in this repo. No check was made that these are real call sites.

  10. not broken modules/builder.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    4 matched lines · reasoning
      69  def get_commands_from_yaml() -> List[dict]:
      76  def create_command_from_dict(cmd: dict) -> BaseCommand:
     112  if isinstance(wrapper_obj, dict):
     134  # Update dict
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  11. not broken modules/bulk_url_downloader.py :json grep-baseline flagged agent · deepseek-v4-flash-free silent

    requests `response.json()`, not a pydantic model.

    1 matched line · reasoning
      31  self.results.append((response.json(), url.steamid64))
    grep-baseline conf 0.50

    'BaseModel.json' is named in the release notes and appears in 16 place(s) in this repo. No check was made that these are real call sites.

  12. unlabeled modules/command_controllers.py :Config grep-baseline flagged agent · deepseek-v4-flash-free silent
    1 matched line · reasoning
      95  class Config(BaseConfig):
    grep-baseline conf 0.50

    'Config' is named in the release notes and appears in 8 place(s) in this repo. No check was made that these are real call sites.

  13. not broken modules/command_controllers.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    4 matched lines · reasoning
      30  self, cmd_name: str, type_: CommandChatTypes, settings: dict = None, user: Player = None
     108  def __init__(self, initializer_config: dict = None, disable_help: bool = False) -> None:
     110  self.__shared = dict()
     133  def help(self, command: str, shared_dict: dict):
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  14. not broken modules/conversation_history.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    1 matched line · reasoning
      13  def __init__(self, settings: dict = None):
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  15. not broken modules/lobby_manager.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    3 matched lines · reasoning
     227  def _get_steam_profiles_data(self, steamids64: List[str]) -> List[dict]:
     237  def _get_steam_ban_data(self, steamids64: List[str]) -> List[dict]:
     297  def get_data(self) -> dict:
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  16. not broken modules/lobby_manager.py :json grep-baseline flagged agent · deepseek-v4-flash-free silent

    `requests.get(...).json()` against the Steam Web API.

    2 matched lines · reasoning
     231  ).json()
     241  ).json()
    grep-baseline conf 0.50

    'BaseModel.json' is named in the release notes and appears in 16 place(s) in this repo. No check was made that these are real call sites.

  17. not broken modules/message_queueing.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    1 matched line · reasoning
     108  def messaging_queue_service(logline: LogLine, shared_dict: dict):
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  18. not broken modules/set_once_dict.py :dict grep-baseline flagged agent · deepseek-v4-flash-free silent

    `dict` as a type annotation or the dict builtin. The repository contains no .dict() call on a pydantic model.

    1 matched line · reasoning
       1  class SetOnceDictionary(dict):
    grep-baseline conf 0.50

    'BaseModel.dict' is named in the release notes and appears in 18 place(s) in this repo. No check was made that these are real call sites.

  19. unlabeled modules/utils/buffered_messages.py :Config grep-baseline flagged agent · deepseek-v4-flash-free silent
    2 matched lines · reasoning
      52  main_logger.info("Config is OK.")
      57  main_logger.error("Config is faulty.")
    grep-baseline conf 0.50

    'Config' is named in the release notes and appears in 8 place(s) in this repo. No check was made that these are real call sites.

  20. unlabeled tests/test_conversation_history.py :Config grep-baseline flagged agent · deepseek-v4-flash-free silent
    1 matched line · reasoning
     140  # Config setup
    grep-baseline conf 0.50

    'Config' is named in the release notes and appears in 8 place(s) in this repo. No check was made that these are real call sites.

  21. breaks config.py :validator grep-baseline flagged agent · deepseek-v4-flash-free flagged

    Five @validator decorators imported from pydantic, on OPENAI_API_KEY, STEAM_WEBAPI_KEY, SHORTENED_USERNAMES_FORMAT, RTD_MODE and TF2_LOGFILE_PATH.

    6 matched lines · reasoning
      13  from pydantic import BaseModel, validator
      61  @validator("OPENAI_API_KEY")
      67  @validator("STEAM_WEBAPI_KEY")
      75  @validator("SHORTENED_USERNAMES_FORMAT")
      85  @validator("RTD_MODE")
      95  @validator("TF2_LOGFILE_PATH")
    grep-baseline conf 0.50

    'validator' is named in the release notes and appears in 6 place(s) in this repo. No check was made that these are real call sites.

  22. breaks modules/command_controllers.py :BaseConfig grep-baseline flagged agent · deepseek-v4-flash-free flagged

    `from pydantic import BaseConfig` with `class Config(BaseConfig)`, which v2 removes in favour of model_config = ConfigDict(...).

    2 matched lines · reasoning
       6  from pydantic import BaseConfig, BaseModel
      95  class Config(BaseConfig):
    grep-baseline conf 0.50

    'BaseConfig' is named in the release notes and appears in 2 place(s) in this repo. No check was made that these are real call sites.