Initial project blueprint
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
# AI Orchestrator
|
||||
|
||||
Отдельный проект для серверного AI-orchestrator, который управляет задачами, моделями, MCP-tools и local workers.
|
||||
|
||||
## Главная идея
|
||||
|
||||
Этот проект не является частью `Local LLM Platform`.
|
||||
|
||||
`Local LLM Platform` отвечает за:
|
||||
- локальные модели;
|
||||
- inference;
|
||||
- registry;
|
||||
- GPU profiles;
|
||||
- model deployment;
|
||||
- smoke tests моделей.
|
||||
|
||||
`AI Orchestrator` отвечает за:
|
||||
- общение с пользователем;
|
||||
- построение плана/графа выполнения;
|
||||
- вызов моделей;
|
||||
- вызов MCP-инструментов;
|
||||
- работу с local worker;
|
||||
- подтверждения действий;
|
||||
- логи;
|
||||
- fallback между weak/strong/vision моделями.
|
||||
|
||||
## Ключевой принцип
|
||||
|
||||
В коде нет жестких запретов на действия.
|
||||
|
||||
Система должна работать через настраиваемую политику проекта:
|
||||
|
||||
- `full_auto` — выполнять без подтверждений;
|
||||
- `confirm` — спрашивать подтверждение для действий, отмеченных политикой;
|
||||
- `manual` — всегда показывать план и ждать запуска;
|
||||
- `disabled` — компонент отключен настройкой.
|
||||
|
||||
Важно: `disabled` — это не hardcoded ban, а выбранная настройка проекта.
|
||||
|
||||
## Базовая схема
|
||||
|
||||
```text
|
||||
User UI / API
|
||||
↓
|
||||
Conversation Manager
|
||||
↓
|
||||
Server Orchestrator
|
||||
↓
|
||||
Execution Graph
|
||||
├─ Planner
|
||||
├─ Workers
|
||||
├─ Reviewer
|
||||
└─ Finalizer
|
||||
↓
|
||||
Model Router
|
||||
├─ weak model: local
|
||||
├─ strong model: local or external
|
||||
└─ vision model: local or external
|
||||
↓
|
||||
Tools
|
||||
├─ MCP client
|
||||
├─ remote MCP servers
|
||||
└─ local worker protocol
|
||||
```
|
||||
|
||||
## Что должен сделать Codex
|
||||
|
||||
Начать с документа `docs/codex/CODEX_TASK.md`.
|
||||
@@ -0,0 +1,10 @@
|
||||
policy:
|
||||
default_mode: confirm
|
||||
resources:
|
||||
filesystem: confirm
|
||||
shell: confirm
|
||||
sql: confirm
|
||||
mcp: confirm
|
||||
external_models: confirm
|
||||
desktop: confirm
|
||||
browser: confirm
|
||||
@@ -0,0 +1,10 @@
|
||||
policy:
|
||||
default_mode: full_auto
|
||||
resources:
|
||||
filesystem: full_auto
|
||||
shell: full_auto
|
||||
sql: full_auto
|
||||
mcp: full_auto
|
||||
external_models: full_auto
|
||||
desktop: full_auto
|
||||
browser: full_auto
|
||||
@@ -0,0 +1,38 @@
|
||||
project:
|
||||
id: default
|
||||
name: Local Only Project
|
||||
|
||||
models:
|
||||
weak:
|
||||
provider: local
|
||||
model: qwen-coder-small
|
||||
base_url: http://localhost:8001/v1
|
||||
strong:
|
||||
provider: local
|
||||
model: qwen-coder-large
|
||||
base_url: http://localhost:8002/v1
|
||||
vision:
|
||||
provider: disabled
|
||||
model: null
|
||||
embedding:
|
||||
provider: local
|
||||
model: bge-m3
|
||||
base_url: http://localhost:8003/v1
|
||||
|
||||
execution:
|
||||
max_graph_nodes: 20
|
||||
max_agent_steps: 8
|
||||
max_local_retries: 2
|
||||
allow_external_models: false
|
||||
allow_paid_fallback: false
|
||||
|
||||
policy:
|
||||
default_mode: confirm
|
||||
resources:
|
||||
filesystem: confirm
|
||||
shell: confirm
|
||||
sql: confirm
|
||||
mcp: confirm
|
||||
external_models: disabled
|
||||
desktop: confirm
|
||||
browser: confirm
|
||||
@@ -0,0 +1,37 @@
|
||||
project:
|
||||
id: hybrid
|
||||
name: Local Plus External
|
||||
|
||||
models:
|
||||
weak:
|
||||
provider: local
|
||||
model: qwen-coder-small
|
||||
base_url: http://localhost:8001/v1
|
||||
strong:
|
||||
provider: external
|
||||
model: gpt-strong
|
||||
base_url: https://api.example.com/v1
|
||||
api_key_env: EXTERNAL_MODEL_API_KEY
|
||||
vision:
|
||||
provider: external
|
||||
model: gpt-vision
|
||||
base_url: https://api.example.com/v1
|
||||
api_key_env: EXTERNAL_MODEL_API_KEY
|
||||
|
||||
execution:
|
||||
max_graph_nodes: 20
|
||||
max_agent_steps: 8
|
||||
max_local_retries: 2
|
||||
allow_external_models: true
|
||||
allow_paid_fallback: true
|
||||
|
||||
policy:
|
||||
default_mode: confirm
|
||||
resources:
|
||||
filesystem: confirm
|
||||
shell: confirm
|
||||
sql: confirm
|
||||
mcp: full_auto
|
||||
external_models: confirm
|
||||
desktop: confirm
|
||||
browser: confirm
|
||||
@@ -0,0 +1,58 @@
|
||||
# Roadmap
|
||||
|
||||
## Phase 1: Skeleton
|
||||
|
||||
- project structure
|
||||
- config loader
|
||||
- API skeleton
|
||||
- task storage in memory
|
||||
- event log in memory
|
||||
- model router mock
|
||||
- policy engine
|
||||
- execution graph engine
|
||||
|
||||
## Phase 2: Local model + MCP
|
||||
|
||||
- local OpenAI-compatible provider
|
||||
- MCP client initialize/tools/list/tools/call
|
||||
- simple agent graph
|
||||
- confirmation flow
|
||||
|
||||
## Phase 3: Local Worker
|
||||
|
||||
- worker registration
|
||||
- WebSocket connection
|
||||
- capabilities
|
||||
- command dispatch
|
||||
- command result
|
||||
- file tools
|
||||
|
||||
## Phase 4: 1C usage
|
||||
|
||||
- connect 1C MCP server
|
||||
- read schema
|
||||
- run SQL
|
||||
- validate queries
|
||||
- generate query
|
||||
- apply controlled changes via confirmation
|
||||
|
||||
## Phase 5: UI
|
||||
|
||||
- chat/task console
|
||||
- plan card
|
||||
- progress card
|
||||
- confirmation card
|
||||
- artifact card
|
||||
- worker status screen
|
||||
- model settings
|
||||
- policy settings
|
||||
|
||||
## Phase 6: Advanced
|
||||
|
||||
- parallel graph nodes
|
||||
- reviewer
|
||||
- vision model slot
|
||||
- cost tracking
|
||||
- persistent storage
|
||||
- audit logs
|
||||
- replay tasks
|
||||
@@ -0,0 +1,116 @@
|
||||
# Архитектура AI Orchestrator
|
||||
|
||||
## Почему отдельный проект
|
||||
|
||||
Оркестратор должен быть независимым от текущей Local LLM Platform.
|
||||
|
||||
Он должен уметь работать:
|
||||
- с локальными моделями из Local LLM Platform;
|
||||
- с внешними моделями;
|
||||
- с любыми MCP-серверами;
|
||||
- с local worker на компьютере пользователя;
|
||||
- с будущими инструментами: файлы, браузер, 1С, SQL, desktop, image, audio, video.
|
||||
|
||||
## Разделение ответственности
|
||||
|
||||
### Local LLM Platform
|
||||
|
||||
Провайдер моделей:
|
||||
|
||||
```text
|
||||
GET /models
|
||||
POST /v1/chat/completions
|
||||
POST /v1/embeddings
|
||||
POST /v1/vision/analyze
|
||||
```
|
||||
|
||||
### AI Orchestrator
|
||||
|
||||
Runtime управления задачами:
|
||||
|
||||
```text
|
||||
POST /chat
|
||||
POST /tasks
|
||||
POST /confirmations/{id}/approve
|
||||
POST /confirmations/{id}/reject
|
||||
GET /tasks/{id}
|
||||
GET /tasks/{id}/events
|
||||
```
|
||||
|
||||
### 1C MCP Server
|
||||
|
||||
Источник инструментов:
|
||||
|
||||
```text
|
||||
tools/list
|
||||
tools/call
|
||||
resources/list
|
||||
resources/read
|
||||
prompts/list
|
||||
prompts/get
|
||||
```
|
||||
|
||||
### Local Worker
|
||||
|
||||
Исполнитель на локальном компьютере:
|
||||
|
||||
```text
|
||||
file.read
|
||||
file.write
|
||||
file.search
|
||||
file.apply_patch
|
||||
command.run
|
||||
desktop.screenshot
|
||||
browser.open
|
||||
mcp.proxy
|
||||
```
|
||||
|
||||
## Оркестратор и агент
|
||||
|
||||
В системе нет отдельной магической сущности “главный агент”.
|
||||
|
||||
Есть:
|
||||
|
||||
```text
|
||||
Orchestrator = управляет выполнением
|
||||
Execution Graph = план задачи
|
||||
Planner = строит граф
|
||||
Worker = выполняет конкретный узел графа
|
||||
Reviewer = проверяет результат
|
||||
Finalizer = формирует итог пользователю
|
||||
```
|
||||
|
||||
Agent — это технический профиль выполнения:
|
||||
|
||||
```text
|
||||
AgentProfile = prompt + model_slot + tools + limits + output_schema
|
||||
```
|
||||
|
||||
## Правильная модель
|
||||
|
||||
Не так:
|
||||
|
||||
```text
|
||||
agent запускает agent
|
||||
agent запускает agent
|
||||
agent запускает agent
|
||||
```
|
||||
|
||||
А так:
|
||||
|
||||
```text
|
||||
Orchestrator
|
||||
↓
|
||||
Planner
|
||||
↓
|
||||
Execution Graph
|
||||
├─ worker: sql
|
||||
├─ worker: 1c
|
||||
├─ worker: file
|
||||
├─ worker: vision
|
||||
└─ reviewer
|
||||
```
|
||||
|
||||
Workers не создают других workers.
|
||||
Они возвращают предложения или результаты orchestrator.
|
||||
Только orchestrator запускает следующие узлы.
|
||||
@@ -0,0 +1,127 @@
|
||||
# Компоненты
|
||||
|
||||
## 1. Conversation Manager
|
||||
|
||||
Отвечает за пользовательский контекст:
|
||||
|
||||
- диалоги;
|
||||
- сообщения;
|
||||
- вложения;
|
||||
- выбранный проект;
|
||||
- активные workers;
|
||||
- выбранные режимы доступа;
|
||||
- настройки моделей;
|
||||
- историю подтверждений.
|
||||
|
||||
Не выполняет tools напрямую.
|
||||
|
||||
## 2. Orchestrator
|
||||
|
||||
Главный серверный компонент.
|
||||
|
||||
Функции:
|
||||
|
||||
- принять задачу;
|
||||
- определить тип задачи;
|
||||
- выбрать execution mode;
|
||||
- запустить planner;
|
||||
- создать execution graph;
|
||||
- запускать узлы графа;
|
||||
- вызывать model router;
|
||||
- вызывать MCP tools;
|
||||
- отправлять команды local worker;
|
||||
- обрабатывать подтверждения;
|
||||
- логировать;
|
||||
- собирать финальный результат.
|
||||
|
||||
## 3. Model Router
|
||||
|
||||
Единый интерфейс к моделям.
|
||||
|
||||
Слоты:
|
||||
|
||||
```text
|
||||
weak
|
||||
strong
|
||||
vision
|
||||
embedding
|
||||
reranker
|
||||
```
|
||||
|
||||
Каждый слот настраивается:
|
||||
|
||||
```text
|
||||
provider = local | external | disabled
|
||||
model = string
|
||||
base_url = string
|
||||
api_key_env = string
|
||||
```
|
||||
|
||||
## 4. MCP Client
|
||||
|
||||
Универсальный клиент к MCP-серверам.
|
||||
|
||||
Не должен знать про 1С.
|
||||
|
||||
Поддержать:
|
||||
|
||||
- initialize;
|
||||
- tools/list;
|
||||
- tools/call;
|
||||
- resources/list;
|
||||
- resources/read;
|
||||
- prompts/list;
|
||||
- prompts/get.
|
||||
|
||||
## 5. Local Worker Gateway
|
||||
|
||||
Серверная часть для связи с local workers.
|
||||
|
||||
Local worker сам открывает исходящее соединение:
|
||||
|
||||
```text
|
||||
Local Worker → WebSocket/gRPC stream → Server
|
||||
```
|
||||
|
||||
Сервер не открывает входящий порт на ПК пользователя.
|
||||
|
||||
## 6. Policy Engine
|
||||
|
||||
Не содержит жестких запретов.
|
||||
|
||||
Он читает настройки проекта и решает:
|
||||
|
||||
- выполнять сразу;
|
||||
- запросить подтверждение;
|
||||
- показать preview;
|
||||
- поставить задачу в ручной режим;
|
||||
- пропустить, если выбран full_auto.
|
||||
|
||||
## 7. Execution Graph Engine
|
||||
|
||||
Хранит и исполняет граф:
|
||||
|
||||
```text
|
||||
nodes:
|
||||
- id
|
||||
- type
|
||||
- input
|
||||
- output
|
||||
- status
|
||||
- dependencies
|
||||
- assigned_runner
|
||||
- attempts
|
||||
- logs
|
||||
```
|
||||
|
||||
Статусы:
|
||||
|
||||
```text
|
||||
pending
|
||||
running
|
||||
waiting_confirmation
|
||||
completed
|
||||
failed
|
||||
cancelled
|
||||
skipped
|
||||
```
|
||||
@@ -0,0 +1,99 @@
|
||||
# Принцип: нет жестких запретов в коде
|
||||
|
||||
## Требование
|
||||
|
||||
В проекте не должно быть hardcoded-запретов вида:
|
||||
|
||||
```text
|
||||
if tool == "command.run": deny
|
||||
if sql contains "DELETE": deny
|
||||
if action == "filesystem": deny
|
||||
```
|
||||
|
||||
Так делать нельзя.
|
||||
|
||||
## Правильный подход
|
||||
|
||||
Код должен классифицировать действие и спросить policy engine.
|
||||
|
||||
```text
|
||||
action → classify → policy.check → decision
|
||||
```
|
||||
|
||||
Policy decision:
|
||||
|
||||
```json
|
||||
{
|
||||
"decision": "allow | confirm | manual | disabled_by_config",
|
||||
"reason": "string",
|
||||
"requires_confirmation": true,
|
||||
"preview": {}
|
||||
}
|
||||
```
|
||||
|
||||
## Пример
|
||||
|
||||
Команда:
|
||||
|
||||
```text
|
||||
file.write D:/Projects/test.txt
|
||||
```
|
||||
|
||||
Tool возвращает metadata:
|
||||
|
||||
```json
|
||||
{
|
||||
"risk_level": "write",
|
||||
"resource": "filesystem",
|
||||
"preview_available": true
|
||||
}
|
||||
```
|
||||
|
||||
Policy проекта:
|
||||
|
||||
```json
|
||||
{
|
||||
"filesystem": {
|
||||
"mode": "confirm"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
```text
|
||||
Нужно подтверждение.
|
||||
```
|
||||
|
||||
Если policy:
|
||||
|
||||
```json
|
||||
{
|
||||
"filesystem": {
|
||||
"mode": "full_auto"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
```text
|
||||
Выполнить сразу.
|
||||
```
|
||||
|
||||
## Режимы
|
||||
|
||||
```text
|
||||
full_auto — выполнять без подтверждения
|
||||
confirm — спросить подтверждение
|
||||
manual — показать план и ждать ручного запуска
|
||||
disabled — отключено настройкой
|
||||
```
|
||||
|
||||
`disabled` допустим только как настройка проекта, а не как зашитый запрет.
|
||||
|
||||
## Зачем
|
||||
|
||||
Пользователь сам выбирает уровень риска.
|
||||
|
||||
Система не должна становиться бесполезной из-за того, что разработчик заранее запретил все потенциально опасные действия.
|
||||
@@ -0,0 +1,182 @@
|
||||
# Задача для Codex
|
||||
|
||||
## Цель
|
||||
|
||||
Создать отдельный проект `ai-orchestrator`.
|
||||
|
||||
Это серверный orchestrator/runtime для управления AI-задачами, моделями, MCP-tools и local workers.
|
||||
|
||||
Проект не должен быть частью текущего `Local LLM Platform`.
|
||||
|
||||
## Основные принципы
|
||||
|
||||
1. Orchestrator — главный сервис.
|
||||
2. Agent — не отдельная сущность, а execution profile.
|
||||
3. Сложные задачи выполняются через execution graph.
|
||||
4. Workers не создают других workers.
|
||||
5. Local Worker — тонкий исполнитель на компьютере пользователя.
|
||||
6. В коде нет hardcoded bans.
|
||||
7. Все ограничения — через настраиваемую policy.
|
||||
8. Система должна работать без внешнего ИИ.
|
||||
9. Strong model может быть локальной или внешней.
|
||||
10. Vision model — отдельный слот.
|
||||
|
||||
## Реализовать структуру
|
||||
|
||||
```text
|
||||
src/
|
||||
orchestrator/
|
||||
agent_runtime/
|
||||
model_router/
|
||||
mcp_client/
|
||||
local_worker_protocol/
|
||||
policy/
|
||||
api/
|
||||
logging/
|
||||
storage/
|
||||
```
|
||||
|
||||
## MVP функции
|
||||
|
||||
### 1. API
|
||||
|
||||
Реализовать:
|
||||
|
||||
```text
|
||||
POST /chat
|
||||
POST /tasks
|
||||
GET /tasks/{id}
|
||||
GET /tasks/{id}/events
|
||||
POST /confirmations/{id}/approve
|
||||
POST /confirmations/{id}/reject
|
||||
GET /workers
|
||||
```
|
||||
|
||||
### 2. Orchestrator
|
||||
|
||||
Должен:
|
||||
|
||||
```text
|
||||
- принимать task;
|
||||
- создавать execution graph;
|
||||
- запускать nodes;
|
||||
- вызывать model router;
|
||||
- вызывать MCP client;
|
||||
- отправлять команды local worker;
|
||||
- обрабатывать confirmation_required;
|
||||
- писать event log.
|
||||
```
|
||||
|
||||
### 3. Execution Graph
|
||||
|
||||
Node types:
|
||||
|
||||
```text
|
||||
planner
|
||||
model_call
|
||||
tool_call
|
||||
local_worker_call
|
||||
reviewer
|
||||
finalizer
|
||||
confirmation
|
||||
```
|
||||
|
||||
### 4. Model Router
|
||||
|
||||
Слоты:
|
||||
|
||||
```text
|
||||
weak
|
||||
strong
|
||||
vision
|
||||
embedding
|
||||
```
|
||||
|
||||
Provider:
|
||||
|
||||
```text
|
||||
local
|
||||
external
|
||||
disabled
|
||||
```
|
||||
|
||||
### 5. Policy Engine
|
||||
|
||||
Без hardcoded bans.
|
||||
|
||||
Policy читает конфиг и возвращает:
|
||||
|
||||
```text
|
||||
allow
|
||||
confirm
|
||||
manual
|
||||
disabled_by_config
|
||||
```
|
||||
|
||||
### 6. Local Worker Gateway
|
||||
|
||||
Поддержать:
|
||||
|
||||
```text
|
||||
worker registration
|
||||
capabilities
|
||||
command dispatch
|
||||
command result
|
||||
progress events
|
||||
heartbeat
|
||||
disconnect
|
||||
```
|
||||
|
||||
### 7. MCP Client
|
||||
|
||||
Поддержать базовый MCP flow:
|
||||
|
||||
```text
|
||||
initialize
|
||||
tools/list
|
||||
tools/call
|
||||
```
|
||||
|
||||
### 8. UI contracts
|
||||
|
||||
Подготовить backend ответы для карточек:
|
||||
|
||||
```text
|
||||
plan_card
|
||||
confirmation_card
|
||||
progress_card
|
||||
artifact_card
|
||||
error_card
|
||||
```
|
||||
|
||||
## Smoke tests
|
||||
|
||||
Добавить тесты:
|
||||
|
||||
```text
|
||||
1. simple chat without tools
|
||||
2. task creates execution graph
|
||||
3. model fallback weak → strong
|
||||
4. policy confirm returns confirmation request
|
||||
5. policy full_auto executes immediately
|
||||
6. local worker command result is stored
|
||||
7. MCP tool call result is stored
|
||||
8. task event stream emits node_started/node_completed
|
||||
```
|
||||
|
||||
## Конфиги
|
||||
|
||||
Создать примеры:
|
||||
|
||||
```text
|
||||
configs/examples/local_only.yaml
|
||||
configs/examples/local_plus_external.yaml
|
||||
configs/examples/full_auto.yaml
|
||||
configs/examples/confirm_mode.yaml
|
||||
```
|
||||
|
||||
## Важно
|
||||
|
||||
Не добавлять 1С-логику в ядро orchestrator.
|
||||
|
||||
1С должна подключаться как MCP server или tool provider.
|
||||
@@ -0,0 +1,106 @@
|
||||
# API Contracts
|
||||
|
||||
## POST /chat
|
||||
|
||||
Вход:
|
||||
|
||||
```json
|
||||
{
|
||||
"project_id": "default",
|
||||
"conversation_id": "optional",
|
||||
"message": "Найди файл и исправь запрос",
|
||||
"attachments": [],
|
||||
"mode": "auto",
|
||||
"preferences": {
|
||||
"local_only": true,
|
||||
"show_plan": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Выход:
|
||||
|
||||
```json
|
||||
{
|
||||
"conversation_id": "conv_1",
|
||||
"task_id": "task_1",
|
||||
"response_type": "answer | task_started | confirmation_required | error",
|
||||
"message": "string",
|
||||
"cards": []
|
||||
}
|
||||
```
|
||||
|
||||
## POST /tasks
|
||||
|
||||
Создать задачу без chat-интерфейса.
|
||||
|
||||
```json
|
||||
{
|
||||
"project_id": "default",
|
||||
"goal": "Исправить модуль",
|
||||
"inputs": {},
|
||||
"execution_mode": "agent_graph"
|
||||
}
|
||||
```
|
||||
|
||||
## GET /tasks/{task_id}
|
||||
|
||||
```json
|
||||
{
|
||||
"task_id": "task_1",
|
||||
"status": "running",
|
||||
"current_node": "node_3",
|
||||
"progress": {
|
||||
"completed": 2,
|
||||
"total": 5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## GET /tasks/{task_id}/events
|
||||
|
||||
SSE/WebSocket stream событий:
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "node_started",
|
||||
"task_id": "task_1",
|
||||
"node_id": "node_3",
|
||||
"timestamp": "..."
|
||||
}
|
||||
```
|
||||
|
||||
## POST /confirmations/{id}/approve
|
||||
|
||||
```json
|
||||
{
|
||||
"scope": "once | task | project",
|
||||
"comment": "approved"
|
||||
}
|
||||
```
|
||||
|
||||
## POST /confirmations/{id}/reject
|
||||
|
||||
```json
|
||||
{
|
||||
"reason": "not now"
|
||||
}
|
||||
```
|
||||
|
||||
## POST /workers/register
|
||||
|
||||
Local worker регистрируется на сервере.
|
||||
|
||||
```json
|
||||
{
|
||||
"worker_id": "worker_home_pc",
|
||||
"name": "Home PC",
|
||||
"capabilities": [
|
||||
"file.read",
|
||||
"file.write",
|
||||
"file.search",
|
||||
"command.run"
|
||||
],
|
||||
"version": "0.1.0"
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,148 @@
|
||||
# Local Worker Protocol
|
||||
|
||||
## Назначение
|
||||
|
||||
Local Worker — тонкий исполнитель команд на локальном компьютере.
|
||||
|
||||
Он не планирует задачу и не принимает интеллектуальных решений.
|
||||
|
||||
Он:
|
||||
|
||||
```text
|
||||
- подключается к серверу;
|
||||
- сообщает capabilities;
|
||||
- получает команды;
|
||||
- выполняет;
|
||||
- возвращает статус, результат, ошибки, артефакты.
|
||||
```
|
||||
|
||||
## Соединение
|
||||
|
||||
Предпочтительно:
|
||||
|
||||
```text
|
||||
Local Worker → outbound WebSocket → Server
|
||||
```
|
||||
|
||||
## Capabilities
|
||||
|
||||
Пример:
|
||||
|
||||
```json
|
||||
{
|
||||
"worker_id": "home_pc",
|
||||
"machine": "DESKTOP-1",
|
||||
"os": "windows",
|
||||
"version": "0.1.0",
|
||||
"capabilities": [
|
||||
"file.read",
|
||||
"file.write",
|
||||
"file.search",
|
||||
"file.apply_patch",
|
||||
"command.run",
|
||||
"process.status",
|
||||
"task.cancel"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Command envelope
|
||||
|
||||
```json
|
||||
{
|
||||
"command_id": "cmd_123",
|
||||
"task_id": "task_456",
|
||||
"tool": "file.read",
|
||||
"args": {
|
||||
"path": "D:/Projects/test.bsl"
|
||||
},
|
||||
"timeout_ms": 30000,
|
||||
"policy_context": {
|
||||
"approved": true,
|
||||
"approval_id": "conf_1"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Result envelope
|
||||
|
||||
```json
|
||||
{
|
||||
"command_id": "cmd_123",
|
||||
"task_id": "task_456",
|
||||
"tool": "file.read",
|
||||
"status": "success",
|
||||
"started_at": "2026-07-03T10:00:00Z",
|
||||
"finished_at": "2026-07-03T10:00:01Z",
|
||||
"duration_ms": 1000,
|
||||
"stdout": "",
|
||||
"stderr": "",
|
||||
"result": {
|
||||
"content": "...",
|
||||
"encoding": "utf-8",
|
||||
"size": 1024,
|
||||
"sha256": "..."
|
||||
},
|
||||
"artifacts": [],
|
||||
"error": null
|
||||
}
|
||||
```
|
||||
|
||||
## Error result
|
||||
|
||||
```json
|
||||
{
|
||||
"command_id": "cmd_123",
|
||||
"status": "error",
|
||||
"error": {
|
||||
"code": "FILE_NOT_FOUND",
|
||||
"message": "File not found",
|
||||
"details": {
|
||||
"path": "D:/Projects/test.bsl"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Progress events
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "progress",
|
||||
"command_id": "cmd_123",
|
||||
"progress": {
|
||||
"percent": 45,
|
||||
"message": "Searching files"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Минимальный набор tools
|
||||
|
||||
```text
|
||||
worker.ping
|
||||
worker.capabilities
|
||||
file.read
|
||||
file.write
|
||||
file.search
|
||||
file.apply_patch
|
||||
command.run
|
||||
process.status
|
||||
task.cancel
|
||||
```
|
||||
|
||||
## Важное правило
|
||||
|
||||
Local Worker не должен сам вызывать модель и не должен сам решать следующий шаг.
|
||||
|
||||
Он может выполнять локальные проверки:
|
||||
|
||||
```text
|
||||
- проверить существование файла;
|
||||
- сделать backup;
|
||||
- посчитать hash;
|
||||
- применить patch;
|
||||
- вернуть diff;
|
||||
- выполнить command timeout;
|
||||
- вернуть stdout/stderr.
|
||||
```
|
||||
@@ -0,0 +1,60 @@
|
||||
# MCP Client
|
||||
|
||||
## Назначение
|
||||
|
||||
AI Orchestrator должен работать с любыми MCP-серверами.
|
||||
|
||||
MCP client — универсальный слой, не содержащий 1С-логики.
|
||||
|
||||
## Поддержать методы
|
||||
|
||||
```text
|
||||
initialize
|
||||
tools/list
|
||||
tools/call
|
||||
resources/list
|
||||
resources/read
|
||||
prompts/list
|
||||
prompts/get
|
||||
```
|
||||
|
||||
## Tool metadata
|
||||
|
||||
Каждый tool должен иметь metadata:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "1c.run_sql",
|
||||
"description": "Execute SQL through 1C adapter",
|
||||
"input_schema": {},
|
||||
"risk": {
|
||||
"resource": "sql",
|
||||
"level": "safe | write | destructive | cost | system",
|
||||
"preview_supported": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Tool call
|
||||
|
||||
```json
|
||||
{
|
||||
"server_id": "one_c",
|
||||
"tool": "1c.run_sql",
|
||||
"args": {
|
||||
"query": "select * from ..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Tool result
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"content": {},
|
||||
"artifacts": [],
|
||||
"logs": [],
|
||||
"error": null
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,78 @@
|
||||
# Model Router
|
||||
|
||||
## Цель
|
||||
|
||||
Единый интерфейс к разным моделям:
|
||||
|
||||
- локальным;
|
||||
- внешним;
|
||||
- отключенным;
|
||||
- vision;
|
||||
- embedding.
|
||||
|
||||
## Слоты
|
||||
|
||||
```text
|
||||
weak
|
||||
strong
|
||||
vision
|
||||
embedding
|
||||
reranker
|
||||
```
|
||||
|
||||
## Provider types
|
||||
|
||||
```text
|
||||
local
|
||||
external
|
||||
disabled
|
||||
```
|
||||
|
||||
## Вызов
|
||||
|
||||
```json
|
||||
{
|
||||
"slot": "weak",
|
||||
"messages": [],
|
||||
"tools": [],
|
||||
"response_format": "json_schema | text",
|
||||
"task_context": {
|
||||
"task_id": "task_1",
|
||||
"node_id": "node_2"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Ответ
|
||||
|
||||
```json
|
||||
{
|
||||
"slot": "weak",
|
||||
"provider": "local",
|
||||
"model": "qwen-coder-7b",
|
||||
"status": "success",
|
||||
"message": {},
|
||||
"tool_calls": [],
|
||||
"usage": {
|
||||
"input_tokens": 100,
|
||||
"output_tokens": 200,
|
||||
"cost": 0
|
||||
},
|
||||
"error": null
|
||||
}
|
||||
```
|
||||
|
||||
## Fallback
|
||||
|
||||
Алгоритм:
|
||||
|
||||
```text
|
||||
1. вызвать weak;
|
||||
2. если результат валиден — продолжить;
|
||||
3. если результат невалиден — retry weak;
|
||||
4. если strong доступна — вызвать strong;
|
||||
5. если strong disabled — вернуть partial result и ошибку качества;
|
||||
6. если external выключен настройкой — не вызывать external.
|
||||
```
|
||||
|
||||
Важно: external не запрещен в коде. Он включается/выключается настройкой.
|
||||
@@ -0,0 +1,324 @@
|
||||
# Интерфейс работы с пользователем
|
||||
|
||||
## Цель интерфейса
|
||||
|
||||
Интерфейс должен быть не просто чатом.
|
||||
|
||||
Он должен позволять пользователю:
|
||||
|
||||
- поставить задачу;
|
||||
- увидеть, как система поняла задачу;
|
||||
- увидеть план/граф выполнения;
|
||||
- выбрать режим доступа;
|
||||
- подключить local worker;
|
||||
- подтвердить действия;
|
||||
- наблюдать прогресс;
|
||||
- посмотреть логи;
|
||||
- открыть артефакты;
|
||||
- продолжить задачу после ошибки;
|
||||
- повторить задачу с другой моделью.
|
||||
|
||||
## Основные экраны
|
||||
|
||||
### 1. Chat / Task Console
|
||||
|
||||
Главный экран.
|
||||
|
||||
Слева:
|
||||
|
||||
- список диалогов;
|
||||
- проекты;
|
||||
- активные задачи;
|
||||
- подключенные workers.
|
||||
|
||||
Центр:
|
||||
|
||||
- чат;
|
||||
- сообщения пользователя;
|
||||
- ответы assistant;
|
||||
- карточки планов;
|
||||
- карточки подтверждений;
|
||||
- статусы выполнения.
|
||||
|
||||
Справа:
|
||||
|
||||
- execution graph;
|
||||
- используемые tools;
|
||||
- выбранные модели;
|
||||
- стоимость;
|
||||
- логи;
|
||||
- артефакты.
|
||||
|
||||
## 2. Project Settings
|
||||
|
||||
Настройки проекта:
|
||||
|
||||
```text
|
||||
Project name
|
||||
Default model slots
|
||||
Available MCP servers
|
||||
Available local workers
|
||||
Policy modes
|
||||
Cost limits
|
||||
Log level
|
||||
Storage paths
|
||||
```
|
||||
|
||||
## 3. Model Settings
|
||||
|
||||
Пользователь может настроить:
|
||||
|
||||
```text
|
||||
weak model
|
||||
strong model
|
||||
vision model
|
||||
embedding model
|
||||
```
|
||||
|
||||
Пример:
|
||||
|
||||
```text
|
||||
weak: local/qwen-coder-7b
|
||||
strong: local/qwen-coder-32b
|
||||
vision: external/gpt-vision
|
||||
```
|
||||
|
||||
Или полностью локально:
|
||||
|
||||
```text
|
||||
weak: local/qwen-coder-7b
|
||||
strong: local/qwen-coder-32b
|
||||
vision: local/qwen-vl
|
||||
```
|
||||
|
||||
Или без strong:
|
||||
|
||||
```text
|
||||
weak: local/model
|
||||
strong: disabled
|
||||
vision: disabled
|
||||
```
|
||||
|
||||
## 4. Access Modes
|
||||
|
||||
Важно: это не запреты в коде, а выбор пользователя.
|
||||
|
||||
Для каждого класса действий:
|
||||
|
||||
```text
|
||||
models.external
|
||||
mcp.remote
|
||||
filesystem
|
||||
shell
|
||||
sql
|
||||
1c
|
||||
browser
|
||||
desktop
|
||||
network
|
||||
cost
|
||||
```
|
||||
|
||||
режим:
|
||||
|
||||
```text
|
||||
full_auto
|
||||
confirm
|
||||
manual
|
||||
disabled
|
||||
```
|
||||
|
||||
Пример:
|
||||
|
||||
```text
|
||||
filesystem = confirm
|
||||
shell = confirm
|
||||
sql = full_auto
|
||||
1c = confirm
|
||||
external_models = manual
|
||||
desktop = disabled
|
||||
```
|
||||
|
||||
## 5. Local Worker Screen
|
||||
|
||||
Показывает:
|
||||
|
||||
```text
|
||||
Worker name
|
||||
Machine name
|
||||
OS
|
||||
Status: online/offline
|
||||
Capabilities
|
||||
Allowed paths
|
||||
Available commands
|
||||
Last heartbeat
|
||||
Current task
|
||||
Version
|
||||
```
|
||||
|
||||
Кнопки:
|
||||
|
||||
```text
|
||||
Connect worker
|
||||
Disconnect
|
||||
Edit capabilities
|
||||
View logs
|
||||
Run diagnostic
|
||||
```
|
||||
|
||||
## 6. Task Plan Card
|
||||
|
||||
Когда пользователь отправляет сложную задачу, система показывает:
|
||||
|
||||
```text
|
||||
Я понял задачу так:
|
||||
- найти файл
|
||||
- прочитать код
|
||||
- проверить запрос
|
||||
- предложить исправление
|
||||
- применить patch
|
||||
- запустить проверку
|
||||
```
|
||||
|
||||
Кнопки:
|
||||
|
||||
```text
|
||||
Run
|
||||
Edit plan
|
||||
Run step by step
|
||||
Use strong model
|
||||
Use local only
|
||||
```
|
||||
|
||||
## 7. Confirmation Card
|
||||
|
||||
Если нужно подтверждение:
|
||||
|
||||
```text
|
||||
Система хочет выполнить действие:
|
||||
|
||||
Tool: file.write
|
||||
Path: D:/Projects/1C/module.bsl
|
||||
Risk: write
|
||||
|
||||
Preview:
|
||||
- будет изменено 12 строк
|
||||
- будет создан backup
|
||||
```
|
||||
|
||||
Кнопки:
|
||||
|
||||
```text
|
||||
Approve once
|
||||
Approve for this task
|
||||
Approve always for this project
|
||||
Reject
|
||||
Edit policy
|
||||
```
|
||||
|
||||
## 8. Progress View
|
||||
|
||||
Показывает выполнение:
|
||||
|
||||
```text
|
||||
[done] analyze request
|
||||
[done] build plan
|
||||
[running] search files
|
||||
[pending] read file
|
||||
[pending] apply patch
|
||||
[pending] validate
|
||||
```
|
||||
|
||||
Для каждого шага:
|
||||
|
||||
```text
|
||||
input
|
||||
output
|
||||
model used
|
||||
tool used
|
||||
duration
|
||||
logs
|
||||
errors
|
||||
artifacts
|
||||
```
|
||||
|
||||
## 9. Result View
|
||||
|
||||
Итог должен быть не только текстом.
|
||||
|
||||
Типы результата:
|
||||
|
||||
```text
|
||||
chat_answer
|
||||
file_created
|
||||
file_modified
|
||||
patch_generated
|
||||
sql_executed
|
||||
report_created
|
||||
task_failed
|
||||
confirmation_required
|
||||
manual_action_required
|
||||
```
|
||||
|
||||
Пример:
|
||||
|
||||
```text
|
||||
Задача выполнена.
|
||||
Изменен файл:
|
||||
D:/Projects/1C/CommonModule/Exchange.bsl
|
||||
|
||||
Создан backup:
|
||||
D:/Projects/1C/.backups/Exchange_2026-07-03.bsl
|
||||
|
||||
Проверка:
|
||||
validate_sql: success
|
||||
syntax_check: success
|
||||
```
|
||||
|
||||
## 10. Error Recovery
|
||||
|
||||
Если задача упала:
|
||||
|
||||
```text
|
||||
Ошибка на шаге: validate_sql
|
||||
Причина: поле Номенклатура.Артикул не найдено
|
||||
|
||||
Варианты:
|
||||
- исправить автоматически
|
||||
- запустить strong model
|
||||
- показать подробный лог
|
||||
- изменить запрос вручную
|
||||
- остановить задачу
|
||||
```
|
||||
|
||||
## Интерфейс сообщения
|
||||
|
||||
Каждое сообщение assistant может содержать:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "assistant_message",
|
||||
"text": "...",
|
||||
"task_id": "...",
|
||||
"cards": [
|
||||
"plan",
|
||||
"confirmation",
|
||||
"progress",
|
||||
"artifact",
|
||||
"error"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Принцип
|
||||
|
||||
Пользователь должен всегда понимать:
|
||||
|
||||
```text
|
||||
что система собирается делать
|
||||
что она уже сделала
|
||||
какие данные использовала
|
||||
какая модель была вызвана
|
||||
какой tool был вызван
|
||||
что изменилось в системе
|
||||
как откатить действие
|
||||
```
|
||||
@@ -0,0 +1 @@
|
||||
Agent = execution profile: prompt + model_slot + tools + limits + output_schema. Workers не создают workers.
|
||||
@@ -0,0 +1 @@
|
||||
HTTP/WebSocket API layer for chat, tasks, confirmations, workers, events.
|
||||
@@ -0,0 +1 @@
|
||||
Local Worker is a thin executor: connects outward, executes commands, returns result/progress/artifacts.
|
||||
@@ -0,0 +1 @@
|
||||
Structured event log for every model call, tool call, confirmation, fallback, worker result.
|
||||
@@ -0,0 +1 @@
|
||||
Universal MCP client: initialize, tools/list, tools/call, resources, prompts.
|
||||
@@ -0,0 +1 @@
|
||||
Unified access to weak/strong/vision/embedding slots. Providers: local/external/disabled.
|
||||
@@ -0,0 +1 @@
|
||||
Главный runtime: task intake, graph scheduling, model/tool/worker calls, confirmations, event logs.
|
||||
@@ -0,0 +1 @@
|
||||
No hardcoded bans. Policy returns allow/confirm/manual/disabled_by_config based on project config.
|
||||
@@ -0,0 +1 @@
|
||||
Task storage, conversation storage, event storage. Start in-memory, later DB.
|
||||
@@ -0,0 +1,16 @@
|
||||
# Smoke tests
|
||||
|
||||
Required tests:
|
||||
|
||||
1. simple chat without tools
|
||||
2. task creates execution graph
|
||||
3. weak model response success
|
||||
4. weak model invalid → retry
|
||||
5. weak invalid → strong fallback
|
||||
6. external disabled by config → no external call
|
||||
7. policy confirm → confirmation card
|
||||
8. policy full_auto → execute immediately
|
||||
9. MCP tool result stored
|
||||
10. local worker command result stored
|
||||
11. event stream emits task/node events
|
||||
12. finalizer creates user result
|
||||
Reference in New Issue
Block a user