# Выгрузка

> Выгрузить сессию разработки: Markdown для чтения и JSON со всеми сообщениями; что входит в файл, пример, что нет, как выгрузка попадает в журнал аудита.

В открытой сессии — две кнопки в шапке: **Markdown** и **JSON**. Файл называется
`buff-code-<id сессии>.md` или `.json`. Выгружается вся сессия целиком, а не загруженная в
ленту часть; служебные вызовы входят всегда.

## Markdown — для чтения

Вся история сессии как текст: заголовок по первой строке первого сообщения разработчика,
разработчик, устройство, проект, начало, число ходов, списанная сумма и токены по видам;
дальше — по порядку:

- **Разработчик:** сообщение;
- **Buff Code — время · модель · токены:** рассуждение модели, ответ, каждое действие —
  глагол, объект, техническое имя инструмента, аргументы и результат в блоках кода, —
  ошибки хода;
- служебные вызовы помечены «(служебный вызов)»;
- ответ инструмента, чей вызов в запись не попал, — блоком «Ответ инструмента».

Так выглядит начало файла (сессия из двух ходов; значения условные):

````markdown
# Почему падает test_orders?

Разработчик: alice · устройство ноутбук alice · проект shop-web
Начало: 2026-09-24T10:12:03+00:00 · ходов: 2 · списано: 3,4 ₽
Токены: 18 240 вход · 612 выход · 0 рассуждение · 9 100 кэш-чтение · 0 кэш-запись

**Разработчик:**

Почему падает test_orders?

### Buff Code — 2026-09-24T10:12:05+00:00 · gpt-5 · 9 120 вход · 96 выход · 0 рассуждение · 0 кэш-чтение · 0 кэш-запись

**Запустил** `pytest tests/test_orders.py -q` (`bash`):

```
{
  "command": "pytest tests/test_orders.py -q",
  "description": "Прогнать падающий тест"
}
```

Результат:

```
F                                                                        [100%]
FAILED tests/test_orders.py::test_total - AssertionError: 100 != 90
Command exited with code 1
```

### Buff Code — 2026-09-24T10:12:19+00:00 · gpt-5 · 9 120 вход · 516 выход · 0 рассуждение · 9 100 кэш-чтение · 0 кэш-запись

Тест ждёт итог со скидкой, а `total()` её не применяет — исправляю.

**Изменил** `src/orders.py` (`edit`):

```
{
  "filePath": "src/orders.py",
  "oldString": "    return sum(i.price for i in items)",
  "newString": "    return sum(i.price for i in items) - discount"
}
```

Результат:

```
Edited src/orders.py
```
````

Подходит, чтобы приложить к разбору инцидента, отправить коллеге или положить в базу знаний.

## JSON — вся сессия как данные

Объект с тремя полями:

- `session` — описание сессии: идентификатор, организация, проект, логин, устройство, начало
  и последнее изменение, число ходов, модель, первое сообщение, токены по видам, длительность и
  сумма;
- `note` — пояснение к составу файла;
- `messages` — сообщения сессии по порядку, как их записал Buff Code. У каждого — номер в
  сессии (`id`), кто говорит (`role`: разработчик или модель), время, признак служебного
  (`service`) и части (`parts`): текст, рассуждение, вызов инструмента с аргументами
  (`tool_call`), результат вызова (`tool_result`), ошибка. У ответа модели — `answer_of`: ход,
  которым он получен, — модель, статус, длительность, токены по видам и списанная сумма.

Подходит для своего анализа: посчитать вызовы инструментов, разобрать типичные вопросы,
загрузить в SIEM.

## Что в выгрузку не входит

- системный промпт и описания инструментов, которые Buff Code добавляет к каждому запросу, —
  ни в Markdown, ни в JSON (см. [что не показывается](/docs/buff-code/sessions#что-не-записывается-и-что-не-показывается));
- файлы на диске разработчика, которые модели не передавались;
- секреты подключений — их в записи нет с самого начала.

## Журнал аудита

Каждая выгрузка — своей и чужой сессии — записывается в [журнал аудита](/docs/audit-log)
событием «Выгружена сессия разработки»: кто, чью сессию, когда, с какого адреса. Подробнее —
[Журнал аудита и Buff Code](/docs/buff-code/sessions/audit).

## Локальная выгрузка из Buff Code

У самого Buff Code есть `buff session export` — это локальная копия сессии с машины
разработчика, в формате Buff Code. К записям в кабинете она отношения не имеет: кабинет
хранит то, что прошло через сервер, и эту запись разработчик изменить не может.
