#!/bin/bash set -e # Host Go E2E shares bind-mounted workspaces; keep files group/world readable. umask 000 # ============================================================================= # Pi Agent Container Entrypoint # Dynamically configures MiniMax provider (4 core parameters) & Tavily search extension # ============================================================================= # 1. 核心参数配置与规整 # 1) ENDPOINT URL (默认: https://api.minimaxi.com/v1) ENDPOINT_URL="${MINIMAX_ENDPOINT_URL:-https://api.minimaxi.com/v1}" # 2) API TOKEN (用户自行设定) API_TOKEN="${MINIMAX_API_KEY:-${MINIMAX_API_TOKEN:-}}" # 3) MODEL ID (默认: MiniMax-M3) MODEL_ID="${MINIMAX_MODEL_ID:-MiniMax-M2.7-highspeed}" # 4) API 类型 (用户设定 openai-compatible,规整映射至 pi 的 openai-completions) RAW_API_TYPE="${MINIMAX_API_TYPE:-openai-compatible}" if [ "$RAW_API_TYPE" = "openai-compatible" ] || [ "$RAW_API_TYPE" = "openai" ]; then API_TYPE="openai-completions" else API_TYPE="$RAW_API_TYPE" fi echo "=================================================================" echo " 🚀 Starting Pi-Agent Container" echo " - ENDPOINT URL : ${ENDPOINT_URL}" echo " - MODEL ID : ${MODEL_ID}" echo " - API TYPE : ${API_TYPE} (from ${RAW_API_TYPE})" if [ -z "$API_TOKEN" ]; then echo " - API TOKEN : [WARNING] MINIMAX_API_KEY is not set yet!" else MASKED_KEY="${API_TOKEN:0:4}...${API_TOKEN: -4}" echo " - API TOKEN : configured (${MASKED_KEY})" fi if [ -n "$TAVILY_API_KEYS" ] || [ -n "$TAVILY_API_KEY" ]; then echo " - TAVILY SEARCH: configured (API Key Pool active)" else echo " - TAVILY SEARCH: not configured (set TAVILY_API_KEYS to enable)" fi echo "=================================================================" # 2. 准备 Pi Agent 运行时目录结构 PI_DIR="${PI_CODING_AGENT_DIR:-/root/.pi/agent}" mkdir -p "${PI_DIR}/extensions" mkdir -p "${DATA_DIR:-/app/data/workspaces}" # 3. 注入 Tavily Web Search 扩展 if [ -f "/app/extensions/tavily-search.mjs" ]; then cp -f "/app/extensions/tavily-search.mjs" "${PI_DIR}/extensions/tavily-search.mjs" fi # 4. 动态生成 models.json cat < "${PI_DIR}/models.json" { "providers": { "minimax": { "name": "MiniMax", "baseUrl": "${ENDPOINT_URL}", "api": "${API_TYPE}", "apiKey": "${API_TOKEN}", "models": [ { "id": "${MODEL_ID}", "name": "${MODEL_ID}", "reasoning": true, "input": ["text"], "contextWindow": 1000000, "maxTokens": 131072 }, { "id": "MiniMax-M2.7-highspeed", "name": "MiniMax-M2.7-highspeed", "reasoning": true, "input": ["text"], "contextWindow": 1000000, "maxTokens": 131072 }, { "id": "MiniMax-M3", "name": "MiniMax-M3", "reasoning": true, "input": ["text"], "contextWindow": 1000000, "maxTokens": 131072 } ] } } } EOF # 5. 生成 settings.json 设置默认 Provider、Model 与全局扩展 cat < "${PI_DIR}/settings.json" { "defaultProvider": "minimax", "defaultModel": "${MODEL_ID}", "extensions": [ "/app/extensions/tavily-search.mjs" ] } EOF # 6. 执行容器命令 if [ "$#" -eq 0 ]; then exec node /app/runner.mjs else exec "$@" fi