TeamCopilot never injects a secret into the LLM chat history. The model gets secret names and placeholders, while the real values are resolved only by trusted runtime layers at execution time.
What you need to do
If a skill or workflow needs a secret:- Open Profile Secrets in TeamCopilot.
- Add the required key, such as
OPENAI_API_KEYorSTRIPE_SECRET_KEY. - Save it.
- Retry the skill or workflow.
Where secrets live
TeamCopilot supports two secret scopes:- Profile Secrets: your personal secrets for your own runs
- Global Secrets: shared fallback secrets managed by engineers
- regular users add their own keys in Profile Secrets
- engineers can provide shared defaults in Global Secrets
- a user’s personal key wins over the global key with the same name
Profile Secrets UI
Users manage profile secrets from the dedicatedProfile Secrets page in the app.
The page shows:
- the keys you have saved
- masked values in normal UI contexts
- actions to add, edit, or delete a key
Global Secrets UI
Engineers manage global secrets from the same page, in a separate section. That makes the common pattern straightforward:- users add personal overrides
- engineers provide shared defaults
- the runtime resolves the best value at execution time
How skills and workflows ask for secrets
Skills and workflows declare the secret keys they need by name.Skills
InSKILL.md, declare required_secrets in frontmatter and use {{SECRET:KEY}} placeholders in the content.
Workflows
Inworkflow.json, declare the required secret keys:
run.py as environment variables:
How TeamCopilot keeps secrets out of the model
The core rule is simple: the agent sees secret names, not secret values. For bash-based usage, TeamCopilot uses a secret proxy pattern:- The skill or command references
{{SECRET:KEY}}. - A trusted runtime layer checks where that placeholder is being used.
- If the usage is allowed, TeamCopilot injects the real value only at execution time.
- The raw value does not need to appear in the prompt, command text, or normal UI output.
required_secrets, and TeamCopilot resolves those values for the current user at runtime.
For chat sessions, the app can also resolve secrets on demand for trusted runtime flows such as command execution or skill loading.
Command support today
As of now, TeamCopilot also injects secret values forcurl and git commands when the agent uses them through bash.
That means a command like:
Extending command support
If you want support for more bash commands, emailrishabh@trythis.app, or create a github pull request.
Another safe option is to wrap the command in a workflow. Workflows are pre-approved before use, so TeamCopilot can inject secrets into them however the workflow needs without exposing those values to the model.
Runtime resolution order
The resolution order is:- profile secret
- global secret fallback
- missing-key error
What this protects against
This design is meant to reduce the most common AI-agent secret leaks.- Prompt injection: if an attacker gets hidden instructions in front of the model, the model still does not have the plaintext key to leak
- Unsafe command construction: secret placeholders are only resolved in trusted positions; unsupported usage is rejected
- UI exposure: the frontend shows masked values instead of raw credentials
- Cross-user leakage: one user can use a shared or personal secret without seeing another user’s actual key