feat: add Bedrock request optimizer (PRE-SEND thinking + cache injection) (#1301)

* feat: add Bedrock request optimizer (PRE-SEND thinking + cache injection)

Add a PRE-SEND request optimizer that enhances Bedrock API requests
before forwarding, complementing the existing POST-ERROR rectifier system.

New modules:
- thinking_optimizer: 3-path model detection (adaptive/legacy/skip)
  - Opus 4.6/Sonnet 4.6: adaptive thinking + effort max + 1M context beta
  - Legacy models: inject extended thinking with max budget
  - Haiku: skip (no modification)
- cache_injector: auto-inject cache_control breakpoints (max 4)
  - Injects at tools/system/assistant message positions
  - TTL upgrade for existing breakpoints (5m → 1h)

Gate: only activates for Bedrock providers (CLAUDE_CODE_USE_BEDROCK=1)
Config: stored in SQLite settings table, default OFF, user opt-in
UI: new Optimizer section in RectifierConfigPanel with 3 toggles + TTL

18 unit tests covering all paths. Verified against live Bedrock API.

* chore: remove docs/plans directory

* fix: address code review findings for Bedrock request optimizer

P0 fixes:
- Replace hardcoded Chinese with i18n t() calls in optimizer panel,
  add translation keys to zh/en/ja locale files
- Fix u64 underflow: max_tokens - 1 → max_tokens.saturating_sub(1)
- Move optimizer from before retry loop to per-provider with body
  cloning, preventing Bedrock fields leaking to non-Bedrock providers

P1 fixes:
- Replace .map() side-effect pattern with idiomatic if-let (clippy)
- Fix module alphabetical ordering in mod.rs
- Add cache_ttl whitelist validation in set_optimizer_config
- Remove #[allow(unused_assignments)] and dead budget decrement

---------

Co-authored-by: Keith (via OpenClaw) <keithyt06@users.noreply.github.com>
Co-authored-by: Jason <farion1231@gmail.com>
This commit is contained in:
Keith Yu
2026-03-07 18:57:21 +08:00
committed by GitHub
parent 27d21c23ac
commit 8217bfff50
14 changed files with 969 additions and 9 deletions
+15
View File
@@ -196,6 +196,14 @@ export const settingsApi = {
return await invoke("set_rectifier_config", { config });
},
async getOptimizerConfig(): Promise<OptimizerConfig> {
return await invoke("get_optimizer_config");
},
async setOptimizerConfig(config: OptimizerConfig): Promise<boolean> {
return await invoke("set_optimizer_config", { config });
},
async getLogConfig(): Promise<LogConfig> {
return await invoke("get_log_config");
},
@@ -211,6 +219,13 @@ export interface RectifierConfig {
requestThinkingBudget: boolean;
}
export interface OptimizerConfig {
enabled: boolean;
thinkingOptimizer: boolean;
cacheInjection: boolean;
cacheTtl: string;
}
export interface LogConfig {
enabled: boolean;
level: "error" | "warn" | "info" | "debug" | "trace";