#!/usr/bin/env bash # Smoke tests — classify (no LLM) + minimal chat set -euo pipefail STACK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$STACK_DIR" set -a # shellcheck disable=SC1091 source .env 2>/dev/null || true set +a BASE="${TEST_BASE_URL:-http://127.0.0.1:8000}" LITELLM_BASE="${TEST_LITELLM_URL:-http://127.0.0.1:4000}" ROUTER_KEY="${ROUTER_API_KEY:?ROUTER_API_KEY required}" curl_common() { local url="$1" CURL=(curl -sf) if [[ "$url" == https:* ]]; then CURL+=( -k ) fi if [[ -n "${TEST_RESOLVE_IP:-}" ]]; then local host="${url#*://}" host="${host%%/*}" host="${host%%:*}" CURL+=( --resolve "${host}:443:${TEST_RESOLVE_IP}" --resolve "${host}:80:${TEST_RESOLVE_IP}" ) fi } curl_common "${BASE}" if [[ "$LITELLM_BASE" == https:* && -n "${TEST_RESOLVE_IP:-}" ]]; then LITELLM_CURL=(curl -sf -k) lh="${LITELLM_BASE#*://}"; lh="${lh%%/*}"; lh="${lh%%:*}" LITELLM_CURL+=( --resolve "${lh}:443:${TEST_RESOLVE_IP}" --resolve "${lh}:80:${TEST_RESOLVE_IP}" ) else LITELLM_CURL=(curl -sf) [[ "$LITELLM_BASE" == https:* ]] && LITELLM_CURL+=( -k ) fi echo "== Router health ==" "${CURL[@]}" "${BASE}/health" | jq . echo "== Classify SIMPLE ==" "${CURL[@]}" "${BASE}/classify" \ -H "Authorization: Bearer ${ROUTER_KEY}" \ -H "Content-Type: application/json" \ -d '{"messages":[{"role":"user","content":"Привет, что такое Docker?"}]}' | jq . echo "== Classify COMPLEX ==" "${CURL[@]}" "${BASE}/classify" \ -H "Authorization: Bearer ${ROUTER_KEY}" \ -H "Content-Type: application/json" \ -d '{"messages":[{"role":"user","content":"Спроектируй архитектуру microservices"}]}' | jq . echo "== Chat smart-router max_tokens=16 (single-shot / no force hierarchical) ==" "${CURL[@]}" "${BASE}/v1/chat/completions" \ -H "Authorization: Bearer ${ROUTER_KEY}" \ -H "Content-Type: application/json" \ -H "X-AI-Orchestrate: off" \ -d '{"model":"smart-router","max_tokens":16,"messages":[{"role":"user","content":"bash docker service ls"}]}' \ | jq '.choices[0].message.content, .x_router_meta // empty' if [[ "${SMOKE_HIERARCHICAL:-}" == "1" ]]; then echo "== Hierarchical force (Novita plan/verify + workers; VPN not required) ==" "${CURL[@]}" "${BASE}/v1/chat/completions" \ -H "Authorization: Bearer ${ROUTER_KEY}" \ -H "Content-Type: application/json" \ -H "X-AI-Orchestrate: force" \ -d '{"model":"smart-router","max_tokens":256,"messages":[{"role":"user","content":"Разбей на 2 шага: 1) что такое Docker 2) одна команда docker ps. Кратко."}]}' \ | jq '.x_router_meta.mode, .x_router_meta.planner_model, .x_router_meta.worker_calls, .x_router_meta.verify_skipped, (.choices[0].message.content|.[0:200])' fi if [[ -n "${SKIP_LITELLM_SMOKE:-}" ]]; then echo "SKIP_LITELLM_SMOKE set — skipping LiteLLM checks" else echo "== LiteLLM liveliness ==" "${LITELLM_CURL[@]}" "${LITELLM_BASE}/health/liveliness" && echo echo "== LiteLLM UI ==" "${LITELLM_CURL[@]}" -I "${LITELLM_BASE}/ui" | head -3 || true fi echo "All smoke checks passed."