Spaces:
Running
Running
| const { parseKeys, selectKey, throttleKey } = require("../lib/key-rotation.js"); | |
| module.exports = async function handler(req, res) { | |
| try { | |
| if (req.method !== "GET") { | |
| return res.status(405).json({ error: "Method not allowed" }); | |
| } | |
| const keysRaw = process.env.KIMCHI_API_KEYS; | |
| const keys = parseKeys(keysRaw); | |
| if (keys.length === 0) { | |
| return res.status(500).json({ error: "No API keys configured. Set KIMCHI_API_KEYS env var." }); | |
| } | |
| const keySelection = selectKey({ keys }); | |
| const { key, index } = keySelection; | |
| const response = await fetch("https://llm.kimchi.dev/v1/models/metadata?include_in_cli=true", { | |
| method: "GET", | |
| headers: { | |
| Authorization: `Bearer ${key}`, | |
| "User-Agent": "kimchi-proxy/1.0.0", | |
| }, | |
| signal: AbortSignal.timeout(20000), | |
| }); | |
| if (!response.ok) { | |
| if (response.status === 429) { | |
| throttleKey(key); | |
| } | |
| return res.status(response.status).json({ | |
| error: `Metadata fetch failed: ${response.status} ${response.statusText}`, | |
| keyIndex: index, | |
| }); | |
| } | |
| const data = await response.json(); | |
| res.setHeader("X-Proxy-Key-Index", String(index)); | |
| res.setHeader("X-Proxy-Key-Total", String(keys.length)); | |
| return res.status(200).json(data); | |
| } catch (error) { | |
| console.error("[models proxy] error:", error); | |
| return res.status(502).json({ | |
| error: "Failed to fetch models metadata", | |
| details: error instanceof Error ? error.message : String(error), | |
| }); | |
| } | |
| }; | |