---
title: "Удалённое управление"
id: "660"
type: "page"
slug: "remote-control"
published_at: "2026-06-07T17:50:40+00:00"
modified_at: "2026-06-13T00:52:52+00:00"
url: "https://pastukhov.com/code/docs/remote-control"
markdown_url: "https://pastukhov.com/code/docs/remote-control.md"
excerpt: "Удалённое управление позволяет управлять Pastukhov Code программно через простой HTTP API. Создавайте чаты, отправляйте промпты…"
---

# Удалённое управление

[https://pastukhov.com/code/docs/remote-control.md](https://pastukhov.com/code/docs/remote-control.md)

Удалённое управление позволяет управлять Pastukhov Code программно через простой HTTP API. Создавайте чаты, отправляйте промпты и получайте ответы ИИ — всё без открытия браузера. Это делает его идеальным для CI/CD-пайплайнов, автоматизированных рабочих процессов и интеграции возможностей ИИ в ваши существующие системы.

API идеально подходит для добавления кнопок **«Редактировать с ИИ»** в любое приложение. Вместо создания сложной интеграции с OpenAI API или агентного фреймворка с нуля вы просто отправляете HTTP-запрос в Pastukhov Code — который уже имеет навыки, валидацию, хуки, окружения и всю мощь Claude Code, встроенную в него. Ваша система получает редактирование кода с помощью ИИ с нулевой дополнительной сложностью.

В сочетании с [Навыками](/code/docs/skills)
 и [Валидацией](/code/docs/validation)
, Удалённое управление может быть значительно эффективнее, чем интеграция OpenAI API или любого агентного фреймворка с нуля. Навыки предоставляют контекст и рабочие процессы для конкретных доменов, а валидация гарантирует, что каждое изменение проверено и исправлено либо автоматически через функцию AutoFix, либо хотя бы вручную проверено.

## Настройка

Удалённое управление требует одной переменной окружения: `PASTUKHOV_CODE_API_KEY`. Эта переменная хранит хеш SHA256 вашего API-ключа — сам ключ в открытом виде никогда не сохраняется на сервере.

### Шаг 1: Сгенерируйте хеш API-ключа

Выберите API-ключ (любую строку, которую хотите) и вычислите его хеш SHA256. Сервер будет сравнивать входящие ключи, хешируя их и сопоставляя с этим значением:

```
# Linux / macOS
echo -n "my-secret-api-key" | sha256sum | awk '{print $1}'
# Вывод: a1b2c3d4e5f6... (64-символьная шестнадцатеричная строка)
```

Вы также можете использовать генератор SHA256 на [странице входа](/code/docs/getting-started)
 — нажмите «SHA256 generator» под кнопкой «Sign In».

### Шаг 2: Установите переменную окружения

Установите хеш как `PASTUKHOV_CODE_API_KEY` в вашем экземпляре Pastukhov Code:

```
# Docker (docker-compose.yml)
services:
  code:
    environment:
      - PASTUKHOV_CODE_API_KEY=a1b2c3d4e5f6...

# Linux / macOS
export PASTUKHOV_CODE_API_KEY=a1b2c3d4e5f6...

# Windows PowerShell
$env:PASTUKHOV_CODE_API_KEY="a1b2c3d4e5f6..."
```

Если переменная не установлена, API возвращает `503 Service Unavailable` — по умолчанию он отключён для безопасности.

## Аутентификация

Все запросы к удалённому API должны включать заголовок `X-API-Key` с вашим API-ключом в **открытом виде**. Сервер автоматически хеширует его и сравнивает с сохранённым значением. Это означает, что сам ключ никогда не касается диска — только его хеш.

```
X-API-Key: my-secret-api-key
```

- **401 Unauthorized** — отсутствующий или недействительный API-ключ
- **503 Service Unavailable** — API отключён (переменная `PASTUKHOV_CODE_API_KEY` не установлена)

## Создание чата

```
POST /api/remote/chats
```

Создаёт новый чат и опционально отправляет начальный промпт. Промпт помещается в очередь и обрабатывается автоматически очередью сообщений.

### Тело запроса

- `prompt` (строка, опционально) — начальное сообщение пользователя для отправки
- `title` (строка, опционально) — название чата (по умолчанию «Remote API Chat»)
- `environment` (строка, опционально) — имя окружения для использования в этом чате (см. [Окружения](/code/docs/environments) )

### Ответ (201 Created)

```
{
  "chatId": 123,
  "url": "/123",
  "status": "queued",
  "createdAt": "2026-06-07T17:50:00Z"
}
```

`status` равен `"queued"`, когда предоставлен промпт (сообщение ожидает в очереди), или `"created"`, когда промпт не предоставлен.

### Пример

```
curl -X POST http://localhost:5173/api/remote/chats \
  -H "X-API-Key: my-secret-api-key" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "Fix the null reference in UserService.cs", "title": "Bug Fix"}'
```

## Статус чата

```
GET /api/remote/chats/{chatId}/status
```

Возвращает текущий статус обработки, количество сообщений, общую стоимость и подробности об ошибке, если что-то пошло не так.

### Ответ (200 OK)

```
{
  "chatId": 123,
  "status": "processing",
  "title": "Bug Fix",
  "createdAt": "2026-06-07T17:50:00Z",
  "updatedAt": "2026-06-07T17:52:30Z",
  "messageCount": 4,
  "totalCost": 0.035,
  "error": null
}
```

**Значения статуса:**

- `created` — чат существует, сообщения ещё не отправлены
- `queued` — сообщения ожидают в очереди
- `processing` — Claude Code активно работает
- `completed` — все сообщения обработаны, чат бездействует
- `error` — произошла ошибка (подробности в поле `error`)

### Пример

```
curl http://localhost:5173/api/remote/chats/123/status \
  -H "X-API-Key: my-secret-api-key"
```

## Сообщения чата

```
GET /api/remote/chats/{chatId}/messages?since={timestamp}
```

Извлекает все сообщения в чате. Используйте опциональный параметр запроса `since` (метка времени ISO 8601) для инкрементальных обновлений — возвращаются только сообщения, созданные в или после этого времени.

### Ответ (200 OK)

```
{
  "chatId": 123,
  "messages": [
    {
      "id": 456,
      "role": "user",
      "content": "Fix the null reference in UserService.cs",
      "createdAt": "2026-06-07T17:50:00Z",
      "tokens": { "input": 250, "output": 0 },
      "cost": 0.0001
    },
    {
      "id": 457,
      "role": "assistant",
      "content": "I found the null reference issue...",
      "createdAt": "2026-06-07T17:50:15Z",
      "tokens": { "input": 1800, "output": 420 },
      "cost": 0.0320
    }
  ],
  "since": "2026-06-07T17:50:00Z"
}
```

Каждое сообщение включает роль (`user`, `assistant` или `system`), содержимое, метки времени, количество токенов и стоимость. Параметр `since` возвращается в ответе для удобства.

### Пример

```
# Получить все сообщения
curl http://localhost:5173/api/remote/chats/123/messages \
  -H "X-API-Key: my-secret-api-key"

# Получить только новые сообщения с определённой метки времени
curl "http://localhost:5173/api/remote/chats/123/messages?since=2026-06-07T17:51:00Z" \
  -H "X-API-Key: my-secret-api-key"
```

## Как это работает внутри

Когда вы создаёте чат с промптом, внутри Pastukhov Code происходит следующее:

1. **Чат создан** — новая запись чата сохраняется в базе данных с названием, окружением и меткой времени
2. **Сообщение помещено в очередь** — промпт помещается в очередь сообщений (поддерживаемая базой данных очередь, обрабатываемая каждую 1 секунду)
3. **Запущен экземпляр Claude Code** — процессор очереди сообщений подбирает сообщение и создаёт экземпляр Claude Code для проекта
4. **Обработка** — Claude Code читает промпт, применяет активный навык и хуки, использует инструменты для чтения/редактирования файлов и генерирует ответ
5. **Валидация** — если настроена [Валидация](/code/docs/validation) , результаты сборки и проверки автоматически оцениваются
6. **Завершение** — ответ сохраняется как сообщение помощника, статус изменяется на `completed`

Параметр `environment` выбирает модель ИИ и конфигурацию из ваших настроек [Окружений](/code/docs/environments)
. Это означает, что вы можете использовать разные модели или настройки для разных вызывающих API — например, быструю модель для быстрых правок и мощную модель для сложных рефакторингов.

## Шаблон опроса

Рекомендуемый способ использования API — простой цикл опроса: создать чат, опрашивать статус до завершения, затем получить сообщения.

```
import time, requests

API_KEY = "my-secret-api-key"
BASE = "http://localhost:5173/api/remote"

# 1. Создать чат с промптом
resp = requests.post(f"{BASE}/chats",
    headers={"X-API-Key": API_KEY},
    json={"prompt": "Add error handling to the login endpoint",
          "title": "Error Handling", "environment": "production"})
chat_id = resp.json()["chatId"]

# 2. Опрашивать до завершения
while True:
    status = requests.get(f"{BASE}/chats/{chat_id}/status",
        headers={"X-API-Key": API_KEY}).json()
    if status["status"] == "completed":
        break
    elif status["status"] == "error":
        raise Exception(status["error"])
    time.sleep(2)

# 3. Получить ответ помощника
messages = requests.get(f"{BASE}/chats/{chat_id}/messages",
    headers={"X-API-Key": API_KEY}).json()["messages"]
for msg in messages:
    if msg["role"] == "assistant":
        print(msg["content"])
```

Для долгих задач используйте параметр `since`, чтобы получать только новые сообщения инкрементально вместо повторной загрузки всей истории каждый раз.

## Интеграция с существующими системами

Удалённое управление — это самый простой путь добавления редактирования кода с помощью ИИ в любое приложение. По сравнению с интеграцией OpenAI API или созданием агентного фреймворка с нуля, Pastukhov Code даёт вам:

- **Не требуется промпт-инжиниринг** — [Навыки](/code/docs/skills) предоставляют предварительно созданный контекст домена, инструкции и рабочие процессы. Попросите модель загрузить навык, и ИИ уже знает, что делать.
- **Автоматическая валидация** — [Валидация](/code/docs/validation) запускает сборки, линтинг и пользовательские проверки после каждого изменения. Вашей интеграции не нужно проверять результаты — Pastukhov Code делает это за вас.
- **Полные возможности Claude Code** — чтение файлов, редактирование, git-операции, терминальные команды, веб-поиск и доступ к MCP-серверам. Всё, что может делать Claude Code, доступно через API.
- **Ограждения безопасности** — [Хуки](/code/docs/hooks) предотвращают опасные команды и автоматически применяют политики.
- **Три HTTP-вызова** — создать чат, опросить статус, получить сообщения. Это вся поверхность интеграции.

Типичная кнопка «Редактировать с ИИ» в вашем приложении будет отправлять POST на `/api/remote/chats` с описательным промптом, опрашивать `/api/remote/chats/{id}/status` до завершения, затем отображать результат. ИИ обрабатывает чтение файлов, понимание контекста, внесение изменений и запуск валидации — ваше приложение только обрабатывает HTTP-вызовы.

## Ответы с ошибками

Все ошибки следуют согласованному формату JSON:

```
{
  "error": "ErrorType",
  "message": "Человекочитаемое описание",
  "details": "Дополнительный контекст (опционально)"
}
```

- `Unauthorized` — недействительный или отсутствующий API-ключ (401)
- `NotFound` — ID чата не существует (404)
- `Remote API is disabled` — `PASTUKHOV_CODE_API_KEY` не установлена (503)
- `InternalServerError` — неожиданная ошибка сервера (500)

**[← Папка .pastukhov](/code/docs/pastukhov-folder)**
