2026-07-15 23:11:25 -07:00
# 系统提示词组装
[English ](system-prompt.md ) | 中文
2026-08-09 15:27:21 +08:00
[system-prompt 包 ](../../packages/core/system-prompt )负责管理提示词贡献者与一次组装调用之间交换的数据。该包的 [README ](../../packages/core/system-prompt/README.md ) 记录注册、排序、作用域与渲染行为;本页记录各插件实现或传递的确切跨包类型。
2026-07-15 23:11:25 -07:00
源码:[`packages/core/system-prompt/src/index.ts` ](../../packages/core/system-prompt/src/index.ts )。
## 组装上下文
2026-08-04 17:36:14 +08:00
`AssembleContext` 标识一次组装所解析的作用域层,并可携带该请求的显式控制信号。它可合并扩展:`dsh-agent` 添加可选字段 `agent` ,用于携带当前的 agent(智能体)实例;`assembleContextFor(agent, signal)` 则一起设置这些显式字段。裸组装既没有作用域,也没有信号。
2026-07-15 23:11:25 -07:00
```ts type-equiv
2026-07-22 22:58:05 +08:00
/** Merge-extensible context for one prompt assembly. */
2026-07-15 23:11:25 -07:00
interface AssembleContext {
2026-07-22 22:58:05 +08:00
/**
* Scope whose providers and waterfall listeners participate. When absent,
* only global providers and subject-less listeners participate.
*/
2026-07-15 23:11:25 -07:00
scope?: ScopeKey
2026-07-22 22:58:05 +08:00
/** Explicit control signal for the turn that requested this assembly, when any. */
signal?: AbortSignal
2026-07-15 23:11:25 -07:00
}
` ``
## 工具提供方结果
2026-08-04 17:36:14 +08:00
` ToolProviderResult.schemas` 是当前组装中对模型可见的工具 schema 集合。` knownNames` 是提供方在限制前的名称全集,用于区分「配置名拼写错误」与「已知工具在此作用域中被有意隐藏」。
2026-07-15 23:11:25 -07:00
` ``ts type-equiv
2026-07-22 22:58:05 +08:00
/** Tool schemas visible in one assembly and their pre-restriction name set. */
2026-07-15 23:11:25 -07:00
interface ToolProviderResult {
2026-07-22 22:58:05 +08:00
/** The schemas this provider contributes to THIS assembly. */
2026-07-15 23:11:25 -07:00
readonly schemas: readonly ToolSchema[]
2026-07-22 22:58:05 +08:00
/** The pre-restriction name universe for config validation (defaults to ` schemas`' names). */
2026-07-15 23:11:25 -07:00
readonly knownNames?: readonly string[]
}
` ``
2026-07-23 01:05:50 +08:00
## 提示词段落
2026-07-15 23:11:25 -07:00
2026-08-10 18:02:11 +08:00
` PromptSection` 是一份只读的同进程注册约定。其文本可以是静态的,也可以从当前组装上下文动态解析。协作式组装完成后,一个有效的 ` complete` 段会成为唯一的提示词段落。
2026-07-15 23:11:25 -07:00
` ``ts type-equiv
2026-07-22 22:58:05 +08:00
/** One contributed section of the system prompt (registry input). */
2026-07-15 23:11:25 -07:00
interface PromptSection {
2026-07-22 22:58:05 +08:00
/** Unique name — a duplicate registration throws (see {@link SystemPrompt.section}). */
2026-07-15 23:11:25 -07:00
readonly name: string
2026-07-22 22:58:05 +08:00
/**
* Sections are concatenated in ascending order. Convention: ` -100` is the
* harness identity, ` 0` the deployment persona, tool guidance uses 100– 199;
* other negative orders also render before the persona.
*/
2026-07-15 23:11:25 -07:00
readonly order: number
2026-07-22 22:58:05 +08:00
/**
* Static text or a provider evaluated at each assembly with that assembly's
* {@link AssembleContext}. The text may reference ` {{variable}}`s — they are
* interpolated later, by {@link renderPrompt}.
*/
2026-07-15 23:11:25 -07:00
readonly text: string | ((context: AssembleContext) => string)
2026-08-10 18:02:11 +08:00
/**
* Treat this contribution as the complete system prompt. Assembly still
* runs the cooperative waterfall so tools, contexts, and variables can be
* resolved, then restores this exact section as the sole prompt section.
* More than one effective complete section makes assembly fail.
*/
readonly complete?: boolean
2026-07-15 23:11:25 -07:00
}
` ``
2026-07-30 22:09:15 +08:00
## 动态提示词上下文
` PromptContext` 是与 ` PromptSection` 对应的缓存安全结构。组装会解析这些贡献并排序;agent loop(智能体循环)仅在完整当前快照发生变化或被压缩(compaction)移除时,才会将其记录在保留的模型历史之后。
` ``ts type-equiv
2026-08-03 12:25:33 +08:00
/** Dynamic model context materialized as a durable user-role snapshot. */
2026-07-30 22:09:15 +08:00
interface PromptContext {
/** Unique name — a duplicate registration throws (see {@link SystemPrompt.context}). */
readonly name: string
2026-08-03 12:25:33 +08:00
/** Contexts are joined in ascending order. */
2026-07-30 22:09:15 +08:00
readonly order: number
/** Static text or a provider evaluated for each assembly. Empty text contributes nothing. */
readonly text: string | ((context: AssembleContext) => string)
}
` ``
2026-07-30 21:40:58 +08:00
<!-- BEGIN GENERATED cordis-surface (gen-cordis-catalog.ts) — do not edit between markers -->
<a id="cordis-surface"></a>
2026-07-24 19:54:25 +08:00
## Cordis API
2026-07-30 21:40:58 +08:00
2026-07-24 19:54:25 +08:00
Generated from source by ` scripts/gen-cordis-catalog.ts` (verified fresh by ` pnpm run verify-cordis-catalog` in doc-sync; regenerate with ` pnpm run gen-cordis-catalog`) — this section is byte-identical in both language sides of the page. Signature blocks use a ` ts cordis-catalog` fence and keep the original source JSDoc; dispatch modes are defined in the [primer](../cordis-primer.md#dispatch-modes), and the framework-inherited ` ctx` API lives in [cordis-api/inherited.md](../cordis-api/inherited.md).
2026-07-30 21:40:58 +08:00
<a id="ctxsystemprompt--systemprompt"></a>
### ` ctx.systemPrompt` — ` SystemPrompt`
Registry service for the prompt inputs assembled before each model step.
` ``ts cordis-catalog
/**
* Register an ordered prompt section in the calling context's scope. A scoped
* section shadows a global section with the same name; duplicates within one
* layer and non-finite orders throw. Registration and disposal emit
* ` system-prompt/change`.
* @param section - the section to register.
* @returns the exact Cordis effect disposer.
*/
section(section: PromptSection): () => void
/**
* Register ordered dynamic context in the calling context's scope. Scoped
* entries shadow global entries with the same name.
* @param context - the context contribution to register.
* @returns the exact Cordis effect disposer.
*/
context(context: PromptContext): () => void
2026-08-12 23:28:15 +08:00
/**
* Suppress every dynamic runtime-context contribution in the calling
* context's scope without changing the services that own or enforce those
* facts. Multiple suppressors remain independently disposable.
* @returns the exact Cordis effect disposer.
*/
suppressRuntimeContext(): () => void
2026-07-30 21:40:58 +08:00
/**
* Register a tool-schema provider in the calling context's scope. Global and
* matching scoped providers both contribute; returning the reserved
* {@link TOOL_ORDER_REST} name makes assembly fail.
* @param provider - evaluated for each assembly with its context.
* @returns the exact Cordis effect disposer.
*/
tools(provider: (context: AssembleContext) => ToolProviderResult): () => void
/**
* Register a prompt variable in the calling context's scope. Scoped values
* shadow globals; invalid or duplicate names throw. A provider may return
* ` undefined`, but rendering a section that references that value then fails.
* @param name - the ` [a-z][a-z0-9_]*` reference name.
* @param provider - evaluated for each assembly.
* @returns the exact Cordis effect disposer.
*/
variable(name: string, provider: (context: AssembleContext) => string | undefined): () => void
/**
* Assemble global and scoped providers, detach tool parameters, apply
* canonical ordering, then run the assembly waterfall. Scoped sections and
2026-08-10 18:02:11 +08:00
* variables shadow globals. The returned waterfall value is authoritative
* except that an effective complete section is restored afterwards as the
* sole prompt section.
2026-07-30 21:40:58 +08:00
* @param context - the optional scope and plugin-defined assembly fields.
2026-08-10 18:02:11 +08:00
* @returns the post-waterfall assembly with any complete prompt enforced.
2026-07-30 21:40:58 +08:00
*/
async assemble(context: AssembleContext = {}): Promise<PromptAssembly>
` ``
2026-08-12 23:28:15 +08:00
Source: [` packages/core/system-prompt/src/index.ts:338`](../../packages/core/system-prompt/src/index.ts)
2026-07-30 21:40:58 +08:00
<a id="system-prompt-events"></a>
### ` system-prompt/*` events
<a id="system-promptassemble--waterfall"></a>
#### ` system-prompt/assemble` — waterfall
2026-08-10 18:02:11 +08:00
Expert waterfall over the assembled sections, contexts, tools, and variables. Scope-filtered dispatch (` @deepseek -ai/dsh-scope`): scoped listeners receive only that scope's assemblies. The returned value is authoritative. A supplied signal controls only this explicit assembly request and must not be retained to control later turns. A registered complete section is restored after this waterfall, so listeners cannot add to or replace that scope's system prompt.
2026-07-30 21:40:58 +08:00
` ``ts cordis-catalog
/**
* Expert waterfall over the assembled sections, contexts, tools, and variables.
* Scope-filtered dispatch (` @deepseek -ai/dsh-scope`): scoped listeners
* receive only that scope's assemblies. The returned value is authoritative.
* A supplied signal controls only this explicit assembly request and must not
2026-08-10 18:02:11 +08:00
* be retained to control later turns. A registered complete section is
* restored after this waterfall, so listeners cannot add to or replace
* that scope's system prompt.
2026-07-30 21:40:58 +08:00
* @param assembly - the mutable assembly built from registered providers.
* @param context - the caller's per-assembly context.
* @mode waterfall
*/
'system-prompt/assemble'(this: Scoped<SystemPrompt>, assembly: PromptAssembly, context: AssembleContext, next: () => Promise<PromptAssembly>): Promise<PromptAssembly>
` ``
Types: [Scoped](scope.md)
2026-08-10 18:02:11 +08:00
Source: [` packages/core/system-prompt/src/index.ts:31`](../../packages/core/system-prompt/src/index.ts)
2026-07-30 21:40:58 +08:00
<a id="system-promptchange--emit"></a>
#### ` system-prompt/change` — emit
Emitted when any prompt provider changes. This registry notification is unfiltered because a global change affects every scope.
` ``ts cordis-catalog
/**
* Emitted when any prompt provider changes. This registry notification is
* unfiltered because a global change affects every scope.
* @mode emit
*/
'system-prompt/change'(): void
` ``
2026-08-10 18:02:11 +08:00
Source: [` packages/core/system-prompt/src/index.ts:37`](../../packages/core/system-prompt/src/index.ts)
2026-07-30 21:40:58 +08:00
<!-- END GENERATED cordis-surface -->