Skip to content

Non-Anthropic providers inherit hardcoded Claude identity in system prompt #2822

@Yeachan-Heo

Description

@Yeachan-Heo

Summary

A Discord report in UltraWorkers #claw-code indicates that Claw Code can identify itself as Claude / Claude Sonnet / Claude Opus even when the configured provider/model is non-Anthropic, e.g. xAI Grok.

This appears to be a prompt identity leak rather than provider routing failure: the runtime system prompt contains a hardcoded Claude-flavored model-family string, and non-Claude models can parrot that identity when asked "Who are you?".

Discord reference

  • Guild: 1452487457085063218
  • Channel: #claw-code (1489068687267725353)
  • Relevant messages:
    • 1498609299860230216 — user reports that asking "Who are you?" returns Claude even without Anthropic API.
    • 1498637653380169818 — user provides suspected root cause and proposed fix.
    • 1498646141409955900 — maintainer-side triage notes this as a prompt identity leak.

Suspected root cause

The report points to a hardcoded model-family constant in:

runtime/src/prompt.rs

with a value like:

pub const FRONTIER_MODEL_NAME: &str = "Claude Opus 4.6";

That value is injected into every session's system prompt as model-family/environment identity text. When the selected backend is Grok or another OpenAI-compatible non-Anthropic provider, the model can read that prompt and answer as if it were Claude.

Repro shape

  1. Configure Claw Code with a non-Anthropic provider/model, e.g. xAI / Grok via an OpenAI-compatible route.
  2. Start a session.
  3. Ask:
Who are you?

Observed behavior

The assistant may answer that it is Claude / Claude Sonnet / Claude Opus, even though the active provider/model is not Anthropic.

Expected behavior

The system prompt should not hardcode a Claude identity for all providers.

Acceptable outcomes:

  • thread the selected model/provider name into system prompt construction, or
  • avoid provider-specific self-identification in the prompt when the selected model is not known, or
  • make the identity text generic and runtime-derived.

Suggested implementation direction

The Discord report suggested threading the selected model name into the prompt builder, for example:

  • add model_name: Option<String> to SystemPromptBuilder
  • add a builder method such as with_model(...)
  • make environment_section() prefer the runtime-selected model name over FRONTIER_MODEL_NAME
  • expose a load_system_prompt_for_model(...) helper and use it from the CLI path that already knows the selected model

The exact API shape can differ, but the important contract is: non-Anthropic providers must not inherit a hardcoded Claude family identity from the global runtime prompt.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions