К основному содержанию
скилл CX Codex

platform-models-api-configure — скилл для Claude Code

Настраивает агент на работу через Salesforce Models API с подписанным OrgJWT, проверяет доступ и раскладывает ключи по файлам.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add forcedotcom/sf-skills --skill platform-models-api-configure -a claude-code
Открыть на GitHub

Что делает platform-models-api-configure

Скилл нужен, когда агент должен ходить не в свой обычный эндпоинт, а в https://api.salesforce.com/ai/gpt/v1. Авторизация у всех одна: подписанный OrgJWT, который скрипт scripts/get-orgjwt.sh получает через client_credentials со скоупом sfap_api. Дальше путь расходится. Для Claude и Claude Agent SDK скилл включает режим Bedrock: прописывает переменные окружения, модель с полным именем вида sfdc_ai__DefaultBedrockAnthropicClaude46Sonnet и кастомные заголовки. Для Codex и остальных агентов берётся тот же токен и тот же адрес, но настройки кладутся в конфиг самого клиента.

Порядок такой: файл .claude/.orgjwt.env с chmod 600 и записью в gitignore, затем проверочный curl, который обязан вернуть 200 ещё до правки settings.json. Если проверка упала, дальше идти нет смысла — ошибка будет та же. Потом в settings.json появляется apiKeyHelper с абсолютными путями и блок env. Агент перезапускают полностью, потому что настройки читаются только при старте.

Заранее нужен connected app в орге со скоупом sfap_api, включённым client_credentials и run-as пользователем. Ещё понадобятся curl, jq и sf. Отдельная строка "ANTHROPIC_AUTH_TOKEN": "" не косметика: этот токен приоритетнее apiKeyHelper, и без очистки агент уйдёт со старым ключом прямо в 401 или 404. Адрес в ANTHROPIC_BEDROCK_BASE_URL пишется ровно как есть, без хвостового слэша.

Сам connected app скилл не создаёт, это задача соседних скиллов про connectivity.

Какие задачи решает

  • перевести агент на эндпоинт Salesforce Models API
  • получить OrgJWT через client_credentials и подставить его в apiKeyHelper
  • проверить доступ к модели до правки настроек
  • разобрать 401 или 404 при обращении к Models API
  • настроить режим Bedrock с нужными переменными окружения

Примеры запросов агенту

  • Настрой Claude на Salesforce Models API через OrgJWT, ключи возьми из .claude/.orgjwt.env
  • Проверь доступ к модели sfdc_ai__DefaultBedrockAnthropicClaude46Sonnet и покажи код ответа
  • Агент получает 401 от Models API — найди причину и почини конфиг

Как установить platform-models-api-configure

1Через Skills CLI (Vercel)

npx skills add forcedotcom/sf-skills --skill platform-models-api-configure -a claude-code

2Вручную: положить файлы

~/.claude/skills/platform-models-api-configure/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/platform-models-api-configure/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о platform-models-api-configure

Как установить platform-models-api-configure в Claude Code?

Выполните npx skills add forcedotcom/sf-skills --skill platform-models-api-configure -a claude-code. Скилл появится по пути ~/.claude/skills/platform-models-api-configure/SKILL.md.

Что делает platform-models-api-configure?

Прописывает агенту адрес Salesforce Models API, авторизацию через OrgJWT и переменные режима Bedrock для Claude, а для других CLI подсказывает, куда положить эквивалентные настройки. Заодно проверяет ответ curl и помогает разобрать ошибки 401 и 404.

Что нужно до запуска скилла?

Connected app в орге со скоупом sfap_api, включённый client_credentials и run-as пользователь. Инструменты: curl, jq и sf.

Исходный текст

SKILL.md · Apache-2.0
---
name: platform-models-api-configure
description: "Configure (or troubleshoot) an AI coding agent or CLI to route through the Salesforce Models API using a signed OrgJWT. Use this skill when pointing an agent at the Salesforce model endpoint (api.salesforce.com/ai/gpt/v1), setting up OrgJWT / Bedrock-mode auth, wiring the agent's settings, API-key helper, and credentials file for the Salesforce endpoint, or fixing Models API 401 / 404 / \"model not available\" errors. DO NOT TRIGGER when the user needs to create or configure the Salesforce Connected App itself (use integration-connectivity-connected-app-configure) or set up Named Credentials / callout auth (use integration-connectivity-generate)."
metadata:
  version: "1.0"
  domains: ["Platform", "Agentforce"]
  relatedSkills:
    - "integration-connectivity-connected-app-configure"
    - "integration-connectivity-generate"
  cliTools:
    - tool: ["curl"]
      semver: ">=7.29.0"
    - tool: ["jq"]
      semver: ">=1.6.0"
    - tool: ["sf"]
      semver: ">=2.0.0"
---

# Salesforce Models API setup for an AI coding agent

The Salesforce Models API (`https://api.salesforce.com/ai/gpt/v1`) is
authenticated with a signed **OrgJWT** (obtained via `client_credentials` with
the `sfap_api` scope — see `scripts/get-orgjwt.sh`; no proxy). That auth and the
base URL are the same for **any** agent. How each agent then talks to the
endpoint is agent-specific: Anthropic clients (**Claude Code** and the **Claude
Agent SDK**) route through **Bedrock mode** (the env vars in Step 3), whereas
other agents (e.g. Codex) use their own client config against the same endpoint
and token — Bedrock mode does **not** apply to them.

The steps below are the **Claude Code / Claude Agent SDK reference
implementation** (Bedrock mode + a JSON settings file + an API-key helper). For
a non-Bedrock agent, reuse the OrgJWT auth (Step 1) and the base URL, and apply
the equivalent client settings in that agent's own config location instead of
the Bedrock env vars.

Bundled scripts are in `scripts/`. Path placeholders below: `<SKILL>` = the
absolute path to **this skill's own directory** (the folder containing this
`SKILL.md`; resolve it from the skill path in context). `<ABS>` = the absolute
path to the user's project root. Always emit fully resolved absolute paths —
the API-key helper runs from an undefined working directory, so relative paths
break it.

## Prerequisite

A connected app in the org with the **`sfap_api`** OAuth scope and the
**client_credentials** flow enabled (consumer key/secret + a run-as user).
Setup steps: https://developer.salesforce.com/docs/ai/agentforce/guide/access-models-api-with-rest.html
`curl` + `jq` installed.

## Inputs to collect

