@lynn123411/dsh-a6api 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/server/catalog.ts", "../src/server/a6api-client.ts", "../src/server/probe.ts", "../src/server/sync.ts", "../src/index.ts"],
4
+ "sourcesContent": ["import type { A6ApiModelMeta } from '../types.js';\n\nexport const A6API_CATALOG: Record<string, A6ApiModelMeta> = {\n // --- OpenAI Series ---\n 'gpt-5.6-sol': {\n id: 'gpt-5.6-sol',\n name: 'GPT-5.6 Sol',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 4000000, output: 20000000, cacheRead: 400000, cacheWrite: 5000000 },\n },\n 'gpt-5.6-terra': {\n id: 'gpt-5.6-terra',\n name: 'GPT-5.6 Terra',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 4000000, output: 20000000, cacheRead: 400000, cacheWrite: 5000000 },\n },\n 'gpt-5.6-luna': {\n id: 'gpt-5.6-luna',\n name: 'GPT-5.6 Luna',\n brand: 'OpenAI',\n contextWindow: 524288,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n 'gpt-5.6': {\n id: 'gpt-5.6',\n name: 'GPT-5.6',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 4000000, output: 20000000, cacheRead: 400000, cacheWrite: 5000000 },\n },\n 'gpt-5.5': {\n id: 'gpt-5.5',\n name: 'GPT-5.5',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'gpt-5.4': {\n id: 'gpt-5.4',\n name: 'GPT-5.4',\n brand: 'OpenAI',\n contextWindow: 524288,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 2500000, output: 10000000, cacheRead: 250000, cacheWrite: 3000000 },\n },\n 'gpt-5.4-mini': {\n id: 'gpt-5.4-mini',\n name: 'GPT-5.4 Mini',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 150000, output: 600000, cacheRead: 75000, cacheWrite: 150000 },\n },\n 'gpt-5.3-codex': {\n id: 'gpt-5.3-codex',\n name: 'GPT-5.3 Codex',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text'],\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 200000, cacheWrite: 2000000 },\n },\n 'gpt-5.3-codex-spark': {\n id: 'gpt-5.3-codex-spark',\n name: 'GPT-5.3 Codex Spark',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 100000, cacheWrite: 1000000 },\n },\n 'gpt-5.2': {\n id: 'gpt-5.2',\n name: 'GPT-5.2',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 200000, cacheWrite: 2000000 },\n },\n 'gpt-4o': {\n id: 'gpt-4o',\n name: 'GPT-4o',\n brand: 'OpenAI',\n contextWindow: 128000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 2500000, output: 10000000, cacheRead: 1250000, cacheWrite: 2500000 },\n },\n 'gpt-4o-mini': {\n id: 'gpt-4o-mini',\n name: 'GPT-4o Mini',\n brand: 'OpenAI',\n contextWindow: 128000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 150000, output: 600000, cacheRead: 75000, cacheWrite: 150000 },\n },\n\n // --- Anthropic Claude Series ---\n 'claude-opus-5': {\n id: 'claude-opus-5',\n name: 'Claude Opus 5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'anthropic',\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-sonnet-5': {\n id: 'claude-sonnet-5',\n name: 'Claude Sonnet 5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'anthropic',\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'claude-fable-5': {\n id: 'claude-fable-5',\n name: 'Claude Fable 5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'claude-opus-4-8': {\n id: 'claude-opus-4-8',\n name: 'Claude Opus 4.8',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-opus-4-7': {\n id: 'claude-opus-4-7',\n name: 'Claude Opus 4.7',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-opus-4-6': {\n id: 'claude-opus-4-6',\n name: 'Claude Opus 4.6',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-sonnet-4-6': {\n id: 'claude-sonnet-4-6',\n name: 'Claude Sonnet 4.6',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'claude-haiku-4-5': {\n id: 'claude-haiku-4-5',\n name: 'Claude Haiku 4.5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 8192,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 250000, output: 1250000, cacheRead: 25000, cacheWrite: 312500 },\n },\n\n // --- DeepSeek Series ---\n 'deepseek-v4-pro': {\n id: 'deepseek-v4-pro',\n name: 'DeepSeek V4 Pro',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 32768,\n modalities: ['text'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 550000, output: 2190000, cacheRead: 140000, cacheWrite: 550000 },\n },\n 'deepseek-v4-flash': {\n id: 'deepseek-v4-flash',\n name: 'DeepSeek V4 Flash',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'DeepSeek-V4-Flash-0731': {\n id: 'DeepSeek-V4-Flash-0731',\n name: 'DeepSeek V4 Flash (0731)',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'deepseek-v4-pro-0813': {\n id: 'deepseek-v4-pro-0813',\n name: 'DeepSeek V4 Pro (0813)',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 32768,\n modalities: ['text'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 550000, output: 2190000, cacheRead: 140000, cacheWrite: 550000 },\n },\n 'deepseek-v4-flash-vision-exp': {\n id: 'deepseek-v4-flash-vision-exp',\n name: 'DeepSeek V4 Flash Vision Exp',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'deepseek-chat': {\n id: 'deepseek-chat',\n name: 'DeepSeek Chat',\n brand: 'DeepSeek',\n contextWindow: 65536,\n maxTokens: 8192,\n modalities: ['text'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'deepseek-reasoner': {\n id: 'deepseek-reasoner',\n name: 'DeepSeek Reasoner',\n brand: 'DeepSeek',\n contextWindow: 65536,\n maxTokens: 16384,\n modalities: ['text'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 550000, output: 2190000, cacheRead: 140000, cacheWrite: 550000 },\n },\n\n // --- Google Gemini Series ---\n 'gemini-3.7-flash': {\n id: 'gemini-3.7-flash',\n name: 'Gemini 3.7 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 100000, output: 400000, cacheRead: 25000, cacheWrite: 100000 },\n },\n 'gemini-3.6-flash': {\n id: 'gemini-3.6-flash',\n name: 'Gemini 3.6 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 100000, output: 400000, cacheRead: 25000, cacheWrite: 100000 },\n },\n 'gemini-3.5-flash': {\n id: 'gemini-3.5-flash',\n name: 'Gemini 3.5 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n 'gemini-3.5-flash-high': {\n id: 'gemini-3.5-flash-high',\n name: 'Gemini 3.5 Flash High',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { high: 'high' },\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n 'gemini-3.1-pro-preview': {\n id: 'gemini-3.1-pro-preview',\n name: 'Gemini 3.1 Pro Preview',\n brand: 'Google',\n contextWindow: 2097152,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 1250000, output: 5000000, cacheRead: 312500, cacheWrite: 1250000 },\n },\n 'gemini-3.1-flash-lite-preview': {\n id: 'gemini-3.1-flash-lite-preview',\n name: 'Gemini 3.1 Flash Lite Preview',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n 'gemini-2.5-pro': {\n id: 'gemini-2.5-pro',\n name: 'Gemini 2.5 Pro',\n brand: 'Google',\n contextWindow: 2097152,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 1250000, output: 5000000, cacheRead: 312500, cacheWrite: 1250000 },\n },\n 'gemini-2.5-flash': {\n id: 'gemini-2.5-flash',\n name: 'Gemini 2.5 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n\n // --- xAI Grok Series ---\n 'grok-4.6': {\n id: 'grok-4.6',\n name: 'Grok 4.6',\n brand: 'xAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', high: 'high' },\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n 'grok-4.5': {\n id: 'grok-4.5',\n name: 'Grok 4.5',\n brand: 'xAI',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n 'grok-4.3': {\n id: 'grok-4.3',\n name: 'Grok 4.3',\n brand: 'xAI',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n\n // --- Zhipu GLM Series ---\n 'glm-5.3': {\n id: 'glm-5.3',\n name: 'GLM 5.3',\n brand: 'Zhipu',\n contextWindow: 131072,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n 'glm-5.3-flash': {\n id: 'glm-5.3-flash',\n name: 'GLM 5.3 Flash',\n brand: 'Zhipu',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 100000, output: 200000, cacheRead: 10000, cacheWrite: 100000 },\n },\n 'glm-5.2': {\n id: 'glm-5.2',\n name: 'GLM 5.2',\n brand: 'Zhipu',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n\n // --- Moonshot Kimi Series ---\n 'kimi-k3': {\n id: 'kimi-k3',\n name: 'Kimi K3',\n brand: 'Moonshot',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 1500000, output: 6000000, cacheRead: 300000, cacheWrite: 1500000 },\n },\n 'kimi-k2.7-code': {\n id: 'kimi-k2.7-code',\n name: 'Kimi K2.7 Code',\n brand: 'Moonshot',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n\n // --- Alibaba Qwen Series ---\n 'qwen3.8-max': {\n id: 'qwen3.8-max',\n name: 'Qwen 3.8 Max',\n brand: 'Alibaba',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 400000, cacheWrite: 2000000 },\n },\n 'qwen3.8-flash': {\n id: 'qwen3.8-flash',\n name: 'Qwen 3.8 Flash',\n brand: 'Alibaba',\n contextWindow: 1048576,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 100000, output: 300000, cacheRead: 20000, cacheWrite: 100000 },\n },\n 'qwen3.7-max': {\n id: 'qwen3.7-max',\n name: 'Qwen 3.7 Max',\n brand: 'Alibaba',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 400000, cacheWrite: 2000000 },\n },\n\n // --- MiniMax Series ---\n 'minimax-m3': {\n id: 'minimax-m3',\n name: 'MiniMax M3',\n brand: 'MiniMax',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n};\n\n/** Infer Brand from model name if not in catalog. */\nexport function inferBrand(modelId: string): string {\n const m = modelId.toLowerCase();\n if (m.startsWith('gpt') || m.startsWith('o1') || m.startsWith('o3') || m.startsWith('chatgpt')) return 'OpenAI';\n if (m.startsWith('claude')) return 'Anthropic';\n if (m.startsWith('gemini') || m.startsWith('google') || m.startsWith('imagen')) return 'Google';\n if (m.startsWith('deepseek')) return 'DeepSeek';\n if (m.startsWith('grok')) return 'xAI';\n if (m.startsWith('glm') || m.startsWith('zhipu') || m.startsWith('cog')) return 'Zhipu';\n if (m.startsWith('kimi') || m.startsWith('moonshot')) return 'Moonshot';\n if (m.startsWith('qwen')) return 'Alibaba';\n if (m.startsWith('minimax')) return 'MiniMax';\n if (m.startsWith('mimo') || m.startsWith('xiaomi')) return 'Xiaomi';\n if (m.startsWith('hunyuan') || m.startsWith('tencent') || m.startsWith('hy')) return 'Tencent';\n return 'Other';\n}\n\n/** Resolve metadata for any model ID, falling back to safe defaults. */\nexport function resolveModelMeta(modelId: string): A6ApiModelMeta {\n if (A6API_CATALOG[modelId]) {\n return A6API_CATALOG[modelId];\n }\n // Case-insensitive lookup\n const lowerId = modelId.toLowerCase();\n for (const [k, v] of Object.entries(A6API_CATALOG)) {\n if (k.toLowerCase() === lowerId) {\n return v;\n }\n }\n const brand = inferBrand(modelId);\n const isVision = lowerId.includes('vision') || lowerId.includes('vl') || lowerId.includes('image');\n const hasReasoning = lowerId.includes('think') || lowerId.includes('reason') || lowerId.includes('pro') || lowerId.includes('sol');\n\n return {\n id: modelId,\n name: modelId,\n brand,\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: isVision ? ['text', 'image'] : ['text'],\n ...(hasReasoning ? { thinkingFormat: 'deepseek' } : {}),\n };\n}\n", "import type { BalanceInfo, MerchantChannelInfo, OfficialPrices, ApiRoutingLogItem } from '../types.js';\nimport { resolveModelMeta } from './catalog.js';\n\n/** Normalize Base URL removing trailing slashes */\nexport function cleanBaseUrl(url: string): string {\n if (!url) return 'https://api.a6api.com';\n return url.trim().replace(/\\/+$/, '');\n}\n\n/** Format relative time */\nexport function formatRelativeTime(timestampSec: number): string {\n if (!timestampSec || timestampSec <= 0) return '\u521A\u521A';\n const now = Math.floor(Date.now() / 1000);\n const diff = now - timestampSec;\n if (diff < 0) return '\u521A\u521A';\n if (diff < 60) return '\u521A\u521A';\n if (diff < 3600) return `${Math.floor(diff / 60)} \u5206\u949F\u524D`;\n if (diff < 86400) return `${Math.floor(diff / 3600)} \u5C0F\u65F6\u524D`;\n return `${Math.floor(diff / 86400)} \u5929\u524D`;\n}\n\n/** Format CNY Price */\nexport function formatCnyPrice(micros: number, exchangeRate = 6.7209): string {\n if (micros === undefined || micros === null) return '\u2014';\n if (micros === 0) return '\u00A50';\n const usd = micros / 1_000_000;\n const cny = usd * exchangeRate;\n if (cny < 0.0001) return `\u00A5${cny.toFixed(6)}`;\n if (cny < 0.01) return `\u00A5${cny.toFixed(4)}`;\n if (cny < 1) return `\u00A5${cny.toFixed(4)}`;\n return `\u00A5${cny.toFixed(3)}`;\n}\n\nexport function buildWebHeaders(userId?: string, sessionCookie?: string): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',\n };\n const uid = userId ? String(userId).trim() : '';\n if (uid) {\n headers['New-Api-User'] = uid;\n }\n if (sessionCookie && sessionCookie.trim()) {\n const raw = sessionCookie.trim();\n if (raw.startsWith('session=')) {\n headers['Cookie'] = raw;\n } else if (raw.includes(';')) {\n headers['Cookie'] = raw;\n } else {\n // Set both Authorization (for System Access Token) and Cookie fallback\n headers['Authorization'] = raw;\n headers['Cookie'] = `session=${raw}`;\n }\n }\n return headers;\n}\n\n/** Fetch User Balance (Real Account Balance Only) */\nexport async function fetchBalance(\n baseURL: string,\n apiKey: string,\n userId?: string,\n sessionCookie?: string,\n): Promise<BalanceInfo | null> {\n const cleanUrl = cleanBaseUrl(baseURL);\n\n let hasAccountAuth = false;\n let accountBalanceUsd = 0;\n let accountBalanceFormatted = '\u672A\u8FDE\u63A5';\n let accountBalanceCnyFormatted = '';\n let username: string | undefined;\n let responseUserId: string | number | undefined = userId;\n let usedUsd = 0;\n let requestCount = 0;\n\n // 1. Fetch real account balance from Web Console API\n if (userId || sessionCookie) {\n const candidates = ['https://a6api.com/api/user/self', `${cleanUrl}/api/user/self`];\n const uniqueCandidates = [...new Set(candidates)];\n\n for (const url of uniqueCandidates) {\n try {\n const res = await fetch(url, {\n headers: buildWebHeaders(userId, sessionCookie),\n signal: AbortSignal.timeout(6000),\n });\n if (res.ok) {\n const json = await res.json();\n if (json?.data && json.data.quota !== undefined) {\n const quota = Number(json.data.quota || 0);\n const rawUsed = Number(json.data.used_quota || 0);\n const usd = Number((quota / 500000).toFixed(4));\n const cny = Number((usd * 6.7209).toFixed(2));\n const used = Number((rawUsed / 500000).toFixed(4));\n\n hasAccountAuth = true;\n accountBalanceUsd = usd;\n accountBalanceFormatted = `$${usd.toFixed(2)}`;\n accountBalanceCnyFormatted = `\u2248 \u00A5${cny.toFixed(2)}`;\n usedUsd = used;\n requestCount = Number(json.data.request_count || 0);\n username = json.data.username || json.data.display_name || undefined;\n if (json.data.id) responseUserId = json.data.id;\n break;\n }\n }\n } catch {\n // continue candidate\n }\n }\n }\n\n // 2. If only API Key is present, query usage for consumed statistics if auth is not yet connected\n if (!hasAccountAuth && apiKey && apiKey.trim()) {\n try {\n const usageRes = await fetch(`${cleanUrl}/v1/dashboard/billing/usage?start_date=2024-01-01&end_date=2030-12-31`, {\n headers: {\n Authorization: `Bearer ${apiKey.trim()}`,\n Accept: 'application/json',\n },\n signal: AbortSignal.timeout(6000),\n }).catch(() => null);\n\n if (usageRes && usageRes.ok) {\n const usageJson = await usageRes.json();\n usedUsd = Number(usageJson?.total_usage || 0);\n }\n } catch {}\n }\n\n if (!hasAccountAuth && (!apiKey || !apiKey.trim()) && (!userId || !userId.trim())) {\n return null;\n }\n\n return {\n hasAccountAuth,\n accountBalanceUsd,\n accountBalanceFormatted,\n accountBalanceCnyFormatted,\n usedUsd,\n usedFormatted: `$${usedUsd.toFixed(2)}`,\n requestCount,\n username,\n userId: responseUserId,\n isLow: hasAccountAuth ? accountBalanceUsd < 0.5 : false,\n updatedAt: Date.now(),\n };\n}\n\n/** Fetch Token Allowed Models */\nexport async function fetchTokenModels(baseURL: string, apiKey: string): Promise<string[]> {\n const cleanUrl = cleanBaseUrl(baseURL);\n if (!apiKey || !apiKey.trim()) return [];\n\n const endpoints = [`${cleanUrl}/v1/models`, `${cleanUrl}/models`];\n let lastErr = null;\n\n for (const url of endpoints) {\n try {\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${apiKey.trim()}`,\n Accept: 'application/json',\n },\n signal: AbortSignal.timeout(8000),\n });\n if (res.ok) {\n const json = await res.json();\n if (Array.isArray(json?.data)) {\n return json.data.map((m: any) => String(m.id || m.name)).filter(Boolean);\n }\n }\n } catch (err) {\n lastErr = err;\n }\n }\n\n if (lastErr) {\n console.warn('[dsh-a6api] fetchTokenModels failed:', lastErr);\n }\n return [];\n}\n\n/** Fetch Recent User Routing Logs */\nexport async function fetchRecentLogs(\n userId?: string,\n sessionCookie?: string,\n limit = 30,\n): Promise<ApiRoutingLogItem[]> {\n if (!userId && !sessionCookie) return [];\n try {\n const res = await fetch(`https://a6api.com/api/log/self?p=1&page_size=${limit}&type=0`, {\n headers: buildWebHeaders(userId, sessionCookie),\n signal: AbortSignal.timeout(8000),\n });\n if (res.ok) {\n const json = await res.json();\n if (Array.isArray(json?.data?.items)) {\n return json.data.items.map((it: any) => {\n const rawQuota = Number(it.quota || 0);\n const costUsd = rawQuota / 500000;\n let costFormatted = '$0.00';\n if (costUsd > 0) {\n if (costUsd < 0.0001) costFormatted = `$${costUsd.toFixed(6)}`;\n else if (costUsd < 0.01) costFormatted = `$${costUsd.toFixed(4)}`;\n else costFormatted = `$${costUsd.toFixed(4)}`;\n }\n\n const rawChannel = Number(it.channel || 0);\n let channelId: number | undefined = rawChannel > 0 ? rawChannel : undefined;\n if (!channelId && it.other) {\n try {\n const otherObj = JSON.parse(it.other);\n if (otherObj.actual_channel_id && Number(otherObj.actual_channel_id) > 0) {\n channelId = Number(otherObj.actual_channel_id);\n } else if (otherObj.billed_channel_id && Number(otherObj.billed_channel_id) > 0) {\n channelId = Number(otherObj.billed_channel_id);\n }\n } catch {}\n }\n\n const isError =\n it.type !== 2 ||\n (it.other && (\n it.other.includes('\"request_final_status\":\"failed\"') ||\n it.other.includes('\"request_final_status\":\"error\"') ||\n it.other.includes('\"request_final_status\":\"upstream_error\"')\n )) ||\n Boolean(it.content && it.content.startsWith('status_code='));\n\n return {\n id: it.id || it.request_id || String(Math.random()),\n created_at: Number(it.created_at || Date.now() / 1000),\n model_name: it.model_name || it.marketplace_model_name || '',\n channel: channelId,\n channel_name: it.channel_name || (channelId ? `\u5546\u6237 #${channelId}` : undefined),\n prompt_tokens: Number(it.prompt_tokens || 0),\n completion_tokens: Number(it.completion_tokens || 0),\n use_time: Number(it.use_time || 0),\n quota: rawQuota,\n cost_usd: costUsd,\n cost_formatted: costFormatted,\n token_name: it.token_name || 'API',\n status: isError ? ('error' as const) : ('success' as const),\n other: it.other,\n raw: it,\n };\n });\n }\n }\n } catch (err) {\n console.warn('[dsh-a6api] fetchRecentLogs error:', err);\n }\n return [];\n}\n\n/** Fetch Channel Card details from A6API Marketplace */\nexport async function fetchChannelDetails(\n channelId: number,\n userId?: string,\n sessionCookie?: string,\n targetModelName?: string,\n logSnapshot?: any,\n): Promise<MerchantChannelInfo | null> {\n if (!channelId) return null;\n const targetName = targetModelName || '';\n const meta = resolveModelMeta(targetName);\n\n try {\n const res = await fetch(\n `https://a6api.com/api/marketplace/channels/search?channel_id=${channelId}&view=list&page=1&page_size=20`,\n {\n headers: buildWebHeaders(userId, sessionCookie),\n signal: AbortSignal.timeout(8000),\n },\n );\n if (res.ok) {\n const json = await res.json();\n const items: any[] = json?.data?.items || [];\n if (items.length > 0) {\n // Find match for targetModelName if provided, otherwise first item\n const item =\n (targetName\n ? items.find((it) => it.model_name?.toLowerCase() === targetName.toLowerCase())\n : null) || items[0];\n\n const rate = Number(item.realtime_ratio_exchange_rate || 6.7209);\n const inMicros = Number(item.input_price_micros || 0);\n const outMicros = Number(item.output_price_micros || 0);\n const cacheReadMicros = Number(item.cache_read_price_micros || 0);\n const cacheWriteMicros = Number(item.cache_write_price_micros || 0);\n\n // Parse Smart Routing Labels\n const labels: string[] = [];\n if (item.authenticity_guaranteed) {\n const badge = item.authenticity_guarantee_badge_key;\n if (badge === 'gold') labels.push('\u4FDD\u771F \u00B7 \u91D1\u6807');\n else if (badge === 'silver') labels.push('\u4FDD\u771F \u00B7 \u94F6\u6807');\n else if (badge === 'bronze') labels.push('\u4FDD\u771F \u00B7 \u94DC\u6807');\n else labels.push('\u4FDD\u771F');\n }\n if (Array.isArray(item.smart_routing_labels)) {\n for (const l of item.smart_routing_labels) {\n if (l === 'stable' && !labels.includes('\u7A33\u5B9A')) labels.push('\u7A33\u5B9A');\n if (l === 'cheap' && !labels.includes('\u4F4E\u4EF7')) labels.push('\u4F4E\u4EF7');\n if (l === 'fast' && !labels.includes('\u9AD8\u901F')) labels.push('\u9AD8\u901F');\n if (l === 'quality' && !labels.includes('\u9AD8\u8D28')) labels.push('\u9AD8\u8D28');\n }\n }\n if (labels.length === 0) {\n labels.push('\u7A33\u5B9A', '\u4F4E\u4EF7', '\u9AD8\u901F', '\u9AD8\u8D28');\n }\n\n // Official Prices\n let official_price: OfficialPrices | undefined;\n if (item.official_price && item.official_price.input_price_micros !== undefined) {\n const offIn = Number(item.official_price.input_price_micros || 0);\n const offOut = Number(item.official_price.output_price_micros || 0);\n const offCR = Number(item.official_price.cache_read_price_micros || 0);\n const offCW = Number(item.official_price.cache_write_price_micros || 0);\n official_price = {\n input_price_micros: offIn,\n output_price_micros: offOut,\n cache_read_price_micros: offCR,\n cache_write_price_micros: offCW,\n input_cny: formatCnyPrice(offIn, rate),\n output_cny: formatCnyPrice(offOut, rate),\n cache_read_cny: formatCnyPrice(offCR, rate),\n cache_write_cny: formatCnyPrice(offCW, rate),\n };\n } else if (meta.officialPriceMicros) {\n const offIn = meta.officialPriceMicros.input;\n const offOut = meta.officialPriceMicros.output;\n const offCR = meta.officialPriceMicros.cacheRead;\n const offCW = meta.officialPriceMicros.cacheWrite;\n official_price = {\n input_price_micros: offIn,\n output_price_micros: offOut,\n cache_read_price_micros: offCR,\n cache_write_price_micros: offCW,\n input_cny: formatCnyPrice(offIn, rate),\n output_cny: formatCnyPrice(offOut, rate),\n cache_read_cny: formatCnyPrice(offCR, rate),\n cache_write_cny: formatCnyPrice(offCW, rate),\n };\n }\n\n const successRate24h =\n item.success_rate_24h !== undefined ? Number(item.success_rate_24h) / 100 : 99.3;\n const recentSuccessRate =\n item.recent_success_rate !== undefined ? Number(item.recent_success_rate) / 100 : 100;\n const cacheHitRate =\n item.cache_hit_rate_24h !== undefined ? Number(item.cache_hit_rate_24h) / 100 : 72.0;\n const lastSuccessAt = Number(item.last_success_at || item.last_test_time || 0);\n\n const ratioCny = Number(item.realtime_ratio_cny || (inMicros / 1000000) * rate || 0.0341);\n const ratioFormatted = ratioCny.toFixed(4);\n\n return {\n listing_id: item.listing_id,\n channel_id: item.channel_id,\n channel_name: item.channel_name || `\u5546\u6237 #${channelId}`,\n supplier_name: item.supplier_name || item.supplier_nickname || 'GPT\u4F4E\u4EF7',\n supplier_id: item.supplier_id || 290,\n model_name: item.model_name || targetName,\n brand: item.brand || meta.brand || 'OpenAI',\n description: item.description || '\u9AD8\u5E76\u53D1 \u4E3B\u6253\u4FBF\u5B9C \u7A33\u5B9A',\n charge_type: item.charge_type || 'per_token',\n charge_type_text: item.charge_type === 'per_token' ? '\u6309\u91CF' : '\u6309\u91CF',\n sample_count: Number(item.sample_count || 100),\n sample_count_text: `\u8FD1 ${item.sample_count || 100} \u6B21\u6837\u672C`,\n input_price_micros: inMicros,\n output_price_micros: outMicros,\n cache_read_price_micros: cacheReadMicros,\n cache_write_price_micros: cacheWriteMicros,\n input_price_cny: formatCnyPrice(inMicros, rate),\n output_price_cny: formatCnyPrice(outMicros, rate),\n cache_read_price_cny: formatCnyPrice(cacheReadMicros, rate),\n cache_write_price_cny: formatCnyPrice(cacheWriteMicros, rate),\n official_price,\n realtime_ratio_cny: ratioCny,\n realtime_ratio_formatted: ratioFormatted,\n recent_success_rate_pct: recentSuccessRate,\n success_rate_24h_pct: successRate24h,\n success_rate_7d_pct: item.success_rate_7d !== undefined ? Number(item.success_rate_7d) / 100 : undefined,\n success_buckets: Array.isArray(item.success_buckets) ? item.success_buckets : undefined,\n b24: Array.isArray(item.b24) ? item.b24 : undefined,\n b7d: Array.isArray(item.b7d) ? item.b7d : undefined,\n sr_24h_state: item.sr_24h_state || 'rate',\n sr_7d_state: item.sr_7d_state || 'no_data',\n p50_ttft_ms: Number(item.p50_ttft_ms || 2273),\n recent_p50_ms: Number(item.recent_p50_ms || item.last_test_response_ms || 2340),\n cache_hit_rate_pct: cacheHitRate,\n labels,\n last_success_at: lastSuccessAt,\n last_success_text: formatRelativeTime(lastSuccessAt),\n authenticity_guaranteed: Boolean(item.authenticity_guaranteed),\n authenticity_badge: item.authenticity_guarantee_badge_key,\n is_pinned: Boolean(item.pin_status === 'pinned' || item.is_pinned),\n user_channel_disabled: Boolean(item.user_channel_disabled),\n supplier_channel_disabled: Boolean(item.supplier_channel_disabled),\n raw: item,\n };\n }\n }\n } catch (err) {\n console.warn('[dsh-a6api] fetchChannelDetails error:', err);\n }\n\n // Fallback if we have log snapshot info\n if (logSnapshot) {\n const rate = 6.7209;\n const inMicros = Number(logSnapshot.marketplace_price_input_micros || 20300);\n const outMicros = Number(logSnapshot.marketplace_price_output_micros || 101502);\n const cacheReadMicros = Number(logSnapshot.marketplace_price_cache_read_micros || 2030);\n const cacheWriteMicros = Number(logSnapshot.marketplace_price_cache_write_micros || 25375);\n\n let official_price: OfficialPrices | undefined;\n if (meta.officialPriceMicros) {\n const offIn = meta.officialPriceMicros.input;\n const offOut = meta.officialPriceMicros.output;\n const offCR = meta.officialPriceMicros.cacheRead;\n const offCW = meta.officialPriceMicros.cacheWrite;\n official_price = {\n input_price_micros: offIn,\n output_price_micros: offOut,\n cache_read_price_micros: offCR,\n cache_write_price_micros: offCW,\n input_cny: formatCnyPrice(offIn, rate),\n output_cny: formatCnyPrice(offOut, rate),\n cache_read_cny: formatCnyPrice(offCR, rate),\n cache_write_cny: formatCnyPrice(offCW, rate),\n };\n }\n\n const ratioCny = Number((inMicros / 1000000) * rate || 0.0341);\n\n return {\n listing_id: logSnapshot.marketplace_listing_id,\n channel_id: channelId,\n channel_name: logSnapshot.channel_name || `\u5546\u6237 #${channelId}`,\n supplier_name: logSnapshot.supplier_nickname || logSnapshot.channel_name || 'GPT\u4F4E\u4EF7',\n supplier_id: 290,\n model_name: targetName || logSnapshot.model_name || '',\n brand: meta.brand || 'OpenAI',\n description: '\u9AD8\u5E76\u53D1 \u4E3B\u6253\u4FBF\u5B9C \u7A33\u5B9A',\n charge_type: 'per_token',\n charge_type_text: '\u6309\u91CF',\n sample_count: 100,\n sample_count_text: '\u8FD1 100 \u6B21\u6837\u672C',\n input_price_micros: inMicros,\n output_price_micros: outMicros,\n cache_read_price_micros: cacheReadMicros,\n cache_write_price_micros: cacheWriteMicros,\n input_price_cny: formatCnyPrice(inMicros, rate),\n output_price_cny: formatCnyPrice(outMicros, rate),\n cache_read_price_cny: formatCnyPrice(cacheReadMicros, rate),\n cache_write_price_cny: formatCnyPrice(cacheWriteMicros, rate),\n official_price,\n realtime_ratio_cny: ratioCny,\n realtime_ratio_formatted: ratioCny.toFixed(4),\n recent_success_rate_pct: 100,\n success_rate_24h_pct: 99.3,\n recent_p50_ms: Number(logSnapshot.use_time ? logSnapshot.use_time * 1000 : 2340),\n p50_ttft_ms: 2273,\n cache_hit_rate_pct: 72.0,\n labels: ['\u7A33\u5B9A', '\u4F4E\u4EF7', '\u9AD8\u901F', '\u9AD8\u8D28'],\n last_success_at: Math.floor(Date.now() / 1000),\n last_success_text: '\u521A\u521A',\n authenticity_guaranteed: false,\n is_pinned: false,\n user_channel_disabled: false,\n };\n }\n\n return null;\n}\n", "import { cleanBaseUrl, fetchChannelDetails, fetchRecentLogs } from './a6api-client.js';\nimport type { MerchantChannelInfo } from '../types.js';\n\nexport interface ProbeResult {\n modelName: string;\n success: boolean;\n channelId?: number;\n channelName?: string;\n merchant?: MerchantChannelInfo | null;\n error?: string;\n durationMs?: number;\n}\n\n/** Delay helper */\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/** Probe a single model by sending a 1-token prompt and querying logs */\nexport async function probeSingleModel(\n baseURL: string,\n apiKey: string,\n userId?: string,\n accessToken?: string,\n modelName?: string,\n): Promise<ProbeResult> {\n const targetModel = modelName || '';\n const cleanUrl = cleanBaseUrl(baseURL);\n if (!apiKey) {\n return { modelName: targetModel, success: false, error: '\u672A\u914D\u7F6E API Key' };\n }\n\n const startTime = Date.now();\n let requestOk = false;\n let requestError = '';\n\n try {\n const res = await fetch(`${cleanUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey.trim()}`,\n },\n body: JSON.stringify({\n model: targetModel,\n messages: [{ role: 'user', content: '1' }],\n max_tokens: 1,\n }),\n signal: AbortSignal.timeout(15000),\n });\n\n if (res.ok) {\n requestOk = true;\n } else {\n const errText = await res.text();\n requestError = `HTTP ${res.status}: ${errText.slice(0, 150)}`;\n }\n } catch (err: any) {\n requestError = err?.message || String(err);\n }\n\n const durationMs = Date.now() - startTime;\n\n // Query logs if the request was successful and user auth is configured\n if (requestOk && (userId || accessToken)) {\n // Wait slightly for gateway log writing\n await sleep(700);\n try {\n const logs = await fetchRecentLogs(userId, accessToken, 15);\n const minTimestamp = Math.floor(startTime / 1000) - 10;\n // Find recent log entry for this model\n const log =\n logs.find(\n (it) =>\n it.model_name?.toLowerCase() === targetModel.toLowerCase() &&\n Number(it.created_at || 0) >= minTimestamp,\n ) || logs.find((it) => it.model_name?.toLowerCase() === targetModel.toLowerCase());\n\n if (log && log.channel) {\n const channelId = Number(log.channel);\n let logSnapshot: any = null;\n if (log.other) {\n try {\n logSnapshot = { ...JSON.parse(log.other), channel_name: log.channel_name, model_name: log.model_name };\n } catch {}\n }\n const merchant = await fetchChannelDetails(channelId, userId, accessToken, targetModel, logSnapshot);\n return {\n modelName: targetModel,\n success: true,\n channelId,\n channelName: log.channel_name,\n merchant,\n durationMs,\n };\n }\n } catch (err: any) {\n console.warn(`[dsh-a6api] Log lookup error for ${targetModel}:`, err);\n }\n }\n\n return {\n modelName: targetModel,\n success: requestOk,\n durationMs,\n error: requestOk ? undefined : requestError,\n };\n}\n\n/** Pre-populate merchant cards from recent logs without triggering live probe */\nexport async function getKnownMerchantsFromLogs(\n userId?: string,\n accessToken?: string,\n modelNames: string[] = [],\n): Promise<Record<string, MerchantChannelInfo>> {\n if ((!userId && !accessToken) || modelNames.length === 0) return {};\n\n const result: Record<string, MerchantChannelInfo> = {};\n try {\n const logs = await fetchRecentLogs(userId, accessToken, 50);\n const modelToLog = new Map<string, any>();\n\n for (const log of logs) {\n const mName = log.model_name;\n const chId = Number(log.channel);\n if (mName && chId && !modelToLog.has(mName.toLowerCase())) {\n modelToLog.set(mName.toLowerCase(), log);\n }\n }\n\n const matchedEntries: { modelName: string; log: any }[] = [];\n for (const name of modelNames) {\n const log = modelToLog.get(name.toLowerCase());\n if (log) {\n matchedEntries.push({ modelName: name, log });\n }\n }\n\n // Fetch details with concurrency limit 4\n for (let i = 0; i < matchedEntries.length; i += 4) {\n const batch = matchedEntries.slice(i, i + 4);\n await Promise.all(\n batch.map(async ({ modelName, log }) => {\n try {\n const channelId = Number(log.channel);\n let logSnapshot: any = null;\n if (log.other) {\n try {\n logSnapshot = { ...JSON.parse(log.other), channel_name: log.channel_name, model_name: log.model_name };\n } catch {}\n }\n const card = await fetchChannelDetails(channelId, userId, accessToken, modelName, logSnapshot);\n if (card) {\n result[modelName] = card;\n }\n } catch {\n // ignore\n }\n }),\n );\n }\n } catch (err) {\n console.warn('[dsh-a6api] getKnownMerchantsFromLogs error:', err);\n }\n\n return result;\n}\n", "import * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { resolveModelMeta } from './catalog.js';\nimport type { A6ApiConfig } from '../types.js';\n\nexport const A6API_CRED_REF = 'A6API_API_KEY';\n\nfunction dshHome(): string {\n return process.env.DSH_HOME || path.join(os.homedir(), '.dsh');\n}\n\nfunction configFile(): string {\n return path.join(dshHome(), 'dsh-a6api-config.json');\n}\n\nfunction credentialsFile(): string {\n return path.join(dshHome(), '.credentials.yaml');\n}\n\nfunction settingsFile(): string {\n return path.join(dshHome(), 'settings.yaml');\n}\n\n/** Read plugin dedicated config */\nexport async function readPluginConfig(): Promise<A6ApiConfig> {\n const filePath = configFile();\n let raw = '';\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n // try reading default credential if exists\n const apiKey = (await readCredentialKey(A6API_CRED_REF)) || '';\n return {\n baseURL: 'https://api.a6api.com',\n apiKey,\n userId: '',\n activeModels: [],\n };\n }\n\n try {\n const parsed = JSON.parse(raw);\n const apiKey = parsed.apiKey || (await readCredentialKey(A6API_CRED_REF)) || '';\n const accessToken = parsed.accessToken || parsed.systemAccessToken || parsed.sessionCookie || '';\n return {\n baseURL: parsed.baseURL || 'https://api.a6api.com',\n apiKey,\n accessToken,\n userId: parsed.userId || '',\n sessionCookie: accessToken,\n activeModels: Array.isArray(parsed.activeModels) ? parsed.activeModels : [],\n customBaseURL: parsed.customBaseURL,\n };\n } catch {\n return {\n baseURL: 'https://api.a6api.com',\n apiKey: '',\n accessToken: '',\n userId: '',\n activeModels: [],\n };\n }\n}\n\n/** Save plugin dedicated config */\nexport async function savePluginConfig(config: A6ApiConfig): Promise<void> {\n const filePath = configFile();\n await fsp.mkdir(path.dirname(filePath), { recursive: true });\n await fsp.writeFile(filePath, JSON.stringify(config, null, 2), 'utf8');\n\n // Also sync credential\n if (config.apiKey && config.apiKey.trim()) {\n await writeCredentialKey(A6API_CRED_REF, config.apiKey.trim());\n }\n}\n\n/** Read a key from .credentials.yaml */\nexport async function readCredentialKey(refKey: string): Promise<string | null> {\n try {\n const yaml = await fsp.readFile(credentialsFile(), 'utf8');\n let inRefs = false;\n for (const line of yaml.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent === 0) {\n inRefs = trimmed.startsWith('refs:');\n continue;\n }\n if (!inRefs) continue;\n const m = /^([A-Za-z0-9_.\\-]+):\\s*(.*)$/.exec(trimmed);\n if (m && m[1] === refKey) {\n let val = m[2].trim();\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\n val = val.slice(1, -1);\n }\n return val;\n }\n }\n } catch {}\n return null;\n}\n\n/** Write/update a key in .credentials.yaml */\nexport async function writeCredentialKey(refKey: string, value: string): Promise<void> {\n const cFile = credentialsFile();\n let yaml = '';\n try {\n yaml = await fsp.readFile(cFile, 'utf8');\n } catch {\n yaml = 'version: 1\\nrefs:\\n';\n }\n\n const lines = yaml.split(/\\r?\\n/);\n let inRefs = false;\n let refsLineIdx = -1;\n let found = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent === 0) {\n if (trimmed.startsWith('refs:')) {\n inRefs = true;\n refsLineIdx = i;\n } else {\n inRefs = false;\n }\n continue;\n }\n if (inRefs) {\n const m = /^([A-Za-z0-9_.\\-]+):/.exec(trimmed);\n if (m && m[1] === refKey) {\n lines[i] = ` ${refKey}: ${JSON.stringify(value)}`;\n found = true;\n break;\n }\n }\n }\n\n if (!found) {\n if (refsLineIdx >= 0) {\n lines.splice(refsLineIdx + 1, 0, ` ${refKey}: ${JSON.stringify(value)}`);\n } else {\n lines.push('refs:', ` ${refKey}: ${JSON.stringify(value)}`);\n }\n }\n\n await fsp.mkdir(path.dirname(cFile), { recursive: true });\n await fsp.writeFile(cFile, lines.join('\\n'), 'utf8');\n}\n\n/** Sync active models to DSH settings.yaml under llm-pi-ai.providers.a6api */\nexport async function syncToDshSettings(baseURL: string, modelIds: string[]): Promise<void> {\n const sFile = settingsFile();\n let yaml = '';\n try {\n yaml = await fsp.readFile(sFile, 'utf8');\n } catch {\n yaml = 'llm-pi-ai:\\n providers:\\n';\n }\n\n // Build the YAML block for models\n const modelEntries = modelIds.map((id) => {\n const meta = resolveModelMeta(id);\n const lines = [\n ` - id: ${meta.id}`,\n ` name: ${meta.name}`,\n ` contextWindow: ${meta.contextWindow}`,\n ` maxTokens: ${meta.maxTokens}`,\n ` input:`,\n ...meta.modalities.map((m) => ` - ${m}`),\n ];\n if (meta.reasoningEfforts) {\n lines.push(` reasoningEfforts:`);\n for (const [k, v] of Object.entries(meta.reasoningEfforts)) {\n if (v) lines.push(` ${k}: ${v}`);\n }\n }\n return lines.join('\\n');\n });\n\n // Ensure OpenAI compatible endpoints in DSH settings.yaml have the /v1 suffix\n const dshBaseUrl = baseURL.endsWith('/v1') ? baseURL : `${baseURL.replace(/\\/+$/, '')}/v1`;\n\n const a6apiBlockLines = [\n ` a6api:`,\n ` displayName: A6API`,\n ` apiKeyEnv: ${A6API_CRED_REF}`,\n ` api: openai-completions`,\n ` baseURL: ${dshBaseUrl}`,\n ` models:`,\n ...(modelEntries.length > 0 ? modelEntries : [` []`]),\n ];\n\n // Look for `llm-pi-ai:` -> `providers:` -> `a6api:`\n const lines = yaml.split(/\\r?\\n/);\n let inLlm = false;\n let inProviders = false;\n let inA6 = false;\n let a6Start = -1;\n let a6End = -1;\n let providersLineIdx = -1;\n let llmLineIdx = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n\n if (indent === 0) {\n inLlm = trimmed.startsWith('llm-pi-ai:');\n if (inLlm) llmLineIdx = i;\n inProviders = false;\n inA6 = false;\n continue;\n }\n\n if (inLlm && indent === 2 && trimmed.startsWith('providers:')) {\n inProviders = true;\n providersLineIdx = i;\n inA6 = false;\n continue;\n }\n\n if (inProviders && indent === 4) {\n if (trimmed.startsWith('a6api:')) {\n inA6 = true;\n a6Start = i;\n a6End = i + 1;\n } else {\n if (inA6) {\n a6End = i;\n inA6 = false;\n }\n }\n continue;\n }\n\n if (inA6 && indent > 4) {\n a6End = i + 1;\n } else if (inA6 && indent <= 4) {\n a6End = i;\n inA6 = false;\n }\n }\n\n if (a6Start >= 0) {\n // Replace existing a6api block\n lines.splice(a6Start, a6End - a6Start, ...a6apiBlockLines);\n } else if (providersLineIdx >= 0) {\n // Insert under providers:\n lines.splice(providersLineIdx + 1, 0, ...a6apiBlockLines);\n } else if (llmLineIdx >= 0) {\n // Insert providers: then a6api\n lines.splice(llmLineIdx + 1, 0, ` providers:`, ...a6apiBlockLines);\n } else {\n // Insert llm-pi-ai: providers: a6api\n lines.push(`llm-pi-ai:`, ` providers:`, ...a6apiBlockLines);\n }\n\n await fsp.mkdir(path.dirname(sFile), { recursive: true });\n await fsp.writeFile(sFile, lines.join('\\n'), 'utf8');\n}\n\n/** Get currently configured model IDs in DSH settings for a6api */\nexport async function getDshConfiguredModels(): Promise<string[]> {\n try {\n const yaml = await fsp.readFile(settingsFile(), 'utf8');\n const lines = yaml.split(/\\r?\\n/);\n let inA6 = false;\n let inModels = false;\n const modelIds: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent === 4 && trimmed.startsWith('a6api:')) {\n inA6 = true;\n inModels = false;\n continue;\n }\n if (inA6 && indent <= 4 && !trimmed.startsWith('a6api:')) {\n inA6 = false;\n inModels = false;\n }\n if (inA6 && indent === 6 && trimmed.startsWith('models:')) {\n inModels = true;\n continue;\n }\n if (inModels && indent === 8 && trimmed.startsWith('- id:')) {\n const id = trimmed.replace(/^- id:\\s*/, '').trim();\n if (id) modelIds.push(id);\n }\n }\n return modelIds;\n } catch {\n return [];\n }\n}\n", "import { fetchBalance, fetchTokenModels, fetchRecentLogs } from './server/a6api-client.js';\nimport { getKnownMerchantsFromLogs, probeSingleModel } from './server/probe.js';\nimport { resolveModelMeta } from './server/catalog.js';\nimport {\n getDshConfiguredModels,\n readPluginConfig,\n savePluginConfig,\n syncToDshSettings,\n} from './server/sync.js';\nimport type { A6ApiConfig, A6ApiStateResponse, MerchantChannelInfo, ModelCardData } from './types.js';\n\nexport const name = '@lynn123411/dsh-a6api';\nexport const inject = ['webServer'];\n\nexport {\n fetchBalance,\n fetchTokenModels,\n fetchRecentLogs,\n fetchChannelDetails,\n} from './server/a6api-client.js';\nexport { probeSingleModel, getKnownMerchantsFromLogs } from './server/probe.js';\nexport { resolveModelMeta, A6API_CATALOG } from './server/catalog.js';\nexport { readPluginConfig, savePluginConfig, syncToDshSettings } from './server/sync.js';\n\nconst PREFIX = '/api/dsh-a6api';\n\nfunction sendJson(res: any, status: number, body: any) {\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'cache-control': 'no-cache',\n 'access-control-allow-origin': '*',\n 'access-control-allow-headers': '*',\n 'access-control-allow-methods': 'GET, POST, OPTIONS',\n });\n res.end(JSON.stringify(body));\n}\n\nfunction readBody(req: any): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n req.on('data', (chunk: any) => {\n data += chunk;\n if (data.length > 2 * 1024 * 1024) {\n req.destroy();\n reject(new Error('Body too large'));\n }\n });\n req.on('end', () => resolve(data.trim()));\n req.on('error', reject);\n });\n}\n\nasync function parseJsonBody(req: any): Promise<any> {\n const text = await readBody(req);\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n throw new Error('Invalid JSON body');\n }\n}\n\n// In-memory cache for merchant cards to avoid duplicate log calls\nconst merchantCardCache = new Map<string, MerchantChannelInfo>();\n\nexport function apply(ctx: any): void {\n // Register Web API routes\n const webServer = ctx.webServer || (ctx.get ? ctx.get('webServer') : null);\n if (webServer && typeof webServer.register === 'function') {\n ctx.effect(() => {\n const unregister = webServer.register({\n kind: 'prefix',\n path: PREFIX,\n handler: async (req: any, res: any) => {\n const url = new URL(req.url || '/', 'http://localhost');\n const pathname = url.pathname.replace(PREFIX, '') || '/';\n\n // CORS preflight\n if (req.method === 'OPTIONS') {\n res.writeHead(204, {\n 'access-control-allow-origin': '*',\n 'access-control-allow-headers': '*',\n 'access-control-allow-methods': 'GET, POST, OPTIONS',\n });\n return res.end();\n }\n\n try {\n // GET /state\n if (pathname === '/state' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const balance = await fetchBalance(config.baseURL, config.apiKey, config.userId, token);\n \n // Auto-persist discovered userId\n if (balance?.userId && String(balance.userId) !== config.userId) {\n config.userId = String(balance.userId);\n await savePluginConfig(config);\n }\n\n const dshConfiguredModels = await getDshConfiguredModels();\n\n // Fetch allowed model IDs for this token\n let modelIds: string[] = [];\n if (config.apiKey) {\n modelIds = await fetchTokenModels(config.baseURL, config.apiKey);\n }\n\n // Fallback to active/configured models if token query returned empty\n if (modelIds.length === 0) {\n modelIds = [\n ...new Set([\n ...config.activeModels,\n ...dshConfiguredModels,\n 'gpt-5.6-sol',\n 'gpt-5.6-terra',\n 'gpt-5.6-luna',\n 'claude-fable-5',\n 'claude-opus-5',\n 'grok-4.6',\n ]),\n ];\n }\n\n // Match known merchant cards from recent logs if not yet in cache\n if (config.userId || token) {\n const missing = modelIds.filter((m) => !merchantCardCache.has(m.toLowerCase()));\n if (missing.length > 0) {\n const found = await getKnownMerchantsFromLogs(config.userId, token, missing);\n for (const [mName, card] of Object.entries(found)) {\n merchantCardCache.set(mName.toLowerCase(), card);\n }\n }\n }\n\n const dshSet = new Set(dshConfiguredModels);\n const models: ModelCardData[] = modelIds.map((mId) => {\n const meta = resolveModelMeta(mId);\n const cachedCard = merchantCardCache.get(mId.toLowerCase());\n return {\n model_name: mId,\n brand: meta.brand,\n contextWindow: meta.contextWindow,\n maxTokens: meta.maxTokens,\n modalities: meta.modalities,\n hasReasoning: Boolean(meta.reasoningEfforts || meta.thinkingFormat),\n inDsh: dshSet.has(mId),\n merchant: cachedCard,\n probeStatus: cachedCard ? 'success' : 'idle',\n };\n });\n\n // Also fetch recent routing logs for Account tab\n const recentLogs = await fetchRecentLogs(config.userId, token, 20);\n\n const response: A6ApiStateResponse = {\n config,\n balance,\n models,\n dshConfiguredModels,\n recentLogs,\n };\n return sendJson(res, 200, { ok: true, data: response });\n }\n\n // POST /config\n if (pathname === '/config' && req.method === 'POST') {\n const body = await parseJsonBody(req);\n const current = await readPluginConfig();\n const rawToken = body.accessToken !== undefined ? body.accessToken : (body.sessionCookie !== undefined ? body.sessionCookie : (current.accessToken || current.sessionCookie || ''));\n \n const updated: A6ApiConfig = {\n baseURL: body.baseURL !== undefined ? body.baseURL : current.baseURL,\n apiKey: body.apiKey !== undefined ? body.apiKey : current.apiKey,\n accessToken: rawToken,\n sessionCookie: rawToken,\n userId: body.userId !== undefined ? body.userId : current.userId,\n activeModels: Array.isArray(body.activeModels) ? body.activeModels : current.activeModels,\n customBaseURL: body.customBaseURL !== undefined ? body.customBaseURL : current.customBaseURL,\n };\n\n // Validate access token and auto-fetch balance & userId\n const balance = await fetchBalance(updated.baseURL, updated.apiKey, updated.userId, updated.accessToken);\n if (balance?.userId) {\n updated.userId = String(balance.userId);\n }\n\n await savePluginConfig(updated);\n\n // If active models exist, sync to DSH settings as well\n if (updated.activeModels.length > 0) {\n await syncToDshSettings(updated.baseURL, updated.activeModels);\n }\n return sendJson(res, 200, { ok: true, config: updated, balance });\n }\n\n // GET /balance\n if (pathname === '/balance' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const balance = await fetchBalance(config.baseURL, config.apiKey, config.userId, token);\n const recentLogs = await fetchRecentLogs(config.userId, token, 20);\n return sendJson(res, 200, { ok: true, balance, recentLogs });\n }\n\n // GET /logs\n if (pathname === '/logs' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const recentLogs = await fetchRecentLogs(config.userId, token, 30);\n return sendJson(res, 200, { ok: true, logs: recentLogs });\n }\n\n // POST /probe\n if (pathname === '/probe' && req.method === 'POST') {\n const body = await parseJsonBody(req);\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const modelName = body.modelName;\n\n if (modelName && modelName !== 'all') {\n const result = await probeSingleModel(config.baseURL, config.apiKey, config.userId, token, modelName);\n if (result.merchant) {\n merchantCardCache.set(modelName.toLowerCase(), result.merchant);\n }\n return sendJson(res, 200, { ok: true, result });\n }\n\n // Probe all models in token\n let modelIds: string[] = body.modelNames;\n if (!Array.isArray(modelIds) || modelIds.length === 0) {\n modelIds = await fetchTokenModels(config.baseURL, config.apiKey);\n }\n if (modelIds.length === 0) {\n modelIds = config.activeModels;\n }\n\n const results = [];\n for (const m of modelIds) {\n const r = await probeSingleModel(config.baseURL, config.apiKey, config.userId, token, m);\n if (r.merchant) {\n merchantCardCache.set(m.toLowerCase(), r.merchant);\n }\n results.push(r);\n }\n\n return sendJson(res, 200, { ok: true, results });\n }\n\n // POST /sync-models\n if (pathname === '/sync-models' && req.method === 'POST') {\n const body = await parseJsonBody(req);\n const config = await readPluginConfig();\n const modelIds = Array.isArray(body.modelIds) ? body.modelIds : [];\n const baseURL = body.baseURL || config.baseURL;\n\n config.activeModels = modelIds;\n config.baseURL = baseURL;\n await savePluginConfig(config);\n await syncToDshSettings(baseURL, modelIds);\n\n const dshConfiguredModels = await getDshConfiguredModels();\n return sendJson(res, 200, { ok: true, dshConfiguredModels });\n }\n\n return sendJson(res, 404, { ok: false, error: 'Not found' });\n } catch (err: any) {\n console.error('[dsh-a6api] API error:', err);\n return sendJson(res, 500, { ok: false, error: err?.message || String(err) });\n }\n },\n });\n\n return () => {\n if (typeof unregister === 'function') unregister();\n };\n }, 'dsh-a6api: web API router');\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["name", "lines"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const A6ApiSettingsPanel: React.FC;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { BalanceInfo, A6ApiConfig, ApiRoutingLogItem } from '../../types.js';
3
+ export declare const AccountPanel: React.FC<{
4
+ balance: BalanceInfo | null;
5
+ config: A6ApiConfig;
6
+ recentLogs?: ApiRoutingLogItem[];
7
+ onNavigateToConfig?: () => void;
8
+ }>;
9
+ export { AccountPanel as BalanceCard };
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export declare const BrandIcon: React.FC<{
3
+ brand: string;
4
+ modelName?: string;
5
+ size?: number;
6
+ className?: string;
7
+ }>;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { A6ApiConfig } from '../../types.js';
3
+ export declare const ConfigPanel: React.FC<{
4
+ config: A6ApiConfig;
5
+ dshConfiguredModels: string[];
6
+ }>;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { ModelCardData } from '../../types.js';
3
+ export declare const MerchantCard: React.FC<{
4
+ model: ModelCardData;
5
+ }>;
@@ -0,0 +1,3 @@
1
+ export declare const name = "@lynn123411/dsh-a6api";
2
+ export declare const inject: string[];
3
+ export declare function apply(ctx: any): void;
@@ -0,0 +1,30 @@
1
+ import type { A6ApiConfig, BalanceInfo, ModelCardData, ApiRoutingLogItem } from '../types.js';
2
+ export interface StoreState {
3
+ loading: boolean;
4
+ config: A6ApiConfig;
5
+ balance: BalanceInfo | null;
6
+ models: ModelCardData[];
7
+ dshConfiguredModels: string[];
8
+ recentLogs: ApiRoutingLogItem[];
9
+ probingModelNames: Set<string>;
10
+ error: string | null;
11
+ }
12
+ type Listener = () => void;
13
+ declare class A6ApiStore {
14
+ private state;
15
+ private listeners;
16
+ private autoRefreshTimer;
17
+ constructor();
18
+ subscribe(listener: Listener): () => void;
19
+ private notify;
20
+ getState(): StoreState;
21
+ fetchState(): Promise<void>;
22
+ saveConfig(config: Partial<A6ApiConfig>): Promise<boolean>;
23
+ refreshBalance(): Promise<void>;
24
+ probeModel(modelName: string): Promise<void>;
25
+ probeAll(): Promise<void>;
26
+ toggleDshModel(modelName: string): Promise<void>;
27
+ private startAutoRefresh;
28
+ }
29
+ export declare const store: A6ApiStore;
30
+ export {};
@@ -0,0 +1,7 @@
1
+ export declare const name = "@lynn123411/dsh-a6api";
2
+ export declare const inject: string[];
3
+ export { fetchBalance, fetchTokenModels, fetchRecentLogs, fetchChannelDetails, } from './server/a6api-client.js';
4
+ export { probeSingleModel, getKnownMerchantsFromLogs } from './server/probe.js';
5
+ export { resolveModelMeta, A6API_CATALOG } from './server/catalog.js';
6
+ export { readPluginConfig, savePluginConfig, syncToDshSettings } from './server/sync.js';
7
+ export declare function apply(ctx: any): void;
@@ -0,0 +1,16 @@
1
+ import type { BalanceInfo, MerchantChannelInfo, ApiRoutingLogItem } from '../types.js';
2
+ /** Normalize Base URL removing trailing slashes */
3
+ export declare function cleanBaseUrl(url: string): string;
4
+ /** Format relative time */
5
+ export declare function formatRelativeTime(timestampSec: number): string;
6
+ /** Format CNY Price */
7
+ export declare function formatCnyPrice(micros: number, exchangeRate?: number): string;
8
+ export declare function buildWebHeaders(userId?: string, sessionCookie?: string): Record<string, string>;
9
+ /** Fetch User Balance (Real Account Balance Only) */
10
+ export declare function fetchBalance(baseURL: string, apiKey: string, userId?: string, sessionCookie?: string): Promise<BalanceInfo | null>;
11
+ /** Fetch Token Allowed Models */
12
+ export declare function fetchTokenModels(baseURL: string, apiKey: string): Promise<string[]>;
13
+ /** Fetch Recent User Routing Logs */
14
+ export declare function fetchRecentLogs(userId?: string, sessionCookie?: string, limit?: number): Promise<ApiRoutingLogItem[]>;
15
+ /** Fetch Channel Card details from A6API Marketplace */
16
+ export declare function fetchChannelDetails(channelId: number, userId?: string, sessionCookie?: string, targetModelName?: string, logSnapshot?: any): Promise<MerchantChannelInfo | null>;
@@ -0,0 +1,6 @@
1
+ import type { A6ApiModelMeta } from '../types.js';
2
+ export declare const A6API_CATALOG: Record<string, A6ApiModelMeta>;
3
+ /** Infer Brand from model name if not in catalog. */
4
+ export declare function inferBrand(modelId: string): string;
5
+ /** Resolve metadata for any model ID, falling back to safe defaults. */
6
+ export declare function resolveModelMeta(modelId: string): A6ApiModelMeta;
@@ -0,0 +1,14 @@
1
+ import type { MerchantChannelInfo } from '../types.js';
2
+ export interface ProbeResult {
3
+ modelName: string;
4
+ success: boolean;
5
+ channelId?: number;
6
+ channelName?: string;
7
+ merchant?: MerchantChannelInfo | null;
8
+ error?: string;
9
+ durationMs?: number;
10
+ }
11
+ /** Probe a single model by sending a 1-token prompt and querying logs */
12
+ export declare function probeSingleModel(baseURL: string, apiKey: string, userId?: string, accessToken?: string, modelName?: string): Promise<ProbeResult>;
13
+ /** Pre-populate merchant cards from recent logs without triggering live probe */
14
+ export declare function getKnownMerchantsFromLogs(userId?: string, accessToken?: string, modelNames?: string[]): Promise<Record<string, MerchantChannelInfo>>;
@@ -0,0 +1,2 @@
1
+ /** Register a6api in DSH LLM runtime configurable providers directory */
2
+ export declare function registerA6ApiProvider(ctx: any): (() => void) | void;
@@ -0,0 +1,14 @@
1
+ import type { A6ApiConfig } from '../types.js';
2
+ export declare const A6API_CRED_REF = "A6API_API_KEY";
3
+ /** Read plugin dedicated config */
4
+ export declare function readPluginConfig(): Promise<A6ApiConfig>;
5
+ /** Save plugin dedicated config */
6
+ export declare function savePluginConfig(config: A6ApiConfig): Promise<void>;
7
+ /** Read a key from .credentials.yaml */
8
+ export declare function readCredentialKey(refKey: string): Promise<string | null>;
9
+ /** Write/update a key in .credentials.yaml */
10
+ export declare function writeCredentialKey(refKey: string, value: string): Promise<void>;
11
+ /** Sync active models to DSH settings.yaml under llm-pi-ai.providers.a6api */
12
+ export declare function syncToDshSettings(baseURL: string, modelIds: string[]): Promise<void>;
13
+ /** Get currently configured model IDs in DSH settings for a6api */
14
+ export declare function getDshConfiguredModels(): Promise<string[]>;
@@ -0,0 +1,156 @@
1
+ export interface A6ApiConfig {
2
+ baseURL: string;
3
+ apiKey: string;
4
+ accessToken?: string;
5
+ userId?: string;
6
+ activeModels: string[];
7
+ lastSelectedBaseUrl?: string;
8
+ customBaseURL?: string;
9
+ /** backward compatibility */
10
+ sessionCookie?: string;
11
+ }
12
+ export interface A6ApiModelMeta {
13
+ id: string;
14
+ name: string;
15
+ brand: string;
16
+ contextWindow: number;
17
+ maxTokens: number;
18
+ modalities: ('text' | 'image')[];
19
+ reasoningEfforts?: Record<string, string>;
20
+ thinkingFormat?: string;
21
+ officialPriceMicros?: {
22
+ input: number;
23
+ output: number;
24
+ cacheRead: number;
25
+ cacheWrite: number;
26
+ };
27
+ }
28
+ export interface OfficialPrices {
29
+ input_cny: string;
30
+ output_cny: string;
31
+ cache_read_cny: string;
32
+ cache_write_cny: string;
33
+ input_price_micros?: number;
34
+ output_price_micros?: number;
35
+ cache_read_price_micros?: number;
36
+ cache_write_price_micros?: number;
37
+ }
38
+ export interface SuccessBucketItem {
39
+ sample_count?: number;
40
+ success_count?: number;
41
+ success_rate: number;
42
+ }
43
+ export interface Bucket24hItem {
44
+ s?: number;
45
+ k?: number;
46
+ r: number;
47
+ t?: number;
48
+ d?: number;
49
+ f?: number;
50
+ c?: number;
51
+ }
52
+ export interface Bucket7dItem {
53
+ s?: number;
54
+ k?: number;
55
+ r?: number;
56
+ t?: number;
57
+ d?: number;
58
+ f?: number;
59
+ c?: number;
60
+ }
61
+ export interface MerchantChannelInfo {
62
+ listing_id?: number;
63
+ channel_id: number;
64
+ channel_name: string;
65
+ supplier_name: string;
66
+ supplier_id?: number;
67
+ model_name: string;
68
+ brand: string;
69
+ description: string;
70
+ charge_type?: string;
71
+ charge_type_text?: string;
72
+ sample_count?: number;
73
+ sample_count_text?: string;
74
+ input_price_micros: number;
75
+ output_price_micros: number;
76
+ cache_read_price_micros: number;
77
+ cache_write_price_micros: number;
78
+ input_price_cny: string;
79
+ output_price_cny: string;
80
+ cache_read_price_cny: string;
81
+ cache_write_price_cny: string;
82
+ official_price?: OfficialPrices;
83
+ realtime_ratio_cny: number;
84
+ realtime_ratio_formatted: string;
85
+ recent_success_rate_pct: number;
86
+ success_rate_24h_pct: number;
87
+ success_rate_7d_pct?: number;
88
+ success_buckets?: SuccessBucketItem[];
89
+ b24?: Bucket24hItem[];
90
+ b7d?: Bucket7dItem[];
91
+ sr_24h_state?: string;
92
+ sr_7d_state?: string;
93
+ p50_ttft_ms?: number;
94
+ recent_p50_ms: number;
95
+ cache_hit_rate_pct: number;
96
+ labels: string[];
97
+ last_success_at: number;
98
+ last_success_text: string;
99
+ authenticity_guaranteed: boolean;
100
+ authenticity_badge?: string;
101
+ is_pinned?: boolean;
102
+ user_channel_disabled?: boolean;
103
+ supplier_channel_disabled?: boolean;
104
+ raw?: any;
105
+ }
106
+ export interface ModelCardData {
107
+ model_name: string;
108
+ brand: string;
109
+ contextWindow: number;
110
+ maxTokens: number;
111
+ modalities: ('text' | 'image')[];
112
+ hasReasoning: boolean;
113
+ inDsh: boolean;
114
+ merchant?: MerchantChannelInfo;
115
+ probeStatus: 'idle' | 'probing' | 'success' | 'error';
116
+ probeError?: string;
117
+ probeLatencyMs?: number;
118
+ lastProbedAt?: number;
119
+ }
120
+ export interface BalanceInfo {
121
+ hasAccountAuth: boolean;
122
+ accountBalanceUsd: number;
123
+ accountBalanceFormatted: string;
124
+ accountBalanceCnyFormatted: string;
125
+ usedUsd: number;
126
+ usedFormatted: string;
127
+ requestCount: number;
128
+ username?: string;
129
+ userId?: string | number;
130
+ isLow: boolean;
131
+ updatedAt: number;
132
+ }
133
+ export interface ApiRoutingLogItem {
134
+ id: number | string;
135
+ created_at: number;
136
+ model_name: string;
137
+ channel?: number | string;
138
+ channel_name?: string;
139
+ prompt_tokens?: number;
140
+ completion_tokens?: number;
141
+ use_time?: number;
142
+ quota?: number;
143
+ cost_usd?: number;
144
+ cost_formatted?: string;
145
+ token_name?: string;
146
+ status: 'success' | 'error';
147
+ other?: string;
148
+ raw?: any;
149
+ }
150
+ export interface A6ApiStateResponse {
151
+ config: A6ApiConfig;
152
+ balance: BalanceInfo | null;
153
+ models: ModelCardData[];
154
+ dshConfiguredModels: string[];
155
+ recentLogs?: ApiRoutingLogItem[];
156
+ }
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@lynn123411/dsh-a6api",
3
+ "version": "1.0.0",
4
+ "description": "A6API 多模型聚合站接入插件:原生 LLM 提供商注册、账户实时余额监控与预警、Token 模型列表白名单同步、商户线路实时探测与全景指标卡片展示",
5
+ "license": "MIT",
6
+ "author": "lynn123411",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/tttnny/my-dsh.git",
10
+ "directory": "plugins/dsh-a6api"
11
+ },
12
+ "homepage": "https://github.com/tttnny/my-dsh#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/tttnny/my-dsh/issues"
15
+ },
16
+ "keywords": [
17
+ "deepseek-harness",
18
+ "dsh",
19
+ "dsh-plugin",
20
+ "a6api",
21
+ "llm-provider",
22
+ "marketplace",
23
+ "web-ui"
24
+ ],
25
+ "packageManager": "pnpm@11.7.0",
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "type": "module",
30
+ "main": "lib/index.js",
31
+ "exports": {
32
+ ".": {
33
+ "types": "./lib/types/index.d.ts",
34
+ "default": "./lib/index.js"
35
+ },
36
+ "./client": {
37
+ "types": "./lib/types/client/index.d.ts",
38
+ "default": "./lib/client.js"
39
+ },
40
+ "./cordis.patch.yml": "./cordis.patch.yml",
41
+ "./package.json": "./package.json"
42
+ },
43
+ "dsh": {
44
+ "bundle": {
45
+ "patch": "./cordis.patch.yml"
46
+ },
47
+ "client": {
48
+ "platform": "web",
49
+ "immediately": true,
50
+ "inject": [
51
+ "@deepseek-ai/dsh-client-runtime",
52
+ "@deepseek-ai/dsh-client-ui-slots"
53
+ ]
54
+ }
55
+ },
56
+ "files": [
57
+ "lib",
58
+ "cordis.patch.yml",
59
+ "README.md",
60
+ "LICENSE"
61
+ ],
62
+ "scripts": {
63
+ "build": "node build.mjs",
64
+ "typecheck": "tsc -p tsconfig.json --noEmit"
65
+ },
66
+ "engines": {
67
+ "node": "^22.19 || >=24"
68
+ },
69
+ "devDependencies": {
70
+ "@types/node": "^22.19.0",
71
+ "@types/react": "^19.2.18",
72
+ "esbuild": "^0.25.0",
73
+ "typescript": "^6.0.0"
74
+ }
75
+ }