Azure VM 部署 OpenClaw + Azure OpenAI 生产实践指南
1. 项目概述为什么要在 Azure VM 上跑 OpenClaw Azure OpenAIOpenClaw 不是某个大厂发布的明星产品而是一个正在社区快速演进的开源智能体Agent框架它的核心定位很清晰让开发者能用极简配置把 LLM 能力快速封装成可编排、可调试、可监控的业务服务层。它不造轮子而是站在 LiteLLM 这个“模型协议转换器”的肩膀上把 Azure OpenAI、Anthropic、Ollama 甚至本地 vLLM 的调用统一成一套 REST API YAML Skill 描述语言。你写一个weather.yaml定义输入参数、调用哪个模型、怎么解析返回OpenClaw 就自动帮你生成/v1/skill/weather接口——这比手写 FastAPI 路由快十倍也比 LangChain Chain 更轻量、更贴近生产部署。而 Azure VM 是这个组合落地最稳的生产环境之一。不是因为 Azure 多好而是因为它的网络拓扑干净、角色权限RBAC粒度细、Ubuntu 镜像更新及时、GPU 实例开箱即用。尤其当你需要对接 Azure OpenAI 时VM 和 OpenAI 服务同属一个 Azure 订阅走内网通信延迟压到 50ms 以内密钥不用出云、不用硬编码、不用轮转管理直接用托管标识Managed Identity就能鉴权——这是你在自己机房或 AWS EC2 上很难一键搞定的体验。我去年在三个客户现场踩过坑一个用 WSL2 在 Windows 上跑 OpenClaw结果 CUDA 驱动和 Ubuntu 内核版本对不上nvidia-smi显示正常但litellm --model azure/gpt-4o死活连不上另一个在群晖 Docker 里硬塞发现 OpenClaw 的 Skill 编排依赖 systemd 用户服务Docker 容器里根本起不来第三个直接在本地 Mac M2 上跑结果openclaw start启动后所有 Skill 的 HTTP 回调都超时查了一周才发现是 macOS 的launchd和 OpenClaw 的进程守护机制有冲突。最后全切到 Azure VM从创建到上线只用了 37 分钟而且后续扩容、日志审计、安全合规全部有 Azure 原生工具链兜底。所以这篇不是“又一个安装教程”而是我用 6 台不同规格 Azure VMB2s、D4as_v5、NC6s_v3、E4as_v5、F8s_v2、Standard_NC24rs_v3实测出来的生产级部署路径。它覆盖了Ubuntu 24.04 LTS 的最小化初始化、Azure OpenAI 密钥的零硬编码接入、LiteLLM 的中继模式与负载均衡配置、OpenClaw 的 Skill 热加载与健康检查、以及最关键的——如何让openclaw命令在非 root 用户下真正可用而不是报错 “无法将‘openclaw’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”。你不需要懂 RustOpenClaw 是 Rust 写的也不需要会写 ARM 模板只要你会点 Azure 门户或者az cli就能照着往下做。如果你正卡在“部署 openclaw”、“openclaw 安装教程”、“openclaw 配置”这几个关键词上那接下来的内容就是你该抄的作业。2. 整体架构设计与关键选型逻辑2.1 为什么必须用 Ubuntu 24.04 LTS而不是 22.04 或 WSLUbuntu 24.04Noble Numbat是 2024 年 4 月发布的 LTS 版本它带来的不是“新功能”而是底层依赖链的确定性。OpenClaw 的构建依赖rustc 1.77而 Ubuntu 22.04 自带的rustc是 1.65手动升级会污染系统包管理LiteLLM 的最新版v1.52默认启用httpx异步客户端它在 Ubuntu 22.04 的openssl 3.0.2下偶发 TLS 握手失败错误日志里只显示ConnectionResetError根本看不出是 OpenSSL 版本问题。而 Ubuntu 24.04 自带rustc 1.77、openssl 3.1.5、python3.12三者版本完全对齐 LiteLLM 和 OpenClaw 的 CI 测试矩阵。提示不要尝试“将 Azure 上的 Ubuntu 系统从 22.04 升级到 24.04”。do-release-upgrade在 Azure VM 上成功率低于 40%常见失败点是walinuxagent服务被中断、cloud-init配置残留导致 SSH 登录失败、grub更新后无法引导。Azure 官方文档明确建议LTS 版本间升级应通过新建 VM 数据盘迁移完成而非原地升级。至于 WSL它本质是 Windows 内核上的兼容层不是真实 Linux。systemd在 WSL2 中是模拟启动的OpenClaw 的openclaw service install命令会静默失败CUDA 驱动必须通过 Windows 的 NVIDIA GPU 驱动桥接nvidia-container-toolkit在 WSL2 中不支持--gpus all参数最致命的是WSL2 的网络是 NAT 模式localhost:8000对宿主机可见但对 Azure OpenAI 的回调地址比如 Webhook不可达——而 OpenClaw 的 Skill 很多依赖外部服务回调比如飞书机器人、企业微信通知这些在 WSL2 里全要配反向代理徒增复杂度。所以我的方案是Azure 门户 → 创建虚拟机 → 镜像选 “Ubuntu Server 24.04 LTS” → 规格选 D4as_v58 核 32GB带 1 个 NVMe 本地盘→ 公网 IP 关闭纯内网→ 启用托管标识Managed Identity。整个过程 3 分钟比你配 WSL2 的.wslconfig还快。2.2 为什么 LiteLLM 必须作为中继层而不是让 OpenClaw 直连 Azure OpenAIOpenClaw 的设计哲学是“Skill 无关模型”它本身不处理模型调用只负责路由、编排、状态管理。所以它必须依赖一个“模型抽象层”而 LiteLLM 就是当前生态里最成熟的选择。但很多人误以为 LiteLLM 只是个“转发代理”其实它在 Azure 场景下承担了四个不可替代的角色协议标准化Azure OpenAI 的 REST API 返回格式和 OpenAI 官方不完全一致比如system_fingerprint字段缺失、usage结构嵌套更深LiteLLM 自动做字段映射让 OpenClaw 的 Skill YAML 无需区分后端。密钥隔离OpenClaw 的 Skill YAML 里如果直接写api_key: xxx密钥就硬编码在 Git 仓库里违反安全基线。LiteLLM 支持从环境变量、Azure Key Vault、甚至 Azure AD 托管标识读取密钥OpenClaw 只需配置https://localhost:4000密钥管理彻底解耦。负载均衡与熔断一个 Azure 订阅下可以建多个 Azure OpenAI 资源比如prod-gpt4o、staging-gpt4、backup-claude3LiteLLM 的litellm --model azure/gpt-4o,azure/gpt-4-turbo,anthropic/claude-3-haiku会自动轮询且内置 5 秒超时、3 次重试、失败率 20% 自动摘除节点的熔断逻辑。可观测性埋点LiteLLM 默认输出结构化日志JSON Lines每条请求带request_id、model、latency、prompt_tokens、completion_tokensOpenClaw 的 Skill 日志可以直接关联排查“为什么这个金融分析 Skill 耗时 12 秒”时一眼就能定位是模型响应慢还是 Skill 自身逻辑卡住。注意LiteLLM 的--model参数里写的azure/gpt-4o不是模型名而是 LiteLLM 的内部别名。它对应的真实配置在.env文件里AZURE_API_BASEhttps://prod-gpt4o.openai.azure.com/、AZURE_API_KEYxxx、AZURE_API_VERSION2024-02-01。OpenClaw 完全不知道这些它只认https://localhost:4000/v1/chat/completions这个统一入口。2.3 为什么 OpenClaw 必须用 systemd 用户服务而不是nohup或screenOpenClaw 的官方文档说 “openclaw start启动即可”但这是针对开发机的简化描述。在生产环境openclaw start本质是前台运行一个 Rust 进程一旦 SSH 断开进程就被 SIGHUP 杀死。有人用nohup openclaw start 结果发现日志文件权限混乱/var/log/openclaw下一堆root:root文件普通用户无法追加还有人用screen -S openclaw但screen进程本身没有健康检查openclaw崩溃后screen还在监控系统永远收不到告警。systemd 用户服务是唯一符合 Linux 生产规范的方案。它提供自动重启Restarton-failure进程退出码非 0 就拉起资源限制MemoryLimit2G、CPUQuota80%防止 Skill 泄露内存拖垮整台 VM依赖管理Afternetwork.target、WantsliteLLM.service确保 LiteLLM 起来了 OpenClaw 才启动日志归集journalctl --user -u openclaw一条命令看所有历史日志不用满/var/log找文件安全沙箱NoNewPrivilegestrue、ProtectSystemstrict禁止 Skill 执行rm -rf /类操作。我试过所有替代方案最后都回到 systemd。这不是教条而是 Azure VM 上跑任何长期服务的铁律。3. 核心细节解析与实操要点3.1 Ubuntu 24.04 的最小化初始化从裸镜像到可部署状态Azure 创建的 Ubuntu 24.04 VM 默认是“最小安装”它没有curl、wget、unzip、甚至sudo都没装cloud-init默认只配azadmin用户。第一步不是装 OpenClaw而是把系统调到“可交付”状态。以下命令必须按顺序执行漏一步后面全卡住# 1. 更新 apt 源为阿里云镜像比官方源快 5 倍且 24.04 的 163 源已停更 sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list # 2. 安装基础工具注意ubuntu-server-minimal 包含 python3.12但不包含 pip3 sudo apt update sudo apt install -y curl wget unzip gnupg2 software-properties-common # 3. 安装 Python 3.12 的 pipUbuntu 24.04 自带 python3.12但 pip 需手动装 sudo apt install -y python3.12-venv python3.12-dev curl https://bootstrap.pypa.io/get-pip.py | sudo python3.12 # 4. 验证 pip 版本必须 24.0否则安装 litellm 会报错 pydantic 版本冲突 pip3.12 --version # 输出应为 pip 24.0.1 或更高 # 5. 创建专用用户绝对不要用 root 或 azadmin 直接跑服务 sudo adduser --disabled-password --gecos openclaw sudo usermod -aG sudo openclaw sudo su - openclaw实操心得adduser --disabled-password是关键。Azure VM 的azadmin用户默认用 SSH 密钥登录密码为空。如果你用passwd openclaw设密码后续用sudo su - openclaw切换时会卡在密码输入而--disabled-password创建的用户sudo权限靠sudoers文件控制完全绕过密码环节。这是我在线上环境被坑了两次才总结出的技巧。3.2 Azure OpenAI 的安全接入托管标识Managed Identity实战Azure OpenAI 控制台里生成的密钥API Key是“短期凭证”有效期最长 90 天且一旦泄露攻击者能调用你的所有模型。Azure 提供的“托管标识”是真正的零密钥方案VM 启动时Azure AD 会动态颁发一个短期访问令牌JWTLiteLLM 可以用这个令牌向 Azure OpenAI 请求访问权限全程密钥不出 Azure 骨干网。配置步骤分三步缺一不可第一步在 Azure 门户给 VM 开启系统分配的托管标识进入 VM → “标识” → “系统分配” → “开启” → 保存等待 1-2 分钟状态变为“已分配”第二步给该托管标识授予 Azure OpenAI 的“Cognitive Services User”角色进入你的 Azure OpenAI 资源 → “访问控制IAM” → “添加角色分配”角色选 “Cognitive Services User”不是 Owner也不是 Contributor成员范围选 “Azure AD 用户、组或服务主体” → 搜索你的 VM 名称 → 选中 → 保存第三步在 LiteLLM 中配置使用托管标识# 切换到 openclaw 用户 sudo su - openclaw # 创建 LiteLLM 配置目录 mkdir -p ~/.litellm cd ~/.litellm # 创建 .env 文件内容如下注意不写 AZURE_API_KEY echo AZURE_API_BASEhttps://your-openai-resource.openai.azure.com/ .env echo AZURE_API_VERSION2024-02-01 .env echo AZURE_USE_MANAGED_IDENTITYTrue .env echo AZURE_RESOURCE_GROUP_NAMEyour-rg-name .env echo AZURE_SUBSCRIPTION_IDyour-subscription-id .env echo AZURE_DEPLOYMENT_NAMEgpt-4o .env echo MODEL_LIST[{model_name: gpt-4o, litellm_params: {model: azure/gpt-4o, api_base: \${AZURE_API_BASE}, api_version: \${AZURE_API_VERSION}}}] .env验证是否成功运行litellm --model azure/gpt-4o --api-key dummy --debug。如果看到Using managed identity for auth和Response: {id:...,object:chat.completion,choices:[...]}说明托管标识已生效。如果报错Authentication failed90% 是第二步的 IAM 角色没赋对去 Azure AD 的“企业应用”里搜你的 VM 名看是否有Cognitive Services User角色。3.3 LiteLLM 的中继服务部署不只是pip install litellmLiteLLM 官方文档说pip install litellm就能跑但在 Azure 生产环境必须做三件事第一用uv替代pip安装提速 8 倍且避免依赖冲突# 安装 uvRust 写的超快 Python 包管理器 curl -LsSf https://astral.sh/uv/install.sh | sh source $HOME/.cargo/env # 用 uv 创建隔离环境并安装 litellm uv venv ~/.venv/litellm source ~/.venv/litellm/bin/activate uv pip install litellm[azure,anthropic,cohere]第二配置 systemd 服务监听127.0.0.1:4000禁止公网暴露# 创建服务文件 sudo tee /etc/systemd/system/litellm.service EOF [Unit] DescriptionLiteLLM API Server Afternetwork.target [Service] Typesimple Useropenclaw WorkingDirectory/home/openclaw EnvironmentPATH/home/openclaw/.venv/litellm/bin:/usr/local/bin:/usr/bin:/bin ExecStart/home/openclaw/.venv/litellm/bin/litellm --port 4000 --host 127.0.0.1 --debug --config /home/openclaw/.litellm/.env Restarton-failure RestartSec10 MemoryLimit2G CPUQuota80% [Install] WantedBymulti-user.target EOF # 启用并启动 sudo systemctl daemon-reload sudo systemctl enable litellm sudo systemctl start litellm第三验证中继是否健康# 查看日志应该看到 LiteLLM: Starting server 和 Running on http://127.0.0.1:4000 sudo journalctl -u litellm -f # 本地 curl 测试必须返回 JSON且 status200 curl -X POST http://127.0.0.1:4000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: gpt-4o, messages: [{role: user, content: Hello}] }注意事项--host 127.0.0.1是强制要求。Azure VM 的网络安全组NSG默认放行所有端口如果你用--host 0.0.0.0LiteLLM 就会监听公网 IP任何能访问你 VM 公网 IP 的人都能调用你的 Azure OpenAI 配额。127.0.0.1确保只有本机进程OpenClaw能访问。3.4 OpenClaw 的安装与命令修复解决 “无法将‘openclaw’项识别为 cmdlet” 错误这个报错是 Windows 用户或 PowerShell 用户在 Azure Cloud Shell 里执行openclaw命令时最常见的问题。根源在于OpenClaw 是 Rust 编译的二进制它不依赖 PowerShell 的 cmdlet 机制而是需要被PATH环境变量收录且执行权限正确。标准安装流程Ubuntu 24.04# 1. 下载最新 release截至 2024-06v0.8.2 是稳定版 cd /tmp curl -LO https://github.com/OpenClaw/OpenClaw/releases/download/v0.8.2/openclaw-v0.8.2-x86_64-unknown-linux-gnu.tar.gz tar -xzf openclaw-v0.8.2-x86_64-unknown-linux-gnu.tar.gz # 2. 安装到 /usr/local/bin系统级 PATH sudo mv openclaw /usr/local/bin/ sudo chmod x /usr/local/bin/openclaw # 3. 验证安装 openclaw --version # 应输出 openclaw 0.8.2但仅这样还不够。openclaw命令默认查找~/.openclaw目录而~是openclaw用户的家目录/home/openclaw。如果openclaw用户的 shell 是/bin/shAzure 默认$HOME可能未正确设置导致openclaw init报错找不到 config 目录。解决方案是显式指定 home 目录# 创建 openclaw 用户的专属配置目录 sudo mkdir -p /home/openclaw/.openclaw sudo chown -R openclaw:openclaw /home/openclaw/.openclaw # 初始化必须用 openclaw 用户执行且指定 --home sudo su - openclaw -c openclaw init --home /home/openclaw实操心得“openclaw 命令” 报错的终极排查法which openclaw—— 看是否在/usr/local/bin/openclawls -l /usr/local/bin/openclaw—— 看权限是否为-rwxr-xr-xsudo su - openclaw -c echo \$HOME—— 看$HOME是否为/home/openclawsudo su - openclaw -c openclaw --help 21 | head -5—— 看是否输出帮助文本。这四步走完99% 的命令问题都能定位。4. 实操过程与核心环节实现4.1 OpenClaw systemd 用户服务配置从启动到自愈OpenClaw 的openclaw service install命令在 Ubuntu 24.04 上会失败因为它试图写入/etc/systemd/system/需要 root而openclaw用户没有权限。我们必须手动创建用户级 service。# 切换到 openclaw 用户 sudo su - openclaw # 创建用户 service 目录如果不存在 mkdir -p ~/.config/systemd/user # 创建 openclaw.service 文件 tee ~/.config/systemd/user/openclaw.service EOF [Unit] DescriptionOpenClaw Agent Framework Afternetwork.target litellm.service [Service] Typesimple WorkingDirectory/home/openclaw EnvironmentPATH/usr/local/bin:/home/openclaw/.local/bin:/usr/bin:/bin ExecStart/usr/local/bin/openclaw start --home /home/openclaw Restarton-failure RestartSec5 MemoryLimit1.5G CPUQuota60% NoNewPrivilegestrue ProtectSystemstrict PrivateTmptrue [Install] WantedBydefault.target EOF # 启用用户服务注意是 --user不是 system systemctl --user daemon-reload systemctl --user enable openclaw systemctl --user start openclaw关键参数解释Afterlitellm.service确保 LiteLLM 已启动OpenClaw 才开始初始化EnvironmentPATH...显式声明 PATH避免openclaw找不到curl或jqNoNewPrivilegestrue禁止 Skill 进程提权即使 YAML 里写了shell: true也无法执行sudoProtectSystemstrict挂载/usr、/boot、/etc为只读防止 Skill 恶意修改系统配置。验证服务状态# 查看用户服务列表 systemctl --user list-units --typeservice | grep openclaw # 查看实时日志OpenClaw 启动时会打印所有 loaded skill journalctl --user -u openclaw -f # 检查端口占用OpenClaw 默认监听 8000 ss -tuln | grep :8000 # 应显示 LISTEN 127.0.0.1:80004.2 第一个 Skill对接 Azure OpenAI 的金融分析助手YAML 实战OpenClaw 的核心价值在 Skill。我们写一个真实的金融分析 Skill调用 Azure OpenAI 的gpt-4o输入股票代码返回基本面摘要。创建/home/openclaw/.openclaw/skills/finance_analyze.yamlname: finance_analyze description: Use GPT-4o to analyze stock fundamentals input_schema: type: object properties: symbol: type: string description: Stock symbol, e.g. AAPL, TSLA required: [symbol] output_schema: type: object properties: summary: type: string description: Concise fundamental analysis in Chinese risk_level: type: string enum: [low, medium, high] recommendation: type: string enum: [buy, hold, sell] steps: - name: call_gpt4o action: http url: http://127.0.0.1:4000/v1/chat/completions method: POST headers: Content-Type: application/json body: | { model: gpt-4o, messages: [ { role: system, content: You are a professional financial analyst. Analyze the stock fundamentals and return JSON with keys: summary (in Chinese), risk_level (low/medium/high), recommendation (buy/hold/sell). Do not output anything else. }, { role: user, content: Analyze stock {{ input.symbol }}. Focus on P/E ratio, debt-to-equity, and revenue growth last 3 years. } ], response_format: { type: json_object } } parse_response: | {% set data response.json() %} { summary: data.choices[0].message.content | from_json | default({}) | get(summary, ), risk_level: data.choices[0].message.content | from_json | default({}) | get(risk_level, medium), recommendation: data.choices[0].message.content | from_json | default({}) | get(recommendation, hold) } - name: validate_output action: script language: python code: | import json try: output json.loads(output) assert output.get(risk_level) in [low, medium, high] assert output.get(recommendation) in [buy, hold, sell] except Exception as e: raise ValueError(fInvalid output format: {e})解析这个 YAML 的关键点input_schema和output_schema是 OpenClaw 的契约前端调用时会自动校验参数httpaction 的url指向127.0.0.1:4000即 LiteLLM 中继不是直连 Azureresponse_format: { type: json_object }是 Azure OpenAI 的新特性强制模型返回合法 JSON避免后处理解析失败parse_response用 Jinja2 模板提取 JSON 字段from_json过滤器确保安全解析。部署 Skill# 重新加载 SkillOpenClaw 支持热加载 sudo su - openclaw -c openclaw reload --home /home/openclaw # 测试调用用 curl 模拟前端 curl -X POST http://127.0.0.1:8000/v1/skill/finance_analyze \ -H Content-Type: application/json \ -d {symbol: AAPL}预期返回{ summary: 苹果公司AAPL市盈率28.5低于行业平均32.1资产负债率142%但现金储备高达1660亿美元过去三年营收年均增长8.3%。, risk_level: medium, recommendation: hold }4.3 健康检查与监控集成让 OpenClaw 真正“可运维”一个服务上线后没人看日志没人设告警等于没上线。OpenClaw 提供/health端点但默认只返回{ status: ok }我们需要注入 LiteLLM 和 Azure OpenAI 的连通性检查。创建/home/openclaw/.openclaw/config.yamlserver: port: 8000 host: 127.0.0.1 health_check: enabled: true timeout_ms: 5000 checks: - name: litellm type: http url: http://127.0.0.1:4000/health timeout_ms: 3000 - name: azure_openai type: http url: http://127.0.0.1:4000/v1/models timeout_ms: 4000 headers: Authorization: Bearer dummy然后重启服务sudo su - openclaw -c openclaw stop sudo su - openclaw -c openclaw start --home /home/openclaw现在访问curl http://127.0.0.1:8000/health返回{ status: ok, checks: { litellm: { status: ok, latency_ms: 12 }, azure_openai: { status: ok, latency_ms: 47 } } }实操心得健康检查的 timeout 必须小于 service 的RestartSec。这里RestartSec5所以每个 check 的timeout_ms必须 5000否则 systemd 会认为服务启动失败反复重启。我第一次配timeout_ms: 10000结果openclaw服务一直在 restarting 状态查了半小时日志才发现是这个原因。5. 常见问题与排查技巧实录5.1 “openclaw : 无法将‘openclaw’项识别为 cmdlet” 的 5 种根因与解法这个问题在搜索热词里高频出现但实际原因五花八门。以下是我在 6 台 VM 上复现并解决的全部场景现象根因解决方案验证命令bash: openclaw: command not foundopenclaw二进制不在PATHsudo ln -s /usr/local/bin/openclaw /usr/bin/openclawwhich openclawopenclaw: command not found但which openclaw有输出openclaw用户的 shell 是/bin/sh不读取~/.bashrcchsh -s /bin/bash openclawsudo su - openclaw -c echo \$SHELLopenclaw: Permission denied/usr/local/bin/openclaw权限不是xsudo chmod x /usr/local/bin/openclawls -l /usr/local/bin/openclawopenclaw: error while loading shared libraries: libssl.so.3: cannot open shared object fileUbuntu 24.04 的libssl.so.3路径变更sudo apt install -y libssl3ldd /usr/local/bin/openclaw | grep sslopenclaw: failed to initialize: No such file or directory (os error 2)~/.openclaw目录不存在或权限不对sudo mkdir -p /home/openclaw/.openclaw sudo chown openclaw:openclaw /home/openclaw/.openclawsudo su - openclaw -c ls -la /home/openclaw/.openclaw独家技巧用strace追踪命令失败全过程。比如strace -e traceopenat,execve openclaw 21 \| grep -E (openat|execve)能精准看到它试图打开哪个路径失败比看错误日志快 10 倍。5.2 LiteLLM 连接 Azure OpenAI 失败的 3 个隐蔽陷阱LiteLLM 报错Authentication failed或Connection refused90% 不是网络问题而是这三个配置陷阱陷阱一AZURE_API_VERSION版本不匹配Azure OpenAI 的 API 版本迭代很快2023-05-15已废弃2024-02-01是当前推荐版。但很多教程还写老版本。验证方法curl -X GET https://your-resource.openai.azure.com/openai/models?api-version2024-02-01 \ -H Authorization: Bearer $(curl http://169.254.169.254/metadata/identity/oauth2/token?api-version2018-02-01resourcehttps://cognitiveservices.azure.com/ -H Metadata:true -s | jq -r .accessToken) \ -H Content-Type: application/json如果返回{error: {code: UnsupportedApiVersion, ...}}说明版本错了。陷阱二AZURE_DEPLOYMENT_NAME大小写敏感Azure 门户里创建的部署名是gpt-4o但你在 LiteLLM 的MODEL_LIST里写成GPT-4o就会报Deployment not found。Azure 的部署名严格区分大小写且不能有空格。验证方法az cognitiveservices account deployment