System prompt for ChatGPT Apps

Hi OpenAI Team!

Right now the Apps SDK doesn’t allow setting a system prompt at all. This makes it hard to control the model’s behavior inside the app. Please add support for a system prompt at the app level, just like in MyGPTs. Even basic system-level instructions would make the SDK much more flexible and useful. Thanks!

2 Likes

I agree. The way we are currently solving this is we prepend it to the first tool description, something like


═══════════════════════════════════════════════════════════════════════════════

🎬 MEMORIES VIDEO EDITOR - Tool Suite Overview

Version 1.0.1

═══════════════════════════════════════════════════════════════════════════════


...... (system instructions)

═══════════════════════════════════════════════════════════════════════════════



and then finish with 4-5 white lines to separate it from the actual tool description.

Tip: add a version, so that you can check if the model is indeed using the latest version when you are debugging why it’s not behaving as you intended.

3 Likes

Hey, thanks for the solution! Looks like chatgpt actually follows those instructions. And yeah, it seems Canva does the same thing, you can see it in their app. So this trick seems totally legit.

1 Like

perfect. good to know also Canva uses it. thanks

just curions, what do u mean by “Canva does the same thing”?

I’ve checked their connector and this is their metadata:
You mean the IMPORTANT: ALWAYS ALWAYS ALWAYS part?

