Библиотека для автоматизации Renga через COM с использованием comtypes.
Для публикации и репозитория проект называется renga_ai, при этом текущий Python-пакет и публичный import-путь сохраняются как renga_api.
Проект состоит из двух разных рабочих направлений, которые не стоит смешивать:
Renga API— COM-автоматизация приложения, проекта, модели, объектов, параметров и introspection.Renga STDL— шаблоны категорий и стилей Renga,.json/.lua/.rst, примеры SDK и локальныйRstBuilder.
Основной Python-пакет проекта — renga_api.
renga_api.core— low-level и core API для прямой работы с COM.renga_api.skills— agent-facing слой с функциями, которые удобно вызывать из ИИ-агента.renga_apiна верхнем уровне напрямую реэкспортирует agent-facing API.
README.md— обзор проекта, архитектуры, правил работы и текущего рабочего процесса.AGENTS.md— постоянные указания агентам для этого репозитория.TODO.md— рабочий журнал задач и текущего состояния.RengaAPI_Docs/— локальная Markdown-версия документации Renga COM API.RengaSTDL_Docs/— локальная Markdown-версия документации Renga STDL, примеры SDK иRstBuilder.
- Функциональный API для подключения к Renga и работы с проектом и моделью.
- Управление локальными процессами Renga для устранения неоднозначности между несколькими COM-экземплярами.
- Reflection по
RengaCOMAPI.tlbдля поиска интерфейсов и анализа сигнатур. - Probe и глубокий JSON-дамп COM-объектов.
- Agent-facing каталог функций для вызова из LLM-инструментов.
- Базовые операции над моделью: уровни, стены, выборка объектов, удаление по id.
- Демонстрационные text-skills для построения слов стенами.
- Базовые обёртки для STDL: импорт категории и создание style из category.
renga_ai/
├── AGENTS.md # проектные правила для агентов и постоянные рабочие соглашения
├── AGENT_EXAMPLE.md # минимальный пример прямого использования `renga_api`
├── README.md # основная документация по проекту, архитектуре и рабочему процессу
├── TODO.md # единый журнал задач, статусов и важных итогов
├── pyproject.toml # метаданные пакета, зависимости и настройки инструментов
├── tlb/ # локальная копия `RengaCOMAPI.tlb` для reflection и генерации типов
├── tests/ # unit-тесты для skills, process helpers и геометрии demo-алгоритмов
├── RengaAPI_Docs/ # локальная документация по Renga COM API
├── RengaSTDL_Docs/ # локальная документация по Renga STDL и материалы SDK
└── renga_api/ # основной Python-пакет проекта
├── catalogs.py # общие каталоги GUID, quantity и других стабильных справочников API
├── core/ # COM-core и low-level helpers, не зависящие от агентного сценария
└── skills/ # agent-facing wrappers поверх core-функций
Примечание по дампам:
- каталог
dumps/не хранится в репозитории как постоянная часть дерева; - он создаётся по месту работы при вызове
dump_to_file(...); - это нормальный рабочий артефакт для исследования, а не часть пакета.
Это COM-автоматизация Renga из Python.
Сюда относятся:
- подключение к приложению;
- открытие и сохранение проекта;
- доступ к модели и объектам;
- создание и удаление объектов;
- чтение параметров и свойств;
- probe интерфейсов;
- dump объектов и геометрии;
- reflection по
RengaCOMAPI.tlb.
Основные источники:
renga_api/core/*renga_api/skills/*RengaAPI_Docs/tlb/RengaCOMAPI.tlb
Это отдельный слой работы с шаблонами категорий и стилей Renga.
Сюда относятся:
.jsonи.luaшаблоны;- сборка
.rstчерезRstBuilder.exe; - ручной импорт категории в Renga;
- создание style на основе category;
- проверка фактического поведения шаблона внутри Renga;
- отладка через
AecApp.log.
Основные источники:
RengaSTDL_Docs/README.mdRengaSTDL_Docs/MODULAR/*RengaSTDL_Docs/Samples/*RengaSTDL_Docs/RstBuilder/RstBuilder.exe
Важно:
Renga STDLне равенRenga API;- успешная сборка
.rstне доказывает корректность геометрии; - часть ошибок STDL проявляется только во время исполнения Lua внутри Renga;
- при проблемах с шаблоном сначала нужен runtime-лог, а не подбор геометрии вслепую.
- параметр
executable_luaв документации и CLIRstBuilder.exeв этом проекте нужно понимать как путь к исполняемому.lua-скрипту шаблона, а не как путь кlua.exe; по названию параметра это легко понять неправильно.
Примечание по RstBuilder.exe:
- корректный вызов на практике выглядит так:
RstBuilder.exe configuration.json run.lua -s 1.0 -o category.rst; - то есть вторым позиционным аргументом передаётся файл Lua-скрипта шаблона;
- отдельный путь к
lua.exeдля этого сценария не требуется.
Текущий подтверждённый путь к логу:
C:\Users\user\AppData\Local\Renga Software\Renga Professional\AecApp.log
Для этого проекта dump_object(...) и dump_selected_object(...) - это основные инструменты исследования Renga API.
Dump нужен для того, чтобы:
- увидеть, какие интерфейсы реально поддерживает конкретный COM-объект;
- не гадать по названиям интерфейсов и свойств;
- получить реальные параметры, свойства и их значения;
- понять, какие методы безопасно вызываются на чтение;
- увидеть geometry-related интерфейсы;
- сопоставить живой объект из модели с тем, что описано в
RengaAPI_Docs/.
Рекомендуемый порядок исследования неизвестного объекта:
- Получить объект через существующие agent-facing функции.
- Выполнить
dump_object(...)илиdump_selected_object(). - Сохранить результат через
renga_api.core.dump_to_file(...), если нужен артефакт для анализа. - Посмотреть
interface_summary,interfaces,parameters,properties,geometry. - Найти интересующие интерфейсы и члены в
RengaAPI_Docs/иRengaCOMAPI.tlb. - Только после этого менять код или добавлять новый skill.
Пример:
from renga_api import dump_selected_object
from renga_api.core import dump_to_file
payload = dump_selected_object()
if payload is not None:
path = dump_to_file(payload, prefix="selected")
print(path)pip install -e .Для разработки:
pip install -e ".[dev]"from renga_api import list_renga_processes, open_renga
print(list_renga_processes())
print(open_renga(mode="active"))from renga_api import create_level, create_model, create_wall, find_base_level, open_renga
open_renga(mode="new", visible=True)
create_model()
level = create_level(name="Level 0")
level_id = level["level_id"] if level else find_base_level()
result = create_wall(level_id=level_id, end_x=6000.0, thickness=200.0, height=3000.0)
print(result)from renga_api import create_word_from_walls, find_base_level, open_renga
open_renga(mode="active")
level_id = find_base_level()
result = create_word_from_walls("СЛОВО", level_id=level_id)
print(result)from renga_api import get_skills_catalog
for skill in get_skills_catalog():
print(skill["module"], skill["name"])
print(skill["description"])При вызове python -c "..." из shell-инструментов может наблюдаться отсутствие вывода print(). Возможные причины:
- Буферизация stdout — Python буферизует вывод, и он не попадает в stdout до завершения процесса. Флаг
-u(unbuffered mode) решает эту проблему. - Длинные многострочные команды — при передаче длинных скриптов с переносами, f-strings и экранированием кавычек через
cmd.exe /cвозможны проблемы с парсингом.
Это не универсальная проблема: в некоторых окружениях всё работает корректно. Если столкнулся с отсутствием вывода, попробуй:
python -u -c "from renga_api import open_renga, get_object_ids_by_category; open_renga(mode='active'); print(get_object_ids_by_category('wall'))"Подключение к приложению, проекту, модели и текущему выделению. Здесь же лежат low-level операции открытия, сохранения и закрытия приложения.
Перечисление и завершение локальных процессов Renga. Это важно, когда в системе открыто несколько экземпляров и GetActiveObject(...) становится неоднозначным.
Загрузка RengaCOMAPI.tlb, генерация COM-типов и построение реестра интерфейсов и членов интерфейсов. Это основной reflection-слой проекта.
Безопасная проверка поддерживаемых интерфейсов, чтение свойств и вызов методов без падения на COM-ошибках при исследовании.
Главный introspection-модуль проекта. Он строит JSON-совместимую структуру по живому COM-объекту, включая:
- базовые идентификаторы объекта;
- summary поддерживаемых интерфейсов;
- свойства интерфейсов;
- безопасно вызываемые методы чтения;
- параметры;
- свойства;
- geometry-related данные;
- попытку вытащить экспортированную 3D-геометрию.
Low-level helpers для операций над моделью, транзакций и создания объектов. Все изменения модели должны идти через operation/transaction-подход.
Модуль общих каталогов и справочников проекта. Сюда следует выносить стабильные реестры GUID, quantity, entity type и другие подобные данные, если они используются несколькими skills или являются частью внешнего API Renga.
Важно:
- не держать такие каталоги внутри отдельных
skills/*, если это не одноразовая локальная константа; - подробно комментировать происхождение и назначение каталога прямо в модуле;
- использовать каталоги как список кандидатов для runtime-проверки, если COM-интерфейс не умеет перечислять значения напрямую.
Agent-facing wrappers поверх core-функций. Это основной интерфейс, через который агент должен вызывать операции в пользовательском сценарии.
В агентном сценарии взаимодействие с Renga должно идти через:
renga_api- или
renga_api.skills/*
Агент не должен использовать renga_api.core/* как основной интерфейс сценария, если соответствующая agent-facing функция уже существует.
- Вызвать
get_skills_catalog(). - Найти подходящую функцию по имени и описанию.
- Импортировать и вызвать нужную функцию напрямую из
renga_api. - Если нужной функции нет, сначала исследовать API через dump и документацию, а уже потом расширять библиотеку.
- Поднять или подключить Renga через agent-facing lifecycle-функции:
list_renga_processes()open_renga(...)create_model()илиopen_model(...)
- Получить интересующий объект существующими skills.
- Выполнить
dump_object(...)илиdump_selected_object(). - Подтвердить увиденные интерфейсы и сигнатуры по
RengaAPI_Docs/. - При необходимости написать небольшой исследовательский Python-скрипт, который вызывает
renga_apiи воспроизводит сценарий. - Зафиксировать наблюдения в коде, тесте или
TODO.md, если они важны для будущей разработки.
- Найти ближайший пример в
RengaSTDL_Docs/Samples/. - Подготовить или изменить
.jsonи.lua. - Собрать
.rstчерезRstBuilder.exe. - Импортировать
.rstв Renga вручную. - Создать style на основе category.
- Проверить фактическое поведение шаблона в Renga.
- При ошибке смотреть
AecApp.logи использоватьprint()в Lua для диагностики.
Уточнение по сборке:
- не интерпретировать аргумент
executable_luaкак путь кlua.exe; - в рабочем сценарии SDK это путь к основному
.lua-файлу шаблона, который передаётсяRstBuilder.exeвторым аргументом.
Важно:
- agent-facing wrapper
import_stdl_category(...)уже существует, но текущий live-сценарий импорта через COM не считается подтверждённым end-to-end; - для STDL основной источник правды при ошибках — runtime-лог, а не только факт успешной сборки
.rst.
Ниже описан практический pipeline для добавления новой возможности в библиотеку.
Чётко определить, что именно нужно получить:
- новый read-only introspection helper;
- новую операцию над моделью;
- новый STDL workflow helper;
- одноразовый исследовательский скрипт;
- полноценный новый skill для агента.
Если задача про COM API:
- искать интерфейсы, параметры и типы в
RengaAPI_Docs/; - при необходимости смотреть
RengaCOMAPI.tlbчерезrenga_api.core.typelib.
Если задача про STDL:
- начинать с
RengaSTDL_Docs/; - затем брать ближайший пример из
RengaSTDL_Docs/Samples/.
Для agent-facing сценария использовать существующие функции:
list_renga_processes()— понять, сколько экземпляров Renga уже запущено;close_renga_process(...)илиclose_all_renga_processes()— убрать лишние процессы, если нужен однозначный active-instance;open_renga(mode="active" | "new")— подключиться или открыть новый экземпляр;create_model()илиopen_model(...)— создать или открыть проект;save_model(...)— сохранить результат проверки.
Нужно не угадывать API по памяти, а работать от живого объекта:
- создать или найти объект;
- выполнить
dump_object(...)илиdump_selected_object(); - при необходимости сохранить дамп в файл;
- посмотреть реальные интерфейсы, параметры и свойства;
- только после этого писать код.
Если задача ещё не оформлена в skill:
- можно создать небольшой одноразовый Python-скрипт, который импортирует функции из
renga_api; - скрипт должен воспроизводить минимальный сценарий и печатать диагностический результат;
- такой скрипт нужен для быстрой проверки гипотезы, а не как постоянная архитектурная надстройка.
Практически это обычно выглядит так:
- открыть Renga;
- создать или открыть проект;
- получить объект;
- вывести dump, значения параметров,
LastError, идентификаторы или результат операции; - проверить поведение в интерфейсе Renga.
Для Python-части полезно логировать:
- входные параметры операции;
- идентификаторы объектов;
- коды возврата COM-вызовов;
LastError, если операция вернулаNoneили код ошибки;- путь к сохранённому дампу.
Для STDL-части полезно логировать:
print()в Lua;- сообщения из
AecApp.log; - факт успешной сборки
.rst; - факт появления category/style в самом Renga.
Проверка должна быть фактической, а не только по отсутствию исключения.
Для COM API это обычно значит:
- убедиться, что объект действительно создан или изменён;
- перечитать объект;
- повторно посмотреть свойства или dump;
- при необходимости визуально проверить модель в Renga.
Для STDL это обычно значит:
- убедиться, что category импортировалась;
- создать style;
- реально проверить геометрию в Renga;
- при ошибке вернуться к логу и примеру.
Дальше нужно решить, во что превращается найденное решение.
Если это reusable low-level логика:
- добавить helper в
renga_api.core.
Если это reusable каталог констант, GUID или справочников:
- добавить его в
renga_api.catalogs; - не зашивать такие каталоги внутрь конкретного skill-модуля без необходимости;
- сопроводить каталог подробным комментарием о том, почему он существует и как должен использоваться.
Если это agent-facing сценарий:
- добавить функцию в
renga_api.skills; - реэкспортировать её через
renga_api; - убедиться, что она попадает в
get_skills_catalog().
Если это одноразовая диагностика:
- не превращать её в постоянный API без необходимости;
- лучше оставить знание в
TODO.md, тесте или docstring, если это важно для будущих агентов.
Минимум:
- unit-тест на mapping, guard, разбор данных или чистую бизнес-логику;
- если логика завязана на геометрию букв или обработку данных, покрыть её без живого COM.
После подтверждения результата:
- обновить
README.md, если поменялись публичные правила или pipeline; - обновить
TODO.mdпо статусу задачи; - при необходимости добавить короткое предупреждение в docstring skill-функции.
- Предпочитать функциональный стиль.
- Добавлять type hints.
- Изолировать COM-ошибки в безопасных helper-функциях там, где это уместно.
- Любые изменения модели выполнять через operation/transaction.
- Не ломать существующие JSON-структуры дампов без явной причины.
- Для агентного сценария использовать
renga_apiилиrenga_api.skills/*, а не строить orchestration поверхcoreбез необходимости.
Сейчас в проекте уже есть рабочий wrapper-слой для agent-facing вызовов, dump/introspection, управление процессами, базовые операции над моделью и демонстрационные text-skills.
Открытые практические вопросы и следующие шаги фиксируются в TODO.md.