import { readAuthFile } from '../../opencode/auth.js'; import { readConfigLayers } from '../../opencode/shared.js'; import { getAuthEntry, normalizeAuthEntry, buildResult, toUsageWindow, toNumber, toTimestamp, resolveWindowSeconds, resolveWindowLabel, normalizeTimestamp } from '../utils/index.js'; export const providerId = 'zhipuai-coding-plan'; export const providerName = 'ZhipuAI'; export const aliases = ['zhipuai-coding-plan', 'zhipuai', 'zhipu']; function getApiKey() { const auth = readAuthFile(); const oldEntry = normalizeAuthEntry(getAuthEntry(auth, aliases)); const apiKeyFromOld = oldEntry?.key ?? oldEntry?.token; if (apiKeyFromOld) { return apiKeyFromOld; } try { const layers = readConfigLayers(); const { mergedConfig } = layers; for (const alias of aliases) { const providerConfig = mergedConfig?.provider?.[alias]; if (providerConfig?.options?.apiKey) { return providerConfig.options.apiKey; } } } catch (error) { // Ignore read errors } return null; } export const isConfigured = () => { return Boolean(getApiKey()); }; export const fetchQuota = async () => { const apiKey = getApiKey(); if (!apiKey) { return buildResult({ providerId, providerName, ok: false, configured: false, error: 'Not configured' }); } try { const response = await fetch('https://open.bigmodel.cn/api/monitor/usage/quota/limit', { method: 'GET', headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' } }); if (!response.ok) { return buildResult({ providerId, providerName, ok: false, configured: true, error: `API error: ${response.status}` }); } const payload = await response.json(); const limits = Array.isArray(payload?.data?.limits) ? payload.data.limits : []; const tokensLimit = limits.find((limit) => limit?.type === 'TOKENS_LIMIT'); const windowSeconds = resolveWindowSeconds(tokensLimit); const windowLabel = resolveWindowLabel(windowSeconds); const resetAt = tokensLimit?.nextResetTime ? normalizeTimestamp(tokensLimit.nextResetTime) : null; const usedPercent = typeof tokensLimit?.percentage === 'number' ? tokensLimit.percentage : null; const windows = {}; if (tokensLimit) { windows[windowLabel] = toUsageWindow({ usedPercent, windowSeconds, resetAt }); } return buildResult({ providerId, providerName, ok: true, configured: true, usage: { windows } }); } catch (error) { return buildResult({ providerId, providerName, ok: false, configured: true, error: error instanceof Error ? error.message : 'Request failed' }); } };