API proxy for llm and more
- Go 84.6%
- Python 8.1%
- Shell 7.3%
- state: rename Slot->Worker (minimal operational unit), WorkerKey (model/preset/id); add persistent state store (state_file) with load on startup and save after transitions; add probe caching (fast path verifies cached state, falls back to full scan) - discover: periodic re-discovery (discover_interval) + manual POST /discover - metrics: checkpoint naming via strconv; non-linear RandomForest model in analysis (dependencies aren't always linear) - docs: worker/upstream distinction, s0 semantics, TODO.md (scheduler not implemented), config.example.yaml with state_file/discover_interval |
||
|---|---|---|
| cmd/proxy | ||
| doc | ||
| internal | ||
| metrics | ||
| scripts | ||
| .gitignore | ||
| config.example.yaml | ||
| go.mod | ||
| go.sum | ||
| README.md | ||
| TODO.md | ||
Temple Switch
Конфигурируемый reverse-proxy, концентрирующий весь AI-функционал машины в одной
точке. Маршрутизирует запросы к OpenAI-совместимым LLM-серверам (сейчас —
llama.cpp) по моделям, управляет жизненным циклом моделей (машина состояний)
и собирает метрики производительности для отдельного сервера метрик.
Возможности
- Модели как единица маршрутизации:
/local/{model}/{preset?}/{upstream?}/...и OpenAI-совместимый роутер/v1/...с полемmodel. - Пресеты — конфигурации модели (
request_params,launch_params). - capabilities — какие OpenAI-эндпоинты поддерживает модель.
- discovery — авто-обнаружение моделей апстрима (
/v1/models). - Машина состояний — прогрев/деградация слотов (
c0..cx..s0..s2), спавн процессов с динамическим портом, idle-деградация. - Метрики — чекпоинты (стриминг/non-stream) и переходы состояний, отправка в сервер метрик (async, fire-and-forget).
- api_mapping — переиспользуемые наборы эндпоинтов с перегрузкой.
Архитектура
Два процесса:
- Прокси (Go,
cmd/proxy) — маршрутизация, планировщик, замеры. - Сервер метрик (Python,
metrics/) — хранение, корреляционный анализ,/predict.
Подробнее — в doc/architecture.md.
Быстрый старт
Прокси
go build -o bin/temple-switch ./cmd/proxy
cp config.example.yaml config.yaml # отредактируйте под себя
./bin/temple-switch -config config.yaml
Проверить: curl http://localhost:8000/v1/models.
Сервер метрик
cd metrics
python3 -m venv .venv
./.venv/bin/pip install -r requirements.txt
./.venv/bin/python -m uvicorn server:app --port 9000
systemd (user-сервисы)
# прокси
systemctl --user enable --now temple-switch
# сервер метрик (аналогично, ExecStart указывает на uvicorn)
Конфигурация
Полный пример с комментариями — config.example.yaml. Основные секции:
| Секция | Назначение |
|---|---|
server |
адрес и лог-уровень прокси |
metrics |
адрес сервера метрик, health-путь, perf-поля |
state_machine |
max_x (уровни кэша) и idle_timeout |
capabilities |
capability → эндпоинты |
launch_args |
канонический ключ launch-параметра → CLI-аргумент |
api_mapping |
именованные наборы эндпоинтов (openai, llama.cpp) |
upstreams |
транспорт: host/port/creds, states, transitions, discover, health |
models |
маршрутные модели: presets, default, capabilities |
Плейсхолдеры команд спавна
{model} (=original_name), {launch_params} (развёрнутые аргументы),
{port}, {pidfile}, {pid}, {preset}, {host}.
Политики апстрима
passthrough— сырой доступ/local/{upstream}/...+ fallback.strict— только явные эндпоинты.mask(default) — прямого маршрута нет, доступ только через модель.
Тесты
go test ./...
./scripts/e2e.sh # регрессия против запущенного прокси
./scripts/e2e-mapping.sh # override/recessive api_mapping
./scripts/e2e-metrics.sh # интеграция сервера метрик
Сервер метрик — эндпоинты
| Метод | Путь | Назначение |
|---|---|---|
| POST | /metrics/transition |
переход состояния (from, to, duration) |
| POST | /metrics/request |
чекпоинты запроса (features + target) |
| POST | /analyze |
ручной запуск корреляционного анализа |
| POST | /predict |
предсказание времени по параметрам |
| GET | /health |
доступность |
Хранение: таблица transitions + по таблице на handler/route с автосозданием
колонок. Длинные строки заменяются placeholder (лимит в конфиге).