версия 0.23.1
Доступ к языковой модели УФИЦ РАН: OpenAI-совместимый API по ключам проектов, чат в личном кабинете и учёт потребления по пользователям и проектам.
Qwen/Qwen3.8-27BQwen/Qwen3-Embedding-0.6Bhttps://chat.predictor.su/v1/opt/ufic-ran-llm-service.old: если обычное удаление .old недоступно, каталог очищается через временный контейнер postgres:17-alpine, как в Predictor. Работающие контейнеры при такой ошибке не затрагиваются.predictor-llm-service деплой УФИЦ автоматически использует общий оверлей: LLM и включённый эмбеддер идут через шлюз Predictor, собственный L2TP-клиент УФИЦ останавливается и удаляется. На отдельном хосте по-прежнему поднимается автономный стек со своим VPN.docker-compose.local.yml сохраняет PUBLIC_BASE_URL из .env, поэтому применим и к локальному, и к прод-запуску рядом с Predictor. Для совместного режима обязателен PREDICTOR_API_KEY; конфигурация проверяется до остановки текущих контейнеров УФИЦ./opt/predictor-llm-service на /opt/ufic-ran-llm-service: перед запуском нового стека старый стек УФИЦ останавливается, только если владелец тома и публикация порта 10012 подтверждают его принадлежность. Это освобождает порт и не даёт двум PostgreSQL одновременно работать с одним томом. Если порт занят другим контейнером, деплой завершается с его именем, не останавливая чужой сервис.PUBLIC_BASE_URL и проверки совместного запуска используют тот же порт.predictor-llm-service: фиксированное имя Compose-проекта УФИЦ и отдельный каталог деплоя /opt/ufic-ran-llm-service исключают пересечение контейнеров, образов и сетей с Predictor.docker-compose.local.yml больше не допускает запуск второго L2TP-клиента: API УФИЦ работает на порту 10011 и обращается к LLM через шлюз Predictor по PREDICTOR_API_KEY. Его PostgreSQL и SearXNG адресуются по полным именам контейнеров и не смешиваются с одноимёнными сервисами Predictor.PUBLIC_BASE_URL и ссылке на ЛК в .env.example исправлен на 10012.python -m app.create_admin создаёт администратора с подтверждённой почтой и одобренным доступом без регистрации и письма. Пароль вводится интерактивно или через stdin; --update обновляет существующего пользователя и отзывает его веб-сессии.ufic-ran-llm-service_pgdata: оно больше не зависит от имени Compose-проекта и не совпадает с томом predictor-llm-service. Определения общих VPN и SearXNG не изменены.docker-compose.yml — публикация и healthcheck, дефолт PUBLIC_BASE_URL в конфиге и compose, проверки в deploy/deploy.sh и scripts/check_gateway.py, документация). Локальный оверлей docker-compose.local.yml остаётся на хост-порте 10011.deploy/deploy.sh (при импорте с Windows терялся — job автодеплоя GitLab CI падал с Permission denied, exit 126).ufic вместо predictor, синие заголовки и шапки таблиц, логотип УФИЦ РАН./admin/projects) и вкладка «Проекты» ЛК (/account/projects/company, проекты компании со ссылками на git/jira/confluence). В чате и статистике — только собственные проекты пользователей. В уже работающей базе общие проекты при старте уходят в архив, их ключи отзываются; строки и журнал потребления сохраняются, колонки projects.shared, projects.company_project_id и таблица company_projects остаются, но не используются./account/projects/company): список проектов компании, вести его может любой одобренный пользователь — создание, правка названия, описания и ссылок на git/jira/confluence, архив и возврат. Список общий: название проекта компании не может совпасть с действующим общим проектом. Каждый проект компании автоматически есть в «Новом чате» и в списке чатов (общая группа), токи чата пишутся на проект и на того, кто пишет, — как на общие. В админке «Общие проекты» такие проекты не показываются и не меняются: единственный способ вести их — вкладка «Проекты».company_projects (формат списков ссылок — из predictor-ppm): название, описание и ссылки на git, jira и confluence — по URL на строку, несколько ссылок на один инструмент.| … | + строка |---|) в чате отрисовываются таблицами — с рамкой, выделенной шапкой, выравниванием колонок по разделителю (:---:, ---:) и горизонтальной прокруткой у широких.max_model_len из /v1/models vLLM; если LLM недоступна — только токены). Рядом с кнопкой Think в поле ввода — заполнение контекста текущего диалога; после перезагрузки страницы значения берутся из сохранённых токенов ответа.reasoning_effort шаблона Qwen3.8). Скрыт, пока Think выключен; настройка сохраняется в профиле и действует на следующие ответы./v1/models и /metrics), — и параметры шлюза из .env (адрес, модель, очередь, таймауты, повторы). Если LLM_MODEL не совпадает с именем модели в vLLM — предупреждение.server/start_vllm.sh: длинный контекст через YaRN (YARN_FACTOR — скрипт сам добавляет --hf-overrides и VLLM_ALLOW_LONG_MAX_MODEL_LEN=1), оценка KV-кэша до старта, передача HF_TOKEN.opencode.json — подключение opencode к шлюзу; scripts/check_gateway.py — проверка шлюза.server/vllm.env.example: bf16-веса, контекст 393 216 токенов (YaRN ×1.5), KV-кэш в fp8, MAX_NUM_SEQS=16 — максимум, проверенный на H100 80GB рядом с эмбеддером (524 288 не влезает: нужно 16.3 ГБ KV-кэша при доступных 12.5 ГБ).LLM_REQUEST_TIMEOUT в .env.example — 1800 с: промпт на сотни тысяч токенов обрабатывается минуты.deploy/deploy.sh работает из Git Bash на Windows: путь к ~/.ssh берётся из $HOME (ssh ломался на кириллице в имени пользователя), без мультиплексирования SSH, которое там не работает; ключ — ~/.ssh/id_ed25519, id_rsa или DEPLOY_SSH_KEY. Ошибка подключения больше не выдаётся за «нет docker compose»./admin/projects): администраторы создают, переименовывают, архивируют и возвращают проекты, которые видят все пользователи — в меню «Новый чат» и в выборе проекта над чатом. Потребление пишется на проект и на того, кто пишет (у каждого пользователя свой ключ чата в общем проекте); в отчётах такие проекты подписаны «общий проект». API-ключи к общим проектам не выпускаются./admin/gpu): как nvidia-smi — таблица по видеокартам, процессы и графики загрузки, памяти, температуры и мощности за 5 мин / 15 мин / 1 час с обновлением каждые 2 с; нагрузка vLLM LLM и эмбеддера из их /metrics (запросы в работе и в очереди, KV-кэш), каждый своим блоком. Показания карт — от нового server/gpu_monitor.py на GPU-сервере (служба server/gpu-monitor.service), настройки шлюза GPU_MONITOR_URL и GPU_MONITOR_TOKEN.maintenance_notices) и переживает перезапуск контейнера; снять можно досрочно.medium (новая настройка DEFAULT_REASONING_EFFORT): если think включён, а клиент глубину не задал, шлюз больше не оставляет шаблону Qwen3.8 его xhigh, на котором агенты (Qwen Code и др.) раздумывали над каждым шагом. Явные reasoning_effort, output_config.effort и chat_template_kwargs клиента главнее; пусто — как раньше.server/vllm.env.example: MAX_NUM_SEQS=32 — без ограничения vLLM с CUDA graphs (ENFORCE_EAGER=0) не помещается рядом с эмбеддером (профилирование рекуррентных состояний Qwen3.8 просит ~24 ГБ); с ним генерация на H100 ~48 ток/с против ~20 в eager-режиме, контекст 131072.deploy/deploy.sh — выкатка всего стека (vpn, postgres, searxng, api) на удалённую машину по SSH одной командой.SKILL.md, Markdown в чате, разбор текстовых вызовов инструментов), остановка генерации корректно завершает задачу (CancelledError пробрасывается после сохранения ответа).<output>, столбцы графика потребления — кнопки с текстовой подписью.sonar-project.properties; сторонние навыки app/skill_packs/ в анализ не входят./admin/requests) в админке. Последние запросы проекта по-прежнему видны в ЛК на его странице.POST /v1/messages (обычный ответ и стрим) и POST /v1/messages/count_tokens — к шлюзу подключается Claude Code (ANTHROPIC_BASE_URL). Формат переводит vLLM, шлюз добавляет ключи, очередь, повторы и учёт (эндпоинт messages в отчётах).thinking Anthropic (enabled / adaptive / disabled) и output_config.effort переводятся в think и reasoning_effort Qwen3.8; без них — DEFAULT_THINKING и рекомендованный сэмплинг.claude-haiku-…, на которую Claude Code шлёт фоновые задачи) уходят в LLM_MODEL.x-api-key, как у Anthropic API./v1/messages* — в формате Anthropic ({"type": "error", "error": {...}}); остальные маршруты — по-прежнему в формате OpenAI.SKILL.md с YAML-шапкой и файлы навыка (справочники, примеры, скрипты). Модель видит список файлов подключённого навыка и читает нужные сама (read_skill_file); скрипты не выполняются.SKILL.md; импортируется выключенным, видны источник, лицензия, совместимость и файлы.app/skill_packs/anthropic/ с лицензией и NOTICE.theme у create_file): модель берёт их, только если пользователь просит другой стиль; по умолчанию — фирменный Predictor.use_skill); полные инструкции загружаются, лишь когда нужны. Под ответом видно, какой навык подключён.create_file); файл скачивается из сообщения.HYPERLINK, WEBSERVICE, DDE и т. п.), записываются как текст.web_search), может поискать до 3 раз за ответ и знает сегодняшнюю дату. Правила «когда искать» администратор правит в навыке.<tool_call>…), скрывается от пользователя и выполняется..docx), Excel и CSV, PowerPoint (.pptx), PDF с текстовым слоем и текстовые файлы — скрепкой, Ctrl+V или перетаскиванием, до 5 на сообщение. Модель отвечает по тексту документа, и документ остаётся в контексте следующих вопросов.tests/test_static_js.py: проверяет, что все вызываемые в JS страниц функции объявлены.:memory: — поведение как у рабочей БД (без общего соединения между сессиями).nosniff и запрещающей CSP.VERSION (SemVer) и этот changelog; версия видна в подвале страниц, в /health и в Swagger.continuous_usage_stats): остановленный или оборванный ответ больше не записывается с нулём токенов.vpn, healthcheck).SERVICE_API_KEYS — доступ только по ключам проектов из ЛК./v1/chat/completions (в т.ч. стриминг и tools), управление think, очередь и повторы запросов./v1/embeddings.