mirror of
https://github.com/router-for-me/CLIProxyAPIPlus.git
synced 2026-04-26 05:26:11 +00:00
Merge branch 'router-for-me:main' into main
This commit is contained in:
128
docker-build.sh
128
docker-build.sh
@@ -5,9 +5,115 @@
|
|||||||
# This script automates the process of building and running the Docker container
|
# This script automates the process of building and running the Docker container
|
||||||
# with version information dynamically injected at build time.
|
# with version information dynamically injected at build time.
|
||||||
|
|
||||||
# Exit immediately if a command exits with a non-zero status.
|
# Hidden feature: Preserve usage statistics across rebuilds
|
||||||
|
# Usage: ./docker-build.sh --with-usage
|
||||||
|
# First run prompts for management API key, saved to temp/stats/.api_secret
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
STATS_DIR="temp/stats"
|
||||||
|
STATS_FILE="${STATS_DIR}/.usage_backup.json"
|
||||||
|
SECRET_FILE="${STATS_DIR}/.api_secret"
|
||||||
|
WITH_USAGE=false
|
||||||
|
|
||||||
|
get_port() {
|
||||||
|
if [[ -f "config.yaml" ]]; then
|
||||||
|
grep -E "^port:" config.yaml | sed -E 's/^port: *["'"'"']?([0-9]+)["'"'"']?.*$/\1/'
|
||||||
|
else
|
||||||
|
echo "8317"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
export_stats_api_secret() {
|
||||||
|
if [[ -f "${SECRET_FILE}" ]]; then
|
||||||
|
API_SECRET=$(cat "${SECRET_FILE}")
|
||||||
|
else
|
||||||
|
if [[ ! -d "${STATS_DIR}" ]]; then
|
||||||
|
mkdir -p "${STATS_DIR}"
|
||||||
|
fi
|
||||||
|
echo "First time using --with-usage. Management API key required."
|
||||||
|
read -r -p "Enter management key: " -s API_SECRET
|
||||||
|
echo
|
||||||
|
echo "${API_SECRET}" > "${SECRET_FILE}"
|
||||||
|
chmod 600 "${SECRET_FILE}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_container_running() {
|
||||||
|
local port
|
||||||
|
port=$(get_port)
|
||||||
|
|
||||||
|
if ! curl -s -o /dev/null -w "%{http_code}" "http://localhost:${port}/" | grep -q "200"; then
|
||||||
|
echo "Error: cli-proxy-api service is not responding at localhost:${port}"
|
||||||
|
echo "Please start the container first or use without --with-usage flag."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
export_stats() {
|
||||||
|
local port
|
||||||
|
port=$(get_port)
|
||||||
|
|
||||||
|
if [[ ! -d "${STATS_DIR}" ]]; then
|
||||||
|
mkdir -p "${STATS_DIR}"
|
||||||
|
fi
|
||||||
|
check_container_running
|
||||||
|
echo "Exporting usage statistics..."
|
||||||
|
EXPORT_RESPONSE=$(curl -s -w "\n%{http_code}" -H "X-Management-Key: ${API_SECRET}" \
|
||||||
|
"http://localhost:${port}/v0/management/usage/export")
|
||||||
|
HTTP_CODE=$(echo "${EXPORT_RESPONSE}" | tail -n1)
|
||||||
|
RESPONSE_BODY=$(echo "${EXPORT_RESPONSE}" | sed '$d')
|
||||||
|
|
||||||
|
if [[ "${HTTP_CODE}" != "200" ]]; then
|
||||||
|
echo "Export failed (HTTP ${HTTP_CODE}): ${RESPONSE_BODY}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${RESPONSE_BODY}" > "${STATS_FILE}"
|
||||||
|
echo "Statistics exported to ${STATS_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
import_stats() {
|
||||||
|
local port
|
||||||
|
port=$(get_port)
|
||||||
|
|
||||||
|
echo "Importing usage statistics..."
|
||||||
|
IMPORT_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
|
||||||
|
-H "X-Management-Key: ${API_SECRET}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d @"${STATS_FILE}" \
|
||||||
|
"http://localhost:${port}/v0/management/usage/import")
|
||||||
|
IMPORT_CODE=$(echo "${IMPORT_RESPONSE}" | tail -n1)
|
||||||
|
IMPORT_BODY=$(echo "${IMPORT_RESPONSE}" | sed '$d')
|
||||||
|
|
||||||
|
if [[ "${IMPORT_CODE}" == "200" ]]; then
|
||||||
|
echo "Statistics imported successfully"
|
||||||
|
else
|
||||||
|
echo "Import failed (HTTP ${IMPORT_CODE}): ${IMPORT_BODY}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f "${STATS_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_service() {
|
||||||
|
local port
|
||||||
|
port=$(get_port)
|
||||||
|
|
||||||
|
echo "Waiting for service to be ready..."
|
||||||
|
for i in {1..30}; do
|
||||||
|
if curl -s -o /dev/null -w "%{http_code}" "http://localhost:${port}/" | grep -q "200"; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
sleep 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ "${1:-}" == "--with-usage" ]]; then
|
||||||
|
WITH_USAGE=true
|
||||||
|
export_stats_api_secret
|
||||||
|
fi
|
||||||
|
|
||||||
# --- Step 1: Choose Environment ---
|
# --- Step 1: Choose Environment ---
|
||||||
echo "Please select an option:"
|
echo "Please select an option:"
|
||||||
echo "1) Run using Pre-built Image (Recommended)"
|
echo "1) Run using Pre-built Image (Recommended)"
|
||||||
@@ -18,7 +124,14 @@ read -r -p "Enter choice [1-2]: " choice
|
|||||||
case "$choice" in
|
case "$choice" in
|
||||||
1)
|
1)
|
||||||
echo "--- Running with Pre-built Image ---"
|
echo "--- Running with Pre-built Image ---"
|
||||||
|
if [[ "${WITH_USAGE}" == "true" ]]; then
|
||||||
|
export_stats
|
||||||
|
fi
|
||||||
docker compose up -d --remove-orphans --no-build
|
docker compose up -d --remove-orphans --no-build
|
||||||
|
if [[ "${WITH_USAGE}" == "true" ]]; then
|
||||||
|
wait_for_service
|
||||||
|
import_stats
|
||||||
|
fi
|
||||||
echo "Services are starting from remote image."
|
echo "Services are starting from remote image."
|
||||||
echo "Run 'docker compose logs -f' to see the logs."
|
echo "Run 'docker compose logs -f' to see the logs."
|
||||||
;;
|
;;
|
||||||
@@ -38,7 +151,11 @@ case "$choice" in
|
|||||||
|
|
||||||
# Build and start the services with a local-only image tag
|
# Build and start the services with a local-only image tag
|
||||||
export CLI_PROXY_IMAGE="cli-proxy-api:local"
|
export CLI_PROXY_IMAGE="cli-proxy-api:local"
|
||||||
|
|
||||||
|
if [[ "${WITH_USAGE}" == "true" ]]; then
|
||||||
|
export_stats
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Building the Docker image..."
|
echo "Building the Docker image..."
|
||||||
docker compose build \
|
docker compose build \
|
||||||
--build-arg VERSION="${VERSION}" \
|
--build-arg VERSION="${VERSION}" \
|
||||||
@@ -48,6 +165,11 @@ case "$choice" in
|
|||||||
echo "Starting the services..."
|
echo "Starting the services..."
|
||||||
docker compose up -d --remove-orphans --pull never
|
docker compose up -d --remove-orphans --pull never
|
||||||
|
|
||||||
|
if [[ "${WITH_USAGE}" == "true" ]]; then
|
||||||
|
wait_for_service
|
||||||
|
import_stats
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Build complete. Services are starting."
|
echo "Build complete. Services are starting."
|
||||||
echo "Run 'docker compose logs -f' to see the logs."
|
echo "Run 'docker compose logs -f' to see the logs."
|
||||||
;;
|
;;
|
||||||
@@ -55,4 +177,4 @@ case "$choice" in
|
|||||||
echo "Invalid choice. Please enter 1 or 2."
|
echo "Invalid choice. Please enter 1 or 2."
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -251,9 +251,14 @@ func ThinkingBudgetToGemini3Level(model string, budget int) (string, bool) {
|
|||||||
|
|
||||||
// modelsWithDefaultThinking lists models that should have thinking enabled by default
|
// modelsWithDefaultThinking lists models that should have thinking enabled by default
|
||||||
// when no explicit thinkingConfig is provided.
|
// when no explicit thinkingConfig is provided.
|
||||||
|
// Note: Gemini 3 models are NOT included here because per Google's official documentation:
|
||||||
|
// - thinkingLevel defaults to "high" (dynamic thinking)
|
||||||
|
// - includeThoughts defaults to false
|
||||||
|
//
|
||||||
|
// We should not override these API defaults; let users explicitly configure if needed.
|
||||||
var modelsWithDefaultThinking = map[string]bool{
|
var modelsWithDefaultThinking = map[string]bool{
|
||||||
"gemini-3-pro-preview": true,
|
// "gemini-3-pro-preview": true,
|
||||||
"gemini-3-pro-image-preview": true,
|
// "gemini-3-pro-image-preview": true,
|
||||||
// "gemini-3-flash-preview": true,
|
// "gemini-3-flash-preview": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user