Skip to content

feat: Migrate synthetic message detection to metadata-based approach #8766

Closed

Description

@ananas-viber

Summary

Currently, copilot.ts detects synthetic user messages (compaction, tool attachments, subtasks) via regex pattern matching on message text. This works but has maintenance coupling.

Current State

  • synthetic: boolean already exists on TextPart (message-v2.ts:64)
  • It's already being set in various places (prompt.ts:1374, etc.)
  • BUT toModelMessage() does not propagate this flag to the final UIMessage

Proposed Change

  1. In message-v2.ts toModelMessage():

    • Pass providerMetadata: { synthetic: true } for user text parts when part.synthetic === true
    • Add same metadata for compaction/subtask generated messages
  2. In copilot.ts:

    • Check part.providerMetadata?.synthetic === true instead of pattern matching
    • Remove SYNTHETIC_PATTERNS array

Benefits

  • Type-safe detection (no string coupling)
  • Compile-time enforcement if field is renamed
  • Cleaner architecture
  • Eliminates theoretical "hackability" of pattern matching

Context

This is a follow-up to #8721 which implements the pattern-matching approach as a minimal fix.

Related issues:

Activity

  1. github-actions commented on Jan 16, 2026

    @github-actions
    Contributor

    Related issue: #8700 describes the specific problem (premium requests being burned when subagents create synthetic user messages) that this metadata-based approach aims to solve. You may want to cross-reference them for implementation context.

  2. onedaxter commented on Jan 23, 2026

    @onedaxter

    any chance we can adjust that compactions are not count towards premium requests with this ?

    because in vscode copilot we are also able to run a single request for multiple hours (of course if good prompted with a spec) without getting additional premium requests used

  3. github-actions commented on Mar 27, 2026

    @github-actions
    Contributor

    To stay organized issues are automatically closed after 90 days of no activity. If the issue is still relevant please open a new one.

  4. georgeharker commented on Mar 27, 2026

    @georgeharker
    Contributor

    My understanding is this is still an issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions