16 lines
1.2 KiB
TypeScript

import { createHash } from 'node:crypto'
import { listAiModelExecutionContracts } from '@/lib/ai-model-service'
/** Public execution contracts only. Credentials never cross the desktop API. */
export async function desktopExecutionModels() {
const runtime = await listAiModelExecutionContracts()
const models = []
for (const {stage,binding,protocol} of runtime.items) {
if (binding.baseUrl !== 'https://api.vip98k.com/v1' || stage !== 'image' && !['openai-chat', 'anthropic-messages'].includes(protocol.id) || stage === 'analysis' && !protocol.supportsImageInput || stage === 'image' && (!protocol.supportsImageInput || !['openai-image-edit','openai-image-generate','async-image-task'].includes(protocol.id))) continue
const contract = { key: binding.modelKey, id: binding.modelId, label: binding.modelId, stage, baseUrl: binding.baseUrl,
protocol, verificationId: binding.verificationId || null, revision: binding.revision }
models.push({ ...contract, fingerprint: createHash('sha256').update(JSON.stringify(contract)).digest('hex') })
}
return { models, defaults: { analysis: runtime.defaults.analysis, copy: runtime.defaults.copy, image: runtime.defaults.image } }
}