warpdotdev/warp · error

Failed to parse saved prompt ID

Error message

Failed to parse saved prompt ID '{id}': {err}

What it means

--prompt accepts a saved-prompt reference, which must convert to a ServerId (then a SyncId) via ServerId::try_from (app/src/ai/agent_sdk/ambient.rs:275-284). A malformed ID fails the conversion and the error embeds both the offending ID and the underlying parse error. This fails before any CloudModel lookup happens.

Solutions

  1. Copy the exact saved-prompt ID from the prompt listing output
  2. Trim whitespace and remove surrounding quotes from the value
  3. If you only have the text, pass it directly with --prompt instead of an ID
Defensive patterns

Strategy: validation

Validate before calling

if let Some(Prompt::SavedPrompt(id)) = args.prompt_arg.to_prompt() {
    if ServerId::try_from(id.as_str()).is_err() {
        // reject the ID early instead of letting the run abort later
    }
}

Type guard

fn saved_prompt_id_is_parsable(id: &str) -> bool {
    ServerId::try_from(id).is_ok()
}

Prevention

When it happens

Trigger: Passing a prompt name or free text instead of the sync ID; copying an ID with extra characters, truncation, or surrounding quotes; an ID belonging to a different entity scheme.

Common situations: Users typing the prompt's display name where the ID is expected; IDs mangled by shell quoting or copy-truncation.

Understand the failure class

Related errors


AI-assisted analysis of warpdotdev/warp@e72fd7aacb (2026-08-16). Data as JSON: /api/errors/e2eac64bb49fa401. Report an issue: GitHub.

Appendix: source

Thrown at app/src/ai/agent_sdk/ambient.rs:278

                    anyhow::anyhow!("Either --prompt, --skill, or --conversation must be provided"),
                    ctx,
                );
                return;
            }
            let prompt = match prompt {
                Some(Prompt::PlainText(text)) => Some(text),
                Some(Prompt::SavedPrompt(id)) => {
                    // Resolve the saved prompt to pass along as the ambient agent query.
                    // We look up the prompt text here, rather than passing along the saved prompt ID,
                    // in order to support personal saved prompts, which team service accounts would not
                    // have access to.
                    // TODO: we should pipe the saved prompt ID through the API, and resolve it server-side.
                    // That'd also allow finding all tasks which used a given saved prompt.
                    let sync_id: SyncId = match ServerId::try_from(id.as_str()) {
                        Ok(server_id) => server_id.into(),
                        Err(err) => {
                            super::report_fatal_error(
                                anyhow::anyhow!("Failed to parse saved prompt ID '{id}': {err}"),
                                ctx,
                            );
                            return;
                        }
                    };

                    let cloud_model = CloudModel::handle(ctx);
                    let workflow = cloud_model.as_ref(ctx).get_workflow(&sync_id);

                    match workflow {
                        Some(cloud_workflow) => match cloud_workflow.model().data.prompt() {
                            Some(prompt_text) => Some(prompt_text.to_string()),
                            None => {
                                super::report_fatal_error(
                                    anyhow::anyhow!("'{id}' is not a saved prompt"),
                                    ctx,
                                );
                                return;

View on GitHub (pinned to e72fd7aacb)