Skip to main content

LocalChat

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

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

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

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

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

После публикации в PyPI установите приложение через pipx:

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

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

До первого релиза можно установить собранный wheel: pipx install --python python3.12 ./dist/local_agent_chat-0.1.0-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.

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

На Linux по умолчанию используются:

  • ~/.config/localchat/.env — параметры запуска и ключи, права нового файла 0600.
  • ~/.config/localchat/models.yaml — профили моделей; ключи здесь не хранятся.
  • ~/.local/share/localchat/ — SQLite, история и вложения.

Учитываются XDG_CONFIG_HOME и XDG_DATA_HOME. --config-dir PATH или LOCALCHAT_CONFIG_DIR выбирает другой каталог конфигурации, --data-dir PATH — каталог данных. Относительные пути из .env разрешаются относительно каталога конфигурации. Приоритет: аргументы запуска, затем переменные окружения, затем .env, затем значения по умолчанию. .env читается как данные: shell-команды и подстановки ${...} не выполняются.

Повторный init не перезаписывает настройки. Для смены модели или ключа отредактируйте конфигурацию и перезапустите приложение. Обновление: pipx upgrade local-agent-chat; перед обновлением остановите процесс и сделайте резервную копию каталогов конфигурации и данных. Установка и переустановка пакета их не затрагивают. Два процесса не могут одновременно открыть один каталог данных.

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

JupyterHub и существующая установка

Для прокси задайте полный публичный префикс:

localchat run --port 8765 \
  --root-path "${JUPYTERHUB_SERVICE_PREFIX%/}/vscode/proxy/8765"

Здесь переменную раскрывает shell перед вызовом команды. В .env нужно записать уже готовый путь, например /user/alice/vscode/proxy/8765. Неверный префикс может привести к белому экрану из-за неправильных адресов JavaScript. Проверяйте UI по публичному адресу прокси. Прямой порт рассчитан на локальное использование; внешний доступ требует аутентификации прокси, см. Security.

Старые .env, models.yaml и каталог данных можно использовать через localchat run --config-dir /path/to/checkout. Сценарий ./scripts/run.sh сохранён для существующих checkout и по-прежнему обрабатывает .env как shell-файл, включая прежние подстановки переменных. В новых установках используйте команды localchat. Запуск из исходников и проверки описаны в 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 ищет буквальную строку.

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

Provider SDK повторяет отдельные 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
Координация истории и 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.0

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.0
File Size Uploaded
local_agent_chat-0.1.0.tar.gz 4.7 MB Details

Built distribution (wheel)

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

Total release size: 9.3 MB

Release files / local_agent_chat-0.1.0.tar.gz

Download URL local_agent_chat-0.1.0.tar.gz
Size 4.7 MB
Tags Source
SHA-256 checksum
How to use checksums
d0e3d12697cc1c338d7e9c9b117643a857aa6c66b62456db1c25b70a5530c4c1
BLAKE2b-256 checksum
How to use checksums
cfe3bbaee982573863c972e4c7781494e84bedcf942cfe13d0c33168e076b873
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 13, 2026.

Transparency log

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

Download URL local_agent_chat-0.1.0-py3-none-any.whl
Size 4.6 MB
Tags Python 3
SHA-256 checksum
How to use checksums
510b5b15fd4d6ad91b5fcfa7a0729383b1c1ef108840d1d8fa18040e076a28c9
BLAKE2b-256 checksum
How to use checksums
3e0dd5f11f30dd2a7c2a9e02c3d8618f59116f6e78a1928e4a52b7d51dc9d010
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 13, 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

0.1.1

2 release files

This release

0.1.0 This release

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