Repository navigation
refactor(chatCore): extrai extractSystemRoleMessages + buildUpstreamHeadersForExecute para leaves puros (#3501) - #4548
Merged
diegosouzapw merged 8 commits intoJun 21, 2026
Conversation
…3501) Move o closure `recordKeyHealthStatus` (~56 ln) do topo de handleChatCore para o novo leaf open-sse/handlers/chatCore/keyHealth.ts, byte-idêntico: 401 → recordKeyFailure + persist sempre; 2xx → recordKeySuccess + persist só na recuperação de warning/invalid; demais status apenas atualizam o set de extra-keys. O handler mantém um closure fino de binding que repassa `log`, então os 2 call sites ficam inalterados. Imports que ficaram órfãos (recordKeyFailure / recordKeySuccess / trackConnectionExtraKeys / KeyHealth) migram para o leaf; connectionHasExtraKeys permanece (ainda usado no site de rotação) e updateProviderConnection é importado em ambos (usado em vários pontos do handler). chatCore.ts 5110->5055 (shrink -55); baseline file-size ratchetado. complexity 1905=1905 (neutro). Coberto por tests/unit/chatcore-key-health.test.ts (6 casos — transições in-memory do apiKeyRotator: warning/invalid no threshold, recuperação 2xx, escopo por selectedKeyId, no-op sem connectionId e em status fora de 401/2xx).
…ro (#3501) Move o bloco de resolução de formato do topo de handleChatCore (endpointPath / sourceFormat / isResponsesEndpoint / nativeCodexPassthrough / isDroidCLI / copilotCompatibleReasoning / clientResponseFormat) para o novo leaf puro open-sse/handlers/chatCore/requestFormat.ts (resolveChatCoreRequestFormat), ao lado de resolveChatCoreRequestSetup (fase de request-setup). O handler agora desestrutura o resultado, então todo uso downstream fica byte-idêntico. A função local isCopilotClient (usada só por esse bloco) vira helper privado do leaf; o import órfão detectFormatFromEndpoint migra junto (getTargetFormat permanece no import de provider). shouldUseNativeCodexPassthrough e FORMATS seguem importados no handler (re-exportado / usado em vários pontos). chatCore.ts 5019->4993 (shrink -26, cruza abaixo de 5000); baseline file-size ratchetado. complexity 1905=1905 (neutro). Coberto por tests/unit/chatcore-request-format.test.ts (7 casos, incluindo o downgrade OpenAI-Responses->OpenAI e sua supressão pelo Droid CLI).
…3501) Move o bloco de effort-variant do Claude/Claude-Code do topo de handleChatCore (strip de claude-...-{low,medium,high,xhigh,max} de volta ao id base + expõe o nível como reasoning_effort; effort explícito do cliente vence; passthrough nativo com sourceFormat==='claude' fica intocado) para o novo leaf open-sse/handlers/chatCore/claudeEffortVariant.ts (applyClaudeEffortVariant). A função muta o body in-place e retorna { effectiveModel, log }, que o handler aplica (reatribuição de effectiveModel + log?.info), byte-idêntico. Import órfão splitClaudeEffortSuffix migra para o leaf (getModelTargetFormat / PROVIDER_ID_TO_ALIAS permanecem no import de providerModels); isClaudeCodeCompatibleProvider e FORMATS seguem no handler (usados em outros pontos). A detecção de effort explícito foi isolada no helper privado hasExplicitClaudeEffort para manter applyClaudeEffortVariant abaixo do teto de complexidade (16->≤15; mesmo padrão de resolveContextCachePin/ markConnectionLevelExhaustion). chatCore.ts 4993->4978 (shrink -15); baseline file-size ratchetado. complexity 1905=1905 (neutro). Coberto por tests/unit/chatcore-claude-effort-variant.test.ts (7 casos).
…3501) Move a resolução de wire target-format do topo de handleChatCore para o novo leaf puro open-sse/handlers/chatCore/targetFormat.ts (resolveChatCoreTargetFormat), ao lado de resolveChatCoreRequestSetup/resolveChatCoreRequestFormat. Retorna { alias, targetFormat }: apiFormat==='responses' força OpenAI Responses; senão o target-format do modelo no registry, depois o override custom (#2905), depois o default do provider. O handler desestrutura — `alias` segue reusado downstream ao remover o prefixo alias/ do model id upstream. Imports órfãos (getModelTargetFormat / PROVIDER_ID_TO_ALIAS / getTargetFormat) migram para o leaf; FORMATS permanece no handler (usado em vários pontos). Tamanho de chatCore.ts neutro (call+comentário compensa os 2 imports removidos), mas a lógica agora é unit-testada e co-localizada. complexity 1905=1905; typecheck 0. Coberto por tests/unit/chatcore-target-format.test.ts (5 casos, asseridos contra a composição inline).
Move o núcleo puro do closure persistFailureUsage para o novo leaf open-sse/handlers/chatCore/failureUsage.ts (buildFailureUsageRecord): monta o registro de usage-history de uma request falha (tokens/timing zerados, success:false, fallbacks unknown/undefined, gate de comboStrategy, timestamp ISO). O handler mantém o impuro byte-idêntico: calcula latencyMs (Date.now()-startTime) e dispara o fire-and-forget saveRequestUsage(...).catch(). O closure binding preserva a assinatura (statusCode, errorCode?), então os 13 call sites + o pass-through ficam inalterados. complexity neutro (leaf puro trivial); typecheck 0. Coberto por tests/unit/chatcore-failure-usage.test.ts (3 casos: record completo, fallbacks, gate combo-strategy).
…3501) Move a função top-level pura extractSystemRoleMessages (lift de mensagens role=system/developer para o campo top-level `system`, exigido pela Messages API da Anthropic) para o novo leaf open-sse/handlers/chatCore/claudeSystemRole.ts, byte-idêntico. O chatCore.ts importa e **re-exporta** o símbolo, então os importadores existentes (tests/unit/system-role-extraction.test.ts) seguem resolvendo de chatCore.ts; os 3 call sites internos (incl. dentro de normalizeClaudeUpstreamMessages) usam a versão importada — leaf autocontido, sem import circular. chatCore.ts encolhe ~33 linhas; typecheck 0; file-size OK. Coberto pelos 10 casos de tests/unit/system-role-extraction.test.ts (via re-export). complexity 1908=base v3.8.33 (drift pré-existente, mover função top-level é neutro).
Contributor
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
…uro (#3501) Move o closure buildUpstreamHeadersForExecute do handleChatCore para o novo leaf puro open-sse/handlers/chatCore/upstreamExecuteHeaders.ts: monta os headers extra de upstream por modelo (merge dos headers configurados do modelo + alias), aplica o User-Agent custom da conexão e ativa o Claude Fast Mode (header CPA) quando habilitado nas settings para o provider canônico `claude` + modelo suportado. O handler mantém um binding fino que repassa os 7 inputs por request, então os 3 call sites (passando só modelToCall/retryModelId) ficam byte-idênticos. Imports órfãos migram: getModelUpstreamExtraHeaders agora do módulo específico @/lib/db/models (não barrel localDb — check-db-rules OK); CPA_FORCE_FAST_MODE_HEADER + shouldRequestClaudeFastMode do claudeFastMode. resolveModelAlias permanece. chatCore.ts -31 linhas; typecheck 0; check-db-rules OK; file-size OK; 172/172 suíte. Coberto por tests/unit/chatcore-upstream-execute-headers.test.ts (6 casos: User-Agent override, fast-mode só p/ claude+enabled+supported, branches).
Collaborator
Author
|
Atualização: este PR agora contém 2 commits / 2 leaves (o 2º foi empilhado por engano nesta branch em vez de uma branch própria; mantido aqui sem force-push conforme orientação de não mexer em branches durante o churn de merge):
Gates (tip 8c914a2): typecheck 0 · check-db-rules OK · file-size OK · 172/172 suíte chatcore. complexity 1908>1906 = drift pré-existente de v3.8.33 (não destes leaves). |
diegosouzapw
changed the base branch from
refactor/qg-chatcore-failureusage
to
release/v3.8.33
June 21, 2026 22:11
# Conflicts: # open-sse/handlers/chatCore.ts
This was referenced Jun 21, 2026
Merged
tkgo11
pushed a commit
to tkgo11/OmniRoute
that referenced
this pull request
Sep 23, 2026
…eadersForExecute para leaves puros (cheaper-inference#3501) (cheaper-inference#4548) Integrated into release/v3.8.33
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O quê
9º incremento da decomposição do god-file
chatCore.ts(#3501). Move a função top-level puraextractSystemRoleMessagespara o novo leafopen-sse/handlers/chatCore/claudeSystemRole.ts.Como (preservação de comportamento)
extractSystemRoleMessages(lift de mensagensrole=system/developerpara o campo top-levelsystem, exigido pela Messages API da Anthropic) move byte-idêntica para o leaf — função pura/autocontida, muta o payload por param.chatCore.tsimporta e re-exporta o símbolo:import { extractSystemRoleMessages } from "./chatCore/claudeSystemRole.ts"; export { extractSystemRoleMessages } from "./chatCore/claudeSystemRole.ts";. Assim:tests/unit/system-role-extraction.test.ts) seguem resolvendo dechatCore.ts(sem tocar no teste);normalizeClaudeUpstreamMessages) usam a versão importada;Gates
chatCore.tsencolhe ~33 linhas → 4956).tests/unit/system-role-extraction.test.ts(via re-export) + 176/176 na suíte chatcore completa.1908 > 1906—Extração de god-file sem mudança de comportamento em runtime.