Skip to main content

LocalChat

Однопользовательский Chainlit UI и обычный ReAct-агент на LangChain: модель вызывает инструменты чтения загруженных файлов и формирует ответ. История диалога, сводка контекста и файлы сохраняются локально.

Агент предоставляет ровно четыре инструмента: ls, read_file, glob, grep. Их виртуальный / — файлы текущего чата. Выход в файловую систему хоста, другие чаты, запись файлов, shell и выполнение кода недоступны. Субагентов, планировщика, файловой выгрузки контекста и общей долговременной памяти нет.

Редактирование исторического запроса удаляет его прежний ответ и последующее продолжение. Контекст вместе со сводкой и файлами восстанавливается перед изменяемым запросом, после чего агент отвечает заново. Ошибка или Stop восстанавливают прежнее состояние. Одинаковый текст правки сохраняет весь диалог.

Установка и первый запуск

Требуются Python 3.12–3.13, Linux (или WSL2) и модель с tool calling: OpenAI-compatible API или GigaChat. Пакет содержит UI, переводы и все ресурсы приложения; клонировать репозиторий для запуска не нужно. Windows без WSL не поддерживается из-за требований файловой песочницы. macOS пока не входит в проверяемые платформы.

Установите приложение из PyPI через pipx:

pipx install --python python3.12 local-agent-chat
localchat init
localchat run

init запросит модель, адрес API и ключ или готовый access token. Запускайте команды в папке, где хотите хранить настройки и историю. Для OpenAI-compatible endpoint имя модели имеет вид openai:<model-id>, например openai:deepseek/deepseek-v4-flash-0731 для OpenRouter. Для GigaChat используйте gigachat:GigaChat-2 и base URL его API. Ключ вводится без отображения в терминале; секрет сессии создаётся автоматически. run покажет адрес UI, по умолчанию http://127.0.0.1:8765/. Остановка — Ctrl+C; --open-browser открывает браузер автоматически.

Можно также установить собранный wheel: pipx install --python python3.12 ./dist/local_agent_chat-0.1.1-py3-none-any.whl. Альтернатива pipx — python3.12 -m venv .venv, активация окружения и python -m pip install local-agent-chat.

Для локального API без ключа:

localchat init --no-input --model openai:your-model \
  --base-url http://127.0.0.1:8000/v1 --no-api-key

Для автоматической настройки с ключом передайте его в OPENAI_API_KEY и используйте те же аргументы без --no-api-key. --api-key-env MY_PROVIDER_KEY выбирает другое имя переменной; --no-streaming отключает потоковый ответ. Полная справка: localchat init --help, localchat run --help.

Для GigaChat можно выполнить интерактивную настройку:

localchat init --model gigachat:GigaChat-2 --base-url https://api.giga.chat/v1
localchat run

Введите готовый access token, а не OAuth-ключ credentials. Для --no-input заранее задайте GIGACHAT_ACCESS_TOKEN; --api-key-env COMPANY_TOKEN выбирает другое имя переменной. OAuth и автоматическое обновление токена не выполняются. Если токен истёк, обновите его в .env (или в окружении, если оно переопределяет файл) и перезапустите приложение. --no-api-key доступен только для локального OpenAI-compatible API. Проверка TLS остаётся включённой; для собственного центра сертификации SDK поддерживает GIGACHAT_CA_BUNDLE_FILE с абсолютным путём к сертификатам.

Настройки, данные и обновление

В текущей рабочей папке создаются:

  • .env — параметры запуска и токены, права нового файла 0600.
  • models.yaml — профили моделей: идентификатор, base URL, streaming и имя переменной токена; секреты здесь не хранятся.
  • .local-agent-chat/ — SQLite, история, память агента и вложения. Технические логи выводятся в консоль.

APP_DATA_DIR=.local-agent-chat и MODEL_PROFILES_FILE=models.yaml сохраняются относительными путями. --config-dir PATH или LOCALCHAT_CONFIG_DIR выбирает другой каталог конфигурации; его каталог данных по умолчанию также находится рядом с .env. --data-dir PATH или APP_DATA_DIR переопределяет каталог данных. Относительные пути разрешаются относительно каталога конфигурации. Приоритет: аргументы запуска, затем переменные окружения, затем .env, затем значения по умолчанию. XDG_CONFIG_HOME и XDG_DATA_HOME больше не выбирают расположение данных LocalChat.

Повторный init не перезаписывает настройки. Для смены модели или ключа отредактируйте конфигурацию и перезапустите приложение. Для нескольких моделей добавьте профили в models.yaml с уникальными id, например:

