TL;DR: A system prompt is the standing instruction set behind every turn of a conversation, not a one-line persona. Below is a fill-in-the-blank template you can paste into a ChatGPT Custom GPT's Instructions field, the OpenAI Responses API's instructions parameter, a Claude Project, a Gemini Gem, or a raw system message. No sign-up, no hosted tool required.
Most system prompt generator pages assume you're building a Custom GPT and stop there. That's a narrower job than the phrase implies. A system prompt is any standing instruction block a model reads before it reads you: whether that's the Instructions tab in ChatGPT's GPT editor, the instructions field in an API call, or the first message in a raw chat-completion array. The structure that makes one good is the same structure that makes all of them good. This page gives you that structure once, plus exactly where each surface expects you to paste it.
What actually counts as a system prompt?
A system prompt sets four things before the user ever types a word: who the model is being asked to act as, what it's allowed and not allowed to do, how it should format what it says back, and what happens when something falls outside its scope. A persona line (You are a helpful marketing assistant) covers the first of those and leaves the other three to chance. That's exactly why so many Custom GPTs and API-based agents drift off-task after a few turns. Our own explainer on system prompts versus user prompts goes deeper into the mechanics if you want the theory; this page is the template.
Different surfaces put this same content in different places, under different names:
| Surface | Where it goes | Field name (as documented) |
|---|---|---|
| ChatGPT Custom GPT | GPT editor, Configure tab | Instructions |
| OpenAI Responses API | Top-level request parameter | instructions |
| Anthropic Claude Projects | Project settings | Custom instructions — see our Claude Project Instructions templates |
| Google Gemini Gems | Gem editor | Instructions — see our Gemini Gem Instruction templates |
| Any raw chat-completion API | First item in the messages array | system role message |
The template below is written to drop into any row of that table with minimal editing. Where a surface has its own documented quirks (file limits, capability names, precedence rules), we call those out separately rather than guessing.
The fill-in-the-blank template
Replace everything in double braces. Delete any section that doesn't apply to your use case. An empty Escalation section is worse than no section at all, because it reads as an instruction to escalate on nothing.
You are {{ROLE_NAME}}, {{ONE_LINE_ROLE_DESCRIPTION}}.
## Objective
{{WHAT_SUCCESS_LOOKS_LIKE_IN_ONE_OR_TWO_SENTENCES}}
## Audience
You are talking to {{WHO_TALKS_TO_THIS}}. Assume {{WHAT_THEY_ALREADY_KNOW}}.
## Tone
{{TONE_DESCRIPTORS}}. Avoid {{TONE_TO_AVOID}}.
## Scope
You help with: {{IN_SCOPE_TASKS}}.
You do not help with: {{OUT_OF_SCOPE_TASKS}} — redirect to {{FALLBACK_OR_HUMAN}}.
## Knowledge and grounding
Trust {{WHAT_SOURCES_YOU_CAN_TRUST}} over your own assumptions. If asked about
{{TOPIC_OUTSIDE_KNOWLEDGE}}, say {{HONEST_UNCERTAINTY_LINE}} instead of guessing.
## Output format
Default to {{DEFAULT_FORMAT}}. When {{CONDITION}}, switch to {{ALTERNATE_FORMAT}}.
## Constraints
- Never {{HARD_NO_1}}.
- Never {{HARD_NO_2}}.
- Always {{HARD_YES_1}}.
## Escalation
If {{ESCALATION_TRIGGER}}, do {{ESCALATION_ACTION}} instead of continuing.
## Example
User: "{{SAMPLE_USER_MESSAGE}}"
You: "{{SAMPLE_GOOD_RESPONSE}}"
That's the whole shape. Eight sections, one job each. Nothing here is Prompt Architects house style dressed up as a standard: it's the same four questions from the section above (role, scope, format, escalation) turned into headings a model reliably reads as structure rather than prose.
How to fill each blank without overthinking it
Role and objective. Be a job title, not a personality. {{ROLE_NAME}}: Senior support engineer for a B2B analytics tool beats a friendly and knowledgeable assistant because the model has something concrete to model behavior on. The objective line should be checkable: resolve billing questions without opening a ticket when possible is checkable; be helpful is not.
Audience and tone. Naming who you're talking to changes vocabulary automatically: talking to non-technical small business owners versus talking to backend engineers produces different word choices with the same instructions otherwise. Tone works best as two or three adjectives plus one explicit thing to avoid, because a placeholder like {{TONE_TO_AVOID}} is only useful when the thing to avoid is named, not implied.
Scope. This is the section people skip and the one that causes the most drift. Write both halves (what's in scope and what's explicitly out) because a model with only a positive scope statement will still attempt anything it's capable of. The out-of-scope line needs a redirect target (a human, a different tool, a specific phrase), not just a refusal.
Knowledge and grounding. State what the agent should trust more than its own training: uploaded files, a specific document, live data from a tool call. Then give it an honest way to say I don't know for anything outside that. A named uncertainty line prevents the vague hedging that reads as confidence when it isn't.
Output format and constraints. Default format plus one conditional switch covers almost every real case (default to a short paragraph; switch to a numbered list when the user asks for steps). Constraints work best as short, absolute statements: never invent a price, not try to always quote accurate prices when possible.
Escalation. Every agent needs an exit ramp: a phrase, a topic, or a repeated failure that hands off instead of continuing to guess. Skipping this section is how a support GPT ends up confidently answering a legal question nobody should have asked it.
How is this different from a persona prompt or a few-shot example?
Both are real techniques, and both are smaller than what this template does. A persona prompt is a single line establishing a role: it shapes vocabulary and confidence but says nothing about scope, escalation, or output format. A few-shot example shows the model a pattern to copy: useful for format consistency, but it doesn't tell the model what to refuse or when to stop. This template treats persona as one piece (Role and Objective) and leaves room for a worked example at the end, but it doesn't stop there, because a real agent needs Audience, Tone, Scope, Knowledge, Output format, Constraints, and Escalation too. If you're only fighting a tone problem, our persona prompting guide is a faster fix than filling in all eight sections here.
It's also worth being precise about where a system prompt sits relative to the message it's paired with. Most APIs, and ChatGPT's own product, treat the standing instruction block as higher-priority than whatever the user types next: our system prompt versus user prompt breakdown covers that hierarchy directly, and our system, developer and user roles explainer goes one level deeper into which role wins when a platform defines three tiers instead of two.
Testing a filled-in template before you trust it
A system prompt that reads well is not the same as a system prompt that holds up. Before publishing a Custom GPT or shipping an agent built on this template, run it through three checks:
Send the out-of-scope request first. Before testing anything the agent is supposed to do well, send it the exact kind of request your Scope section says it should refuse. If it answers anyway, the Scope section is too vague, or the model is weighing a Knowledge file above the refusal rule.
Send a contradictory follow-up. Real users don't stop after one message. Ask the filled-in agent to do the thing it just refused, phrased differently, two turns later. A system prompt that only holds for one turn isn't holding.
Check the escalation trigger fires on the vague version, not just the exact one. Write your Escalation trigger as a category (a security concern), then test it with a request that fits the category without using the word security. If it doesn't fire, tighten the language.
None of this replaces OpenAI's own advice for GPTs specifically: test changes in Preview before saving, and if behavior drifts, shorten and simplify the instructions rather than adding more text on top of what's already there. That guidance generalizes past ChatGPT. Every surface in the table above rewards a shorter, tested system prompt over a longer, unverified one.
Where this actually goes on each surface
ChatGPT Custom GPTs. Paste the filled template into the Instructions field on the Configure tab. OpenAI's own Help Center describes the field plainly: "Instructions define how your GPT behaves: what it should do, how it should respond, and what it should avoid." It documents no character limit for that field as of this writing. The widely repeated 8,000-character figure you'll see on SEO roundups isn't sourced to OpenAI's current documentation, so this post isn't going to repeat it as fact. What OpenAI does document is the same structural advice baked into the template above: use explicit step structure for multi-step behavior, prefer positive concrete instructions over long prohibition lists, and add a worked example when a rule needs to be consistent.
OpenAI's Responses API. If you're building an agent against OpenAI's API rather than the ChatGPT product, the equivalent field is the top-level instructions parameter, which OpenAI's API reference documents as: "A system (or developer) message inserted into the model’s context." Paste the filled template there as a plain string. One migration note worth knowing: the older Assistants API, which used to be the default place to store this kind of standing instruction, was shut down. OpenAI's own deprecations page confirms the shutdown date and names the Responses API and Conversations API as the recommended replacement, after giving developers a year of notice starting in August 2025. If a tutorial you're reading still tells you to create an Assistant with an instructions field, it's describing a retired product.
Any other agent framework or raw API. Put the filled template as the first message in the array, with "role": "system". Every major chat-completion API (regardless of vendor) reads a system-role message first and weights it above user turns, which is the mechanism our system prompt versus user prompt breakdown covers if you want to see how that precedence actually works.
Claude Projects and Gemini Gems. Both platforms take the same prose and expect it in their own dedicated field rather than a raw API parameter, and both have platform-specific behavior worth knowing before you paste in a generic template: how project knowledge interacts with instructions on Claude, and how a Gem's instructions interact with grounding and file uploads on Gemini. Rather than guess at those specifics here, our dedicated posts cover each one against its own vendor documentation: see Claude Project Instructions templates and Gemini Gem Instruction templates for the platform-specific detail this generic template deliberately leaves out.
A filled-out example, so the shape is concrete
Here's the template filled in for a support-triage agent, condensed to show the pattern rather than a maximal version:
You are Triage, a first-line support agent for a project management SaaS product.
## Objective
Resolve account and billing questions without a ticket when the answer is
documented; otherwise collect the right details and hand off cleanly.
## Audience
You are talking to paying customers, most of whom are not technical.
## Tone
Direct, warm, brief. Avoid corporate hedging ("we apologize for any
inconvenience this may have caused").
## Scope
You help with: billing questions, plan changes, password resets, basic
feature how-to.
You do not help with: refund exceptions, security incidents, API bugs —
redirect these to a human agent by name.
## Knowledge and grounding
Trust the attached help center articles over your own assumptions. If asked
about a feature not documented there, say plainly that you're not certain and
offer to check with the team.
## Output format
Default to two or three short sentences. When giving setup steps, switch to a
numbered list.
## Constraints
- Never promise a refund amount.
- Never share another customer's account details.
- Always confirm the account email before making a change.
## Escalation
If the user mentions data loss, a security concern, or asks for a manager,
stop and hand off to a human agent immediately.
Notice what's absent: no personality flourish, no I'm here to help! filler. Every line either scopes behavior or sets a boundary, which is the entire point of a system prompt: it's read once and applied to every subsequent turn, so anything decorative in it is a cost paid on every message for the life of the agent.
Walk through why each section earns its place. The Objective line is checkable against a real ticket log, not aspirational. The Audience line changes what plain language means for this agent specifically. Tone names one thing to avoid (corporate hedging) instead of a vague instruction to sound friendly, because the model can match a named phrase and can't reliably match a mood. Scope carries both halves, with the out-of-scope half naming a concrete redirect rather than a bare refusal. Knowledge and grounding gives the agent a source to prefer and an honest fallback, so it doesn't default to guessing when the attached files don't cover a question. Output format sets a default and one switch condition, not a menu of options. Constraints are absolute, not aspirational, which is what makes them enforceable rather than advisory. And Escalation names three concrete triggers instead of a general if unsure, ask for help, which a model tends to read as optional.
Stop rewriting prompts. Start shipping.
Works with ChatGPT, Claude, Gemini, Grok, Midjourney, Ideogram, Veo3 & Kling. 4.8★ on the Chrome Web Store.
Create An AccountWhere this breaks down
Three failure patterns show up constantly once you start filling this in for real work. The first is writing the Scope section as only a positive list (helps with billing, plan changes, password resets) with no out-of-scope half. A model reads an unbounded positive scope as permission to attempt anything nearby, including things you never meant to hand it. The second is treating Constraints as aspirations rather than absolutes: try to avoid sharing account details reads very differently to a model than never share another customer's account details, and only one of those survives an edge case.
The third is overloading the Tone section with personality adjectives and leaving Scope and Constraints thin, on the theory that a well-characterized agent will naturally behave well. It won't. Tone governs word choice; it has no bearing on whether the model knows what it's not allowed to do. A system prompt with five tone adjectives and no named constraint reads as more effort than one with one tone adjective and three absolute rules, and produces a worse agent every time.
If you're specifically building for ChatGPT's Custom GPT product and want complete, job-specific instruction sets rather than a blank template to fill in yourself, our companion post, Custom GPT Instruction Templates That Work, has seven of them worked out end to end, including the ChatGPT-only capability references (Actions, Code Interpreter, web browsing) that this page's platform-agnostic template deliberately leaves out. And if the drift you're fighting is really a persona problem rather than a full system-prompt problem, our persona prompting guide is the narrower fix.
Start with the template, fill every blank you can justify, and delete the sections you can't. A shorter system prompt that's fully true beats a longer one padded with lines nobody checked.