import { readFile, writeFile } from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { MOONSHOT_KIMI_K2_CONTEXT_WINDOW, MOONSHOT_KIMI_K2_COST, MOONSHOT_KIMI_K2_INPUT, MOONSHOT_KIMI_K2_MAX_TOKENS, MOONSHOT_KIMI_K2_MODELS, } from "../ui/src/ui/data/moonshot-kimi-k2"; const here = path.dirname(fileURLToPath(import.meta.url)); const repoRoot = path.resolve(here, ".."); function replaceBlockLines( text: string, startMarker: string, endMarker: string, lines: string[], ): string { const startIndex = text.indexOf(startMarker); if (startIndex === -1) { throw new Error(`Missing start marker: ${startMarker}`); } const endIndex = text.indexOf(endMarker, startIndex); if (endIndex === -1) { throw new Error(`Missing end marker: ${endMarker}`); } const startLineStart = text.lastIndexOf("\n", startIndex); const startLineStartIndex = startLineStart === -1 ? 0 : startLineStart + 1; const indent = text.slice(startLineStartIndex, startIndex); const endLineEnd = text.indexOf("\n", endIndex); const endLineEndIndex = endLineEnd === -1 ? text.length : endLineEnd + 1; const before = text.slice(0, startLineStartIndex); const after = text.slice(endLineEndIndex); const replacementLines = [ `${indent}${startMarker}`, ...lines.map((line) => `${indent}${line}`), `${indent}${endMarker}`, ]; const replacement = replacementLines.join("\n"); if (!after) return `${before}${replacement}`; return `${before}${replacement}\n${after}`; } function renderKimiK2Ids(prefix: string) { return MOONSHOT_KIMI_K2_MODELS.map( (model) => `- \`${prefix}${model.id}\``, ); } function renderMoonshotAliases() { return MOONSHOT_KIMI_K2_MODELS.map((model, index) => { const isLast = index === MOONSHOT_KIMI_K2_MODELS.length - 1; const suffix = isLast ? "" : ","; return `"moonshot/${model.id}": { alias: "${model.alias}" }${suffix}`; }); } function renderMoonshotModels() { const input = JSON.stringify([...MOONSHOT_KIMI_K2_INPUT]); const cost = `input: ${MOONSHOT_KIMI_K2_COST.input}, output: ${MOONSHOT_KIMI_K2_COST.output}, cacheRead: ${MOONSHOT_KIMI_K2_COST.cacheRead}, cacheWrite: ${MOONSHOT_KIMI_K2_COST.cacheWrite}`; return MOONSHOT_KIMI_K2_MODELS.flatMap((model, index) => { const isLast = index === MOONSHOT_KIMI_K2_MODELS.length - 1; const closing = isLast ? "}" : "},"; return [ "{", ` id: "${model.id}",`, ` name: "${model.name}",`, ` reasoning: ${model.reasoning},`, ` input: ${input},`, ` cost: { ${cost} },`, ` contextWindow: ${MOONSHOT_KIMI_K2_CONTEXT_WINDOW},`, ` maxTokens: ${MOONSHOT_KIMI_K2_MAX_TOKENS}`, closing, ]; }); } async function syncMoonshotDocs() { const moonshotDoc = path.join(repoRoot, "docs/providers/moonshot.md"); const conceptsDoc = path.join( repoRoot, "docs/concepts/model-providers.md", ); let moonshotText = await readFile(moonshotDoc, "utf8"); moonshotText = replaceBlockLines( moonshotText, "", "", renderKimiK2Ids(""), ); moonshotText = replaceBlockLines( moonshotText, "// moonshot-kimi-k2-aliases:start", "// moonshot-kimi-k2-aliases:end", renderMoonshotAliases(), ); moonshotText = replaceBlockLines( moonshotText, "// moonshot-kimi-k2-models:start", "// moonshot-kimi-k2-models:end", renderMoonshotModels(), ); let conceptsText = await readFile(conceptsDoc, "utf8"); conceptsText = replaceBlockLines( conceptsText, "", "", renderKimiK2Ids("moonshot/"), ); await writeFile(moonshotDoc, moonshotText); await writeFile(conceptsDoc, conceptsText); } syncMoonshotDocs().catch((error) => { console.error(error); process.exitCode = 1; });