platform-models-api-configure
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).
Esta skill incluye scripts que tu agente puede ejecutar. Ver qué archivos
Resumen
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.comSF_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(defaultai-platform-models-connected-app),<APP>=x-sfdc-app-context(defaultEinsteinGPT). Used in the Step 2 verify curl and inANTHROPIC_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.
- Write
<project>/.claude/.orgjwt.env(chmod 600), gitignore it:SF_INSTANCE_URL="..." SF_CLIENT_ID="..." SF_CLIENT_SECRET="..." - Verify — must return
200before writing settings: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"}]}' - Write
.claude/settings.json(merge into existing; keep other keys):{ "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.) - Tell the admin to fully restart the agent (
claudefor 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.envcreated,chmod 600, and gitignored - [ ] Verification curl returned HTTP
200beforesettings.jsonwas written - [ ]
ANTHROPIC_AUTH_TOKENset to""insettings.json - [ ]
CLAUDE_CODE_USE_BEDROCKset to"1" - [ ]
CLAUDE_CODE_SKIP_BEDROCK_AUTHset to"1" - [ ]
ANTHROPIC_BEDROCK_BASE_URLis exactlyhttps://api.salesforce.com/ai/gpt/v1(no trailing slash/path) - [ ]
model,ANTHROPIC_DEFAULT_MODEL, andANTHROPIC_SMALL_FAST_MODELall use the fully qualifiedsfdc_ai__…alias - [ ]
ANTHROPIC_CUSTOM_HEADERScontainsx-client-feature-idandx-sfdc-app-context - [ ]
apiKeyHelperuses 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 outrankapiKeyHelper(precedence:ANTHROPIC_AUTH_TOKEN>ANTHROPIC_API_KEYapiKeyHelper). 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 ignoresANTHROPIC_BEDROCK_BASE_URLentirely, so every call bypasses the Models API.CLAUDE_CODE_SKIP_BEDROCK_AUTH=1— else Claude Code overwritesAuthorizationwith AWS SigV4 and the OrgJWT never lands.apiKeyHelpermust be invoked asbash <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, scopesfap_api) — NOTsf org display(unsigned session token → 404).sfCLI has no client_credentials command; the helper calls/services/oauth2/token. - Only
ANTHROPIC_BEDROCK_BASE_URLroutes; 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) |
Archivos 2 archivos
Instálala a mano
Deska ejecuta esto por ti, para cada agente que elijas. Para ejecutarlo tú en una terminal:
npx skills add forcedotcom/sf-skills --skill platform-models-api-configureMás de forcedotcom
- platform-apex-generateforcedotcomPrimary Apex authoring skill for class generation, refactoring, and review. ALWAYS ACTIVATE when the user mentions Apex, .cls, triggers, or asks to create/refactor a class (service, selector, domain, batch, queueable, schedulable, invocable, DTO, utility, interface, abstract, exception, REST resource). Use this skill for requests involving SObject CRUD, mapping collections, fetching related records, scheduled jobs, batch jobs, trigger design, @AuraEnabled controllers, @RestResource endpoints, custom REST APIs, or code review of existing Apex.6,700 instalaciones en skills.sh0
- platform-apex-test-generateforcedotcomUse to generate and validate Apex test classes with TestDataFactory patterns, bulk testing (251+ records), mocking, assertions, and disciplined test-fix loops. Use when creating Apex test classes (for triggers, services, controllers, batch jobs, queueables, and callouts), improving coverage, debugging or fixing failing Apex tests, or running test/coverage analysis. Triggers on *Test.cls files, sf apex run test, coverage reports. Do NOT trigger for production Apex (use platform-apex-generate) or Jest/LWC tests.6,600 instalaciones en skills.sh0
- platform-apex-test-runforcedotcomApex test execution, coverage analysis, and test-fix loops with 120-point scoring. Use when the user runs Apex tests, checks code coverage, fixes failing tests, or touches *Test.cls / *_Test.cls files. DO NOT TRIGGER when writing Apex production code (use platform-apex-generate), Agentforce agent testing (use agentforce-test), or Jest/LWC tests (use experience-lwc-generate).6,500 instalaciones en skills.sh0
- platform-apex-logs-debugforcedotcomSalesforce debug log analysis and troubleshooting with 100-point scoring. TRIGGER when: user analyzes debug logs, hits governor limits, reads stack traces, or touches .log files from Salesforce orgs. DO NOT TRIGGER when: running Apex tests (use platform-apex-test-run), generating or fixing Apex code (use platform-apex-generate), or Agentforce session tracing (use agentforce-observe).6,400 instalaciones en skills.sh0
- platform-metadata-deployforcedotcomSalesforce DevOps automation using sf CLI v2. TRIGGER when: user deploys metadata, creates/manages scratch orgs or sandboxes, sets up CI/CD pipelines, or troubleshoots deployment errors with sf project deploy. DO NOT TRIGGER when: writing Apex code (use platform-apex-generate), building LWC components (use experience-lwc-generate), creating metadata definitions (use platform-custom-object-generate or platform-custom-field-generate), or querying org data (use platform-data-manage).6,300 instalaciones en skills.sh0