- `SF_INSTANCE_URL` — org My Domain, e.g. `https://acme.my.salesforce.com`
- `SF_CLIENT_ID`, `SF_CLIENT_SECRET` — connected-app consumer key/secret
- Models API base URL: `https://api.salesforce.com/ai/gpt/v1`
- Model: a fully qualified `sfdc_ai__…` name, e.g.
  `sfdc_ai__DefaultBedrockAnthropicClaude46Sonnet`
  (full list: https://developer.salesforce.com/docs/ai/agentforce/guide/supported-models.html)
- Scope: project (`<cwd>/.claude/settings.json`, default) or user (`~/.claude/settings.json`) — reference-agent settings paths
- Headers — `<FEAT>` = `x-client-feature-id` (default `ai-platform-models-connected-app`),
  `<APP>` = `x-sfdc-app-context` (default `EinsteinGPT`). Used in the Step 2 verify curl
  and in `ANTHROPIC_CUSTOM_HEADERS`.

## Steps (reference implementation)

Concrete values for a JSON-settings + API-key-helper agent. Reuse the OrgJWT
auth, verify curl, and base URL verbatim for any agent; adapt the settings-file
location and env-var wiring to the target agent.

1. Write `<project>/.claude/.orgjwt.env` (chmod 600), gitignore it:
   ```ini
   SF_INSTANCE_URL="..."
   SF_CLIENT_ID="..."
   SF_CLIENT_SECRET="..."
   ```
2. Verify — must return `200` before writing settings:
   ```bash
   TOKEN=$(bash <SKILL>/scripts/get-orgjwt.sh <ABS>/.claude/.orgjwt.env)
   curl -s -o /dev/null -w '%{http_code}\n' \
     <MODELS_API_URL>/model/<MODEL>/invoke-with-response-stream \
     -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
     -H 'x-client-feature-id: <FEAT>' -H 'x-sfdc-app-context: <APP>' \
     --data '{"anthropic_version":"bedrock-2023-05-31","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'
   ```
3. Write `.claude/settings.json` (merge into existing; keep other keys):
   ```json
   {
     "apiKeyHelper": "bash <SKILL>/scripts/get-orgjwt.sh <ABS>/.claude/.orgjwt.env",
     "model": "<MODEL>",
     "env": {
       "ANTHROPIC_AUTH_TOKEN": "",
       "CLAUDE_CODE_USE_BEDROCK": "1",
       "CLAUDE_CODE_SKIP_BEDROCK_AUTH": "1",
       "ANTHROPIC_BEDROCK_BASE_URL": "<MODELS_API_URL>",
       "ANTHROPIC_SMALL_FAST_MODEL": "<MODEL>",
       "ANTHROPIC_DEFAULT_MODEL": "<MODEL>",
       "ANTHROPIC_CUSTOM_HEADERS": "x-client-feature-id: <FEAT>\nx-sfdc-app-context: <APP>"
     }
   }
   ```
   Use absolute paths in `apiKeyHelper`. (`<FEAT>` / `<APP>` defaults are in
   "Inputs to collect" above.)
4. Tell the admin to fully restart the agent (`claude` for the reference agent) —
   settings and the API-key helper load at startup only.

### Capturing as a runbook (when asked to document, not apply)

If the user wants the setup written up for review instead of applied to their
machine (e.g. "save it as a Markdown runbook"), write **all** of the above into
the requested file (e.g. `models-api-setup-runbook.md`), in order and self-contained:
the exact `.orgjwt.env` contents, the `chmod 600` + gitignore note, the
verification curl (with the "must be `200` before writing settings" note), the
full `settings.json` block with every key from Step 3, and the final
"fully restart `claude`" step. Don't omit any of the nine `settings.json` keys.

## Verify before finishing

- [ ] `.claude/.orgjwt.env` created, `chmod 600`, and gitignored
- [ ] Verification curl returned HTTP `200` before `settings.json` was written
- [ ] `ANTHROPIC_AUTH_TOKEN` set to `""` in `settings.json`
- [ ] `CLAUDE_CODE_USE_BEDROCK` set to `"1"`
- [ ] `CLAUDE_CODE_SKIP_BEDROCK_AUTH` set to `"1"`
- [ ] `ANTHROPIC_BEDROCK_BASE_URL` is exactly `https://api.salesforce.com/ai/gpt/v1` (no trailing slash/path)
- [ ] `model`, `ANTHROPIC_DEFAULT_MODEL`, and `ANTHROPIC_SMALL_FAST_MODEL` all use the fully qualified `sfdc_ai__…` alias
- [ ] `ANTHROPIC_CUSTOM_HEADERS` contains `x-client-feature-id` and `x-sfdc-app-context`
- [ ] `apiKeyHelper` uses absolute paths (`bash <SKILL>/scripts/get-orgjwt.sh <ABS>/.claude/.orgjwt.env`)
- [ ] User told to fully restart `claude`

## Must be exact (each prevents a specific failure)

- `"ANTHROPIC_AUTH_TOKEN": ""` — clears any global token that would otherwise
  outrank `apiKeyHelper` (precedence: `ANTHROPIC_AUTH_TOKEN` > `ANTHROPIC_API_KEY`
  > `apiKeyHelper`). Without it → wrong/old bearer → 401/404.
- `CLAUDE_CODE_USE_BEDROCK=1` — activates the Bedrock API client; without it
  Claude Code uses the standard Anthropic API protocol and ignores
  `ANTHROPIC_BEDROCK_BASE_URL` entirely, so every call bypasses the Models API.
- `CLAUDE_CODE_SKIP_BEDROCK_AUTH=1` — else Claude Code overwrites `Authorization`
  with AWS SigV4 and the OrgJWT never lands.
- `apiKeyHelper` must be invoked as `bash <path> <credsfile>` (avoids exit-126).
- Model must be a fully qualified `sfdc_ai__…` name (see supported models).
- Auth is the OrgJWT from `client_credentials` (a signed JWT, 2 dots, scope
  `sfap_api`) — NOT `sf org display` (unsigned session token → 404). `sf` CLI
  has no client_credentials command; the helper calls `/services/oauth2/token`.
- Only `ANTHROPIC_BEDROCK_BASE_URL` routes; no tenant-id header needed.

## Diagnose

| Error | Meaning | Check first |
|-------|---------|-------------|
| `401` | Token is not a valid OrgJWT | Connected App `sfap_api` scope, `client_credentials` flow enabled, consumer key/secret in `.orgjwt.env`; `ANTHROPIC_AUTH_TOKEN` not cleared to `""` |
| `404` | Token valid but model/env/org not routable | Fully qualified `sfdc_ai__…` model alias, `ANTHROPIC_BEDROCK_BASE_URL` exactly `https://api.salesforce.com/ai/gpt/v1`, org entitled for the Models API, `ANTHROPIC_AUTH_TOKEN` cleared |
| `model not available` | Non-alias model id | Replace with a fully qualified `sfdc_ai__…` alias (see supported models) |

© forcedotcom · Apache-2.0 · forcedotcom/sf-skills

Похожие скиллы

Все скиллы по теме «Настройка агента: память, контекст, субагенты» →
setup-matt-pocock-skills Matt Pocock Скилл настраивает репозиторий для инженерных скиллов Matt Pocock: задаёт трекер задач, метки триажа и расположение доменной документации. Запустите его перед первым использованием остальных скиллов. 1 052 851установок ask-matt Matt Pocock Помогает выбрать подходящий скилл или рабочий поток из набора Matt Pocock. Пригодится, когда непонятно, с чего начать задачу: от идеи до разбора бага. 766 587установок to-tickets Matt Pocock Разбивает план, спецификацию или переписку на небольшие сквозные задачи и отмечает, какие из них блокируют остальные. Пригодится, когда нужно согласовать порядок работы до публикации задач в трекере. 711 230установок writing-plans Jesse Vincent Скилл превращает требования к многошаговой задаче в подробный план реализации до начала работы с кодом. Пригодится, когда исполнителю нужно зафиксировать файлы, интерфейсы и проверки. CX Codex 282 859установок caveman-review JuliusBrussee Пишет замечания к коду одной строкой: место, проблема, исправление. Пригодится, когда ревью диффа или PR надо пройти быстро и без воды. CX Codex +1 411 800установок caveman-compress JuliusBrussee Сжимает CLAUDE.md, списки задач и другие текстовые файлы в краткий формат, сохраняя читаемую резервную копию. CX Codex +1 411 500установок

Из того же набора181

mobile-platform-offline-validate Проверяет компоненты LWC на совместимость с офлайн-режимом Komaci в Salesforce Mobile App Plus. Находит ошибки прайминга и формирует исправления кода. CX Codex +1 4 700установок mobile-platform-native-capabilities-integrate Помогает собрать Salesforce LWC с нативными функциями мобильного устройства: сканированием, геолокацией, NFC и платежами. Нужен при работе с lightning/mobileCapabilities. CX Codex +1 4 700установок commerce-b2b-open-code-components-replace Меняет стандартные B2B Commerce компоненты на открытые аналоги в content.json метаданных сайта. Или просто показывает соответствия, если менять файлы не нужно. CX Codex +1 4 600установок commerce-b2b-open-code-components-integrate Копирует открытые компоненты Salesforce B2B Commerce из GitHub в метаданные сайта магазина, чтобы они появились в палитре Experience Builder. CX Codex +1 4 600установок platform-policy-rule-generate Помогает писать метаданные PolicyRuleDefinition и PolicyRuleDefinitionSet для Salesforce Data Cloud: схема, дерево категорий, проверки перед деплоем. CX Codex +1 4 100установок platform-custom-report-type-generate Помогает агенту создавать и проверять метаданные Salesforce Custom Report Type: база, связи, доступные поля. Пригодится при разборе ошибок деплоя .reportType-meta.xml. CX Codex +1 4 000установок platform-sharing-owd-configure Скилл читает и меняет Organization-Wide Default для объектов Salesforce: показывает текущие уровни доступа и правит sharingModel в метаданных. CX Codex +1 3 700установок platform-encryption-configure Скилл для настройки Salesforce Shield Platform Encryption через метаданные и консультаций по архитектуре управления ключами. CX Codex +1 3 600установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой