4.2 KiB
4.2 KiB
new-qwen
Клиент-серверная замена локального агента qwen-code.
servотвечает за OAuth, сессии, работу с Qwen LLM и вызов инструментов.botотвечает за Telegram и пересылку сообщений на сервер.
Проект написан на Python stdlib, чтобы не зависеть от Node/npm в текущем окружении.
Архитектура
Telegram User
|
v
bot/app.py
|
v
serv/app.py
|
v
Qwen OAuth + OpenAI-compatible endpoint
Что уже реализовано
- Qwen OAuth Device Flow, совместимый с
qwen-code - хранение токенов в
~/.qwen/oauth_creds.json - HTTP API сервера
- агентный цикл с tool calling
- инструменты:
list_files,glob_search,grep_text,stat_path,read_file,replace_in_file,write_file,make_directory,exec_command - Telegram polling без внешних библиотек
- JSON-хранилище сессий
- API списка и просмотра сессий
- автоматический polling OAuth flow в боте
- очередь сообщений, пришедших до завершения OAuth
- job-based chat polling между
botиserv - persistence для chat jobs и pending OAuth flows на стороне
serv - policy mode для инструментов:
full-access,workspace-write,read-only - live approval flow для инструментов через Telegram
Ограничения текущей реализации
- это упрощённая серверная архитектура, а не побайтный порт всего
qwen-code - пока нет MCP, skill system, subagents и rich-streaming UI
- Telegram-бот работает через long polling
Переменные окружения
Сервер:
cp serv/.env.example serv/.env
Ключевые параметры сервера:
NEW_QWEN_STATE_DIR- где хранить jobs и pending OAuth flowsNEW_QWEN_TOOL_POLICY- режим инструментов:full-access- все инструментыworkspace-write- безexec_commandread-only- только чтение и поискask-shell- shell только после подтвержденияask-write- shell и записи только после подтвержденияask-all- любой инструмент только после подтвержденияNEW_QWEN_APPROVAL_TIMEOUT_SECONDS- сколько сервер ждёт решения по approval
Бот:
cp bot/.env.example bot/.env
Запуск
Сервер:
python3 serv/app.py
Бот:
python3 bot/app.py
Авторизация Qwen OAuth
- Отправить боту
/auth - Открыть ссылку подтверждения
- Бот сам дождётся завершения OAuth и продолжит работу
Если пользователь отправит обычное сообщение до завершения OAuth, бот поставит его в очередь и автоматически отправит на сервер после успешной авторизации.
Либо можно вызвать API сервера напрямую:
curl -X POST http://127.0.0.1:8080/api/v1/auth/device/start
API
GET /healthGET /api/v1/auth/statusPOST /api/v1/auth/device/startPOST /api/v1/auth/device/pollGET /api/v1/sessionsGET /api/v1/approvalsPOST /api/v1/session/getPOST /api/v1/session/clearPOST /api/v1/chatPOST /api/v1/chat/startPOST /api/v1/chat/pollPOST /api/v1/approval/respond
Telegram Approval Flow
Если политика инструментов настроена как ask-shell, ask-write или ask-all, бот пришлёт запрос на подтверждение с approval_id.
Дальше можно ответить одной из команд:
/approve <approval_id>/reject <approval_id>