Skip to content

refactor(chatCore): extrai extractSystemRoleMessages + buildUpstreamHeadersForExecute para leaves puros (#3501) - #4548

Merged
diegosouzapw merged 8 commits into
release/v3.8.33from
refactor/qg-chatcore-claudesysrole
Jun 21, 2026
Merged

diegosouzapw merged 8 commits into
release/v3.8.33from
refactor/qg-chatcore-claudesysrole

Conversation

@diegosouzapw

Copy link
Copy Markdown
Collaborator

O quê

9º incremento da decomposição do god-file chatCore.ts (#3501). Move a função top-level pura extractSystemRoleMessages para o novo leaf open-sse/handlers/chatCore/claudeSystemRole.ts.

Stacked sobre o #4544 (base refactor/qg-chatcore-failureusage); auto-retarget conforme os pais mergeiam. Sem force-push.

Como (preservação de comportamento)

  • extractSystemRoleMessages (lift de mensagens role=system/developer para o campo top-level system, exigido pela Messages API da Anthropic) move byte-idêntica para o leaf — função pura/autocontida, muta o payload por param.
  • O chatCore.ts importa e re-exporta o símbolo: import { extractSystemRoleMessages } from "./chatCore/claudeSystemRole.ts"; export { extractSystemRoleMessages } from "./chatCore/claudeSystemRole.ts";. Assim:
    • os importadores existentes (tests/unit/system-role-extraction.test.ts) seguem resolvendo de chatCore.ts (sem tocar no teste);
    • os 3 call sites internos (incl. dentro de normalizeClaudeUpstreamMessages) usam a versão importada;
    • sem import circular (o leaf é autocontido).

Gates

  • typecheck:core: exit 0.
  • file-size: OK (chatCore.ts encolhe ~33 linhas → 4956).
  • Testes: cobertos pelos 10/10 de tests/unit/system-role-extraction.test.ts (via re-export) + 176/176 na suíte chatcore completa.
  • complexity: mostra 1908 > 1906 — ⚠️ drift pré-existente de v3.8.33 (a base sozinha já reporta 1908); mover uma função top-level é complexity-neutro, não é deste leaf.

Extração de god-file sem mudança de comportamento em runtime.

diegosouzapw and others added 6 commits June 21, 2026 14:46
…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).
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@chatgpt-codex-connector

Copy link
Copy Markdown

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).
@diegosouzapw diegosouzapw changed the title refactor(chatCore): extrai extractSystemRoleMessages para leaf puro (#3501) refactor(chatCore): extrai extractSystemRoleMessages + buildUpstreamHeadersForExecute para leaves puros (#3501) Jun 21, 2026
@diegosouzapw

Copy link
Copy Markdown
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):

  1. fe3073cfa — extrai extractSystemRoleMessages → chatCore/claudeSystemRole.ts (re-export; teste system-role via re-export).
  2. 8c914a276 — extrai buildUpstreamHeadersForExecute → chatCore/upstreamExecuteHeaders.ts (binding fino, 3 call sites byte-idênticos; getModelUpstreamExtraHeaders migrado p/ @/lib/db/models — check-db-rules OK; coberto por chatcore-upstream-execute-headers.test.ts, 6 casos).

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
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
@diegosouzapw
diegosouzapw merged commit 4b34a75 into release/v3.8.33 Jun 21, 2026
4 checks passed
@diegosouzapw
diegosouzapw deleted the refactor/qg-chatcore-claudesysrole branch June 23, 2026 13:13
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
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.

1 participant