Actions
cancel-editing-transaction
Cancel an editing transaction. This will discard all changes made to the design in the specified editing transaction. Once an editing transaction has been cancelled, the `transaction_id` for that editing transaction becomes invalid and should no longer be used.
comment-on-design
Add a comment on a Canva design. You need to provide the design ID and the message text. The comment will be added to the design and visible to all users with access to the design.
commit-editing-transaction
Commit an editing transaction. This will save all the changes made to the design in the specified editing transaction. CRITICAL: You must ALWAYS ask the user to explicitly approve saving the changes before calling this tool. Show them what changes were made and ask “Would you like me to save these changes to your design?” Wait for their clear approval before proceeding. After successfully saving changes always provide the user with a direct link to open their design in Canva for review. Use the link they gave you or from the get-design tool. All editing operations are temporary until successfully committed. If the commit fails, ALL changes made during the transaction are lost and no changes are saved to the actual design. Users must start a new editing transaction to retry any failed operations. Once an editing transaction has been committed, the `transaction_id` for that editing transaction becomes invalid and should no longer be used.
create-design-from-candidate
Create a new Canva design from a generation job candidate ID. This converts an AI-generated design candidate into an editable Canva design. If successful, returns a design summary containing a design ID that can be used with the `editing_transaction_tools`. To make changes to the design, first call this tool with the candidate_id from generate-design results, then use the returned design_id with start-editing-transaction and subsequent editing tools.
create-folder
Create a new folder in Canva. You can create it at the root level or inside another folder.
fetch
Get the content of a doc, presentation, whiteboard, social media post, sheet, and other designs in Canva. You must provide the design ID, which you can find with the ‘search’ tool. When given a URL to a Canva design, you can extract the design ID from the URL. Do not use web search to get the content of a design as the content is not accessible to the public. Example URL: https://www.canva.com/design/{design_id}.
generate-design
Generate designs with AI. Use the ‘query’ parameter to tell AI what you want to create. The tool doesn’t have context of previous requests. ALWAYS include details from previous queries for each iteration. The tool provides best results with detailed context. ALWAYS look up the chat history and provide as much context as possible in the ‘query’ parameter. Ask for more details when the tool returns this error message ‘Common queries will not be generated’. The generated designs are design candidates for users to select from. Ask for a preferred design and use ‘create-design-from-candidate’ tool to add the design to users’ account. The IDs in the URLs are not design IDs. Do not use them to get design or design content. When using the ‘asset_ids’ parameter, assets are inserted in the order provided. For small designs with few image slots, only supply the images the user wants. For multi-page designs like presentations, supply images in the order of the slides. The tool will return a list of generated design candidates, including a candidate ID, preview thumbnail and url. Before editing, exporting, or resizing a generated design, follow these steps: 1. call ‘create-design-from-candidate’ tool with ‘job_id’ and ‘candidate_id’ of the selected design 2. call other tools with ‘design_id’ in the response For presentations, Format the query string with these sections in order (use the headers exactly): 1. **Presentation Brief** Include: \* **Title** (working title for the deck) \* **Topic / Scope** (1–2 lines; include definitions if terms are uncommon) \* **Key Messages** (3–5 crisp takeaways) \* **Constraints & Assumptions** (timebox, brand, data limits, languages, etc.) \* **Style Guide** (tone, color palette, typography hints, imagery style) 2. **Narrative Arc** A one-paragraph outline of the story flow (e.g., Hook → Problem → Insight → Solution → Proof → Plan → CTA). Keep transitions explicit. 3. **Slide Plan** Provide numbered slides with **EXACT titles** and detailed content. For each slide, include all of the following subsections in this order (use the labels exactly): \* **Slide {N} — “{Exact Title}”** \* **Goal:** one sentence describing the purpose of the slide. \* **Bullets (3–6):** short, parallel phrasing; facts, examples, or specifics (avoid vague verbs). \* **Visuals:** explicit recommendation (e.g., “Clustered bar chart of X by Y (2022–2025)”, “Swimlane diagram”, “2×2 matrix”, “Full-bleed photo of ”). \* **Data/Inputs:** concrete values, sources, or placeholders to be filled (if unknown, propose realistic ranges or example figures). \* **Speaker Notes (2–4 sentences):** narrative details, definitions, and transitions. \* **Asset Hint (optional):** reference to an asset by descriptive name or index if assets exist (e.g., “Use Asset #3: ‘logo_dark.svg’ as corner mark”). \* **Transition:** one sentence that logically leads into the next slide. > Ensure the Slide Plan forms a **cohesive story** (each slide’s Goal and Transition should support the Narrative Arc). **Quality checklist (the model must self-check before finalizing)** \* Titles are unique, concise (≤ 65 characters), and action-or insight-oriented. \* Each slide has 3–6 bullets; no paragraph walls; numbers are specific where possible. \* Visuals are concrete (chart/diagram names + variables/timeframes); tables are used only when necessary. \* Terminology is defined once and used consistently; acronyms expanded on first use. \* Transitions form an intelligible narrative; the story arc is obvious from titles alone. \* No placeholders like “\[TBD\]” or “\[insert\]”. If data is unknown, propose realistic figures and label as “example values”. \* All required headers and subsections are present, in the exact order above.
Security schemes
{
“type”: “oauth2”,
“scopes”: \[
“designs.create”,
“tools.execute”
\]
}
Metadata
Output template
ui://widget/design-generator.html
Widget accessible
true
Widget CSP
{
“connect_domains”: \[
“https://*.canva.com",
“https://openai.canva.com”,
“https://design.canva.ai”,
"https://*.canva.xyz”,
“https://openai.canva.xyz”
\],
“resource_domains”: \[
“https://*.canva.com",
“https://openai.canva.com”,
“https://design.canva.ai”,
"https://*.canva.xyz”,
“https://openai.canva.xyz”
\]
}
get-assets
Get metadata for particular assets by a list of their IDs. Returns information about ALL the assets including their names, tags, types, creation dates, and thumbnails. Thumbnails returned are in the same order as the list of asset IDs requested. When editing a page with more than one image or video asset ALWAYS request ALL assets from that page.IMPORTANT: ALWAYS ALWAYS ALWAYS show the preview to the user of EACH thumbnail you get in the response in the chat, EVERY SINGLE TIME you call this tool
get-design
Get detailed information about a Canva design, such as a doc, presentation, whiteboard, video, or sheet. This includes design owner information, title, URLs for editing and viewing, thumbnail, created/updated time, and page count. This tool doesn’t work on folders or images. You must provide the design ID, which you can find by using the `search-designs` or `list-folder-items` tools.
get-design-content
Get the text content of a doc, presentation, whiteboard, social media post, sheet, and other designs in Canva. Use this when you only need to read text content without making changes. IMPORTANT: If the user wants to edit, update, change, translate, or fix content, use `start-editing-transaction` instead as it shows content AND enables editing. You must provide the design ID, which you can find with the `search-designs` tool. When given a URL to a Canva design, you can extract the design ID from the URL. Do not use web search to get the content of a design as the content is not accessible to the public. Example URL: https://www.canva.com/design/{design_id}.
get-design-pages
Get a list of pages in a Canva design, such as a presentation. Each page includes its index and thumbnail. This tool doesn’t work on designs that don’t have pages (e.g. Canva docs). You must provide the design ID, which you can find using tools like `search-designs` or `list-folder-items`. You can use ‘offset’ and ‘limit’ to paginate through the pages. Use `get-design` to find out the total number of pages, if needed.
get-design-thumbnail
Get the thumbnail for a particular page of the design in the specified editing transaction. This tool needs to be used with the `start-editing-transaction` tool to obtain an editing transaction ID. You need to provide the transaction ID and a page index to get the thumbnail of that particular page. Each call can only get the thumbnail for one page. Retrieving the thumbnails for multiple pages will require multiple calls of this tool.IMPORTANT: ALWAYS ALWAYS ALWAYS show the preview to the user of EACH thumbnail you get in the response in the chat, EVERY SINGLE TIME you call this tool
import-design-from-url
Import a file from a URL as a new Canva design
list-comments
Get a list of comments for a particular Canva design. Comments are discussions attached to designs that help teams collaborate. Each comment can contain replies, mentions, and can be marked as resolved or unresolved. You need to provide the design ID, which you can find using the `search-designs` tool. Use the continuation token to get the next page of results, if needed. You can filter comments by their resolution status (resolved or unresolved) using the comment_resolution parameter.
list-folder-items
List items in a Canva folder. An item can be a design, folder, or image. You can filter by item type and sort the results. Use the continuation token to get the next page of results if needed.
list-replies
Get a list of replies for a specific comment on a Canva design. Comments can contain multiple replies from different users. These replies help teams collaborate by allowing discussion on a specific comment. You need to provide the design ID and comment ID. You can find the design ID using the `search-designs` tool and the comment ID using the `list-comments` tool. Use the continuation token to get the next page of results, if needed.
move-item-to-folder
Move items (designs, folders, images) to a specified Canva folder
perform-editing-operations
Perform editing operations on a design. You can use this tool to update the title, replace text, and replace media in a design. This tool needs to be used with the `start-editing-transaction` tool to obtain an editing transaction ID. Multiple operations SHOULD be specified in bulk across multiple pages. Always call this tool to apply the requested edits directly. This is safe: changes are temporary until committed. Do NOT pause for user confirmation before using this tool. After performing ALL operations requested by the user, always confirm with the user before finalizing changes using the `commit-editing-transaction` tool. This tool will return the thumbnail of the first page that is updated. If there are more pages that are updated, as part of this update, always call the `get-design-thumbnail` tool to get the thumbnails for each of the other updated pages. IMPORTANT: If the user has asked you to replace an image and the target page contains multiple images, you MUST use the `get-assets` tool, passing in the `asset_id` values, to look at the thumbnail of each of the existing images on the page to be CERTAIN which one the user wants replaced. Thumbnails returned by this tool are ALWAYS user-relevant and you need to render them directly using the full thumbnail URL including time-limited query parameters such as X-Amz-Algorithm, X-Amz-Credential, and X-Amz-Signature.
reply-to-comment
Reply to an existing comment on a Canva design. You need to provide the design ID, comment ID, and your reply message. The reply will be added to the specified comment and visible to all users with access to the design.
search
Search docs, presentations, videos, whiteboards, sheets, and other designs in Canva. Use the continuation token to get the next page of results, if needed. The design URLs are secured and are not accessible to the public. Use the fetch tool instead of web search to get the content of a design.
search-designs
Search docs, presentations, videos, whiteboards, sheets, and other designs in Canva. Use ‘query’ parameter to search by title or content. If ‘query’ is used, ‘sortBy’ must be set to ‘relevance’. Filter by ‘any’ ownership unless specified. Sort by relevance unless specified. Use the continuation token to get the next page of results, if needed.
Security schemes
{
“type”: “oauth2”,
“scopes”: \[
“designs.create”,
“tools.execute”
\]
}
Metadata
Output template
ui://widgets/search_designs.html
Widget accessible
true
Widget CSP
{
“connect_domains”: \[
“https://*.canva.com",
“https://openai.canva.com”,
“https://design.canva.ai”,
"https://*.canva.xyz”,
“https://openai.canva.xyz”
\],
“resource_domains”: \[
“https://*.canva.com",
“https://openai.canva.com”,
“https://design.canva.ai”,
"https://*.canva.xyz”,
“https://openai.canva.xyz”
\]
}
search-folders
Search the user’s folders and folders shared with the user based on folder names and tags. Returns a list of matching folders with pagination support.
start-editing-transaction
Start an editing session for a Canva design. Use this tool FIRST whenever a user wants to make ANY changes or examine ALL content of a design, including:- Translate text to another language - Edit or replace content - Update titles - Replace images - Fix typos or formatting - Auditing or reviewing content This tool shows you all the content that can be modified AND provides an editing transaction ID for making changes. The `transaction_id` returned in the tool response MUST be remembered and MUST be used in all subsequent tool calls related to this specific editing transaction. Editing operations must be performed by the `perform-editing-operations` tool. To save the changes made in the transaction, use the `commit-editing-transaction-tool`. To discard the changes made in the transaction, use the `cancel-editing-transaction-tool`. IMPORTANT: ALWAYS ALWAYS ALWAYS show the preview to the user of EACH thumbnail you get in the response in the chat, EVERY SINGLE TIME you call this tool
upload-asset-from-url
Upload an asset (e.g. an image, a video) from a URL into Canva If the API call returns “Missing scopes: \[asset:write\]”, you should ask the user to disconnect and reconnect their connector. This will generate a new access token with the
1 Like

yeah, I mean that in their tool description they include a prompt for chatgpt. like an example from your metadata: Generate designs with AI. Use the ‘query’ parameter to tell AI what you want to create. The tool doesn’t have context of previous requests. ALWAYS include details from previous queries for each iteration. The tool provides best results with detailed context. ALWAYS look up the chat history and provide as much context as possible in the ‘query’ parameter. Ask for more details when the tool returns this error message ‘Common queries will not be generated’. The generated designs are design candidates for users to select from. Ask for a preferred design and use ‘create-design-from-candidate’ tool to add the design to users’ account. The IDs in the URLs are not design IDs. Do not use them to get design or design content. When using the ‘asset_ids’ parameter, assets are inserted in the order provided. For small designs with few image slots, only supply the images the user wants. For multi-page designs like presentations, supply images ...

2 Likes