60 lines
1.7 KiB
JavaScript
60 lines
1.7 KiB
JavaScript
/**
|
|
* /api/models routes
|
|
*
|
|
* Returns available model lists for each provider.
|
|
* Claude models are fetched live from MODELS_API_BASE_URL/v1/models
|
|
* (9router) and cached for 5 minutes; other providers use their
|
|
* static constants.
|
|
*/
|
|
|
|
import express from 'express';
|
|
import { getAvailableClaudeModels, invalidateModelCache } from '../services/model-discovery.js';
|
|
import { CODEX_MODELS, CURSOR_MODELS, GEMINI_MODELS } from '../../shared/modelConstants.js';
|
|
|
|
const router = express.Router();
|
|
|
|
/**
|
|
* GET /api/models
|
|
* Returns all providers' model lists.
|
|
* Claude list is dynamically fetched from 9router when configured.
|
|
*/
|
|
router.get('/', async (_req, res) => {
|
|
try {
|
|
const claudeModels = await getAvailableClaudeModels();
|
|
|
|
res.json({
|
|
claude: claudeModels,
|
|
codex: CODEX_MODELS.OPTIONS,
|
|
gemini: GEMINI_MODELS.OPTIONS,
|
|
cursor: CURSOR_MODELS.OPTIONS,
|
|
});
|
|
} catch (err) {
|
|
console.error('[/api/models] Error:', err?.message ?? err);
|
|
res.status(500).json({ error: 'Failed to load model list' });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* GET /api/models/claude
|
|
* Returns only Claude model list (with 9router discovery).
|
|
*/
|
|
router.get('/claude', async (_req, res) => {
|
|
try {
|
|
const models = await getAvailableClaudeModels();
|
|
res.json({ models });
|
|
} catch (err) {
|
|
console.error('[/api/models/claude] Error:', err?.message ?? err);
|
|
res.status(500).json({ error: 'Failed to load Claude model list' });
|
|
}
|
|
});
|
|
|
|
/**
|
|
* POST /api/models/refresh
|
|
* Force-invalidates the model cache (admin convenience endpoint).
|
|
*/
|
|
router.post('/refresh', (_req, res) => {
|
|
invalidateModelCache();
|
|
res.json({ success: true, message: 'Model cache invalidated' });
|
|
});
|
|
|
|
export default router;
|