https://github.com/agems-ai/agems изучи репозитори...

Creado el: 23 de marzo de 2026

Respondido usando GPT-5.4 Thinking por Chat01

Pregunta

https://github.com/agems-ai/agems изучи репозиторий ведь код найди ошибки

Pensamiento

Сначала быстро сниму структуру репозитория, посмотрю ключевые модули и попробую найти конкретные баги с примерами по файлам и строкам. Если у тебя есть приоритет по части проекта — API, агенты, CLI или тесты — учту это, но уже начинаю разбор.

Thought for 17s

Pensamiento

Thought for 3m 32s

Respuesta

Не смог надёжно открыть именно agems-ai/agems: публично доступный код, который удалось разобрать через GitHub/PyPI, относится к репозиторию anges-ai/anges и пакету anges 0.1.1. Поэтому ниже — разбор по этому публичному коду; если твой URL не опечатка и там другой/приватный репозиторий, часть выводов может не совпасть. (GitHub)

Вот самые сильные находки.

  1. Неправильный return в run_with_new_request.
    Внутри run_with_new_request(self, task_description, event_stream=None) сначала строится run_config = self._build_run_config(...), но на всех выходах функция возвращает параметр event_stream, а не поток из run_config. Если вызов был с event_stream=None, то метод на выходе вернёт None, даже если внутри уже создан и заполнен новый stream. Это выглядит как реальный баг управления состоянием. (PyPI)

  2. Краш диспетчера действий на пустом ответе модели.
    В _prefict_next_event_and_handle_actions код делает called_actions_json = parsed_response_dict.get("actions", []), а сразу после этого обращается к called_actions_json[0] без проверки длины. Если модель вернёт пустой список действий, будет IndexError. Это high-confidence runtime bug. (PyPI)

  3. Там же нет валидации action_type.
    Строка called_actions_json[0].get("action_type").lower() упадёт с AttributeError, если action_type отсутствует или null. А registered_actions_dict[...] даст KeyError, если пришёл неизвестный action. В цикле ниже ещё хуже: action = registered_actions_dict.get(...) может вернуть None, после чего action.handle_action_in_parsed_response(...) даст AttributeError. То есть парсер ответа LLM здесь практически без защит. (PyPI)

  4. Mutable default argument: parent_ids=[].
    В BaseAgent.__init__ используется parent_ids=[] как значение по умолчанию. Для Python это классическая ошибка: список будет разделяться между инстансами, и если он где-то мутируется, состояние может протечь между агентами. Нужно parent_ids=None и инициализация внутри функции. (PyPI)

  5. Игнорируется входной mcp_config.
    В EventStream.__init__(..., mcp_config=None) публичный интерфейс принимает mcp_config, но внутри фрагмент кода просто делает self.mcp_config = None. Если это соответствует реальной реализации, конфиг MCP вообще не сохраняется, несмотря на заявленную поддержку MCP. (PyPI)

  6. Похоже на сломанную/рассинхронизированную API-модель Event.
    Публичное описание класса показывает Event.__init__(self, type, ...), но примеры по всему README/PyPI создают объекты как Event(event_type="NEW_REQUEST", ...). Если код действительно ждёт type, такие примеры упадут с TypeError: unexpected keyword argument 'event_type'. Даже если в реальном коде уже event_type, тогда публичная документация устарела и вводит в заблуждение. (PyPI)

  7. Ещё одна вероятная рассинхронизация API: events_list vs events.
    EventStream в описании хранит события в self.events_list, но примеры дальше итерируются по agent.event_stream.events и считают len(orchestrator.event_stream.events). Если property/alias events не определён, это будет AttributeError. Как минимум docs/examples тут не бьются между собой. (PyPI)

Что бы я правил первым:

  • в run_with_new_request возвращать реальный stream из run_config, а не входной параметр;
  • в _prefict_next_event_and_handle_actions добавить проверки на пустой actions, отсутствие action_type и неизвестные action-ы;
  • заменить parent_ids=[] на None;
  • сохранять self.mcp_config = mcp_config;
  • унифицировать API Event(type vs event_type) и EventStream(events_list vs events). (PyPI)

Если нужен разбор именно точного репозитория по твоей ссылке, самый надёжный путь — прислать архив репо или открыть публичный доступ к нему: тогда можно пройтись уже по реальным файлам, тестам и назвать баги по конкретным модулям, а не по опубликованным фрагментам.

Compartir este Q&A