52 lines
2.3 KiB
TypeScript
52 lines
2.3 KiB
TypeScript
/**
|
|
* chatCore request-setup resolvers (Quality Gate v2 / Fase 9 — chatCore god-file decomposition).
|
|
*
|
|
* The first pure slice of handleChatCore's request-setup phase: the per-request model-routing
|
|
* metadata resolved at the very top of the handler. Side-effect-free; future increments grow this
|
|
* into the full ChatCoreContext carrier (setup / dispatch / streaming phases).
|
|
*/
|
|
|
|
export type ChatCoreRequestSetup = {
|
|
/**
|
|
* Optional custom-model wire-format marker injected by getModelInfo for providers whose models
|
|
* can route to /chat/completions or /responses (Azure AI Foundry, OCI generic OpenAI). Not on
|
|
* the base ModelInfo shape, so read via structural narrowing (never `as any`).
|
|
*/
|
|
apiFormat: string | undefined;
|
|
/**
|
|
* #2905: per-model wire-format override for custom models, injected by getModelInfo. Custom
|
|
* models aren't in the static registry, so getModelTargetFormat() can't see this — used before
|
|
* the provider default.
|
|
*/
|
|
customModelTargetFormat: string | undefined;
|
|
/** The client-requested model string, falling back to the resolved model id when absent/blank. */
|
|
requestedModel: string;
|
|
};
|
|
|
|
/**
|
|
* Resolve the per-request model-routing metadata at the top of handleChatCore. Pure: a function of
|
|
* the injected modelInfo, the request body, and the resolved model id. Behaviour is byte-identical
|
|
* to the previous inline code.
|
|
*/
|
|
export function resolveChatCoreRequestSetup(
|
|
modelInfo: unknown,
|
|
body: { model?: unknown } | null | undefined,
|
|
model: string
|
|
): ChatCoreRequestSetup {
|
|
const apiFormat: string | undefined =
|
|
modelInfo && typeof modelInfo === "object" && "apiFormat" in modelInfo
|
|
? typeof (modelInfo as { apiFormat?: unknown }).apiFormat === "string"
|
|
? ((modelInfo as { apiFormat?: string }).apiFormat as string)
|
|
: undefined
|
|
: undefined;
|
|
const customModelTargetFormat: string | undefined =
|
|
modelInfo && typeof modelInfo === "object" && "targetFormat" in modelInfo
|
|
? typeof (modelInfo as { targetFormat?: unknown }).targetFormat === "string"
|
|
? ((modelInfo as { targetFormat?: string }).targetFormat as string)
|
|
: undefined
|
|
: undefined;
|
|
const requestedModel =
|
|
typeof body?.model === "string" && body.model.trim().length > 0 ? body.model : model;
|
|
return { apiFormat, customModelTargetFormat, requestedModel };
|
|
}
|