models:
  - id: openrouter
    label: DeepSeek
    model: openai:deepseek/deepseek-v4-flash-0731
    base_url: https://openrouter.ai/api/v1
    api_key_env: OPENAI_API_KEY
  - id: giga
    label: GigaChat 2
    model: gigachat:GigaChat-2
    base_url: https://api.giga.chat/v1
    api_key_env: GIGACHAT_ACCESS_TOKEN

Токены обоих профилей задаются в .env. Модели используются для ответа, инструментов, суммаризации и названий чатов.

Обновление: pipx upgrade local-agent-chat или python -m pip install --upgrade local-agent-chat. Перед обновлением или переносом папки остановите процесс. Папку с .env, models.yaml и .local-agent-chat/ можно скопировать целиком и запустить в новом месте; относительные пути продолжат работать. Абсолютные пути нужно изменить отдельно. Два процесса не могут одновременно открыть один каталог данных, даже на разных портах.

Если запуск сообщает об отсутствующей конфигурации, выполните localchat init. По умолчанию сервер начинает с порта 8765; если он занят, пробует следующие до 65535. localchat run --port 9000 меняет начальный порт. Фактический порт показывается при запуске. Ошибки модели отображаются в UI и терминале; используйте endpoint с поддержкой tool calling и подходящим бюджетом контекста.

JupyterHub и VS Code proxy

В новом .env записывается APP_ROOT_PATH=auto. При наличии JUPYTERHUB_SERVICE_PREFIX сервер автоматически использует <prefix>/vscode/proxy/<фактический порт>. Вне JupyterHub префикс пустой, приложение открывается напрямую.

Также поддерживается точная запись:

APP_ROOT_PATH="${JUPYTERHUB_SERVICE_PREFIX%/}/vscode/proxy/$APP_PORT"

Этот шаблон раскрывается самим CLI после выбора свободного порта; без JupyterHub он даёт /vscode/proxy/<порт>. Остальные значения .env читаются буквально, shell-команды не выполняются. Явный --root-path /custom/path или статический путь в .env используется без замены порта. --root-path '' либо APP_ROOT_PATH='' отключает префикс даже в JupyterHub.

Открывайте UI по публичному адресу прокси. Прямой порт рассчитан на локальное использование; внешний доступ требует аутентификации прокси, см. Security.

Прежние системные каталоги автоматически не переносятся. Для старой установки используйте localchat run --config-dir ~/.config/localchat, сохранив прежний APP_DATA_DIR в её .env. Для перехода на локальную папку остановите сервис, скопируйте .env, models.yaml и содержимое прежнего каталога данных в .local-agent-chat/, затем задайте относительный APP_DATA_DIR. Пустой старый APP_ROOT_PATH сохраняет прямой запуск; замените его на auto для автоматического прокси.

./scripts/run.sh делегирует запуск Python CLI из текущей рабочей папки и больше не выполняет .env как shell-скрипт. Для совместимости можно задать ENV_FILE=/path/to/.env; для другого расположения используйте --config-dir. Запуск из исходников и проверки описаны в Contributing, выпуск — в инструкции публикации.

Контекст и лимиты

Параметры находятся в AgentConfig и могут задаваться через .env:

Переменная По умолчанию Назначение
AGENT_CONTEXT_TOKENS 16000 Бюджет окна с резервом под ответ и инструменты
AGENT_SUMMARY_TRIGGER_TOKENS 10000 Порог суммаризации сообщений
AGENT_KEEP_TOKENS 3000 Бюджет последних сообщений, сохраняемых дословно
AGENT_SUMMARY_TOKENS 1000 Максимальный ответ модели суммаризации
AGENT_MAX_OUTPUT_TOKENS 2000 Максимальный ответ основной модели
AGENT_MAX_MODEL_CALLS 12 Максимум обращений основной модели за один запрос

Укажите бюджет не больше реального окна выбранной модели. Счётчик использует консервативную оценку для текста и tool calls, поскольку у совместимых endpoint не всегда доступен точный токенизатор. Конфигурация проверяет запас для ответа, сводки и схем инструментов.

Перед обращением к основной модели штатный SummarizationMiddleware заменяет старую часть контекста сводкой и сохраняет недавние сообщения, не разрывая tool-call/result пары. Предыдущая сводка включается в следующую. Длинный импортированный контекст суммируется порциями: старые сообщения не отбрасываются из-за стандартного лимита summarizer в 4000 токенов. Сводка не показывается как ответ пользователю и не заменяет полную историю UI.

