[开源] Antigravity IDE 模型配额监控插件(支持Win-x64/Mac/Linux系统)

:+1:好东西

好东西,,谢谢分享


佬这是为啥

大佬麻烦更新一下,用Get-CimInstance替代wmic命令吧。

另外现在实在想用的佬,可以管理员打开PowerShell,执行命令安装wmic:
DISM /Online /Add-Capability /CapabilityName:WMIC~~~~

试一下这个办法
image

win11?试一下这个办法:
image

是的win11

感谢,勾选后可以了

大佬啊 支持一下

谢谢佬,mac亲测没问题

好东西,star一下

好东西,感谢大佬!

感谢,真的很好用

感谢佬友, mac arm架构已成功运行

感谢佬开源,mac上也用上了,很好用~

感谢大佬,windows系统反重力已经用上了

star已点,基于楼主项目ai写了个shell脚本

#!/bin/bash
# Antigravity Quota 手动测试脚本
# 用于获取 Antigravity AI 模型的配额信息

set -e

echo "=========================================="
echo "  Antigravity Quota 手动测试脚本"
echo "=========================================="

# 1. 查找 language_server 进程
echo ""
echo "[1] 查找 Antigravity language_server 进程..."

# 根据系统自动选择进程名
if [[ "$OSTYPE" == "darwin"* ]]; then
    PROCESS_NAME="language_server_macos"
else
    PROCESS_NAME="language_server_linux"
fi

# 获取进程信息(完整命令行)
PROCESS_INFO=$(ps -ww -eo pid,args | grep "$PROCESS_NAME" | grep -v grep | grep "antigravity" | head -1)

if [ -z "$PROCESS_INFO" ]; then
    echo "❌ 未找到 Antigravity 进程!"
    echo "   请确保 Antigravity 正在运行"
    echo ""
    echo "调试信息 - 所有 language_server 进程:"
    ps -ww -eo pid,args | grep "language_server" | grep -v grep || echo "(无)"
    exit 1
fi

echo "✅ 找到进程:"
echo "   $PROCESS_INFO"

# 2. 提取 PID
PID=$(echo "$PROCESS_INFO" | awk '{print $1}')
echo ""
echo "[2] 进程 PID: $PID"

# 3. 提取 CSRF Token
CSRF_TOKEN=$(echo "$PROCESS_INFO" | grep -oE '\-\-csrf_token[= ]+[a-f0-9-]+' | grep -oE '[a-f0-9-]+$')

if [ -z "$CSRF_TOKEN" ]; then
    echo "❌ 未能提取 CSRF Token"
    exit 1
fi

echo ""
echo "[3] CSRF Token: ${CSRF_TOKEN:0:8}...${CSRF_TOKEN: -8}"

# 4. 提取 extension_server_port (可选)
EXT_PORT=$(echo "$PROCESS_INFO" | grep -oE '\-\-extension_server_port[= ]+[0-9]+' | grep -oE '[0-9]+$')
echo ""
echo "[4] Extension Server Port: ${EXT_PORT:-"(未指定)"}"

# 5. 获取进程监听的所有端口
echo ""
echo "[5] 检测进程监听的端口..."

# 尝试使用 lsof, ss, 或 netstat
if command -v lsof &> /dev/null; then
    PORTS=$(lsof -Pan -p $PID -i 2>/dev/null | grep LISTEN | grep -oE '127\.0\.0\.1:[0-9]+' | cut -d: -f2 | sort -u)
    TOOL="lsof"
elif command -v ss &> /dev/null; then
    PORTS=$(ss -tlnp 2>/dev/null | grep "pid=$PID," | grep -oE '127\.0\.0\.1:[0-9]+' | cut -d: -f2 | sort -u)
    TOOL="ss"
elif command -v netstat &> /dev/null; then
    PORTS=$(netstat -tulpn 2>/dev/null | grep "$PID" | grep LISTEN | grep -oE '127\.0\.0\.1:[0-9]+' | cut -d: -f2 | sort -u)
    TOOL="netstat"
else
    echo "❌ 需要 lsof, ss 或 netstat 命令"
    exit 1
fi

echo "   (使用 $TOOL 检测)"
echo "   监听端口: $PORTS"

# 6. 测试端口连通性并获取配额
echo ""
echo "[6] 测试端口并获取配额信息..."

API_PATH="/exa.language_server_pb.LanguageServerService/GetUserStatus"
REQUEST_BODY='{
  "metadata": {
    "ideName": "antigravity",
    "extensionName": "antigravity",
    "ideVersion": "1.0.0",
    "locale": "en"
  }
}'

WORKING_PORT=""
RESPONSE=""

