import type { CanonicalModelRequest, ModelConfig, ModelDefinition, ProviderConfig } from "../protocol/canonical.js";
import { ModelRequestError } from "../protocol/errors.js";
import { assertContentSupported } from "../protocol/multimodal.js";
export type ResolvedModelRequest = {
provider: ProviderConfig;
model: ModelDefinition;
};
export function validateModelRequest(
request: CanonicalModelRequest,
config: ModelConfig,
): ResolvedModelRequest {
const provider = config.providers[request.provider];
if (!provider) {
throw new ModelRequestError("provider_not_found", `Provider ${request.provider} does not exist.`);
}
const model = provider.models[request.model];
if (!model) {
throw new ModelRequestError(
"model_not_found",
`Model ${request.model} does not exist in provider ${request.provider}.`,
);
}
if (request.stream && !model.capabilities.supportsStreaming) {
throw new ModelRequestError("unsupported_streaming", `Model ${request.model} does not support streaming.`);
}
if (request.systemPrompt && !model.capabilities.supportsSystemPrompt) {
throw new ModelRequestError(
"unsupported_system_prompt",
`Model ${request.model} does not support system prompts.`,
);
}
if (request.tools?.length && !model.capabilities.supportsToolUse) {
throw new ModelRequestError("unsupported_tool_use", `Model ${request.model} does not support tools.`);
}
for (const message of request.messages) {
assertContentSupported(message.content, model.multimodal);
}
return { provider, model };
}