zai-coding-gateway 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zai_coding_gateway/__init__.py +3 -0
- zai_coding_gateway/client.py +93 -0
- zai_coding_gateway/errors.py +63 -0
- zai_coding_gateway/logging_utils.py +32 -0
- zai_coding_gateway/main.py +38 -0
- zai_coding_gateway/server.py +120 -0
- zai_coding_gateway/tools/__init__.py +10 -0
- zai_coding_gateway/tools/file_io.py +228 -0
- zai_coding_gateway/tools/solve_in_workspace.py +761 -0
- zai_coding_gateway-0.1.0.dist-info/METADATA +176 -0
- zai_coding_gateway-0.1.0.dist-info/RECORD +13 -0
- zai_coding_gateway-0.1.0.dist-info/WHEEL +4 -0
- zai_coding_gateway-0.1.0.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: zai-coding-gateway
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP-сервер для решения задач в рабочем пространстве через Z.AI Coding Plan (solve_in_workspace, apply_changes)
|
|
5
|
+
License: MIT
|
|
6
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
10
|
+
Classifier: Topic :: Software Development
|
|
11
|
+
Requires-Python: >=3.11
|
|
12
|
+
Requires-Dist: mcp>=1.0.0
|
|
13
|
+
Requires-Dist: openai>=1.0.0
|
|
14
|
+
Requires-Dist: pydantic>=2.0.0
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
|
17
|
+
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
18
|
+
Requires-Dist: respx>=0.20.0; extra == 'dev'
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
|
|
21
|
+
# ZAI Coding Gateway
|
|
22
|
+
|
|
23
|
+
MCP-сервер для решения задач в рабочем пространстве через **Z.AI Coding Plan** endpoint (`api.z.ai/api/coding/paas/v4`). Предоставляет инструменты `solve_in_workspace`, `apply_changes`, `confirm_session_done` для любых MCP-клиентов (Cursor, Anigravity, Claude Code, Cline и др.). Один и тот же сервер можно добавить в любую IDE — поведение не зависит от того, откуда вы его запускаете.
|
|
24
|
+
|
|
25
|
+
## Требования
|
|
26
|
+
|
|
27
|
+
- Python 3.11+
|
|
28
|
+
- Ключ Z.AI и подписка Coding Plan
|
|
29
|
+
|
|
30
|
+
## Установка
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pip install -e .
|
|
34
|
+
# или с тестами:
|
|
35
|
+
pip install -e ".[dev]"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Настройка
|
|
39
|
+
|
|
40
|
+
Все настройки задаются **переменными окружения**. Ключ и модель **не хранятся в коде** — их задаёт пользователь в настройках MCP-клиента (например, в Cursor в `mcp.json` в секции `env`).
|
|
41
|
+
|
|
42
|
+
| Переменная | Назначение |
|
|
43
|
+
|----------------|--------------------------------------------------|
|
|
44
|
+
| `ZAI_API_KEY` | Ключ Z.AI (обязательный) |
|
|
45
|
+
| `ZAI_WORK_MODEL` | Необязательно. Модель для генерации кода, рефакторинга и основного цикла сессии. По умолчанию **glm-4.7** (контекст 200K). |
|
|
46
|
+
| `ZAI_FAST_MODEL` | Необязательно. Модель для консолидации и суммаризации внутри сессии. По умолчанию **glm-4.5-air** (контекст 128K, быстрая). |
|
|
47
|
+
| `ZAI_BASE_URL` | По умолчанию `https://api.z.ai/api/coding/paas/v4` |
|
|
48
|
+
| `ZAI_PROJECT_ROOT` | Корень открытого проекта для solve_in_workspace (пути file_paths и сессия). **Чтобы из любой IDE всё работало «как по маслу»**, задайте эту переменную в конфиге MCP так, чтобы она указывала на папку открытого в IDE проекта. Многие IDE при старте MCP подставляют в env переменные вроде `${workspaceFolder}` / `${projectPath}` — тогда один конфиг подходит для Cursor, Anigravity и др. Без неё сервер пробует MCP `roots/list` (многие клиенты пока не поддерживают) или поиск вверх от cwd по маркерам; при неудаче — явная ошибка с просьбой задать ZAI_PROJECT_ROOT. |
|
|
49
|
+
| `ZAI_SESSION_LOGS_DIR` | Опционально. Каталог для логов сессий solve_in_workspace. По умолчанию логи пишутся в проект gateway (для разработчиков). Если нужно получать логи в свой проект — укажите абсолютный путь к каталогу (например `${workspaceFolder}/workspace_sessions_logs`). |
|
|
50
|
+
|
|
51
|
+
## Работа из любой IDE
|
|
52
|
+
|
|
53
|
+
MCP запускается вашей IDE при открытии проекта. Чтобы пути file_paths/file_path и сессия solve_in_workspace относились к открытому проекту (а не к случайному cwd), в настройках MCP укажите **ZAI_PROJECT_ROOT** в `env`. Тогда не важно, в какой IDE вы работаете (Cursor, Anigravity, другая):
|
|
54
|
+
|
|
55
|
+
- Если IDE при запуске MCP подставляет в env путь к открытому проекту (например через переменную вроде `${workspaceFolder}`, `${workspaceRoot}`, `%projectPath%` и т.п.) — используйте её для `ZAI_PROJECT_ROOT`. Один и тот же конфиг будет работать во всех проектах и во всех таких IDE.
|
|
56
|
+
- Если такой подстановки нет — укажите в конфиге абсолютный путь к корню проекта; для другого проекта можно завести отдельный конфиг или переопределить env в настройках проекта/workspace.
|
|
57
|
+
|
|
58
|
+
Идея: **корень проекта задаёт тот, кто запускает MCP (IDE)**, через env — тогда серверу не нужно угадывать, и поведение едино во всех средах.
|
|
59
|
+
|
|
60
|
+
## Подключение в Cursor
|
|
61
|
+
|
|
62
|
+
1. Скопируйте пример конфигурации:
|
|
63
|
+
```bash
|
|
64
|
+
cp mcp.json.example mcp.json
|
|
65
|
+
```
|
|
66
|
+
2. Откройте `mcp.json` и в секции `env` подставьте свой `ZAI_API_KEY`.
|
|
67
|
+
3. Добавьте содержимое `mcp.json` в настройки MCP Cursor (например, в `~/.cursor/mcp.json` или в настройках проекта в разделе MCP Servers). **При использовании в другом проекте** укажите в `env` путь к корню этого проекта: `"ZAI_PROJECT_ROOT": "/путь/к/проекту"` (Cursor пока не передаёт workspace через MCP roots/list). Формат:
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"mcpServers": {
|
|
71
|
+
"zai-coding-gateway": {
|
|
72
|
+
"command": "/путь/к/.venv/bin/python",
|
|
73
|
+
"args": ["-m", "zai_coding_gateway.main", "--stdio"],
|
|
74
|
+
"env": {
|
|
75
|
+
"ZAI_API_KEY": "ваш-ключ",
|
|
76
|
+
"ZAI_PROJECT_ROOT": "/путь/к/корню/проекта"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
4. Убедитесь, что в PATH доступен тот же Python, в окружении которого установлен пакет (`pip install -e .`). Либо укажите полный путь к `python` в `command`.
|
|
83
|
+
|
|
84
|
+
## Модели (work / fast)
|
|
85
|
+
|
|
86
|
+
- Для основного цикла сессии в **solve_in_workspace** (need_more/done/use_tools) используется **work-модель** (по умолчанию **glm-4.7**, контекст 200K).
|
|
87
|
+
- Для внутренней консолидации и суммаризации истории в **solve_in_workspace** используется **fast-модель** (по умолчанию **glm-4.5-air**, контекст 128K).
|
|
88
|
+
- Выбор модели в вызовах MCP недоступен; при необходимости заменить дефолты задайте **ZAI_WORK_MODEL** и/или **ZAI_FAST_MODEL** в env.
|
|
89
|
+
|
|
90
|
+
## Запуск
|
|
91
|
+
|
|
92
|
+
Сервер запускается MCP-клиентом по stdio (Cursor сам стартует процесс по `mcp.json`). Ручной запуск для отладки:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
export ZAI_API_KEY="ваш-ключ"
|
|
96
|
+
python -m zai_coding_gateway.main --stdio
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Инструменты
|
|
100
|
+
|
|
101
|
+
Порядок использования: **solve_in_workspace** → **apply_changes** → при необходимости **confirm_session_done**.
|
|
102
|
+
|
|
103
|
+
### solve_in_workspace
|
|
104
|
+
|
|
105
|
+
Точка входа: запускает сессию рабочего пространства. Модель получает полный контекст, может запрашивать файлы (need_more), использовать list_dir/grep/glob/read, вернуть отчёт и suggested_changes (в т.ч. предложения по новым файлам). Создание файлов в проекте — только через apply_changes после утверждения архитектором.
|
|
106
|
+
|
|
107
|
+
**Вход:** `instruction` (строка — формулировка задачи), `todos` (список строк), `file_paths` (список путей относительно корня проекта, обязательный начальный контекст), `max_steps` (число, по умолчанию 10).
|
|
108
|
+
|
|
109
|
+
**Выход:** `session_id` (строка), `report` (строка), `suggested_changes` (список объектов: каждый с полем `path` и полем `diff` или `content`), `files_used` (список путей).
|
|
110
|
+
|
|
111
|
+
Лимит: 5 раундов инструментов за сессию. Логи: `workspace_sessions_logs/<session_id>.log` или каталог из `ZAI_SESSION_LOGS_DIR`.
|
|
112
|
+
|
|
113
|
+
### apply_changes
|
|
114
|
+
|
|
115
|
+
Применяет утверждённые изменения к проекту. Вызывать после solve_in_workspace, когда принято решение по suggested_changes.
|
|
116
|
+
|
|
117
|
+
**Вход:** `session_id` (из ответа solve_in_workspace), `changes` (список объектов: каждый `{path: путь к файлу, content: новое содержимое}` или `{path, diff: unified diff или полный текст}`), `confirm_after` (bool, по умолчанию True — после применения очистить сессию). Пути должны входить в сессию.
|
|
118
|
+
|
|
119
|
+
**Выход:** `session_id`, `applied` (список применённых путей), `cleaned` (bool).
|
|
120
|
+
|
|
121
|
+
### confirm_session_done
|
|
122
|
+
|
|
123
|
+
Очищает темп-каталог сессии после принятия решения (после apply_changes или при отказе от изменений).
|
|
124
|
+
|
|
125
|
+
**Вход:** `session_id`. **Выход:** `session_id`, `cleaned` (true).
|
|
126
|
+
|
|
127
|
+
## Режим «архитектор + разработчик»
|
|
128
|
+
|
|
129
|
+
Один поток работы: сформулируйте задачу в **instruction** и **todos**, укажите **file_paths** (начальный контекст — существующие файлы). Запустите **solve_in_workspace** — модель получит контекст, при необходимости запросит ещё файлы или использует list_dir/grep/glob/read, затем вернёт отчёт и suggested_changes (в т.ч. предложения по новым файлам). Все изменения применяются только после вашего утверждения через **apply_changes** (или откажитесь и при необходимости вызовите **confirm_session_done**). Точечное чтение и запись файлов архитектор выполняет средствами IDE.
|
|
130
|
+
|
|
131
|
+
## Тесты
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
pytest tests/ -v
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Тесты используют мок Z.AI API (реальный ключ не нужен). E2E-тесты с реальным API помечены маркером `e2e` и выполняются только при заданном `ZAI_API_KEY`:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
ZAI_API_KEY=ваш-ключ pytest tests/ -v -m e2e
|
|
141
|
+
# или
|
|
142
|
+
ZAI_API_KEY=ваш-ключ ./scripts/e2e_smoke.sh
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Боевой E2E** (`tests/test_e2e_battle.py`): тестовый проект в `tests/e2e_fixtures/battle_project/`. Тесты проверяют доступ к файлам проекта и solve_in_workspace (структура ответа). Запуск с ключом: `ZAI_API_KEY=... pytest tests/test_e2e_battle.py -v -m e2e`.
|
|
146
|
+
|
|
147
|
+
В CI по умолчанию e2e не запускают.
|
|
148
|
+
|
|
149
|
+
## Как проверить, что списывается Coding Plan (а не общий биллинг)
|
|
150
|
+
|
|
151
|
+
1. **При старте MCP** в stderr выводится строка вида:
|
|
152
|
+
`zai-coding-gateway: endpoint = https://api.z.ai/api/coding/paas/v4 (Coding Plan)`
|
|
153
|
+
Если в скобках **Coding Plan** — запросы идут на подписку Coding Plan. Если **общий paas (не Coding Plan)** — используется общий endpoint (без `/coding/` в пути), и списание может идти с общего биллинга.
|
|
154
|
+
|
|
155
|
+
2. **По умолчанию** (без `ZAI_BASE_URL`) используется `https://api.z.ai/api/coding/paas/v4` — это Coding Plan. Не задавайте `ZAI_BASE_URL`, если хотите использовать только Coding Plan.
|
|
156
|
+
|
|
157
|
+
3. **Проверка в кабинете Z.AI** — в [использовании/биллинге](https://z.ai) посмотрите, по какому продукту идёт списание (Coding Plan vs общий API).
|
|
158
|
+
|
|
159
|
+
4. **Кто решает, откуда списывать** — итоговая привязка к Coding Plan или к общему биллингу определяется политикой Z.AI (как правило, по вызываемому endpoint и/или по привязке API-ключа к продукту). Мы со своей стороны гарантируем только то, что запросы уходят на выбранный URL (по умолчанию Coding Plan); ключ вы задаёте в конфиге MCP. При сомнениях — уточните в документации или поддержке Z.AI.
|
|
160
|
+
|
|
161
|
+
## Диагностика 401 (token expired or incorrect)
|
|
162
|
+
|
|
163
|
+
Если E2E или вызовы из Cursor возвращают `401 - token expired or incorrect`:
|
|
164
|
+
|
|
165
|
+
1. **Формат ключа** — Z.AI ожидает ключ вида `{id}.{secret}` и заголовок `Authorization: Bearer <ключ>`. Сервер уже отправляет ключ в этом формате; проверьте, что в `ZAI_API_KEY` нет лишних пробелов и кавычек.
|
|
166
|
+
2. **Подписка Coding Plan** — endpoint `api.z.ai/api/coding/paas/v4` доступен только при активной подписке [GLM Coding Plan](https://docs.z.ai/devpack/overview). Убедитесь, что ключ создан для аккаунта с этой подпиской.
|
|
167
|
+
3. **Проверка ключа на общем endpoint** — временно задайте `ZAI_BASE_URL=https://api.z.ai/api/paas/v4` и запустите E2E. Если с общим endpoint запрос проходит, а с Coding — 401, значит ключ или аккаунт не привязаны к Coding Plan.
|
|
168
|
+
4. **Перевыпуск ключа** — в [управлении API-ключами](https://z.ai/manage-apikey/apikey-list) проверьте, что ключ активен; при необходимости создайте новый и подставьте в `ZAI_API_KEY`.
|
|
169
|
+
|
|
170
|
+
## Транспорт и развёртывание
|
|
171
|
+
|
|
172
|
+
Текущий режим — **stdio** (клиент запускает процесс). Развёртывание на удалённом сервере (StreamableHTTP) планируется в следующей итерации.
|
|
173
|
+
|
|
174
|
+
## Лицензия
|
|
175
|
+
|
|
176
|
+
MIT.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
zai_coding_gateway/__init__.py,sha256=0-XPpO9zARpaUk0NSWdOmNaKxKWRdg4UQ-s_2K5F9uE,174
|
|
2
|
+
zai_coding_gateway/client.py,sha256=lxC4G2lIJTUcNAzvVe-mkeoOzUgcKvzY9FVVYE301Z0,3514
|
|
3
|
+
zai_coding_gateway/errors.py,sha256=YJEi-kbGfE1EBxfI79pySAa8VBQ9AzRq4K2Fp0_6p-E,1971
|
|
4
|
+
zai_coding_gateway/logging_utils.py,sha256=bZfiEAaMOp3R0Pp_OtQO5fSvM1jWl5LTdZLQS4wYeFU,923
|
|
5
|
+
zai_coding_gateway/main.py,sha256=WKyb0a8mlVasQzPhtXrDpCLIMpHuqHY-IPJJikhrsYc,1371
|
|
6
|
+
zai_coding_gateway/server.py,sha256=i-EZrGVzyO6ncriQXw1mhgDu6GcOChuNpTna443hZ7k,6198
|
|
7
|
+
zai_coding_gateway/tools/__init__.py,sha256=54dlzvfE3ABXIr0c43WRCDcyRLyoOujQBzOoDoQypZI,405
|
|
8
|
+
zai_coding_gateway/tools/file_io.py,sha256=cPEU-lnOgWUOWWlP7KnHU-N0-gc5X75Eu1taRALFSss,10075
|
|
9
|
+
zai_coding_gateway/tools/solve_in_workspace.py,sha256=upD6rFp1ASBfuwCKqs28gRXjERxmIo0GwbzL6AwJhoY,33037
|
|
10
|
+
zai_coding_gateway-0.1.0.dist-info/METADATA,sha256=STH6dARXfPIxd2dEfYFuxu6fdy6IYW3SuqBWP2l7V_Q,15686
|
|
11
|
+
zai_coding_gateway-0.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
12
|
+
zai_coding_gateway-0.1.0.dist-info/entry_points.txt,sha256=oOLFZHbaSY5-gyqFseThMdL5BlmnNpD79x9PRywodPA,68
|
|
13
|
+
zai_coding_gateway-0.1.0.dist-info/RECORD,,
|