SecretRef Matrix
Fased supportsSecretRef objects so credentials can stay in environment
variables, local secret files, or trusted resolver commands instead of plaintext
config.
Use this object shape:
Secret Sources
env: simple local or hosted env vars. Example:{ source: "env", provider: "default", id: "OPENAI_API_KEY" }. The default env provider works without extra config.file: mounted JSON secret files or one-value secret files. Example:{ source: "file", provider: "filemain", id: "/providers/openai/apiKey" }. Configure it withsecrets.providers.filemain = { source: "file", path, mode }.exec: 1Password, Vault,sops, or a custom trusted resolver. Example:{ source: "exec", provider: "vault", id: "providers/openai/apiKey" }. Configure it withsecrets.providers.vault = { source: "exec", command, args, passEnv }.
Field Matrix
Model Providers
models.providers.<provider>.apiKeySupports SecretRef. Managed by Agent > Models,fased models, andfased secrets. Use it for provider-level API keys when you do not use auth profiles.auth-profiles.json profiles.<profileId>.keyRefSupports SecretRef. Managed by Agent > Models,fased models auth, andfased secrets. Used bytype: "api_key"auth profiles. Runtime ignores plaintextkeywhenkeyRefexists.auth-profiles.json profiles.<profileId>.tokenRefSupports SecretRef. Managed by Agent > Models,fased models auth, andfased secrets. Used bytype: "token"auth profiles. Runtime ignores plaintexttokenwhentokenRefexists.- OAuth credential files do not use SecretRef. They are managed by the provider login flow, and SecretRef migration does not rewrite OAuth stores.
Skills and Plugins
skills.entries.<skillKey>.apiKeyResolves through the runtime snapshot before skill env injection. Managed by Agent > Skills andfased secrets. Validate withfased secrets audit --check.skills.entries.<skillKey>.envHas no generic SecretRef contract. Store non-secret env values here. PreferapiKeyor a skill-specific credential field for secrets.plugins.entries.<pluginId>.apiKeyHas no stable top-level credential field. Plugin credentials belong in plugin-defined config.plugins.entries.<pluginId>.config.*May define plugin-specific credential paths. Review the plugin manifest, UI hints, and plugin docs.
Secret Proxy Boundary
SecretRef resolves credentials. The secret-proxy runtime helper is the safer call pattern for service/tool code that needs a credential for one provider request:- resolve the SecretRef inside the provider call
- pass the raw secret only to the bounded callback
- return sanitized provider output
- fail if the callback result echoes the raw secret
- keep audit metadata for source, provider, id, purpose, and consumer
Google Chat
channels.googlechat.serviceAccountSupports inline JSON, string JSON, or SecretRef. Managed by Agent > Channels andfased secrets.channels.googlechat.serviceAccountRefExplicit SecretRef field. Prefer it when keeping service-account JSON out of config.channels.googlechat.accounts.<id>.serviceAccountPer-account version. Supports inline JSON, string JSON, or SecretRef.channels.googlechat.accounts.<id>.serviceAccountRefPer-account explicit SecretRef field.
Web, Fetch, and Talk Services
These fields support SecretRef and are managed from Agent > Services or Advanced Config:tools.web.search.apiKey: Brave Search or the selected built-in/plugin search provider.tools.web.search.exa.apiKey: Exa search provider.tools.web.search.firecrawl.apiKey: Firecrawl search provider.tools.web.search.perplexity.apiKey: Perplexity/OpenRouter path.tools.web.search.grok.apiKey: xAI/Grok web search path.tools.web.search.gemini.apiKey: Gemini grounded search path.tools.web.search.kimi.apiKey: Moonshot/Kimi search path.tools.web.search.tavily.apiKey: Tavily search provider.tools.web.fetch.firecrawl.apiKey: Firecrawl fallback forweb_fetch.talk.apiKey: legacy global talk API key. Prefer provider-specific talk config when available.talk.providers.<provider>.apiKey: provider-specific TTS credentials.
fased secrets configure/apply
migration helper is narrower than the schema. If a field is not offered by the
helper, edit it through the focused UI or Advanced Config and run
fased secrets audit --check.
Memory Search
agents.defaults.memorySearch.remote.apiKeyRuntime-tolerant. Managed by Agent > Memory, the Memory page, or Advanced Config. Used for custom remote embedding endpoints. Prefer provider auth/env keys for OpenAI, Gemini, Voyage, and Mistral when possible.agents.list[].memorySearch.remote.apiKeyRuntime-tolerant per-Agent override. Managed by Agent > Memory or Advanced Config. Validate with a memory status/search check after saving.
Tooling Coverage
fased secrets audit --check: finds plaintext and unresolved refs for model providers, skill API keys, Google Chat service accounts, and auth-profile refs.fased secrets configure: builds SecretRef provider config and migration plans for the main supported static credential fields.fased secrets apply --from <plan>: applies a reviewed migration plan after preflight.fased secrets reload: re-resolves refs and swaps the runtime snapshot atomically.- Control UI focused pages: best for normal setup. Use Agent > Models, Agent > Services, Agent > Skills, and Agent > Channels first.
- Advanced Config: escape hatch for fields that do not have a friendly form yet.
Credential Defaults
- Prefer
envfor local installs and hosted secret managers that expose env vars. - Prefer
filefor mounted secrets in Docker/Podman/Kubernetes-style hosting. - Prefer
execonly when the resolver command is trusted, absolute, reviewed, and has a small environment allowlist. - Do not store wallet seed phrases, private keys, or passkeys in SecretRef fields. Wallet material stays in the wallet keystore/passkey flow.
- Do not assume a resolved key grants Agent access. Services connect credentials; Agent > Tools and Agent > Skills decide what the selected Agent can use.