Skip to content

Conversation

@maorinn
Copy link

@maorinn maorinn commented Jan 5, 2026

Summary

Integrate Claude-Cloak functionality to natively disguise API requests as originating from the official Claude Code CLI, when the client is not Claude Code.

Features

  • CloakConfig: New configuration option under claude-api-key with mode (auto/always/never) and strict-mode options
  • Fake User ID Generation: Generate user IDs in Claude Code format (user_[64-hex]_account__session_[uuid])
  • System Prompt Injection: Inject Claude Code system prompt with configurable strict mode
    • strict-mode: false (default): prepend to user system messages
    • strict-mode: true: strip all user system messages, keep only Claude Code prompt
  • Sensitive Word Obfuscation: Obfuscate configured words with zero-width characters
  • Auto-Detection: Automatically detect Claude Code clients via User-Agent (skip cloaking for them)

Configuration Example

claude-api-key:
  - api-key: "sk-ant-xxx"
    base-url: "https://api.anthropic.com"
    cloak:
      mode: "auto"           # auto | always | never
      strict-mode: false     # false: prepend; true: replace
      sensitive-words:
        - "API"
        - "proxy"

Behavior

mode Claude Code Client Other Clients
auto (default) No cloak Cloak
always Cloak Cloak
never No cloak No cloak

Test plan

  • Test with Claude Code client (should not apply cloaking when mode=auto)
  • Test with non-Claude Code client (should apply cloaking when mode=auto)
  • Test strict-mode=true (should strip user system messages)
  • Test strict-mode=false (should prepend Claude Code prompt)
  • Test sensitive word obfuscation
  • Verify fake user_id format matches Claude Code pattern

🤖 Generated with Claude Code

integrate claude-cloak functionality to disguise api requests:
- add CloakConfig with mode (auto/always/never) and strict-mode options
- generate fake user_id in claude code format (user_[hex]_account__session_[uuid])
- inject claude code system prompt (configurable strict mode)
- obfuscate sensitive words with zero-width characters
- auto-detect claude code clients via user-agent

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @maorinn, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a new "Claude-Cloak" feature designed to make API requests from non-Claude Code clients appear as if they originate from the official Claude Code CLI. This is achieved through a set of configurable mechanisms including dynamic user ID generation, intelligent system prompt injection, and sensitive word obfuscation, all managed by a new CloakConfig that allows for flexible control over when and how cloaking is applied.

Highlights

  • Configurable Request Cloaking: Introduced CloakConfig with mode (auto, always, never) and strict-mode options to control when and how API requests are disguised.
  • Fake User ID Generation: Implemented generation of user IDs that mimic the format used by the official Claude Code CLI.
  • System Prompt Manipulation: Added logic to inject a specific Claude Code system prompt, with an option (strict-mode) to either prepend it to existing user prompts or replace all user prompts entirely.
  • Sensitive Word Obfuscation: Provided functionality to obfuscate specified sensitive words within prompts and messages using zero-width characters to bypass content filters.
  • Automatic Client Detection: The system can now automatically detect Claude Code clients via their User-Agent and skip cloaking for them when mode is set to "auto".

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a request cloaking feature to disguise API requests as originating from the official Claude Code CLI. The implementation is well-structured, with new configuration options and dedicated files for obfuscation and utility functions. I've identified a few issues that should be addressed. There's a significant bug causing CountTokens to be inconsistent with Execute/ExecuteStream, a data loss issue in the system prompt injection logic, and a potential security vulnerability in the random user ID generation. I've also noted some dead code that can be removed. Addressing these points will help ensure the feature is robust and correct.

Comment on lines +872 to +877
system.ForEach(func(_, part gjson.Result) bool {
if part.Get("type").String() == "text" {
claudeCodeInstructions, _ = sjson.SetRaw(claudeCodeInstructions, "-1", part.Raw)
}
return true
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

When prepending the Claude Code system prompt, the current logic only preserves existing system prompt blocks of type: "text". Any other content block types, such as images, will be dropped from the request. This can lead to data loss and incorrect model behavior. To fix this, all parts of the original system prompt should be preserved, regardless of their type.

 			system.ForEach(func(_, part gjson.Result) bool {
 				claudeCodeInstructions, _ = sjson.SetRaw(claudeCodeInstructions, "-1", part.Raw)
 				return true
 			})


// applyCloaking applies cloaking transformations to the payload based on config and client.
// Cloaking includes: system prompt injection, fake user ID, and sensitive word obfuscation.
func applyCloaking(ctx context.Context, cfg *config.Config, auth *cliproxyauth.Auth, payload []byte, model string) []byte {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

While Execute and ExecuteStream have been updated to use this new applyCloaking function, the CountTokens function in this file still uses the old checkSystemInstructions logic. This will lead to CountTokens returning an incorrect token count for requests that are subject to cloaking, as the system prompt modifications will not be accounted for consistently. To ensure correctness, CountTokens should also be updated to use applyCloaking.

// Format: user_[64-hex-chars]_account__session_[UUID-v4]
func generateFakeUserID() string {
hexBytes := make([]byte, 32)
_, _ = rand.Read(hexBytes)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The error returned by rand.Read is currently ignored. If rand.Read fails (e.g., due to the OS entropy source being unavailable), the hexBytes slice will contain all zeros, resulting in a predictable, non-random user ID. This is a security risk. Since a failure here is a critical problem, the program should panic to prevent insecure operation.

	if _, err := rand.Read(hexBytes); err != nil {
		// rand.Read failing is a catastrophic failure of the OS's entropy source.
		// The program cannot continue securely, so we panic.
		panic("crypto/rand: failed to read random bytes for fake user ID: " + err.Error())
	}

Comment on lines +44 to +47
// isClaudeCodeClient checks if the User-Agent indicates a Claude Code client.
func isClaudeCodeClient(userAgent string) bool {
return strings.HasPrefix(userAgent, "claude-cli")
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This function isClaudeCodeClient is not used anywhere in the codebase. Its logic is already implemented inside the shouldCloak function. To improve maintainability and remove dead code, this function should be removed.

HsnSaboor added a commit to HsnSaboor/CLIProxyAPI that referenced this pull request Jan 6, 2026
…auto-update, request timeout, multi-candidate, auth persistence

Applied features from upstream PRs:
- PR router-for-me#878: Usage statistics persistence (SetPersistPath, LoadStatistics, SaveStatistics)
- PR router-for-me#877: Codex plan type credential filename handling
- PR router-for-me#868: Claude request cloaking utilities (obfuscation, fake user IDs)
- PR router-for-me#715: Auto-update command for self-updating binary
- PR router-for-me#860: Configurable request timeout with RequestTimeout config
- PR router-for-me#879: Gemini multi-candidate support (n param -> candidateCount)
- PR router-for-me#869: Auth token persistence for non-Google OAuth providers

Fixed build issues:
- Added applyPayloadConfig wrapper function
- Added originalTranslated computation in claude/antigravity/codex executors
- Fixed model registry hook methods
- Removed duplicate SanitizeFunctionName
- Fixed gemini_schema placeholder logic for nested object properties

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants