| 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, |
| "<!-- moonshot-kimi-k2-ids:start -->", |
| "<!-- moonshot-kimi-k2-ids:end -->", |
| 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, |
| "<!-- moonshot-kimi-k2-model-refs:start -->", |
| "<!-- moonshot-kimi-k2-model-refs:end -->", |
| renderKimiK2Ids("moonshot/"), |
| ); |
|
|
| await writeFile(moonshotDoc, moonshotText); |
| await writeFile(conceptsDoc, conceptsText); |
| } |
|
|
| syncMoonshotDocs().catch((error) => { |
| console.error(error); |
| process.exitCode = 1; |
| }); |
|
|