Files
OmniRoute/open-sse/services/AGENTS.md
Jan Leon b2b568b08e Fix routed target request parameters (#7323)
* fix routed target request parameters

* chore: rerun CI

* test(chatcore): align PR #7323 Codex-routing test with #7533 verbosity gating

The "Codex Responses routing keeps reasoning effort while dropping GPT-only
verbosity" test translated a Responses-shape request with credentials=null
and only the positional `provider` arg set to "opencode-go". #7533's
verbosity carry-over (Responses `text.verbosity` -> Chat `verbosity`) reads
the destination from `credentials.provider`, which the source->openai
translation step never threads from the positional provider arg — so
`translated.verbosity` came back undefined instead of "low", failing before
prepareUpstreamBody's sanitizer was even reached.

The test's intent (per its own name/comment) is a combo/fallback reroute:
translate while still addressed at Codex (an #7533-allowlisted OpenAI-param
destination, so verbosity legitimately survives translateRequest), then
resolve the final upstream target to opencode-go/GLM so prepareUpstreamBody's
sanitizeRequestForResolvedTarget (#7050/#7533) strips the GPT-only verbosity
for that concrete target while preserving reasoning_effort. Fixed by passing
`credentials: { provider: "codex" }` to the first translateRequest call to
match how production actually carries the destination provider, instead of
relying on the provider positional argument. No production code changed —
#7050 and #7533's sanitization are intentional and protected; only the test's
setup was misaligned with them.

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>

---------

Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
2026-07-18 21:18:34 -03:00

4.3 KiB

open-sse/services/ — Routing Engine & Cross-Cutting Services

Purpose: 134 service modules (top-level) powering request routing, rate limiting, quota management, token refresh, fallback strategies, and runtime state. The combo routing engine (combo.ts) is the core; supporting services handle resilience, accounting, and decision-making.

Live count: ls open-sse/services/*.ts | wc -l (currently 134). More including sub-dirs like autoCombo/ and compression/.


Combo Routing Engine

  • combo.ts — Entry point for multi-model routing. handleComboChat() iterates through targets in order until success or all fail. resolveComboTargets() expands combo config into ordered ResolvedComboTarget[] (provider + model + account + credentials).
  • Strategies (17): priority, weighted, fill-first, round-robin, P2C, random, least-used, reset-aware, reset-window, cost-optimized, strict-random, auto, lkgp, context-optimized, context-relay, headroom, fusion. Source: ROUTING_STRATEGY_VALUES in src/shared/constants/routingStrategies.ts.
  • Each target calls handleSingleModel() which wraps handleChatCore() with per-target error handling and circuit breaker checks.

Key Services

Quota & Rate Limiting

  • rateLimitManager.ts — Token bucket per API key + provider combo. Rejects before dispatch.
  • usage.ts — Per-request token/cost consumption tracking.
  • quotaCache.ts — In-memory quota snapshots, pre-loaded at startup.

Account & Token Management

  • tokenRefresh.ts — OAuth token expiration detection and refresh.
  • accountFallback.ts — Account switching on quota/rate-limit. Also houses model lockout.
  • sessionManager.ts — Request session state across retries.

Request Routing & Intelligence

  • wildcardRouter.ts — Wildcard route matching in combo configs.
  • intentClassifier.ts — Request intent classification for intelligent routing.
  • taskAwareRouter.ts — Task-type-based routing (reasoning → o1, code-gen → Cursor).
  • targetRequestSanitizer.ts — Final provider/model-aware parameter sanitation after routing resolution and before executor dispatch.
  • thinkingBudget.ts — Thinking token allocation for o1/o3 models.
  • contextManager.ts — Routing context injection (system prompts, memory).

Model Lifecycle & Fallback

  • modelDeprecation.ts — Deprecated model detection and successor routing.
  • modelFamilyFallback.ts — T5 intra-family fallback chains.
  • emergencyFallback.ts — Last-resort fallback to stable free providers.

State & Detection

  • workflowFSM.ts — Multi-turn workflow state machine.
  • backgroundTaskDetector.ts — Long-running task detection for batch routing.
  • ipFilter.ts — IP-based routing rules.
  • signatureCache.ts — Request signature caching for deduplication.
  • volumeDetector.ts — Volume spike detection for rate-limit escalation.
  • contextHandoff.ts — Session context serialization for A2A handoff.

Prompt Compression Pipeline (compression/)

  • strategySelector.ts — Compression mode selection (off/lite/standard/aggressive/ultra/rtk/stacked).
  • lite.ts — 5 lite techniques (whitespace, dedup, tool results, redundant removal, image URLs).
  • caveman.ts / cavemanRules.ts — Caveman-style semantic condensation with rule packs.
  • engines/rtk/ — RTK tool-output compression (command detection, JSON filters, dedup, truncation).
  • engines/registry.ts — Engine registry for standalone and stacked pipelines.
  • stats.ts — Per-request compression stats.
  • types.ts — Shared types (CompressionMode, CompressionConfig, CompressionStats).

Adding a New Service

  1. Create open-sse/services/[serviceName].ts
  2. Export main handler function
  3. Add unit tests in tests/unit/services/
  4. Integrate into handlers/chatCore.ts (if routing-related) or combo.ts
  5. Document in this file

Anti-Patterns

  • Synchronous DB calls in combo.ts hot path — pre-compute and cache
  • Retry logic in handlers — use retry() from resilience service
  • Direct provider config access — use providerRegistry getter functions
  • Hardcoded fallback chains — define in modelFamilyFallback.ts
  • State mutations across concurrent requests — use request-scoped context only