for PORT in $PORTS; do
    echo ""
    echo "   测试端口 $PORT (HTTPS)..."
    
    # 尝试 HTTPS
    RESPONSE=$(curl -s -k --max-time 5 \
        -X POST \
        -H "Content-Type: application/json" \
        -H "Connect-Protocol-Version: 1" \
        -H "X-Codeium-Csrf-Token: $CSRF_TOKEN" \
        -d "$REQUEST_BODY" \
        "https://127.0.0.1:$PORT$API_PATH" 2>/dev/null) || true
    
    if [ -n "$RESPONSE" ] && [[ "$RESPONSE" != *"error"* ]] && [[ "$RESPONSE" == *"userStatus"* ]]; then
        WORKING_PORT=$PORT
        echo "   ✅ 端口 $PORT (HTTPS) 连接成功!"
        break
    fi
    
    # 尝试 HTTP
    echo "   测试端口 $PORT (HTTP)..."
    RESPONSE=$(curl -s --max-time 5 \
        -X POST \
        -H "Content-Type: application/json" \
        -H "Connect-Protocol-Version: 1" \
        -H "X-Codeium-Csrf-Token: $CSRF_TOKEN" \
        -d "$REQUEST_BODY" \
        "http://127.0.0.1:$PORT$API_PATH" 2>/dev/null) || true
    
    if [ -n "$RESPONSE" ] && [[ "$RESPONSE" != *"error"* ]] && [[ "$RESPONSE" == *"userStatus"* ]]; then
        WORKING_PORT=$PORT
        echo "   ✅ 端口 $PORT (HTTP) 连接成功!"
        break
    fi
    
    echo "   ❌ 端口 $PORT 无响应或响应无效"
done

if [ -z "$WORKING_PORT" ]; then
    echo ""
    echo "❌ 所有端口测试失败!"
    echo "   可能原因:"
    echo "   1. Antigravity 未完全启动"
    echo "   2. CSRF Token 已过期(重启 Antigravity 后会变化)"
    echo "   3. 网络/防火墙问题"
    exit 1
fi

# 7. 解析并显示配额信息
echo ""
echo "=========================================="
echo "  配额信息 (原始 JSON)"
echo "=========================================="
echo "$RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$RESPONSE"

echo ""
echo "=========================================="
echo "  配额摘要"
echo "=========================================="

# 使用 Python 解析 JSON(更可靠)
python3 << EOF
import json
import sys
from datetime import datetime

try:
    data = json.loads('''$RESPONSE''')
    user_status = data.get('userStatus', {})
    
    # 用户信息
    print(f"用户邮箱: {user_status.get('email', 'N/A')}")
    
    # 计划信息
    plan_status = user_status.get('planStatus', {})
    plan_info = plan_status.get('planInfo', {})
    print(f"订阅计划: {plan_info.get('planName', 'N/A')}")
    
    # Prompt Credits
    monthly = plan_info.get('monthlyPromptCredits', 0)
    available = plan_status.get('availablePromptCredits', 0)
    if monthly > 0:
        remaining_pct = (available / monthly) * 100
        print(f"Prompt Credits: {available}/{monthly} ({remaining_pct:.1f}% 剩余)")
    
    # 模型配额
    print("\n模型配额:")
    print("-" * 60)
    
    model_configs = user_status.get('cascadeModelConfigData', {}).get('clientModelConfigs', [])
    for config in model_configs:
        label = config.get('label', 'Unknown')
        quota_info = config.get('quotaInfo', {})
        remaining = quota_info.get('remainingFraction', None)
        reset_time = quota_info.get('resetTime', '')
        
        if remaining is not None:
            pct = remaining * 100
            
            # 计算重置时间
            if reset_time:
                try:
                    reset_dt = datetime.fromisoformat(reset_time.replace('Z', '+00:00'))
                    now = datetime.now(reset_dt.tzinfo)
                    delta = reset_dt - now
                    hours = int(delta.total_seconds() // 3600)
                    minutes = int((delta.total_seconds() % 3600) // 60)
                    reset_str = f"{hours}h {minutes}m 后重置"
                except:
                    reset_str = reset_time[:19]
            else:
                reset_str = "N/A"
            
            # 状态指示符
            if pct <= 0:
                indicator = "⚫"
            elif pct <= 30:
                indicator = "🔴"
            elif pct <= 50:
                indicator = "🟡"
            else:
                indicator = "🟢"
            
            print(f"{indicator} {label:30} {pct:5.1f}%  ({reset_str})")
    
except Exception as e:
    print(f"解析失败: {e}")
    sys.exit(1)
EOF

echo ""
echo "=========================================="
echo "  测试完成!"
echo "=========================================="
echo "工作端口: $WORKING_PORT"
echo "CSRF Token: $CSRF_TOKEN"
echo ""
echo "手动 curl 命令:"
echo "curl -s -k -X POST \\"
echo "  -H 'Content-Type: application/json' \\"
echo "  -H 'Connect-Protocol-Version: 1' \\"
echo "  -H 'X-Codeium-Csrf-Token: $CSRF_TOKEN' \\"
echo "  -d '$REQUEST_BODY' \\"
echo "  'https://127.0.0.1:$WORKING_PORT$API_PATH'"

2 个赞

感谢佬,mac arm正常使用

1 个赞

如果以后更新版本了,咱们这个是只能手动更新?

这个编辑器使用模型需要代理吗