Files
upstream-tldraw/templates/agent/worker/prompt/buildSystemPrompt.ts
upstream-mirror a774ac673a
Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
snapshot of https://github.com/tldraw/tldraw.git (main, 2026-09-23; blobs > 131072B omitted)
2026-09-23 16:12:52 +05:00

59 lines
2.1 KiB
TypeScript

import { buildResponseSchema } from '../../shared/schema/buildResponseSchema'
import type { ModePart } from '../../shared/schema/PromptPartDefinitions'
import { AgentPrompt } from '../../shared/types/AgentPrompt'
import { getSystemPromptFlags } from './getSystemPromptFlags'
import { buildIntroPromptSection } from './sections/intro-section'
import { buildRulesPromptSection } from './sections/rules-section'
/**
* Build the system prompt for the agent.
*
* This is the main instruction set that tells the AI how to behave.
* The prompt is constructed from modular sections that adapt based on
* what actions and parts are available.
*
* @param prompt - The prompt containing all parts including the mode part.
* @param opts - Options for building the system prompt.
* @param opts.withSchema - Whether to include the JSON schema in the system prompt. Defaults to true.
* @returns The system prompt string.
*/
export function buildSystemPrompt(
prompt: AgentPrompt,
opts: { withSchema: boolean } = { withSchema: true }
): string {
const { withSchema = true } = opts
const modePart = prompt.mode
if (!modePart) {
throw new Error('A mode part is always required.')
}
const { actionTypes, partTypes } = modePart
const flags = getSystemPromptFlags(actionTypes, partTypes)
const lines = [buildIntroPromptSection(flags), buildRulesPromptSection(flags)]
if (withSchema) {
lines.push(buildSchemaPromptSection(modePart))
}
const result = normalizeNewlines(lines.join('\n'))
return result
}
function buildSchemaPromptSection(modePart: ModePart) {
const schema = buildResponseSchema(modePart.actionTypes, modePart.modeType)
return `## JSON schema
This is the JSON schema for the events you can return. You must conform to this schema. You must only return things in this format, otherwise your response will error. Output ONLY the JSON itself — do not add any preamble, explanation, or commentary before or after it, and do NOT wrap your response in a markdown code block (e.g. \`\`\`json). Just the raw JSON object.
${JSON.stringify(schema, null, 2)}
`
}
function normalizeNewlines(text: string): string {
return text.replace(/\n{3,}/g, '\n\n')
}