feat: add /api/models route with dynamic Claude model discovery
This commit is contained in:
parent
13992ef00f
commit
f013601f70
1 changed files with 60 additions and 0 deletions
60
server/routes/models.js
Normal file
60
server/routes/models.js
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
/**
|
||||||
|
* /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;
|
||||||
Loading…
Reference in a new issue