В summary_options профиля можно передать параметры модели только для суммаризации. В примере OpenRouter reasoning выключен через extra_body.reasoning.enabled: false: иначе небольшой лимит ответа может целиком уйти на reasoning и оставить пустую сводку. См. параметры reasoning OpenRouter. Для другого провайдера задайте поддерживаемые им параметры. Лимиты ответа и streaming управляются агентом.

Пустая или обрезанная сводка, пустой ответ, ошибка модели и превышение бюджета последнего запроса завершают операцию с откатом. Слишком большой запрос следует разделить на части. Вывод одного файлового инструмента ограничен примерно 6000 символами; read_file поддерживает постраничное чтение, grep ищет буквальную строку.

Надёжность и хранение

OpenAI SDK и адаптер GigaChat повторяют отдельные transient HTTP-запросы; полный ход агента и инструменты не переигрываются. Настройки: LLM_MAX_RETRIES=3, LLM_REQUEST_TIMEOUT_SECONDS=60, LLM_STREAM_CHUNK_TIMEOUT_SECONDS=120, LLM_STREAM_RETRIES=1, LLM_AUXILIARY_TIMEOUT_SECONDS=30. Дополнительная попытка streaming допустима только до первого полученного chunk. Для суммаризации действует та же политика без вложенного with_retry.

В APP_DATA_DIR находятся:

  • chainlit.sqlite3: сообщения, шаги инструментов, вложения, названия; постоянный stepOrder сохраняет порядок даже при одинаковых временных метках.
  • runtime-history.sqlite3: только актуальные завершённые запросы/ответы и ссылки на предшествующее состояние.
  • checkpoints.sqlite3: выбор модели, текущий контекст и снимки контекста перед запросами. Граф ReAct между вызовами не хранит внутреннее состояние.
  • sandboxes/: файлы и снимки файлов; blobs/: сохранённые вложения Chainlit.

Прежние чаты импортируются из актуальных запросов и ответов. Старые вызовы инструментов и внутренние графы не выполняются. Редактирование старого запроса восстанавливает предшествующую часть видимой истории. Старые режимы доступа исчезают; все чаты получают только чтение своей песочницы. Прежний индекс межчатового поиска удаляется, сохранённый memory/MEMORY.md больше не читается агентом. Внутренние старые LangGraph-таблицы могут оставаться в существующей базе как неиспользуемые данные.

UI принимает до 20 файлов по 100 MiB; объём активных файлов чата ограничен 1 GiB. Коллизии имён получают суффикс. Удаление чата удаляет его активные данные и снимки нового контекста.

Где менять код

Задача Файл
Сборка агента и цикл выполнения local_agent_chat/agent_execution.py
Суммаризация и бюджет контекста local_agent_chat/agent_context.py
Хранение контекста и откат local_agent_chat/agent_memory.py
Четыре инструмента чтения local_agent_chat/sandbox_tools.py
System prompt и заголовки local_agent_chat/prompts.py
Настройки и provider retry local_agent_chat/settings.py, local_agent_chat/llm_retry.py, local_agent_chat/providers.py
Координация истории и UI local_agent_chat/runtime.py, local_agent_chat/chainlit_data.py, local_agent_chat/app.py

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

Metadata

Release files for local-agent-chat 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for local-agent-chat 0.1.1
File Size Uploaded
local_agent_chat-0.1.1.tar.gz 4.7 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for local-agent-chat 0.1.1
File Interpreter ABI Platform
local_agent_chat-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 9.4 MB

Release files / local_agent_chat-0.1.1.tar.gz

Download URL local_agent_chat-0.1.1.tar.gz
Size 4.7 MB
Tags Source
SHA-256 checksum
How to use checksums
4ad22d8265b57698c5baea5b08b1d19aad53fdc66344c5d27d8afd178289ba8e
BLAKE2b-256 checksum
How to use checksums
26bf2c20b98e86038a553fb401068916daa912239c7a566f2726817e01a967c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.

Transparency log

Release files / local_agent_chat-0.1.1-py3-none-any.whl

Download URL local_agent_chat-0.1.1-py3-none-any.whl
Size 4.6 MB
Tags Python 3
SHA-256 checksum
How to use checksums
f08f7ee4d00dac10cd7b609ff34ba0283ecc776692d169bf87890319124a50c7
BLAKE2b-256 checksum
How to use checksums
410904a5b6376593a00cf01b3b0a4fe9979bbc51aadfa1055dddf0621d4f138f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page