@tuned-tensor/cli 0.10.0 → 0.12.0-beta.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.
- package/README.md +21 -6
- package/dist/{chunk-DAP2Z7EZ.js → chunk-HDGBDHOB.js} +474 -74
- package/dist/chunk-HDGBDHOB.js.map +1 -0
- package/dist/index.js +235 -84
- package/dist/index.js.map +1 -1
- package/dist/local-runtime.js +52 -19
- package/dist/local-runtime.js.map +1 -1
- package/docs/local-runtime/architecture.md +8 -2
- package/docs/local-runtime/spark.md +39 -2
- package/package.json +5 -1
- package/training/local-runner/pyproject.toml +2 -2
- package/training/local-runner/src/evaluate.py +44 -18
- package/training/local-runner/src/model_contract.py +134 -14
- package/training/local-runner/src/prefetch.py +25 -8
- package/training/local-runner/src/serve.py +14 -6
- package/training/local-runner/src/sft_data.py +7 -3
- package/training/local-runner/src/train.py +48 -14
- package/training/local-runner/uv.lock +54 -54
- package/dist/chunk-DAP2Z7EZ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/local-runtime/index.ts","../src/local-runtime/compare.ts","../src/local-runtime/doctor.ts","../src/local-runtime/model-server.ts","../src/local-runtime/active-model.ts"],"sourcesContent":["import { readFileSync, realpathSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { cwd } from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport { compareRuns } from \"./compare.js\";\nimport { assertArtifactManifest } from \"./artifacts.js\";\nimport { fineTuneRunRequestSchema, localBehaviorSpecFileSchema, localRunnerConfigSchema, type FineTuneRunRequest, type LocalRunnerConfig, type SpecSnapshot } from \"./contracts.js\";\nimport { buildSystemMessage } from \"./dataset.js\";\nimport {\n loadLocalRunnerConfig,\n fingerprintLocalBaseModel,\n runLocalFineTune,\n validateLocalFineTuneInput,\n} from \"./orchestrator.js\";\nimport { runDoctor } from \"./doctor.js\";\nimport { assertUsableModelArtifact } from \"./model-registry.js\";\nimport {\n buildLocalBaseModelServerLaunch,\n buildLocalModelServerLaunch,\n serveLocalModel,\n} from \"./model-server.js\";\nimport { prefetchBaseModel } from \"./prefetch.js\";\nimport { createLocalStore, type LocalModelRecord, type LocalStore } from \"./store.js\";\nimport {\n DEFAULT_LOCAL_SPEC_PATH,\n assertLocalRunInputReady,\n initLocalRunnerConfigFile,\n initLocalSpecFile,\n loadLocalRunInput,\n} from \"./local-project.js\";\nimport { sanitizeLogLine, type LocalRunProgressEvent, type LocalRunReporter } from \"./run-reporter.js\";\nimport { activateModel, getActiveModel, rollbackActiveModel } from \"./active-model.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\n\nexport * from \"./compare.js\";\nexport * from \"./contracts.js\";\nexport * from \"./dataset.js\";\nexport * from \"./model-server.js\";\nexport * from \"./orchestrator.js\";\nexport * from \"./local-project.js\";\nexport * from \"./prefetch.js\";\nexport * from \"./run-reporter.js\";\nexport * from \"./store.js\";\nexport * from \"./general-regression.js\";\nexport * from \"./active-model.js\";\n\nexport interface LocalRunnerInfo {\n name: \"tuned-tensor-local\";\n status: \"local-runner-preview\";\n description: string;\n version: string;\n}\n\nfunction packageVersion(): string {\n try {\n const packageJson = JSON.parse(\n readFileSync(resolve(localRuntimePackageRoot(import.meta.url), \"package.json\"), \"utf8\"),\n ) as { version?: unknown };\n return typeof packageJson.version === \"string\" ? packageJson.version : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport const TT_LOCAL_VERSION = packageVersion();\n\nexport function getLocalRunnerInfo(): LocalRunnerInfo {\n return {\n name: \"tuned-tensor-local\",\n status: \"local-runner-preview\",\n description: \"Local CUDA LoRA fine-tuning with held-out base-versus-tuned evaluation.\",\n version: TT_LOCAL_VERSION,\n };\n}\n\nfunction readOption(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name);\n if (index !== -1) return argv[index + 1];\n const inline = argv.find((value) => value.startsWith(`${name}=`));\n return inline?.slice(name.length + 1);\n}\n\nfunction hasFlag(argv: string[], name: string): boolean {\n return argv.includes(name);\n}\n\nfunction printHelp(): void {\n console.log(`Usage: tt-local <command> [options]\n\nCommands:\n info Show package and runner information\n init [--name \"My Local Model\"] [--model Qwen/Qwen3.5-2B] [--output tunedtensor.json] [--profile spark] [--force]\n doctor [tunedtensor.json] [--config local-runner.json]\n validate [tunedtensor.json] [--config local-runner.json]\n run [tunedtensor.json] [--config local-runner.json] [--dry-run] [--verbose] [--quiet]\n serve <model-id|active|base> [--config local-runner.json] [--host 127.0.0.1] [--port 8000]\n runs list|get|events|report|compare [args] [--config local-runner.json]\n models list|get|verify|prefetch|verify-base|active|activate|rollback|serve [args] [--config local-runner.json]\n\nGlobal options:\n -h, --help Show help\n -V, --version Show the installed version\n\nThe run command writes local artifacts under config.artifactRoot, defaulting to\n.tt-local/artifacts. The file-backed local store defaults to\n~/.tuned-tensor-local unless config.storeRoot or TT_LOCAL_HOME is set.`);\n}\n\ninterface CliOptionDefinition {\n name: string;\n value?: string;\n description: string;\n}\n\ninterface CliCommandDefinition {\n usage: string;\n description: string;\n options: readonly CliOptionDefinition[];\n minPositionals?: number;\n maxPositionals?: number;\n missingPositionalsMessage?: string;\n}\n\ninterface CliCommandGroup {\n description: string;\n defaultSubcommand?: string;\n subcommands: Record<string, CliCommandDefinition>;\n}\n\ninterface ParsedCli {\n command: string;\n subcommand?: string;\n positionals: string[];\n help: \"top\" | \"command\" | \"group\";\n definition?: CliCommandDefinition;\n}\n\nconst CONFIG_OPTION = { name: \"--config\", value: \"path\", description: \"Local runner config JSON path\" } as const;\nconst VERBOSE_OPTION = { name: \"--verbose\", description: \"Stream subprocess output\" } as const;\nconst QUIET_OPTION = { name: \"--quiet\", description: \"Suppress progress output on stderr\" } as const;\nconst MODEL_SERVE_OPTIONS = [\n CONFIG_OPTION,\n { name: \"--host\", value: \"host\", description: \"Bind host (localhost by default)\" },\n { name: \"--port\", value: \"port\", description: \"Bind port\" },\n { name: \"--device\", value: \"device\", description: \"cuda or cpu\" },\n { name: \"--max-tokens\", value: \"count\", description: \"Default response token limit\" },\n { name: \"--temperature\", value: \"number\", description: \"Default sampling temperature\" },\n { name: \"--top-p\", value: \"number\", description: \"Default nucleus sampling threshold\" },\n { name: \"--max-concurrent-requests\", value: \"count\", description: \"Concurrent generation limit\" },\n { name: \"--spec\", value: \"path\", description: \"Behavior spec whose instructions are enforced\" },\n { name: \"--no-spec-prompt\", description: \"Do not enforce the stored behavior-spec prompt\" },\n { name: \"--allow-remote\", description: \"Allow a non-loopback bind\" },\n { name: \"--api-key-env\", value: \"name\", description: \"Environment variable containing a bearer token\" },\n { name: \"--print-command\", description: \"Validate and print the launch plan without starting\" },\n] as const satisfies readonly CliOptionDefinition[];\n\nconst COMMAND_DEFINITIONS: Record<string, CliCommandDefinition> = {\n info: {\n usage: \"tt-local info\",\n description: \"Show the installed TT Local version and runner status.\",\n options: [],\n maxPositionals: 0,\n },\n init: {\n usage: \"tt-local init [options]\",\n description: \"Create a local tunedtensor.json behavior spec.\",\n options: [\n { name: \"--name\", value: \"name\", description: \"Behavior spec name\" },\n { name: \"--model\", value: \"model\", description: \"Base model ID\" },\n { name: \"--output\", value: \"path\", description: \"Output spec path\" },\n { name: \"--profile\", value: \"profile\", description: \"Write a durable runner config (spark)\" },\n { name: \"--config\", value: \"path\", description: \"Runner config path (written with --profile)\" },\n { name: \"--force\", description: \"Overwrite an existing output file\" },\n ],\n maxPositionals: 0,\n },\n doctor: {\n usage: \"tt-local doctor [tunedtensor.json] [--config path]\",\n description: \"Check the host and optional run input before starting work.\",\n options: [CONFIG_OPTION],\n maxPositionals: 1,\n },\n validate: {\n usage: \"tt-local validate [tunedtensor.json] [options]\",\n description: \"Validate a local behavior spec without executing it.\",\n options: [CONFIG_OPTION],\n maxPositionals: 1,\n },\n run: {\n usage: \"tt-local run [tunedtensor.json] [options]\",\n description: \"Run the baseline, fine-tuning, tuned evaluation, and report workflow.\",\n options: [\n CONFIG_OPTION,\n { name: \"--dry-run\", description: \"Write representative artifacts without GPU work\" },\n VERBOSE_OPTION,\n QUIET_OPTION,\n ],\n maxPositionals: 1,\n },\n serve: {\n usage: \"tt-local serve <model-id|active|base> [options]\",\n description: \"Serve a verified adapter, the active model, or the protected base.\",\n options: MODEL_SERVE_OPTIONS,\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"serve requires <model-id>\",\n },\n};\n\nconst COMMAND_GROUPS: Record<string, CliCommandGroup> = {\n runs: {\n description: \"Inspect locally stored runs.\",\n defaultSubcommand: \"list\",\n subcommands: {\n list: { usage: \"tt-local runs list [--config path]\", description: \"List local runs.\", options: [CONFIG_OPTION], maxPositionals: 0 },\n get: { usage: \"tt-local runs get <run-id> [--config path]\", description: \"Get a local run.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs get requires <run-id>\" },\n events: { usage: \"tt-local runs events <run-id> [--config path]\", description: \"List run events.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs events requires <run-id>\" },\n report: { usage: \"tt-local runs report <run-id> [--config path]\", description: \"Show the baseline-vs-tuned report, including deltas and regressions.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs report requires <run-id>\" },\n compare: { usage: \"tt-local runs compare <run-id-a> <run-id-b> [--config path]\", description: \"Compare two run reports.\", options: [CONFIG_OPTION], minPositionals: 2, maxPositionals: 2, missingPositionalsMessage: \"runs compare requires <run-id-a> <run-id-b>\" },\n },\n },\n models: {\n description: \"Inspect, verify, prefetch, or serve local models.\",\n defaultSubcommand: \"list\",\n subcommands: {\n list: { usage: \"tt-local models list [--config path]\", description: \"List local models.\", options: [CONFIG_OPTION], maxPositionals: 0 },\n get: { usage: \"tt-local models get <model-id> [--config path]\", description: \"Get a local model.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"models get requires <model-id>\" },\n verify: {\n usage: \"tt-local models verify <model-id-or-artifact-path> [--config path]\",\n description: \"Verify a stored model or manifested artifact path.\",\n options: [CONFIG_OPTION],\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models verify requires <model-id-or-artifact-path>\",\n },\n prefetch: {\n usage: \"tt-local models prefetch [tunedtensor.json] [options]\",\n description: \"Download the configured base model before a run.\",\n options: [CONFIG_OPTION, VERBOSE_OPTION, QUIET_OPTION],\n maxPositionals: 1,\n },\n \"verify-base\": {\n usage: \"tt-local models verify-base [tunedtensor.json] [options]\",\n description: \"Verify that the configured base-model snapshot is complete and locally available.\",\n options: [CONFIG_OPTION, VERBOSE_OPTION, QUIET_OPTION],\n maxPositionals: 1,\n },\n active: {\n usage: \"tt-local models active [--config path]\",\n description: \"Show the active adapter, or the protected base when none is active.\",\n options: [CONFIG_OPTION],\n maxPositionals: 0,\n },\n activate: {\n usage: \"tt-local models activate <model-id> [--config path]\",\n description: \"Activate a verified model whose general regression gate passed.\",\n options: [CONFIG_OPTION],\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models activate requires <model-id>\",\n },\n rollback: {\n usage: \"tt-local models rollback [--config path]\",\n description: \"Restore the previously active adapter or protected base.\",\n options: [CONFIG_OPTION],\n maxPositionals: 0,\n },\n serve: {\n usage: \"tt-local models serve <model-id|active|base> [options]\",\n description: \"Alias for `tt-local serve`.\",\n options: MODEL_SERVE_OPTIONS,\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models serve requires <model-id>\",\n },\n },\n },\n};\n\nfunction hasHelpFlag(argv: string[]): boolean {\n return argv.includes(\"--help\") || argv.includes(\"-h\");\n}\n\nfunction printCommandHelp(definition: CliCommandDefinition): void {\n console.log(`Usage: ${definition.usage}\\n\\n${definition.description}`);\n if (definition.options.length > 0) {\n console.log(\"\\nOptions:\");\n for (const option of definition.options) {\n const label = option.value ? `${option.name} <${option.value}>` : option.name;\n console.log(` ${label.padEnd(34)} ${option.description}`);\n }\n }\n console.log(\" -h, --help Show help\");\n}\n\nfunction printGroupHelp(command: string, group: CliCommandGroup): void {\n console.log(`Usage: tt-local ${command} <command> [options]\\n\\n${group.description}\\n\\nCommands:`);\n for (const [name, definition] of Object.entries(group.subcommands)) {\n console.log(` ${name.padEnd(16)} ${definition.description}`);\n }\n console.log(\"\\nRun `tt-local \" + command + \" <command> --help` for command-specific help.\");\n}\n\nfunction parseCommandArguments(tokens: string[], definition: CliCommandDefinition): string[] {\n const options = new Map(definition.options.map((option) => [option.name, option]));\n const seen = new Set<string>();\n const positionals: string[] = [];\n let optionsEnded = false;\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index]!;\n if (!optionsEnded && token === \"--\") {\n optionsEnded = true;\n continue;\n }\n if (!optionsEnded && token.startsWith(\"-\")) {\n const equalsIndex = token.indexOf(\"=\");\n const name = equalsIndex === -1 ? token : token.slice(0, equalsIndex);\n const inlineValue = equalsIndex === -1 ? undefined : token.slice(equalsIndex + 1);\n const option = options.get(name);\n if (!option) throw new Error(`Unknown option: ${name}`);\n if (seen.has(name)) throw new Error(`Option ${name} may only be specified once.`);\n seen.add(name);\n if (option.value) {\n if (inlineValue !== undefined) {\n if (!inlineValue) throw new Error(`Option ${name} requires a value.`);\n continue;\n }\n const value = tokens[index + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`Option ${name} requires a value.`);\n }\n index += 1;\n } else if (inlineValue !== undefined) {\n throw new Error(`Option ${name} does not accept a value.`);\n }\n continue;\n }\n positionals.push(token);\n }\n\n if (positionals.length < (definition.minPositionals ?? 0)) {\n throw new Error(definition.missingPositionalsMessage ?? `Missing required argument. Usage: ${definition.usage}`);\n }\n if (definition.maxPositionals !== undefined && positionals.length > definition.maxPositionals) {\n throw new Error(`Too many arguments. Usage: ${definition.usage}`);\n }\n return positionals;\n}\n\nfunction parseCli(argv: string[]): ParsedCli {\n const command = argv[2] ?? \"info\";\n if (command === \"--help\" || command === \"-h\") {\n return { command: \"info\", positionals: [], help: \"top\" };\n }\n if (command === \"--version\" || command === \"-V\") {\n if (argv.length > 3) throw new Error(`${command} does not accept arguments.`);\n return { command, positionals: [], help: \"command\" };\n }\n if (command.startsWith(\"-\")) throw new Error(`Unknown option: ${command}`);\n\n const definition = COMMAND_DEFINITIONS[command];\n if (definition) {\n if (hasHelpFlag(argv.slice(3))) {\n return { command, positionals: [], help: \"command\", definition };\n }\n return {\n command,\n positionals: parseCommandArguments(argv.slice(3), definition),\n help: \"top\",\n definition,\n };\n }\n\n const group = COMMAND_GROUPS[command];\n if (!group) throw new Error(`Unknown command: ${command}`);\n if (argv[3] === \"--help\" || argv[3] === \"-h\") {\n return { command, positionals: [], help: \"group\" };\n }\n\n const candidate = argv[3];\n let subcommand: string;\n let tokenStart: number;\n if (candidate && !candidate.startsWith(\"-\")) {\n subcommand = candidate;\n tokenStart = 4;\n } else if (group.defaultSubcommand) {\n subcommand = group.defaultSubcommand;\n tokenStart = 3;\n } else {\n throw new Error(`${command} requires a subcommand. Run 'tt-local ${command} --help'.`);\n }\n const subcommandDefinition = group.subcommands[subcommand];\n if (!subcommandDefinition) throw new Error(`Unknown ${command} command: ${subcommand}`);\n if (hasHelpFlag(argv.slice(tokenStart))) {\n return { command, subcommand, positionals: [], help: \"command\", definition: subcommandDefinition };\n }\n return {\n command,\n subcommand,\n positionals: parseCommandArguments(argv.slice(tokenStart), subcommandDefinition),\n help: \"top\",\n definition: subcommandDefinition,\n };\n}\n\nfunction readNumberOption(argv: string[], name: string): number | undefined {\n const value = readOption(argv, name);\n return value ? Number(value) : undefined;\n}\n\ninterface LocalConfigSelection {\n config: LocalRunnerConfig;\n path?: string;\n}\n\nasync function selectedConfigPath(argv: string[], adjacentTo?: string): Promise<string | undefined> {\n const explicitPath = readOption(argv, \"--config\");\n if (explicitPath) return resolve(explicitPath);\n const candidate = join(adjacentTo ? dirname(resolve(adjacentTo)) : cwd(), \"local-runner.json\");\n const metadata = await stat(candidate).catch(() => null);\n return metadata?.isFile() ? candidate : undefined;\n}\n\nasync function configSelectionFromArgv(argv: string[], adjacentTo?: string): Promise<LocalConfigSelection> {\n const path = await selectedConfigPath(argv, adjacentTo);\n return {\n config: await loadLocalRunnerConfig(path),\n ...(path ? { path } : {}),\n };\n}\n\nasync function configFromArgv(argv: string[], adjacentTo?: string): Promise<LocalRunnerConfig> {\n return (await configSelectionFromArgv(argv, adjacentTo)).config;\n}\n\nasync function loadCliBehaviorSpec(inputPath: string, runId?: string) {\n const input = await loadLocalRunInput(inputPath, {\n ...(runId ? { runId } : {}),\n });\n if (input.kind !== \"spec\") {\n throw new Error(`TT Local CLI expects a tunedtensor.json behavior spec, not a full run request: ${input.path}`);\n }\n return input;\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction shortValue(value: unknown): string | null {\n if (value === undefined || value === null) return null;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) return `[${value.length} items]`;\n return null;\n}\n\nfunction formatEvent(event: LocalRunProgressEvent): string {\n const detailText = Object.entries(event.details ?? {})\n .filter(([key]) => key !== \"metrics\")\n .map(([key, value]) => {\n const formatted = key === \"command\" && Array.isArray(value)\n ? value.join(\" \")\n : shortValue(value);\n return formatted ? `${key}=${formatted}` : null;\n })\n .filter((value): value is string => Boolean(value))\n .slice(0, 5)\n .join(\" \");\n return sanitizeLogLine(`[tt-local] ${event.stage}: ${event.message}${detailText ? ` (${detailText})` : \"\"}`);\n}\n\nfunction createConsoleReporter(options: { verbose: boolean; quiet: boolean }): LocalRunReporter | undefined {\n if (options.quiet) return undefined;\n let lastLogLine = \"\";\n return {\n verbose: options.verbose,\n onEvent(event) {\n process.stderr.write(`${formatEvent(event)}\\n`);\n },\n onLog(log) {\n const line = sanitizeLogLine(`[tt-local] ${log.stage}${log.stream ? ` ${log.stream}` : \"\"}: ${log.message}`);\n // tqdm redraws the same progress line several times per step; collapse\n // consecutive duplicates so --verbose output stays readable.\n if (line === lastLogLine) return;\n lastLogLine = line;\n process.stderr.write(`${line}\\n`);\n },\n };\n}\n\nasync function verifyStoredModel(model: LocalModelRecord): Promise<{\n manifest_path: string;\n integrity: Awaited<ReturnType<typeof assertArtifactManifest>>;\n artifact: Awaited<ReturnType<typeof assertUsableModelArtifact>>;\n contract: unknown;\n}> {\n const manifestPath = join(model.artifact_dir, \"artifact-manifest.json\");\n const integrity = await assertArtifactManifest(manifestPath, {\n requiredPaths: [\"stage-metadata.json\", \"training-report.json\"],\n scopeToRequired: true,\n verifyModel: true,\n });\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as {\n model?: {\n artifact_root?: unknown;\n base_model?: unknown;\n format?: unknown;\n framework?: unknown;\n servable?: unknown;\n base_model_artifact_uri?: unknown;\n base_model_fingerprint?: unknown;\n };\n };\n if (!manifest.model) {\n throw new Error(`Artifact manifest does not contain a model contract: ${manifestPath}`);\n }\n const artifact = await assertUsableModelArtifact(model.artifact_uri);\n if (\n typeof manifest.model.base_model_artifact_uri === \"string\"\n && typeof manifest.model.base_model_fingerprint === \"string\"\n ) {\n const actualBaseFingerprint = await fingerprintLocalBaseModel(manifest.model.base_model_artifact_uri);\n if (actualBaseFingerprint !== manifest.model.base_model_fingerprint) {\n throw new Error(\"Recorded local base-model content no longer matches the model artifact contract.\");\n }\n }\n if (\n typeof manifest.model.artifact_root !== \"string\"\n || resolve(manifest.model.artifact_root) !== resolve(artifact.path)\n ) {\n throw new Error(\"Stored model record does not match the artifact covered by its manifest.\");\n }\n if (manifest.model.base_model !== model.base_model) {\n throw new Error(\"Stored model base model does not match its artifact manifest.\");\n }\n return {\n manifest_path: manifestPath,\n integrity,\n artifact,\n contract: manifest.model,\n };\n}\n\nasync function verifyActivationEvidence(model: LocalModelRecord): Promise<void> {\n await assertArtifactManifest(join(model.artifact_dir, \"artifact-manifest.json\"), {\n requiredPaths: [\n \"run-report.json\",\n \"general-baseline-eval.json\",\n \"general-candidate-eval.json\",\n ],\n scopeToRequired: true,\n verifyModel: true,\n });\n}\n\nasync function verifyModelArtifactPath(input: string): Promise<{\n manifest_path: string;\n integrity: Awaited<ReturnType<typeof assertArtifactManifest>>;\n artifact: Awaited<ReturnType<typeof assertUsableModelArtifact>>;\n contract: unknown;\n}> {\n const inputPath = resolve(input);\n let manifestPath: string | undefined;\n let artifactUri = inputPath;\n if (basename(inputPath) === \"artifact-manifest.json\") {\n manifestPath = inputPath;\n const raw = JSON.parse(await readFile(inputPath, \"utf8\")) as { model?: { artifact_root?: unknown } };\n if (typeof raw.model?.artifact_root !== \"string\") {\n throw new Error(`Artifact manifest does not contain a model contract: ${inputPath}`);\n }\n artifactUri = raw.model.artifact_root;\n } else {\n const metadata = await stat(inputPath).catch(() => null);\n if (!metadata) throw new Error(`Model not found and artifact path does not exist: ${input}`);\n let current = metadata.isDirectory() ? inputPath : dirname(inputPath);\n for (let depth = 0; depth < 8; depth += 1) {\n const candidate = join(current, \"artifact-manifest.json\");\n const raw = await readFile(candidate, \"utf8\").catch(() => null);\n if (raw) {\n const parsed = JSON.parse(raw) as { model?: { artifact_root?: unknown } };\n if (\n typeof parsed.model?.artifact_root === \"string\"\n && resolve(parsed.model.artifact_root) === resolve(inputPath)\n ) {\n manifestPath = candidate;\n break;\n }\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n }\n if (!manifestPath) {\n throw new Error(`No artifact manifest covering model path ${inputPath} was found in its parent run directory.`);\n }\n const integrity = await assertArtifactManifest(manifestPath, {\n requiredPaths: [\"stage-metadata.json\", \"training-report.json\"],\n scopeToRequired: true,\n verifyModel: true,\n });\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as { model?: Record<string, unknown> };\n if (!manifest.model) throw new Error(`Artifact manifest does not contain a model contract: ${manifestPath}`);\n const artifact = await assertUsableModelArtifact(artifactUri);\n if (\n typeof manifest.model.base_model_artifact_uri === \"string\"\n && typeof manifest.model.base_model_fingerprint === \"string\"\n ) {\n const actualBaseFingerprint = await fingerprintLocalBaseModel(manifest.model.base_model_artifact_uri);\n if (actualBaseFingerprint !== manifest.model.base_model_fingerprint) {\n throw new Error(\"Recorded local base-model content no longer matches the model artifact contract.\");\n }\n }\n if (\n typeof manifest.model.artifact_root !== \"string\"\n || resolve(manifest.model.artifact_root) !== resolve(artifact.path)\n ) {\n throw new Error(\"Model path does not match the artifact covered by its manifest.\");\n }\n return { manifest_path: manifestPath, integrity, artifact, contract: manifest.model };\n}\n\nasync function modelSystemPrompt(args: {\n argv: string[];\n model: LocalModelRecord;\n store: LocalStore;\n}): Promise<string | undefined> {\n const specPath = readOption(args.argv, \"--spec\");\n if (specPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n if (hasFlag(args.argv, \"--no-spec-prompt\")) return undefined;\n\n let spec: SpecSnapshot;\n if (specPath) {\n const input = JSON.parse(await readFile(resolve(specPath), \"utf8\")) as unknown;\n const local = localBehaviorSpecFileSchema.safeParse(input);\n if (!local.success) {\n throw new Error(`--spec must contain a tunedtensor.json behavior spec: ${resolve(specPath)}`);\n }\n spec = local.data;\n } else {\n const runRequestPath = join(args.store.paths.runsDir, args.model.run_id, \"request.json\");\n let persistedRequest: FineTuneRunRequest | null = null;\n try {\n persistedRequest = fineTuneRunRequestSchema.parse(JSON.parse(await readFile(runRequestPath, \"utf8\")));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n spec = persistedRequest?.spec_snapshot\n ?? (await args.store.getSpec(args.model.behavior_spec_id)).spec;\n }\n if (spec.base_model !== args.model.base_model) {\n throw new Error(\n `Behavior spec base model ${spec.base_model} does not match stored model base ${args.model.base_model}.`,\n );\n }\n const prompt = buildSystemMessage(spec);\n const metadata = JSON.parse(\n await readFile(join(args.model.artifact_dir, \"stage-metadata.json\"), \"utf8\"),\n ) as { system_prompt_sha256?: unknown };\n const promptHash = createHash(\"sha256\").update(prompt).digest(\"hex\");\n if (metadata.system_prompt_sha256 !== promptHash) {\n throw new Error(\n \"Behavior spec instructions do not match the prompt fingerprint used for this trained model. \"\n + \"Pass the original --spec, or use --no-spec-prompt only when this change is intentional.\",\n );\n }\n return prompt;\n}\n\nfunction modelServeDevice(argv: string[]): \"cpu\" | \"cuda\" | undefined {\n const value = readOption(argv, \"--device\");\n if (value === undefined || value === \"cpu\" || value === \"cuda\") {\n return value;\n }\n throw new Error(`--device must be cuda or cpu; got: ${value}`);\n}\n\nasync function serveStoredModelFromCli(args: {\n argv: string[];\n modelId: string;\n config: LocalRunnerConfig;\n}): Promise<void> {\n const store = createLocalStore(args.config.storeRoot);\n const model = await store.getModel(args.modelId);\n const verified = await verifyStoredModel(model);\n const launch = buildLocalModelServerLaunch({\n model,\n config: args.config,\n options: {\n host: readOption(args.argv, \"--host\"),\n port: readNumberOption(args.argv, \"--port\"),\n device: modelServeDevice(args.argv),\n maxTokens: readNumberOption(args.argv, \"--max-tokens\"),\n temperature: readNumberOption(args.argv, \"--temperature\"),\n topP: readNumberOption(args.argv, \"--top-p\"),\n maxConcurrentRequests: readNumberOption(args.argv, \"--max-concurrent-requests\"),\n systemPrompt: await modelSystemPrompt({ argv: args.argv, model, store }),\n allowRemote: hasFlag(args.argv, \"--allow-remote\"),\n apiKeyEnv: readOption(args.argv, \"--api-key-env\"),\n baseModelRevision: (() => {\n const contract = verified.contract as { base_model_revision?: unknown };\n return typeof contract.base_model_revision === \"string\" ? contract.base_model_revision : undefined;\n })(),\n baseModelArtifactUri: (() => {\n const contract = verified.contract as { base_model_artifact_uri?: unknown };\n return typeof contract.base_model_artifact_uri === \"string\" ? contract.base_model_artifact_uri : undefined;\n })(),\n },\n });\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: model.id,\n url: launch.url,\n command: launch.displayCommand,\n artifact_path: launch.artifactPath,\n manifest_path: verified.manifest_path,\n integrity: verified.integrity,\n });\n return;\n }\n process.stderr.write(`[tt-local] verified ${verified.integrity.checked} artifact file(s)\\n`);\n process.stderr.write(`[tt-local] model API: ${launch.url}\\n`);\n await serveLocalModel(launch);\n}\n\nfunction serveOptionsFromArgv(argv: string[]) {\n return {\n host: readOption(argv, \"--host\"),\n port: readNumberOption(argv, \"--port\"),\n device: modelServeDevice(argv),\n maxTokens: readNumberOption(argv, \"--max-tokens\"),\n temperature: readNumberOption(argv, \"--temperature\"),\n topP: readNumberOption(argv, \"--top-p\"),\n maxConcurrentRequests: readNumberOption(argv, \"--max-concurrent-requests\"),\n allowRemote: hasFlag(argv, \"--allow-remote\"),\n apiKeyEnv: readOption(argv, \"--api-key-env\"),\n };\n}\n\nasync function serveBaseModelFromCli(args: {\n argv: string[];\n config: LocalRunnerConfig;\n}): Promise<void> {\n const explicitSpecPath = readOption(args.argv, \"--spec\");\n if (explicitSpecPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n const defaultSpecPath = resolve(DEFAULT_LOCAL_SPEC_PATH);\n const specPath = explicitSpecPath\n ? resolve(explicitSpecPath)\n : (await stat(defaultSpecPath).catch(() => null))?.isFile()\n ? defaultSpecPath\n : undefined;\n const spec = specPath\n ? localBehaviorSpecFileSchema.parse(\n JSON.parse(await readFile(specPath, \"utf8\")) as unknown,\n )\n : undefined;\n let baseModel = spec?.base_model;\n if (!baseModel) {\n const store = createLocalStore(args.config.storeRoot);\n const active = await getActiveModel(store);\n const referenceModel = active.model\n ?? (active.pointer?.previous_model_id\n ? await store.getModel(active.pointer.previous_model_id)\n : null);\n baseModel = referenceModel?.base_model;\n }\n if (!baseModel) {\n throw new Error(\n \"Cannot identify the protected base model. Pass --spec <tunedtensor.json> \"\n + \"or activate a model first.\",\n );\n }\n const launch = buildLocalBaseModelServerLaunch({\n baseModel,\n config: args.config,\n options: {\n ...serveOptionsFromArgv(args.argv),\n systemPrompt: explicitSpecPath && !hasFlag(args.argv, \"--no-spec-prompt\")\n ? buildSystemMessage(spec!)\n : undefined,\n baseModelRevision: spec?.hyperparameters?.base_model_revision,\n },\n });\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: null,\n base_model: baseModel,\n url: launch.url,\n command: launch.displayCommand,\n });\n return;\n }\n process.stderr.write(`[tt-local] protected base model API: ${launch.url}\\n`);\n await serveLocalModel(launch);\n}\n\nasync function serveModelTargetFromCli(args: {\n argv: string[];\n target: string;\n config: LocalRunnerConfig;\n}): Promise<void> {\n if (args.target === \"base\") {\n return serveBaseModelFromCli(args);\n }\n if (args.target === \"active\") {\n const store = createLocalStore(args.config.storeRoot);\n const active = await getActiveModel(store);\n if (!active.model) return serveBaseModelFromCli(args);\n return serveStoredModelFromCli({\n argv: args.argv,\n modelId: active.model.id,\n config: args.config,\n });\n }\n return serveStoredModelFromCli({\n argv: args.argv,\n modelId: args.target,\n config: args.config,\n });\n}\n\nasync function main(argv: string[]): Promise<void> {\n const cli = parseCli(argv);\n const command = cli.command;\n\n if (command === \"--version\" || command === \"-V\") {\n console.log(TT_LOCAL_VERSION);\n return;\n }\n if (cli.help === \"top\" && (argv[2] === \"--help\" || argv[2] === \"-h\")) {\n printHelp();\n return;\n }\n if (cli.help === \"group\") {\n printGroupHelp(command, COMMAND_GROUPS[command]!);\n return;\n }\n if (cli.help === \"command\" && cli.definition) {\n printCommandHelp(cli.definition);\n return;\n }\n\n if (command === \"info\") {\n const info = getLocalRunnerInfo();\n console.log(`${info.name}: ${info.description}`);\n console.log(`Version: ${info.version}`);\n console.log(`Status: ${info.status}`);\n return;\n }\n\n if (command === \"doctor\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const hasDefaultSpec = cli.positionals[0]\n ? true\n : Boolean((await stat(inputPath).catch(() => null))?.isFile());\n const request = hasDefaultSpec\n ? (await loadCliBehaviorSpec(inputPath)).request\n : undefined;\n const checks = await runDoctor(configSelection.config, request);\n const ok = checks.every((check) => check.ok);\n printJson({\n ok,\n config_path: configSelection.path ?? null,\n checks,\n });\n if (!ok) process.exitCode = 1;\n return;\n }\n\n if (command === \"init\") {\n const outputPath = resolve(readOption(argv, \"--output\") ?? DEFAULT_LOCAL_SPEC_PATH);\n const profile = readOption(argv, \"--profile\");\n if (profile !== undefined && profile !== \"spark\") {\n throw new Error(`--profile must be spark, got: ${profile}`);\n }\n const spec = await initLocalSpecFile({\n outputPath,\n name: readOption(argv, \"--name\") ?? \"Local Tuned Tensor Spec\",\n baseModel: readOption(argv, \"--model\") ?? \"Qwen/Qwen3.5-2B\",\n force: hasFlag(argv, \"--force\"),\n });\n const configPath = profile\n ? resolve(readOption(argv, \"--config\") ?? resolve(dirname(outputPath), \"local-runner.json\"))\n : await selectedConfigPath(argv, outputPath);\n if (profile) {\n await initLocalRunnerConfigFile({\n outputPath: configPath!,\n profile,\n force: hasFlag(argv, \"--force\"),\n });\n } else if (configPath) {\n await loadLocalRunnerConfig(configPath);\n }\n printJson({\n ok: true,\n path: outputPath,\n id: spec.id,\n name: spec.name,\n base_model: spec.base_model,\n config_path: configPath ?? null,\n });\n return;\n }\n\n if (command === \"validate\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const input = await loadCliBehaviorSpec(inputPath);\n assertLocalRunInputReady(input.request);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const validated = await validateLocalFineTuneInput({\n request: input.request,\n config: configSelection.config,\n });\n const request = validated.request;\n const config = validated.config;\n printJson({\n ok: true,\n input_path: input.path,\n config_path: configSelection.path ?? null,\n behavior_spec_id: request.behavior_spec_id,\n base_model: request.spec_snapshot.base_model,\n dataset_format: request.dataset_prebuilt?.format ?? null,\n artifact_root: config.artifactRoot,\n store_root: config.storeRoot,\n dry_run: config.dryRun,\n });\n return;\n }\n\n if (command === \"run\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const configInput = configSelection.config;\n const config = localRunnerConfigSchema.parse({\n ...configInput,\n dryRun: hasFlag(argv, \"--dry-run\") ? true : configInput.dryRun,\n });\n const input = await loadCliBehaviorSpec(inputPath);\n assertLocalRunInputReady(input.request);\n const validated = await validateLocalFineTuneInput({\n request: input.request,\n config,\n });\n let request = validated.request;\n const reporter = createConsoleReporter({\n verbose: hasFlag(argv, \"--verbose\"),\n quiet: hasFlag(argv, \"--quiet\"),\n });\n if (\n !config.dryRun\n && !config.paths.baseModel\n && !request.hyperparameters.base_model_revision\n ) {\n const prefetch = await prefetchBaseModel({\n request,\n config,\n reporter,\n });\n if (!prefetch.snapshot_revision) {\n throw new Error(\"Base-model prefetch did not return an immutable snapshot revision.\");\n }\n request = fineTuneRunRequestSchema.parse({\n ...request,\n hyperparameters: {\n ...request.hyperparameters,\n base_model_revision: prefetch.snapshot_revision,\n },\n });\n }\n const result = await runLocalFineTune({\n request,\n config,\n reporter,\n });\n printJson({\n status: result.report.status,\n run_id: result.report.run_id,\n behavior_spec_id: result.report.behavior_spec_id,\n report_path: result.reportPath,\n artifact_dir: result.artifactDir,\n ...(!config.dryRun ? {\n model_id: `local-${result.report.run_id}`,\n fine_tuned_model_id: result.report.fine_tuned_model_id,\n } : {}),\n training_log: result.report.training.log_uri,\n baseline_eval: result.report.artifact_uris.baseline_eval,\n candidate_eval: result.report.artifact_uris.candidate_eval,\n comparison: result.report.comparison,\n general_regression: result.report.general_regression,\n });\n return;\n }\n\n if (command === \"serve\") {\n const config = await configFromArgv(argv);\n await serveModelTargetFromCli({\n argv,\n target: cli.positionals[0]!,\n config,\n });\n return;\n }\n\n if (command === \"runs\") {\n const subcommand = cli.subcommand!;\n const config = await configFromArgv(argv);\n const store = createLocalStore(config.storeRoot);\n if (subcommand === \"list\") return printJson(await store.listRuns());\n if (subcommand === \"get\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs get requires <run-id>\");\n return printJson(await store.getRun(id));\n }\n if (subcommand === \"events\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs events requires <run-id>\");\n return printJson(await store.getRunEvents(id));\n }\n if (subcommand === \"report\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs report requires <run-id>\");\n return printJson(await store.getRunReport(id));\n }\n if (subcommand === \"compare\") {\n const idA = cli.positionals[0];\n const idB = cli.positionals[1];\n if (!idA || !idB) throw new Error(\"runs compare requires <run-id-a> <run-id-b>\");\n const [reportA, reportB] = await Promise.all([\n store.getRunReport(idA),\n store.getRunReport(idB),\n ]);\n return printJson(compareRuns(reportA, reportB));\n }\n throw new Error(`Unknown runs command: ${subcommand}`);\n }\n\n if (command === \"models\") {\n const subcommand = cli.subcommand!;\n const modelInputPath = subcommand === \"prefetch\" || subcommand === \"verify-base\"\n ? resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH)\n : undefined;\n const config = await configFromArgv(argv, modelInputPath);\n const store = createLocalStore(config.storeRoot);\n if (subcommand === \"list\") return printJson(await store.listModels());\n if (subcommand === \"get\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models get requires <model-id>\");\n return printJson(await store.getModel(id));\n }\n if (subcommand === \"verify\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models verify requires <model-id-or-artifact-path>\");\n if (await stat(resolve(id)).then(() => true, () => false)) {\n return printJson({ ok: true, model: null, ...await verifyModelArtifactPath(id) });\n }\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model);\n return printJson({ ok: true, model, ...verified });\n }\n if (subcommand === \"active\") {\n const active = await getActiveModel(store);\n return printJson({\n active: active.model?.id ?? \"base\",\n pointer: active.pointer,\n model: active.model,\n });\n }\n if (subcommand === \"activate\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models activate requires <model-id>\");\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model);\n await verifyActivationEvidence(model);\n const pointer = await activateModel(store, model.id);\n return printJson({\n active: pointer.model_id,\n pointer,\n manifest_path: verified.manifest_path,\n integrity: verified.integrity,\n });\n }\n if (subcommand === \"rollback\") {\n const current = await getActiveModel(store);\n if (current.pointer?.previous_model_id) {\n const previous = await store.getModel(current.pointer.previous_model_id);\n await verifyStoredModel(previous);\n await verifyActivationEvidence(previous);\n }\n const pointer = await rollbackActiveModel(store);\n return printJson({ active: pointer.model_id ?? \"base\", pointer });\n }\n if (subcommand === \"prefetch\" || subcommand === \"verify-base\") {\n const input = await loadCliBehaviorSpec(modelInputPath!);\n const report = await prefetchBaseModel({\n request: input.request,\n config,\n localOnly: subcommand === \"verify-base\",\n reporter: createConsoleReporter({\n verbose: hasFlag(argv, \"--verbose\"),\n quiet: hasFlag(argv, \"--quiet\"),\n }),\n });\n return printJson({\n ...report,\n input_path: input.path,\n });\n }\n if (subcommand === \"serve\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models serve requires <model-id>\");\n await serveModelTargetFromCli({ argv, target: id, config });\n return;\n }\n throw new Error(`Unknown models command: ${subcommand}`);\n }\n\n console.error(`Unknown command: ${command}`);\n process.exitCode = 1;\n}\n\nfunction isCliEntrypoint(): boolean {\n if (!process.argv[1]) return false;\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1]);\n}\n\nif (isCliEntrypoint()) {\n main(process.argv).catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n });\n}\n","import type { EvalExampleResult, EvalReport, RunReport } from \"./contracts.js\";\nimport { tokenF1 } from \"./evaluation.js\";\n\ninterface SubsetSide {\n baseline_avg_score: number | null;\n candidate_avg_score: number | null;\n candidate_avg_token_f1: number | null;\n}\n\ninterface RunSummary {\n run_id: string;\n started_at: string;\n base_model: string;\n training_example_count: number | null;\n eval_examples_used: number;\n baseline_avg_score: number;\n candidate_avg_score: number;\n candidate_avg_token_f1: number | null;\n avg_score_delta: number;\n}\n\nexport interface RunComparison {\n run_a: RunSummary;\n run_b: RunSummary;\n shared: {\n examples: number;\n run_a: SubsetSide;\n run_b: SubsetSide;\n candidate_avg_score_delta: number | null;\n candidate_avg_token_f1_delta: number | null;\n };\n b_only: SubsetSide & { examples: number };\n notes: string[];\n}\n\nfunction byPrompt(report: EvalReport): Map<string, EvalExampleResult> {\n return new Map(report.results.map((result) => [result.prompt, result]));\n}\n\nfunction avg(values: number[]): number | null {\n return values.length > 0 ? values.reduce((sum, value) => sum + value, 0) / values.length : null;\n}\n\nfunction summarizeRun(report: RunReport): RunSummary {\n return {\n run_id: report.run_id,\n started_at: report.run_metadata.started_at,\n base_model: report.base_model,\n training_example_count: report.run_metadata.training_example_count,\n eval_examples_used: report.run_metadata.eval_examples_used,\n baseline_avg_score: report.baseline.avg_score,\n candidate_avg_score: report.candidate.avg_score,\n candidate_avg_token_f1: report.candidate.avg_token_f1 ?? null,\n avg_score_delta: report.comparison.avg_score_delta,\n };\n}\n\nfunction subsetSide(\n prompts: string[],\n baseline: Map<string, EvalExampleResult>,\n candidate: Map<string, EvalExampleResult>,\n): SubsetSide {\n const candidateResults = prompts\n .map((prompt) => candidate.get(prompt))\n .filter((result): result is EvalExampleResult => Boolean(result));\n return {\n baseline_avg_score: avg(prompts\n .map((prompt) => baseline.get(prompt)?.score)\n .filter((score): score is number => typeof score === \"number\")),\n candidate_avg_score: avg(candidateResults.map((result) => result.score)),\n candidate_avg_token_f1: avg(candidateResults.map((result) => tokenF1(result.expected, result.actual))),\n };\n}\n\n/**\n * Aligns two run reports on their shared eval prompts so recipe changes can\n * be compared apples-to-apples even when the eval set grew or shifted between\n * runs. Headline avg_score_delta values are not comparable across different\n * eval subsets; the shared subset is.\n */\nexport function compareRuns(a: RunReport, b: RunReport): RunComparison {\n const aCandidate = byPrompt(a.candidate);\n const bCandidate = byPrompt(b.candidate);\n const aBaseline = byPrompt(a.baseline);\n const bBaseline = byPrompt(b.baseline);\n const sharedPrompts = [...bCandidate.keys()].filter((prompt) => aCandidate.has(prompt));\n const bOnlyPrompts = [...bCandidate.keys()].filter((prompt) => !aCandidate.has(prompt));\n\n const sharedA = subsetSide(sharedPrompts, aBaseline, aCandidate);\n const sharedB = subsetSide(sharedPrompts, bBaseline, bCandidate);\n const runA = summarizeRun(a);\n const runB = summarizeRun(b);\n\n const notes: string[] = [];\n if (bOnlyPrompts.length > 0) {\n notes.push(\n `run_b evaluated ${bOnlyPrompts.length} example(s) run_a never saw; headline avg_score_delta values `\n + \"are not directly comparable across the two runs. Use the shared subset for recipe comparisons.\",\n );\n }\n return {\n run_a: runA,\n run_b: runB,\n shared: {\n examples: sharedPrompts.length,\n run_a: sharedA,\n run_b: sharedB,\n candidate_avg_score_delta:\n sharedA.candidate_avg_score !== null && sharedB.candidate_avg_score !== null\n ? sharedB.candidate_avg_score - sharedA.candidate_avg_score\n : null,\n candidate_avg_token_f1_delta:\n sharedA.candidate_avg_token_f1 !== null && sharedB.candidate_avg_token_f1 !== null\n ? sharedB.candidate_avg_token_f1 - sharedA.candidate_avg_token_f1\n : null,\n },\n b_only: { examples: bOnlyPrompts.length, ...subsetSide(bOnlyPrompts, bBaseline, bCandidate) },\n notes,\n };\n}\n","import { constants } from \"node:fs\";\nimport { access, mkdir, statfs, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport type { FineTuneRunRequest, LocalRunnerConfig } from \"./contracts.js\";\nimport {\n minimalMachineLearningEnvironment,\n withHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport {\n buildBundledPythonCommand,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\nimport { resolveTrainingModel } from \"./model-registry.js\";\nimport { defaultLocalHome } from \"./store.js\";\nimport { verifyLocalBaseModel } from \"./prefetch.js\";\n\nexport interface DoctorCheck {\n name: string;\n ok: boolean;\n message: string;\n details?: Record<string, unknown>;\n}\n\ninterface CommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n error?: string;\n}\n\ninterface CommandOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n timeoutMs?: number;\n}\n\nasync function runCommand(command: string, args: string[], options: CommandOptions = {}): Promise<CommandResult> {\n const timeoutMs = options.timeoutMs ?? 10_000;\n let interrupted: string | undefined;\n const result = await new Promise<CommandResult>((resolveResult) => {\n let settled = false;\n let stdout = \"\";\n let stderr = \"\";\n let stopError: string | undefined;\n let forceKillTimer: NodeJS.Timeout | null = null;\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env ?? process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n const killProcessGroup = (signal: NodeJS.Signals) => {\n if (child.pid && process.platform !== \"win32\") {\n try {\n process.kill(-child.pid, signal);\n return;\n } catch {\n // The child may have exited between the check and signal.\n }\n }\n child.kill(signal);\n };\n const requestStop = (signal: NodeJS.Signals = \"SIGTERM\") => {\n killProcessGroup(signal);\n if (!forceKillTimer) {\n forceKillTimer = setTimeout(() => killProcessGroup(\"SIGKILL\"), 5_000);\n forceKillTimer.unref();\n }\n };\n const onSigint = () => {\n interrupted = \"interrupted by SIGINT\";\n stopError = interrupted;\n requestStop(\"SIGINT\");\n };\n const onSigterm = () => {\n interrupted = \"interrupted by SIGTERM\";\n stopError = interrupted;\n requestStop(\"SIGTERM\");\n };\n const finish = (result: CommandResult) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n resolveResult(result);\n };\n const timer = setTimeout(() => {\n stopError = `timed out after ${timeoutMs}ms`;\n requestStop();\n }, timeoutMs);\n timer.unref();\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk) => { stdout += chunk; });\n child.stderr.on(\"data\", (chunk) => { stderr += chunk; });\n child.on(\"error\", (error) => {\n finish({ code: null, stdout, stderr, error: error.message });\n });\n child.on(\"close\", (code) => {\n finish({ code: stopError ? null : code, stdout, stderr, error: stopError });\n });\n });\n if (interrupted) throw new Error(interrupted);\n return result;\n}\n\nfunction firstLine(value: string): string {\n return value.trim().split(/\\r?\\n/)[0] ?? \"\";\n}\n\nfunction commandText(command: string, args: string[]): string {\n return [command, ...args].map((part) => /\\s/.test(part) ? JSON.stringify(part) : part).join(\" \");\n}\n\nasync function writableDirectoryCheck(name: string, path: string): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n const probePath = join(resolvedPath, `.tt-local-write-probe-${process.pid}-${Date.now()}`);\n try {\n await mkdir(resolvedPath, { recursive: true });\n await access(resolvedPath, constants.R_OK | constants.W_OK);\n await writeFile(probePath, \"ok\\n\", { flag: \"wx\" });\n await unlink(probePath);\n const fs = await statfs(resolvedPath);\n const freeBytes = Number(fs.bavail) * Number(fs.bsize);\n return {\n name,\n ok: true,\n message: `${resolvedPath} is writable (${Math.round(freeBytes / (1024 ** 3) * 10) / 10} GiB available)`,\n details: { path: resolvedPath, free_bytes: freeBytes },\n };\n } catch (error) {\n await unlink(probePath).catch(() => undefined);\n return {\n name,\n ok: false,\n message: `${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`,\n details: { path: resolvedPath },\n };\n }\n}\n\ninterface PythonProbePlan {\n name: \"python-runtime\";\n command: string;\n args: string[];\n env: NodeJS.ProcessEnv;\n}\n\nfunction pythonProbeSource(device: LocalRunnerConfig[\"evaluation\"][\"inference\"][\"device\"]): string {\n return [\n \"import json\",\n \"import torch, transformers, peft, huggingface_hub\",\n `requested = ${JSON.stringify(device)}`,\n \"assert torch.cuda.is_available(), 'TT Local training requires CUDA but torch.cuda.is_available() is false'\",\n \"props = torch.cuda.get_device_properties(0)\",\n \"print(json.dumps({'python_ok': True, 'torch': torch.__version__, 'transformers': transformers.__version__, 'cuda_available': True, 'cuda_device': torch.cuda.get_device_name(0), 'compute_capability': list(torch.cuda.get_device_capability(0)), 'total_memory_bytes': props.total_memory, 'evaluation_device': requested}))\",\n ].join(\"; \");\n}\n\nfunction pythonProbePlan(args: {\n device: LocalRunnerConfig[\"evaluation\"][\"inference\"][\"device\"];\n modelCache?: string;\n}): PythonProbePlan {\n const entrypoint = buildBundledPythonCommand(\n \"-c\",\n [pythonProbeSource(args.device)],\n );\n const env = withBundledPythonEnvironment(\n withHuggingFaceCacheEnvironment(\n minimalMachineLearningEnvironment(process.env),\n args.modelCache,\n ),\n );\n return {\n name: \"python-runtime\",\n command: entrypoint.command,\n args: entrypoint.commandArgs,\n env,\n };\n}\n\n/** Build the exact bundled uv environment that every real stage uses. */\nexport function buildDoctorPythonPlans(config: LocalRunnerConfig): PythonProbePlan[] {\n if (config.dryRun) return [];\n return [\n pythonProbePlan({\n device: config.evaluation.inference.device,\n modelCache: config.paths.modelCache,\n }),\n ];\n}\n\nfunction placeholderSpecCheck(request: FineTuneRunRequest): DoctorCheck {\n const placeholder = request.spec_snapshot.examples.some((example) =>\n /replace this with/i.test(example.input) || /replace this with/i.test(example.output)\n ) || /describe the behavior this local model should learn/i.test(request.spec_snapshot.system_prompt);\n return {\n name: \"spec-content\",\n ok: !placeholder,\n message: placeholder\n ? \"The spec still contains generated placeholder content; edit it before training.\"\n : `${request.spec_snapshot.examples.length} spec example(s); base model ${request.spec_snapshot.base_model}`,\n };\n}\n\nasync function localBaseModelCheck(path: string): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n try {\n const verified = await verifyLocalBaseModel(resolvedPath);\n return {\n name: \"local-base-model\",\n ok: true,\n message: `${resolvedPath} is a valid local Hugging Face snapshot directory.`,\n details: { path: resolvedPath, file_count: verified.fileCount, size_bytes: verified.sizeBytes },\n };\n } catch (error) {\n return {\n name: \"local-base-model\",\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n details: { path: resolvedPath },\n };\n }\n}\n\nexport async function runDoctor(config: LocalRunnerConfig, request?: FineTuneRunRequest): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n const nodeVersion = process.versions.node;\n const nodeMajor = Number(nodeVersion.split(\".\")[0]);\n checks.push({ name: \"node\", ok: nodeMajor >= 22, message: `Node ${nodeVersion}` });\n\n checks.push(await writableDirectoryCheck(\"artifact-root\", config.artifactRoot));\n checks.push(await writableDirectoryCheck(\"store-root\", config.storeRoot ?? defaultLocalHome()));\n checks.push(await writableDirectoryCheck(\n \"model-cache\",\n config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), \".cache\", \"huggingface\"),\n ));\n if (config.paths.baseModel) checks.push(await localBaseModelCheck(config.paths.baseModel));\n\n if (request) {\n checks.push(placeholderSpecCheck(request));\n resolveTrainingModel(request.spec_snapshot.base_model);\n }\n const pythonPlans = buildDoctorPythonPlans(config);\n if (pythonPlans.length > 0) {\n const uvVersion = await runCommand(\"uv\", [\"--version\"]);\n checks.push({\n name: \"uv\",\n ok: uvVersion.code === 0,\n message: uvVersion.code === 0\n ? firstLine(uvVersion.stdout)\n : uvVersion.error ?? (firstLine(uvVersion.stderr) || \"uv is not available\"),\n });\n\n if (uvVersion.code === 0) {\n const uniquePlans = new Map<string, PythonProbePlan>();\n for (const plan of pythonPlans) {\n const key = JSON.stringify([plan.command, plan.args, plan.env]);\n if (!uniquePlans.has(key)) uniquePlans.set(key, plan);\n }\n for (const plan of uniquePlans.values()) {\n const result = await runCommand(plan.command, plan.args, {\n env: plan.env,\n timeoutMs: 1_800_000,\n });\n checks.push({\n name: plan.name,\n ok: result.code === 0,\n message: result.code === 0\n ? firstLine(result.stdout)\n : result.error ?? (firstLine(result.stderr) || `${plan.command} exited ${result.code}`),\n details: { command: commandText(plan.command, plan.args) },\n });\n }\n }\n } else {\n checks.push({\n name: \"python-runtime\",\n ok: true,\n message: config.dryRun\n ? \"Python dependency checks skipped because dryRun is enabled.\"\n : \"Python dependency checks were skipped.\",\n });\n }\n\n const device = config.evaluation.inference.device;\n if (!config.dryRun) {\n const nvidiaSmi = await runCommand(\"nvidia-smi\", []);\n checks.push({\n name: \"nvidia-smi\",\n ok: nvidiaSmi.code === 0,\n message: nvidiaSmi.code === 0\n ? firstLine(nvidiaSmi.stdout)\n : nvidiaSmi.error ?? (firstLine(nvidiaSmi.stderr) || \"nvidia-smi not available\"),\n });\n } else {\n checks.push({\n name: \"nvidia-smi\",\n ok: true,\n message: config.dryRun\n ? \"GPU checks skipped because dryRun is enabled.\"\n : `nvidia-smi is not required for device=${device}.`,\n });\n }\n\n const trainingCommand = buildBundledPythonCommand(\"train.py\").displayCommand;\n checks.push({\n name: \"effective-plan\",\n ok: true,\n message: \"Resolved the configured training and evaluation plan.\",\n details: {\n training_command: trainingCommand ?? null,\n evaluation_provider: \"transformers\",\n evaluation_device: device,\n artifact_root: resolve(config.artifactRoot),\n store_root: resolve(config.storeRoot ?? defaultLocalHome()),\n model_cache: resolve(config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), \".cache\", \"huggingface\")),\n base_model: request?.spec_snapshot.base_model ?? null,\n scoring_mode: config.evaluation.scoring.mode,\n },\n });\n\n return checks;\n}\n","import { spawn } from \"node:child_process\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { LocalRunnerConfig } from \"./contracts.js\";\nimport {\n minimalMachineLearningEnvironment,\n withOfflineHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport { resolveTrainingModel } from \"./model-registry.js\";\nimport {\n buildBundledPythonCommand,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\nimport type { LocalModelRecord } from \"./store.js\";\n\nexport interface LocalModelServeOptions {\n host?: string;\n port?: number;\n device?: \"cpu\" | \"cuda\";\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n systemPrompt?: string;\n allowRemote?: boolean;\n apiKeyEnv?: string;\n maxConcurrentRequests?: number;\n baseModelRevision?: string;\n baseModelArtifactUri?: string;\n}\n\nexport interface LocalModelServerLaunch {\n command: string;\n commandArgs: string[];\n displayCommand: string[];\n env: NodeJS.ProcessEnv;\n url: string;\n modelName: string;\n artifactPath?: string;\n}\n\nfunction localArtifactPath(uri: string): string {\n if (uri.startsWith(\"file://\")) return fileURLToPath(uri);\n if (/^[a-z][a-z0-9+.-]*:/i.test(uri)) {\n throw new Error(`TT Local serving requires a local file artifact, got: ${uri}`);\n }\n return resolve(uri);\n}\n\nfunction boundedNumber(name: string, value: number, minimum: number, maximum: number, integer = false): number {\n if (!Number.isFinite(value) || value < minimum || value > maximum || (integer && !Number.isInteger(value))) {\n throw new Error(`${name} must be between ${minimum} and ${maximum}`);\n }\n return value;\n}\n\nfunction isLoopbackHost(host: string): boolean {\n return host === \"127.0.0.1\" || host === \"localhost\" || host === \"::1\" || host === \"[::1]\";\n}\n\nfunction httpHost(host: string): string {\n return host.includes(\":\") && !host.startsWith(\"[\") ? `[${host}]` : host;\n}\n\nfunction buildModelServerLaunch(args: {\n modelName: string;\n baseModel: string;\n artifactUri?: string;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n const options = args.options ?? {};\n const host = options.host ?? \"127.0.0.1\";\n const remote = !isLoopbackHost(host);\n if (remote && !options.allowRemote) {\n throw new Error(\"Refusing a non-loopback model server bind without --allow-remote.\");\n }\n const apiKey = options.apiKeyEnv ? process.env[options.apiKeyEnv]?.trim() : undefined;\n if (options.apiKeyEnv && !apiKey) throw new Error(`${options.apiKeyEnv} is not set.`);\n if (remote && !apiKey) {\n throw new Error(\"Non-loopback serving requires --api-key-env with a populated environment variable.\");\n }\n const port = boundedNumber(\"port\", options.port ?? 8000, 1, 65_535, true);\n const maxTokens = boundedNumber(\"maxTokens\", options.maxTokens ?? 512, 1, 8192, true);\n const temperature = boundedNumber(\"temperature\", options.temperature ?? 0, 0, 5);\n const topP = boundedNumber(\"topP\", options.topP ?? 1, 0, 1);\n const maxConcurrentRequests = boundedNumber(\n \"maxConcurrentRequests\",\n options.maxConcurrentRequests ?? 1,\n 1,\n 8,\n true,\n );\n const artifactPath = args.artifactUri\n ? localArtifactPath(args.artifactUri)\n : undefined;\n const recordedBaseModelPath = options.baseModelArtifactUri\n ? localArtifactPath(options.baseModelArtifactUri)\n : undefined;\n const configuredBaseModelPath = args.config.paths.baseModel\n ? resolve(args.config.paths.baseModel)\n : undefined;\n if (\n recordedBaseModelPath\n && configuredBaseModelPath\n && resolve(recordedBaseModelPath) !== configuredBaseModelPath\n ) {\n throw new Error(\n `Configured paths.baseModel ${configuredBaseModelPath} does not match the base model recorded for this artifact: `\n + recordedBaseModelPath,\n );\n }\n const localBaseModelPath = recordedBaseModelPath ?? configuredBaseModelPath;\n resolveTrainingModel(args.baseModel);\n const entrypoint = buildBundledPythonCommand(\"serve.py\");\n const env = withBundledPythonEnvironment(\n withOfflineHuggingFaceCacheEnvironment({\n ...minimalMachineLearningEnvironment(process.env),\n ...(artifactPath ? { TT_MODEL_ARTIFACT: artifactPath } : {}),\n TT_BASE_MODEL: localBaseModelPath ?? args.baseModel,\n ...(options.baseModelRevision && !localBaseModelPath\n ? { TT_BASE_MODEL_REVISION: options.baseModelRevision }\n : {}),\n TT_MODEL_NAME: args.modelName,\n TT_MODEL_LOADER: \"causal_lm\",\n TT_HOST: host,\n TT_PORT: String(port),\n TT_DEVICE: options.device ?? args.config.evaluation.inference.device,\n TT_MAX_TOKENS: String(maxTokens),\n TT_TEMPERATURE: String(temperature),\n TT_TOP_P: String(topP),\n TT_TRUST_REMOTE_CODE: \"false\",\n TT_MAX_CONCURRENT_REQUESTS: String(maxConcurrentRequests),\n ...(options.systemPrompt ? { TT_SYSTEM_PROMPT: options.systemPrompt } : {}),\n ...(apiKey ? { TT_API_KEY: apiKey } : {}),\n }, args.config.paths.modelCache),\n );\n return {\n command: entrypoint.command,\n commandArgs: entrypoint.commandArgs,\n displayCommand: entrypoint.displayCommand,\n env,\n url: `http://${httpHost(host)}:${port}`,\n modelName: args.modelName,\n artifactPath,\n };\n}\n\nexport function buildLocalModelServerLaunch(args: {\n model: LocalModelRecord;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n return buildModelServerLaunch({\n modelName: args.model.id,\n baseModel: args.model.base_model,\n artifactUri: args.model.artifact_uri,\n config: args.config,\n options: args.options,\n });\n}\n\nexport function buildLocalBaseModelServerLaunch(args: {\n baseModel: string;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n return buildModelServerLaunch({\n modelName: `base:${args.baseModel}`,\n baseModel: args.baseModel,\n config: args.config,\n options: args.options,\n });\n}\n\nexport async function serveLocalModel(launch: LocalModelServerLaunch): Promise<void> {\n await new Promise<void>((resolveServer, reject) => {\n const child = spawn(launch.command, launch.commandArgs, {\n env: launch.env,\n stdio: \"inherit\",\n detached: process.platform !== \"win32\",\n });\n let stopping = false;\n let forceKillTimer: NodeJS.Timeout | undefined;\n const killProcessGroup = (signal: NodeJS.Signals) => {\n if (child.pid && process.platform !== \"win32\") {\n try {\n process.kill(-child.pid, signal);\n return;\n } catch {\n // Fall through when the process group has already exited.\n }\n }\n child.kill(signal);\n };\n const stop = (signal: NodeJS.Signals) => {\n if (stopping) return;\n stopping = true;\n killProcessGroup(signal);\n forceKillTimer = setTimeout(() => killProcessGroup(\"SIGKILL\"), 5_000);\n forceKillTimer.unref();\n };\n const onSigint = () => stop(\"SIGINT\");\n const onSigterm = () => stop(\"SIGTERM\");\n const cleanup = () => {\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n };\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n child.once(\"error\", (error) => {\n cleanup();\n reject(error);\n });\n child.once(\"close\", (code, signal) => {\n cleanup();\n if (stopping || signal === \"SIGINT\" || signal === \"SIGTERM\") {\n resolveServer();\n } else if (code === 0) {\n resolveServer();\n } else {\n reject(new Error(`Local model server exited with code ${code ?? \"unknown\"}.`));\n }\n });\n });\n}\n","import { appendFile, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { writeJsonAtomic } from \"./artifacts.js\";\nimport { runReportSchema } from \"./contracts.js\";\nimport type { LocalModelRecord, LocalStore } from \"./store.js\";\n\nexport interface ActiveModelPointer {\n schema_version: 1;\n model_id: string | null;\n run_id: string | null;\n previous_model_id: string | null;\n activated_at: string;\n action: \"activate\" | \"rollback\";\n}\n\nexport interface ActiveModelState {\n pointer: ActiveModelPointer | null;\n model: LocalModelRecord | null;\n}\n\nfunction pointerPath(store: LocalStore): string {\n return join(store.root, \"active-model.json\");\n}\n\nfunction historyPath(store: LocalStore): string {\n return join(store.root, \"activation-history.jsonl\");\n}\n\nasync function readPointer(store: LocalStore): Promise<ActiveModelPointer | null> {\n try {\n const value = JSON.parse(await readFile(pointerPath(store), \"utf8\")) as ActiveModelPointer;\n if (\n value.schema_version !== 1\n || ![\"activate\", \"rollback\"].includes(value.action)\n || (value.model_id !== null && typeof value.model_id !== \"string\")\n || (value.run_id !== null && typeof value.run_id !== \"string\")\n || (value.previous_model_id !== null && typeof value.previous_model_id !== \"string\")\n ) {\n throw new Error(\"Active model pointer has an invalid shape.\");\n }\n return value;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nasync function assertModelCanActivate(\n store: LocalStore,\n modelId: string,\n): Promise<LocalModelRecord> {\n const model = await store.getModel(modelId);\n const run = await store.getRun(model.run_id);\n if (run.status !== \"completed\") {\n throw new Error(`Model ${model.id} belongs to run ${run.id}, which is not completed.`);\n }\n const report = runReportSchema.parse(\n JSON.parse(await readFile(join(model.artifact_dir, \"run-report.json\"), \"utf8\")),\n );\n if (!report.general_regression) {\n throw new Error(`Model ${model.id} has no general regression evaluation.`);\n }\n if (!report.general_regression.passed) {\n throw new Error(\n `Model ${model.id} failed general regression: `\n + (report.general_regression.failures.join(\" \") || \"regression budget exceeded\"),\n );\n }\n return model;\n}\n\nasync function publishPointer(\n store: LocalStore,\n pointer: ActiveModelPointer,\n): Promise<ActiveModelPointer> {\n await store.ensure();\n await writeJsonAtomic(pointerPath(store), pointer);\n await appendFile(historyPath(store), `${JSON.stringify(pointer)}\\n`, \"utf8\");\n return pointer;\n}\n\nexport async function getActiveModel(store: LocalStore): Promise<ActiveModelState> {\n const pointer = await readPointer(store);\n if (!pointer?.model_id) return { pointer, model: null };\n return { pointer, model: await store.getModel(pointer.model_id) };\n}\n\nexport async function activateModel(\n store: LocalStore,\n modelId: string,\n): Promise<ActiveModelPointer> {\n const [model, current] = await Promise.all([\n assertModelCanActivate(store, modelId),\n readPointer(store),\n ]);\n if (current?.model_id === model.id) return current;\n return publishPointer(store, {\n schema_version: 1,\n model_id: model.id,\n run_id: model.run_id,\n previous_model_id: current?.model_id ?? null,\n activated_at: new Date().toISOString(),\n action: \"activate\",\n });\n}\n\nexport async function rollbackActiveModel(store: LocalStore): Promise<ActiveModelPointer> {\n const current = await readPointer(store);\n if (!current) throw new Error(\"No active-model history exists to roll back.\");\n const targetId = current.previous_model_id;\n const target = targetId ? await assertModelCanActivate(store, targetId) : null;\n return publishPointer(store, {\n schema_version: 1,\n model_id: target?.id ?? null,\n run_id: target?.run_id ?? null,\n previous_model_id: current.model_id,\n activated_at: new Date().toISOString(),\n action: \"rollback\",\n });\n}\n"],"mappings":"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","names":["readFile","join","resolve","fileURLToPath","result","spawn","resolve","resolve","spawn","join","join","resolve","join","readFile","fileURLToPath"]}
|
|
1
|
+
{"version":3,"sources":["../src/local-runtime/index.ts","../src/local-runtime/compare.ts","../src/local-runtime/doctor.ts","../src/local-runtime/model-server.ts","../src/local-runtime/active-model.ts"],"sourcesContent":["import { readFileSync, realpathSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { cwd } from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport { compareRuns } from \"./compare.js\";\nimport { assertArtifactManifest } from \"./artifacts.js\";\nimport { fineTuneRunRequestSchema, localBehaviorSpecFileSchema, localRunnerConfigSchema, type FineTuneRunRequest, type LocalRunnerConfig, type SpecSnapshot } from \"./contracts.js\";\nimport { buildSystemMessage } from \"./dataset.js\";\nimport {\n loadLocalRunnerConfig,\n fingerprintLocalBaseModel,\n runLocalFineTune,\n validateLocalFineTuneInput,\n} from \"./orchestrator.js\";\nimport { runDoctor } from \"./doctor.js\";\nimport { assertUsableModelArtifact, defaultBaseModelRevision } from \"./model-registry.js\";\nimport {\n buildLocalBaseModelServerLaunch,\n buildLocalModelServerLaunch,\n serveLocalModel,\n} from \"./model-server.js\";\nimport { prefetchBaseModel } from \"./prefetch.js\";\nimport { createLocalStore, type LocalModelRecord, type LocalStore } from \"./store.js\";\nimport {\n DEFAULT_LOCAL_SPEC_PATH,\n assertLocalRunInputReady,\n initLocalRunnerConfigFile,\n initLocalSpecFile,\n loadLocalRunInput,\n} from \"./local-project.js\";\nimport { sanitizeLogLine, type LocalRunProgressEvent, type LocalRunReporter } from \"./run-reporter.js\";\nimport { activateModel, getActiveModel, rollbackActiveModel } from \"./active-model.js\";\nimport { localRuntimePackageRoot } from \"./package-root.js\";\n\nexport * from \"./compare.js\";\nexport * from \"./contracts.js\";\nexport * from \"./dataset.js\";\nexport * from \"./model-server.js\";\nexport * from \"./orchestrator.js\";\nexport * from \"./local-project.js\";\nexport * from \"./prefetch.js\";\nexport * from \"./run-reporter.js\";\nexport * from \"./store.js\";\nexport * from \"./general-regression.js\";\nexport * from \"./active-model.js\";\n\nexport interface LocalRunnerInfo {\n name: \"tuned-tensor-local\";\n status: \"local-runner-preview\";\n description: string;\n version: string;\n}\n\nfunction packageVersion(): string {\n try {\n const packageJson = JSON.parse(\n readFileSync(resolve(localRuntimePackageRoot(import.meta.url), \"package.json\"), \"utf8\"),\n ) as { version?: unknown };\n return typeof packageJson.version === \"string\" ? packageJson.version : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport const TT_LOCAL_VERSION = packageVersion();\n\nexport function getLocalRunnerInfo(): LocalRunnerInfo {\n return {\n name: \"tuned-tensor-local\",\n status: \"local-runner-preview\",\n description: \"Local CUDA LoRA fine-tuning with held-out base-versus-tuned evaluation.\",\n version: TT_LOCAL_VERSION,\n };\n}\n\nfunction readOption(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name);\n if (index !== -1) return argv[index + 1];\n const inline = argv.find((value) => value.startsWith(`${name}=`));\n return inline?.slice(name.length + 1);\n}\n\nfunction hasFlag(argv: string[], name: string): boolean {\n return argv.includes(name);\n}\n\nfunction printHelp(): void {\n console.log(`Usage: tt-local <command> [options]\n\nCommands:\n info Show package and runner information\n init [--name \"My Local Model\"] [--model Qwen/Qwen3.5-2B] [--output tunedtensor.json] [--profile spark] [--force]\n doctor [tunedtensor.json] [--config local-runner.json]\n validate [tunedtensor.json] [--config local-runner.json]\n run [tunedtensor.json] [--config local-runner.json] [--dry-run] [--verbose] [--quiet]\n serve <model-id|active|base> [--config local-runner.json] [--host 127.0.0.1] [--port 8000]\n runs list|get|events|report|compare [args] [--config local-runner.json]\n models list|get|verify|prefetch|verify-base|active|activate|rollback|serve [args] [--config local-runner.json]\n\nGlobal options:\n -h, --help Show help\n -V, --version Show the installed version\n\nThe run command writes local artifacts under config.artifactRoot, defaulting to\n.tt-local/artifacts. The file-backed local store defaults to\n~/.tuned-tensor-local unless config.storeRoot or TT_LOCAL_HOME is set.`);\n}\n\ninterface CliOptionDefinition {\n name: string;\n value?: string;\n description: string;\n}\n\ninterface CliCommandDefinition {\n usage: string;\n description: string;\n options: readonly CliOptionDefinition[];\n minPositionals?: number;\n maxPositionals?: number;\n missingPositionalsMessage?: string;\n}\n\ninterface CliCommandGroup {\n description: string;\n defaultSubcommand?: string;\n subcommands: Record<string, CliCommandDefinition>;\n}\n\ninterface ParsedCli {\n command: string;\n subcommand?: string;\n positionals: string[];\n help: \"top\" | \"command\" | \"group\";\n definition?: CliCommandDefinition;\n}\n\nconst CONFIG_OPTION = { name: \"--config\", value: \"path\", description: \"Local runner config JSON path\" } as const;\nconst VERBOSE_OPTION = { name: \"--verbose\", description: \"Stream subprocess output\" } as const;\nconst QUIET_OPTION = { name: \"--quiet\", description: \"Suppress progress output on stderr\" } as const;\nconst MODEL_SERVE_OPTIONS = [\n CONFIG_OPTION,\n { name: \"--host\", value: \"host\", description: \"Bind host (localhost by default)\" },\n { name: \"--port\", value: \"port\", description: \"Bind port\" },\n { name: \"--device\", value: \"device\", description: \"cuda or cpu\" },\n { name: \"--max-tokens\", value: \"count\", description: \"Default response token limit\" },\n { name: \"--temperature\", value: \"number\", description: \"Default sampling temperature\" },\n { name: \"--top-p\", value: \"number\", description: \"Default nucleus sampling threshold\" },\n { name: \"--max-concurrent-requests\", value: \"count\", description: \"Concurrent generation limit\" },\n { name: \"--spec\", value: \"path\", description: \"Behavior spec whose instructions are enforced\" },\n { name: \"--no-spec-prompt\", description: \"Do not enforce the stored behavior-spec prompt\" },\n { name: \"--allow-remote\", description: \"Allow a non-loopback bind\" },\n { name: \"--api-key-env\", value: \"name\", description: \"Environment variable containing a bearer token\" },\n { name: \"--print-command\", description: \"Validate and print the launch plan without starting\" },\n] as const satisfies readonly CliOptionDefinition[];\n\nconst COMMAND_DEFINITIONS: Record<string, CliCommandDefinition> = {\n info: {\n usage: \"tt-local info\",\n description: \"Show the installed TT Local version and runner status.\",\n options: [],\n maxPositionals: 0,\n },\n init: {\n usage: \"tt-local init [options]\",\n description: \"Create a local tunedtensor.json behavior spec.\",\n options: [\n { name: \"--name\", value: \"name\", description: \"Behavior spec name\" },\n { name: \"--model\", value: \"model\", description: \"Base model ID\" },\n { name: \"--output\", value: \"path\", description: \"Output spec path\" },\n { name: \"--profile\", value: \"profile\", description: \"Write a durable runner config (spark)\" },\n { name: \"--config\", value: \"path\", description: \"Runner config path (written with --profile)\" },\n { name: \"--force\", description: \"Overwrite an existing output file\" },\n ],\n maxPositionals: 0,\n },\n doctor: {\n usage: \"tt-local doctor [tunedtensor.json] [--config path]\",\n description: \"Check the host and optional run input before starting work.\",\n options: [CONFIG_OPTION],\n maxPositionals: 1,\n },\n validate: {\n usage: \"tt-local validate [tunedtensor.json] [options]\",\n description: \"Validate a local behavior spec without executing it.\",\n options: [CONFIG_OPTION],\n maxPositionals: 1,\n },\n run: {\n usage: \"tt-local run [tunedtensor.json] [options]\",\n description: \"Run the baseline, fine-tuning, tuned evaluation, and report workflow.\",\n options: [\n CONFIG_OPTION,\n { name: \"--dry-run\", description: \"Write representative artifacts without GPU work\" },\n VERBOSE_OPTION,\n QUIET_OPTION,\n ],\n maxPositionals: 1,\n },\n serve: {\n usage: \"tt-local serve <model-id|active|base> [options]\",\n description: \"Serve a verified adapter, the active model, or the protected base.\",\n options: MODEL_SERVE_OPTIONS,\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"serve requires <model-id>\",\n },\n};\n\nconst COMMAND_GROUPS: Record<string, CliCommandGroup> = {\n runs: {\n description: \"Inspect locally stored runs.\",\n defaultSubcommand: \"list\",\n subcommands: {\n list: { usage: \"tt-local runs list [--config path]\", description: \"List local runs.\", options: [CONFIG_OPTION], maxPositionals: 0 },\n get: { usage: \"tt-local runs get <run-id> [--config path]\", description: \"Get a local run.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs get requires <run-id>\" },\n events: { usage: \"tt-local runs events <run-id> [--config path]\", description: \"List run events.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs events requires <run-id>\" },\n report: { usage: \"tt-local runs report <run-id> [--config path]\", description: \"Show the baseline-vs-tuned report, including deltas and regressions.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"runs report requires <run-id>\" },\n compare: { usage: \"tt-local runs compare <run-id-a> <run-id-b> [--config path]\", description: \"Compare two run reports.\", options: [CONFIG_OPTION], minPositionals: 2, maxPositionals: 2, missingPositionalsMessage: \"runs compare requires <run-id-a> <run-id-b>\" },\n },\n },\n models: {\n description: \"Inspect, verify, prefetch, or serve local models.\",\n defaultSubcommand: \"list\",\n subcommands: {\n list: { usage: \"tt-local models list [--config path]\", description: \"List local models.\", options: [CONFIG_OPTION], maxPositionals: 0 },\n get: { usage: \"tt-local models get <model-id> [--config path]\", description: \"Get a local model.\", options: [CONFIG_OPTION], minPositionals: 1, maxPositionals: 1, missingPositionalsMessage: \"models get requires <model-id>\" },\n verify: {\n usage: \"tt-local models verify <model-id-or-artifact-path> [--config path]\",\n description: \"Verify a stored model or manifested artifact path.\",\n options: [CONFIG_OPTION],\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models verify requires <model-id-or-artifact-path>\",\n },\n prefetch: {\n usage: \"tt-local models prefetch [tunedtensor.json] [options]\",\n description: \"Download the configured base model before a run.\",\n options: [CONFIG_OPTION, VERBOSE_OPTION, QUIET_OPTION],\n maxPositionals: 1,\n },\n \"verify-base\": {\n usage: \"tt-local models verify-base [tunedtensor.json] [options]\",\n description: \"Verify that the configured base-model snapshot is complete and locally available.\",\n options: [CONFIG_OPTION, VERBOSE_OPTION, QUIET_OPTION],\n maxPositionals: 1,\n },\n active: {\n usage: \"tt-local models active [--config path]\",\n description: \"Show the active adapter, or the protected base when none is active.\",\n options: [CONFIG_OPTION],\n maxPositionals: 0,\n },\n activate: {\n usage: \"tt-local models activate <model-id> [--config path]\",\n description: \"Activate a verified model whose general regression gate passed.\",\n options: [CONFIG_OPTION],\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models activate requires <model-id>\",\n },\n rollback: {\n usage: \"tt-local models rollback [--config path]\",\n description: \"Restore the previously active adapter or protected base.\",\n options: [CONFIG_OPTION],\n maxPositionals: 0,\n },\n serve: {\n usage: \"tt-local models serve <model-id|active|base> [options]\",\n description: \"Alias for `tt-local serve`.\",\n options: MODEL_SERVE_OPTIONS,\n minPositionals: 1,\n maxPositionals: 1,\n missingPositionalsMessage: \"models serve requires <model-id>\",\n },\n },\n },\n};\n\nfunction hasHelpFlag(argv: string[]): boolean {\n return argv.includes(\"--help\") || argv.includes(\"-h\");\n}\n\nfunction printCommandHelp(definition: CliCommandDefinition): void {\n console.log(`Usage: ${definition.usage}\\n\\n${definition.description}`);\n if (definition.options.length > 0) {\n console.log(\"\\nOptions:\");\n for (const option of definition.options) {\n const label = option.value ? `${option.name} <${option.value}>` : option.name;\n console.log(` ${label.padEnd(34)} ${option.description}`);\n }\n }\n console.log(\" -h, --help Show help\");\n}\n\nfunction printGroupHelp(command: string, group: CliCommandGroup): void {\n console.log(`Usage: tt-local ${command} <command> [options]\\n\\n${group.description}\\n\\nCommands:`);\n for (const [name, definition] of Object.entries(group.subcommands)) {\n console.log(` ${name.padEnd(16)} ${definition.description}`);\n }\n console.log(\"\\nRun `tt-local \" + command + \" <command> --help` for command-specific help.\");\n}\n\nfunction parseCommandArguments(tokens: string[], definition: CliCommandDefinition): string[] {\n const options = new Map(definition.options.map((option) => [option.name, option]));\n const seen = new Set<string>();\n const positionals: string[] = [];\n let optionsEnded = false;\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index]!;\n if (!optionsEnded && token === \"--\") {\n optionsEnded = true;\n continue;\n }\n if (!optionsEnded && token.startsWith(\"-\")) {\n const equalsIndex = token.indexOf(\"=\");\n const name = equalsIndex === -1 ? token : token.slice(0, equalsIndex);\n const inlineValue = equalsIndex === -1 ? undefined : token.slice(equalsIndex + 1);\n const option = options.get(name);\n if (!option) throw new Error(`Unknown option: ${name}`);\n if (seen.has(name)) throw new Error(`Option ${name} may only be specified once.`);\n seen.add(name);\n if (option.value) {\n if (inlineValue !== undefined) {\n if (!inlineValue) throw new Error(`Option ${name} requires a value.`);\n continue;\n }\n const value = tokens[index + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`Option ${name} requires a value.`);\n }\n index += 1;\n } else if (inlineValue !== undefined) {\n throw new Error(`Option ${name} does not accept a value.`);\n }\n continue;\n }\n positionals.push(token);\n }\n\n if (positionals.length < (definition.minPositionals ?? 0)) {\n throw new Error(definition.missingPositionalsMessage ?? `Missing required argument. Usage: ${definition.usage}`);\n }\n if (definition.maxPositionals !== undefined && positionals.length > definition.maxPositionals) {\n throw new Error(`Too many arguments. Usage: ${definition.usage}`);\n }\n return positionals;\n}\n\nfunction parseCli(argv: string[]): ParsedCli {\n const command = argv[2] ?? \"info\";\n if (command === \"--help\" || command === \"-h\") {\n return { command: \"info\", positionals: [], help: \"top\" };\n }\n if (command === \"--version\" || command === \"-V\") {\n if (argv.length > 3) throw new Error(`${command} does not accept arguments.`);\n return { command, positionals: [], help: \"command\" };\n }\n if (command.startsWith(\"-\")) throw new Error(`Unknown option: ${command}`);\n\n const definition = COMMAND_DEFINITIONS[command];\n if (definition) {\n if (hasHelpFlag(argv.slice(3))) {\n return { command, positionals: [], help: \"command\", definition };\n }\n return {\n command,\n positionals: parseCommandArguments(argv.slice(3), definition),\n help: \"top\",\n definition,\n };\n }\n\n const group = COMMAND_GROUPS[command];\n if (!group) throw new Error(`Unknown command: ${command}`);\n if (argv[3] === \"--help\" || argv[3] === \"-h\") {\n return { command, positionals: [], help: \"group\" };\n }\n\n const candidate = argv[3];\n let subcommand: string;\n let tokenStart: number;\n if (candidate && !candidate.startsWith(\"-\")) {\n subcommand = candidate;\n tokenStart = 4;\n } else if (group.defaultSubcommand) {\n subcommand = group.defaultSubcommand;\n tokenStart = 3;\n } else {\n throw new Error(`${command} requires a subcommand. Run 'tt-local ${command} --help'.`);\n }\n const subcommandDefinition = group.subcommands[subcommand];\n if (!subcommandDefinition) throw new Error(`Unknown ${command} command: ${subcommand}`);\n if (hasHelpFlag(argv.slice(tokenStart))) {\n return { command, subcommand, positionals: [], help: \"command\", definition: subcommandDefinition };\n }\n return {\n command,\n subcommand,\n positionals: parseCommandArguments(argv.slice(tokenStart), subcommandDefinition),\n help: \"top\",\n definition: subcommandDefinition,\n };\n}\n\nfunction readNumberOption(argv: string[], name: string): number | undefined {\n const value = readOption(argv, name);\n return value ? Number(value) : undefined;\n}\n\ninterface LocalConfigSelection {\n config: LocalRunnerConfig;\n path?: string;\n}\n\nasync function selectedConfigPath(argv: string[], adjacentTo?: string): Promise<string | undefined> {\n const explicitPath = readOption(argv, \"--config\");\n if (explicitPath) return resolve(explicitPath);\n const candidate = join(adjacentTo ? dirname(resolve(adjacentTo)) : cwd(), \"local-runner.json\");\n const metadata = await stat(candidate).catch(() => null);\n return metadata?.isFile() ? candidate : undefined;\n}\n\nasync function configSelectionFromArgv(argv: string[], adjacentTo?: string): Promise<LocalConfigSelection> {\n const path = await selectedConfigPath(argv, adjacentTo);\n return {\n config: await loadLocalRunnerConfig(path),\n ...(path ? { path } : {}),\n };\n}\n\nasync function configFromArgv(argv: string[], adjacentTo?: string): Promise<LocalRunnerConfig> {\n return (await configSelectionFromArgv(argv, adjacentTo)).config;\n}\n\nasync function loadCliBehaviorSpec(inputPath: string, runId?: string) {\n const input = await loadLocalRunInput(inputPath, {\n ...(runId ? { runId } : {}),\n });\n if (input.kind !== \"spec\") {\n throw new Error(`TT Local CLI expects a tunedtensor.json behavior spec, not a full run request: ${input.path}`);\n }\n return input;\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction shortValue(value: unknown): string | null {\n if (value === undefined || value === null) return null;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) return `[${value.length} items]`;\n return null;\n}\n\nfunction formatEvent(event: LocalRunProgressEvent): string {\n const detailText = Object.entries(event.details ?? {})\n .filter(([key]) => key !== \"metrics\")\n .map(([key, value]) => {\n const formatted = key === \"command\" && Array.isArray(value)\n ? value.join(\" \")\n : shortValue(value);\n return formatted ? `${key}=${formatted}` : null;\n })\n .filter((value): value is string => Boolean(value))\n .slice(0, 5)\n .join(\" \");\n return sanitizeLogLine(`[tt-local] ${event.stage}: ${event.message}${detailText ? ` (${detailText})` : \"\"}`);\n}\n\nfunction createConsoleReporter(options: { verbose: boolean; quiet: boolean }): LocalRunReporter | undefined {\n if (options.quiet) return undefined;\n let lastLogLine = \"\";\n return {\n verbose: options.verbose,\n onEvent(event) {\n process.stderr.write(`${formatEvent(event)}\\n`);\n },\n onLog(log) {\n const line = sanitizeLogLine(`[tt-local] ${log.stage}${log.stream ? ` ${log.stream}` : \"\"}: ${log.message}`);\n // tqdm redraws the same progress line several times per step; collapse\n // consecutive duplicates so --verbose output stays readable.\n if (line === lastLogLine) return;\n lastLogLine = line;\n process.stderr.write(`${line}\\n`);\n },\n };\n}\n\nasync function verifyStoredModel(model: LocalModelRecord, config: LocalRunnerConfig): Promise<{\n manifest_path: string;\n integrity: Awaited<ReturnType<typeof assertArtifactManifest>>;\n artifact: Awaited<ReturnType<typeof assertUsableModelArtifact>>;\n contract: unknown;\n}> {\n const manifestPath = join(model.artifact_dir, \"artifact-manifest.json\");\n const integrity = await assertArtifactManifest(manifestPath, {\n requiredPaths: [\"stage-metadata.json\", \"training-report.json\"],\n scopeToRequired: true,\n verifyModel: true,\n });\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as {\n model?: {\n artifact_root?: unknown;\n base_model?: unknown;\n format?: unknown;\n framework?: unknown;\n servable?: unknown;\n base_model_artifact_uri?: unknown;\n base_model_fingerprint?: unknown;\n };\n };\n if (!manifest.model) {\n throw new Error(`Artifact manifest does not contain a model contract: ${manifestPath}`);\n }\n const artifact = await assertUsableModelArtifact(model.artifact_uri);\n if (\n typeof manifest.model.base_model_artifact_uri === \"string\"\n && typeof manifest.model.base_model_fingerprint === \"string\"\n ) {\n const actualBaseFingerprint = await fingerprintLocalBaseModel(\n manifest.model.base_model_artifact_uri,\n typeof manifest.model.base_model === \"string\"\n ? manifest.model.base_model\n : undefined,\n config.paths.modelCache,\n );\n if (actualBaseFingerprint !== manifest.model.base_model_fingerprint) {\n throw new Error(\"Recorded local base-model content no longer matches the model artifact contract.\");\n }\n }\n if (\n typeof manifest.model.artifact_root !== \"string\"\n || resolve(manifest.model.artifact_root) !== resolve(artifact.path)\n ) {\n throw new Error(\"Stored model record does not match the artifact covered by its manifest.\");\n }\n if (manifest.model.base_model !== model.base_model) {\n throw new Error(\"Stored model base model does not match its artifact manifest.\");\n }\n return {\n manifest_path: manifestPath,\n integrity,\n artifact,\n contract: manifest.model,\n };\n}\n\nasync function verifyActivationEvidence(model: LocalModelRecord): Promise<void> {\n await assertArtifactManifest(join(model.artifact_dir, \"artifact-manifest.json\"), {\n requiredPaths: [\n \"run-report.json\",\n \"general-baseline-eval.json\",\n \"general-candidate-eval.json\",\n ],\n scopeToRequired: true,\n verifyModel: true,\n });\n}\n\nasync function verifyModelArtifactPath(input: string, config: LocalRunnerConfig): Promise<{\n manifest_path: string;\n integrity: Awaited<ReturnType<typeof assertArtifactManifest>>;\n artifact: Awaited<ReturnType<typeof assertUsableModelArtifact>>;\n contract: unknown;\n}> {\n const inputPath = resolve(input);\n let manifestPath: string | undefined;\n let artifactUri = inputPath;\n if (basename(inputPath) === \"artifact-manifest.json\") {\n manifestPath = inputPath;\n const raw = JSON.parse(await readFile(inputPath, \"utf8\")) as { model?: { artifact_root?: unknown } };\n if (typeof raw.model?.artifact_root !== \"string\") {\n throw new Error(`Artifact manifest does not contain a model contract: ${inputPath}`);\n }\n artifactUri = raw.model.artifact_root;\n } else {\n const metadata = await stat(inputPath).catch(() => null);\n if (!metadata) throw new Error(`Model not found and artifact path does not exist: ${input}`);\n let current = metadata.isDirectory() ? inputPath : dirname(inputPath);\n for (let depth = 0; depth < 8; depth += 1) {\n const candidate = join(current, \"artifact-manifest.json\");\n const raw = await readFile(candidate, \"utf8\").catch(() => null);\n if (raw) {\n const parsed = JSON.parse(raw) as { model?: { artifact_root?: unknown } };\n if (\n typeof parsed.model?.artifact_root === \"string\"\n && resolve(parsed.model.artifact_root) === resolve(inputPath)\n ) {\n manifestPath = candidate;\n break;\n }\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n }\n if (!manifestPath) {\n throw new Error(`No artifact manifest covering model path ${inputPath} was found in its parent run directory.`);\n }\n const integrity = await assertArtifactManifest(manifestPath, {\n requiredPaths: [\"stage-metadata.json\", \"training-report.json\"],\n scopeToRequired: true,\n verifyModel: true,\n });\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as { model?: Record<string, unknown> };\n if (!manifest.model) throw new Error(`Artifact manifest does not contain a model contract: ${manifestPath}`);\n const artifact = await assertUsableModelArtifact(artifactUri);\n if (\n typeof manifest.model.base_model_artifact_uri === \"string\"\n && typeof manifest.model.base_model_fingerprint === \"string\"\n ) {\n const actualBaseFingerprint = await fingerprintLocalBaseModel(\n manifest.model.base_model_artifact_uri,\n typeof manifest.model.base_model === \"string\"\n ? manifest.model.base_model\n : undefined,\n config.paths.modelCache,\n );\n if (actualBaseFingerprint !== manifest.model.base_model_fingerprint) {\n throw new Error(\"Recorded local base-model content no longer matches the model artifact contract.\");\n }\n }\n if (\n typeof manifest.model.artifact_root !== \"string\"\n || resolve(manifest.model.artifact_root) !== resolve(artifact.path)\n ) {\n throw new Error(\"Model path does not match the artifact covered by its manifest.\");\n }\n return { manifest_path: manifestPath, integrity, artifact, contract: manifest.model };\n}\n\nasync function modelSystemPrompt(args: {\n argv: string[];\n model: LocalModelRecord;\n store: LocalStore;\n}): Promise<string | undefined> {\n const specPath = readOption(args.argv, \"--spec\");\n if (specPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n if (hasFlag(args.argv, \"--no-spec-prompt\")) return undefined;\n\n let spec: SpecSnapshot;\n if (specPath) {\n const input = JSON.parse(await readFile(resolve(specPath), \"utf8\")) as unknown;\n const local = localBehaviorSpecFileSchema.safeParse(input);\n if (!local.success) {\n throw new Error(`--spec must contain a tunedtensor.json behavior spec: ${resolve(specPath)}`);\n }\n spec = local.data;\n } else {\n const runRequestPath = join(args.store.paths.runsDir, args.model.run_id, \"request.json\");\n let persistedRequest: FineTuneRunRequest | null = null;\n try {\n persistedRequest = fineTuneRunRequestSchema.parse(JSON.parse(await readFile(runRequestPath, \"utf8\")));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n spec = persistedRequest?.spec_snapshot\n ?? (await args.store.getSpec(args.model.behavior_spec_id)).spec;\n }\n if (spec.base_model !== args.model.base_model) {\n throw new Error(\n `Behavior spec base model ${spec.base_model} does not match stored model base ${args.model.base_model}.`,\n );\n }\n const prompt = buildSystemMessage(spec);\n const metadata = JSON.parse(\n await readFile(join(args.model.artifact_dir, \"stage-metadata.json\"), \"utf8\"),\n ) as { system_prompt_sha256?: unknown };\n const promptHash = createHash(\"sha256\").update(prompt).digest(\"hex\");\n if (metadata.system_prompt_sha256 !== promptHash) {\n throw new Error(\n \"Behavior spec instructions do not match the prompt fingerprint used for this trained model. \"\n + \"Pass the original --spec, or use --no-spec-prompt only when this change is intentional.\",\n );\n }\n return prompt;\n}\n\nfunction modelServeDevice(argv: string[]): \"cpu\" | \"cuda\" | undefined {\n const value = readOption(argv, \"--device\");\n if (value === undefined || value === \"cpu\" || value === \"cuda\") {\n return value;\n }\n throw new Error(`--device must be cuda or cpu; got: ${value}`);\n}\n\nasync function serveStoredModelFromCli(args: {\n argv: string[];\n modelId: string;\n config: LocalRunnerConfig;\n}): Promise<void> {\n const store = createLocalStore(args.config.storeRoot);\n const model = await store.getModel(args.modelId);\n const verified = await verifyStoredModel(model, args.config);\n const launch = buildLocalModelServerLaunch({\n model,\n config: args.config,\n options: {\n host: readOption(args.argv, \"--host\"),\n port: readNumberOption(args.argv, \"--port\"),\n device: modelServeDevice(args.argv),\n maxTokens: readNumberOption(args.argv, \"--max-tokens\"),\n temperature: readNumberOption(args.argv, \"--temperature\"),\n topP: readNumberOption(args.argv, \"--top-p\"),\n maxConcurrentRequests: readNumberOption(args.argv, \"--max-concurrent-requests\"),\n systemPrompt: await modelSystemPrompt({ argv: args.argv, model, store }),\n allowRemote: hasFlag(args.argv, \"--allow-remote\"),\n apiKeyEnv: readOption(args.argv, \"--api-key-env\"),\n baseModelRevision: (() => {\n const contract = verified.contract as { base_model_revision?: unknown };\n return typeof contract.base_model_revision === \"string\" ? contract.base_model_revision : undefined;\n })(),\n baseModelArtifactUri: (() => {\n const contract = verified.contract as { base_model_artifact_uri?: unknown };\n return typeof contract.base_model_artifact_uri === \"string\" ? contract.base_model_artifact_uri : undefined;\n })(),\n },\n });\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: model.id,\n url: launch.url,\n command: launch.displayCommand,\n artifact_path: launch.artifactPath,\n manifest_path: verified.manifest_path,\n integrity: verified.integrity,\n });\n return;\n }\n process.stderr.write(`[tt-local] verified ${verified.integrity.checked} artifact file(s)\\n`);\n process.stderr.write(`[tt-local] model API: ${launch.url}\\n`);\n await serveLocalModel(launch);\n}\n\nfunction serveOptionsFromArgv(argv: string[]) {\n return {\n host: readOption(argv, \"--host\"),\n port: readNumberOption(argv, \"--port\"),\n device: modelServeDevice(argv),\n maxTokens: readNumberOption(argv, \"--max-tokens\"),\n temperature: readNumberOption(argv, \"--temperature\"),\n topP: readNumberOption(argv, \"--top-p\"),\n maxConcurrentRequests: readNumberOption(argv, \"--max-concurrent-requests\"),\n allowRemote: hasFlag(argv, \"--allow-remote\"),\n apiKeyEnv: readOption(argv, \"--api-key-env\"),\n };\n}\n\nasync function serveBaseModelFromCli(args: {\n argv: string[];\n config: LocalRunnerConfig;\n}): Promise<void> {\n const explicitSpecPath = readOption(args.argv, \"--spec\");\n if (explicitSpecPath && hasFlag(args.argv, \"--no-spec-prompt\")) {\n throw new Error(\"Use only one of --spec or --no-spec-prompt.\");\n }\n const defaultSpecPath = resolve(DEFAULT_LOCAL_SPEC_PATH);\n const specPath = explicitSpecPath\n ? resolve(explicitSpecPath)\n : (await stat(defaultSpecPath).catch(() => null))?.isFile()\n ? defaultSpecPath\n : undefined;\n const spec = specPath\n ? localBehaviorSpecFileSchema.parse(\n JSON.parse(await readFile(specPath, \"utf8\")) as unknown,\n )\n : undefined;\n let baseModel = spec?.base_model;\n if (!baseModel) {\n const store = createLocalStore(args.config.storeRoot);\n const active = await getActiveModel(store);\n const referenceModel = active.model\n ?? (active.pointer?.previous_model_id\n ? await store.getModel(active.pointer.previous_model_id)\n : null);\n baseModel = referenceModel?.base_model;\n }\n if (!baseModel) {\n throw new Error(\n \"Cannot identify the protected base model. Pass --spec <tunedtensor.json> \"\n + \"or activate a model first.\",\n );\n }\n const launch = buildLocalBaseModelServerLaunch({\n baseModel,\n config: args.config,\n options: {\n ...serveOptionsFromArgv(args.argv),\n systemPrompt: explicitSpecPath && !hasFlag(args.argv, \"--no-spec-prompt\")\n ? buildSystemMessage(spec!)\n : undefined,\n baseModelRevision: spec?.hyperparameters?.base_model_revision ?? defaultBaseModelRevision(baseModel),\n },\n });\n if (hasFlag(args.argv, \"--print-command\")) {\n printJson({\n ok: true,\n model_id: null,\n base_model: baseModel,\n url: launch.url,\n command: launch.displayCommand,\n });\n return;\n }\n process.stderr.write(`[tt-local] protected base model API: ${launch.url}\\n`);\n await serveLocalModel(launch);\n}\n\nasync function serveModelTargetFromCli(args: {\n argv: string[];\n target: string;\n config: LocalRunnerConfig;\n}): Promise<void> {\n if (args.target === \"base\") {\n return serveBaseModelFromCli(args);\n }\n if (args.target === \"active\") {\n const store = createLocalStore(args.config.storeRoot);\n const active = await getActiveModel(store);\n if (!active.model) return serveBaseModelFromCli(args);\n return serveStoredModelFromCli({\n argv: args.argv,\n modelId: active.model.id,\n config: args.config,\n });\n }\n return serveStoredModelFromCli({\n argv: args.argv,\n modelId: args.target,\n config: args.config,\n });\n}\n\nasync function main(argv: string[]): Promise<void> {\n const cli = parseCli(argv);\n const command = cli.command;\n\n if (command === \"--version\" || command === \"-V\") {\n console.log(TT_LOCAL_VERSION);\n return;\n }\n if (cli.help === \"top\" && (argv[2] === \"--help\" || argv[2] === \"-h\")) {\n printHelp();\n return;\n }\n if (cli.help === \"group\") {\n printGroupHelp(command, COMMAND_GROUPS[command]!);\n return;\n }\n if (cli.help === \"command\" && cli.definition) {\n printCommandHelp(cli.definition);\n return;\n }\n\n if (command === \"info\") {\n const info = getLocalRunnerInfo();\n console.log(`${info.name}: ${info.description}`);\n console.log(`Version: ${info.version}`);\n console.log(`Status: ${info.status}`);\n return;\n }\n\n if (command === \"doctor\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const hasDefaultSpec = cli.positionals[0]\n ? true\n : Boolean((await stat(inputPath).catch(() => null))?.isFile());\n const request = hasDefaultSpec\n ? (await loadCliBehaviorSpec(inputPath)).request\n : undefined;\n const checks = await runDoctor(configSelection.config, request);\n const ok = checks.every((check) => check.ok);\n printJson({\n ok,\n config_path: configSelection.path ?? null,\n checks,\n });\n if (!ok) process.exitCode = 1;\n return;\n }\n\n if (command === \"init\") {\n const outputPath = resolve(readOption(argv, \"--output\") ?? DEFAULT_LOCAL_SPEC_PATH);\n const profile = readOption(argv, \"--profile\");\n if (profile !== undefined && profile !== \"spark\") {\n throw new Error(`--profile must be spark, got: ${profile}`);\n }\n const spec = await initLocalSpecFile({\n outputPath,\n name: readOption(argv, \"--name\") ?? \"Local Tuned Tensor Spec\",\n baseModel: readOption(argv, \"--model\") ?? \"Qwen/Qwen3.5-2B\",\n force: hasFlag(argv, \"--force\"),\n });\n const configPath = profile\n ? resolve(readOption(argv, \"--config\") ?? resolve(dirname(outputPath), \"local-runner.json\"))\n : await selectedConfigPath(argv, outputPath);\n if (profile) {\n await initLocalRunnerConfigFile({\n outputPath: configPath!,\n profile,\n force: hasFlag(argv, \"--force\"),\n });\n } else if (configPath) {\n await loadLocalRunnerConfig(configPath);\n }\n printJson({\n ok: true,\n path: outputPath,\n id: spec.id,\n name: spec.name,\n base_model: spec.base_model,\n config_path: configPath ?? null,\n });\n return;\n }\n\n if (command === \"validate\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const input = await loadCliBehaviorSpec(inputPath);\n assertLocalRunInputReady(input.request);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const validated = await validateLocalFineTuneInput({\n request: input.request,\n config: configSelection.config,\n });\n const request = validated.request;\n const config = validated.config;\n printJson({\n ok: true,\n input_path: input.path,\n config_path: configSelection.path ?? null,\n behavior_spec_id: request.behavior_spec_id,\n base_model: request.spec_snapshot.base_model,\n dataset_format: request.dataset_prebuilt?.format ?? null,\n artifact_root: config.artifactRoot,\n store_root: config.storeRoot,\n dry_run: config.dryRun,\n });\n return;\n }\n\n if (command === \"run\") {\n const inputPath = resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH);\n const configSelection = await configSelectionFromArgv(argv, inputPath);\n const configInput = configSelection.config;\n const config = localRunnerConfigSchema.parse({\n ...configInput,\n dryRun: hasFlag(argv, \"--dry-run\") ? true : configInput.dryRun,\n });\n const input = await loadCliBehaviorSpec(inputPath);\n assertLocalRunInputReady(input.request);\n const validated = await validateLocalFineTuneInput({\n request: input.request,\n config,\n });\n let request = validated.request;\n const reporter = createConsoleReporter({\n verbose: hasFlag(argv, \"--verbose\"),\n quiet: hasFlag(argv, \"--quiet\"),\n });\n if (\n !config.dryRun\n && !config.paths.baseModel\n && !request.hyperparameters.base_model_revision\n ) {\n const prefetch = await prefetchBaseModel({\n request,\n config,\n reporter,\n });\n if (!prefetch.snapshot_revision) {\n throw new Error(\"Base-model prefetch did not return an immutable snapshot revision.\");\n }\n request = fineTuneRunRequestSchema.parse({\n ...request,\n hyperparameters: {\n ...request.hyperparameters,\n base_model_revision: prefetch.snapshot_revision,\n },\n });\n }\n const result = await runLocalFineTune({\n request,\n config,\n reporter,\n });\n printJson({\n status: result.report.status,\n run_id: result.report.run_id,\n behavior_spec_id: result.report.behavior_spec_id,\n report_path: result.reportPath,\n artifact_dir: result.artifactDir,\n ...(!config.dryRun ? {\n model_id: `local-${result.report.run_id}`,\n fine_tuned_model_id: result.report.fine_tuned_model_id,\n } : {}),\n training_log: result.report.training.log_uri,\n baseline_eval: result.report.artifact_uris.baseline_eval,\n candidate_eval: result.report.artifact_uris.candidate_eval,\n comparison: result.report.comparison,\n general_regression: result.report.general_regression,\n });\n return;\n }\n\n if (command === \"serve\") {\n const config = await configFromArgv(argv);\n await serveModelTargetFromCli({\n argv,\n target: cli.positionals[0]!,\n config,\n });\n return;\n }\n\n if (command === \"runs\") {\n const subcommand = cli.subcommand!;\n const config = await configFromArgv(argv);\n const store = createLocalStore(config.storeRoot);\n if (subcommand === \"list\") return printJson(await store.listRuns());\n if (subcommand === \"get\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs get requires <run-id>\");\n return printJson(await store.getRun(id));\n }\n if (subcommand === \"events\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs events requires <run-id>\");\n return printJson(await store.getRunEvents(id));\n }\n if (subcommand === \"report\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"runs report requires <run-id>\");\n return printJson(await store.getRunReport(id));\n }\n if (subcommand === \"compare\") {\n const idA = cli.positionals[0];\n const idB = cli.positionals[1];\n if (!idA || !idB) throw new Error(\"runs compare requires <run-id-a> <run-id-b>\");\n const [reportA, reportB] = await Promise.all([\n store.getRunReport(idA),\n store.getRunReport(idB),\n ]);\n return printJson(compareRuns(reportA, reportB));\n }\n throw new Error(`Unknown runs command: ${subcommand}`);\n }\n\n if (command === \"models\") {\n const subcommand = cli.subcommand!;\n const modelInputPath = subcommand === \"prefetch\" || subcommand === \"verify-base\"\n ? resolve(cli.positionals[0] ?? DEFAULT_LOCAL_SPEC_PATH)\n : undefined;\n const config = await configFromArgv(argv, modelInputPath);\n const store = createLocalStore(config.storeRoot);\n if (subcommand === \"list\") return printJson(await store.listModels());\n if (subcommand === \"get\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models get requires <model-id>\");\n return printJson(await store.getModel(id));\n }\n if (subcommand === \"verify\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models verify requires <model-id-or-artifact-path>\");\n if (await stat(resolve(id)).then(() => true, () => false)) {\n return printJson({ ok: true, model: null, ...await verifyModelArtifactPath(id, config) });\n }\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model, config);\n return printJson({ ok: true, model, ...verified });\n }\n if (subcommand === \"active\") {\n const active = await getActiveModel(store);\n return printJson({\n active: active.model?.id ?? \"base\",\n pointer: active.pointer,\n model: active.model,\n });\n }\n if (subcommand === \"activate\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models activate requires <model-id>\");\n const model = await store.getModel(id);\n const verified = await verifyStoredModel(model, config);\n await verifyActivationEvidence(model);\n const pointer = await activateModel(store, model.id);\n return printJson({\n active: pointer.model_id,\n pointer,\n manifest_path: verified.manifest_path,\n integrity: verified.integrity,\n });\n }\n if (subcommand === \"rollback\") {\n const current = await getActiveModel(store);\n if (current.pointer?.previous_model_id) {\n const previous = await store.getModel(current.pointer.previous_model_id);\n await verifyStoredModel(previous, config);\n await verifyActivationEvidence(previous);\n }\n const pointer = await rollbackActiveModel(store);\n return printJson({ active: pointer.model_id ?? \"base\", pointer });\n }\n if (subcommand === \"prefetch\" || subcommand === \"verify-base\") {\n const input = await loadCliBehaviorSpec(modelInputPath!);\n const report = await prefetchBaseModel({\n request: input.request,\n config,\n localOnly: subcommand === \"verify-base\",\n reporter: createConsoleReporter({\n verbose: hasFlag(argv, \"--verbose\"),\n quiet: hasFlag(argv, \"--quiet\"),\n }),\n });\n return printJson({\n ...report,\n input_path: input.path,\n });\n }\n if (subcommand === \"serve\") {\n const id = cli.positionals[0];\n if (!id) throw new Error(\"models serve requires <model-id>\");\n await serveModelTargetFromCli({ argv, target: id, config });\n return;\n }\n throw new Error(`Unknown models command: ${subcommand}`);\n }\n\n console.error(`Unknown command: ${command}`);\n process.exitCode = 1;\n}\n\nfunction isCliEntrypoint(): boolean {\n if (!process.argv[1]) return false;\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1]);\n}\n\nif (isCliEntrypoint()) {\n main(process.argv).catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n });\n}\n","import type { EvalExampleResult, EvalReport, RunReport } from \"./contracts.js\";\nimport { tokenF1 } from \"./evaluation.js\";\n\ninterface SubsetSide {\n baseline_avg_score: number | null;\n candidate_avg_score: number | null;\n candidate_avg_token_f1: number | null;\n}\n\ninterface RunSummary {\n run_id: string;\n started_at: string;\n base_model: string;\n training_example_count: number | null;\n eval_examples_used: number;\n baseline_avg_score: number;\n candidate_avg_score: number;\n candidate_avg_token_f1: number | null;\n avg_score_delta: number;\n}\n\nexport interface RunComparison {\n run_a: RunSummary;\n run_b: RunSummary;\n shared: {\n examples: number;\n run_a: SubsetSide;\n run_b: SubsetSide;\n candidate_avg_score_delta: number | null;\n candidate_avg_token_f1_delta: number | null;\n };\n b_only: SubsetSide & { examples: number };\n notes: string[];\n}\n\nfunction byPrompt(report: EvalReport): Map<string, EvalExampleResult> {\n return new Map(report.results.map((result) => [result.prompt, result]));\n}\n\nfunction avg(values: number[]): number | null {\n return values.length > 0 ? values.reduce((sum, value) => sum + value, 0) / values.length : null;\n}\n\nfunction summarizeRun(report: RunReport): RunSummary {\n return {\n run_id: report.run_id,\n started_at: report.run_metadata.started_at,\n base_model: report.base_model,\n training_example_count: report.run_metadata.training_example_count,\n eval_examples_used: report.run_metadata.eval_examples_used,\n baseline_avg_score: report.baseline.avg_score,\n candidate_avg_score: report.candidate.avg_score,\n candidate_avg_token_f1: report.candidate.avg_token_f1 ?? null,\n avg_score_delta: report.comparison.avg_score_delta,\n };\n}\n\nfunction subsetSide(\n prompts: string[],\n baseline: Map<string, EvalExampleResult>,\n candidate: Map<string, EvalExampleResult>,\n): SubsetSide {\n const candidateResults = prompts\n .map((prompt) => candidate.get(prompt))\n .filter((result): result is EvalExampleResult => Boolean(result));\n return {\n baseline_avg_score: avg(prompts\n .map((prompt) => baseline.get(prompt)?.score)\n .filter((score): score is number => typeof score === \"number\")),\n candidate_avg_score: avg(candidateResults.map((result) => result.score)),\n candidate_avg_token_f1: avg(candidateResults.map((result) => tokenF1(result.expected, result.actual))),\n };\n}\n\n/**\n * Aligns two run reports on their shared eval prompts so recipe changes can\n * be compared apples-to-apples even when the eval set grew or shifted between\n * runs. Headline avg_score_delta values are not comparable across different\n * eval subsets; the shared subset is.\n */\nexport function compareRuns(a: RunReport, b: RunReport): RunComparison {\n const aCandidate = byPrompt(a.candidate);\n const bCandidate = byPrompt(b.candidate);\n const aBaseline = byPrompt(a.baseline);\n const bBaseline = byPrompt(b.baseline);\n const sharedPrompts = [...bCandidate.keys()].filter((prompt) => aCandidate.has(prompt));\n const bOnlyPrompts = [...bCandidate.keys()].filter((prompt) => !aCandidate.has(prompt));\n\n const sharedA = subsetSide(sharedPrompts, aBaseline, aCandidate);\n const sharedB = subsetSide(sharedPrompts, bBaseline, bCandidate);\n const runA = summarizeRun(a);\n const runB = summarizeRun(b);\n\n const notes: string[] = [];\n if (bOnlyPrompts.length > 0) {\n notes.push(\n `run_b evaluated ${bOnlyPrompts.length} example(s) run_a never saw; headline avg_score_delta values `\n + \"are not directly comparable across the two runs. Use the shared subset for recipe comparisons.\",\n );\n }\n return {\n run_a: runA,\n run_b: runB,\n shared: {\n examples: sharedPrompts.length,\n run_a: sharedA,\n run_b: sharedB,\n candidate_avg_score_delta:\n sharedA.candidate_avg_score !== null && sharedB.candidate_avg_score !== null\n ? sharedB.candidate_avg_score - sharedA.candidate_avg_score\n : null,\n candidate_avg_token_f1_delta:\n sharedA.candidate_avg_token_f1 !== null && sharedB.candidate_avg_token_f1 !== null\n ? sharedB.candidate_avg_token_f1 - sharedA.candidate_avg_token_f1\n : null,\n },\n b_only: { examples: bOnlyPrompts.length, ...subsetSide(bOnlyPrompts, bBaseline, bCandidate) },\n notes,\n };\n}\n","import { constants } from \"node:fs\";\nimport { access, mkdir, statfs, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport type { FineTuneRunRequest, LocalRunnerConfig } from \"./contracts.js\";\nimport {\n minimalMachineLearningEnvironment,\n withHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport {\n buildBundledPythonCommand,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\nimport { resolveTrainingModel } from \"./model-registry.js\";\nimport { defaultLocalHome } from \"./store.js\";\nimport { verifyLocalBaseModel } from \"./prefetch.js\";\n\nexport interface DoctorCheck {\n name: string;\n ok: boolean;\n message: string;\n details?: Record<string, unknown>;\n}\n\ninterface CommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n error?: string;\n}\n\ninterface CommandOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n timeoutMs?: number;\n}\n\nasync function runCommand(command: string, args: string[], options: CommandOptions = {}): Promise<CommandResult> {\n const timeoutMs = options.timeoutMs ?? 10_000;\n let interrupted: string | undefined;\n const result = await new Promise<CommandResult>((resolveResult) => {\n let settled = false;\n let stdout = \"\";\n let stderr = \"\";\n let stopError: string | undefined;\n let forceKillTimer: NodeJS.Timeout | null = null;\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env ?? process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n const killProcessGroup = (signal: NodeJS.Signals) => {\n if (child.pid && process.platform !== \"win32\") {\n try {\n process.kill(-child.pid, signal);\n return;\n } catch {\n // The child may have exited between the check and signal.\n }\n }\n child.kill(signal);\n };\n const requestStop = (signal: NodeJS.Signals = \"SIGTERM\") => {\n killProcessGroup(signal);\n if (!forceKillTimer) {\n forceKillTimer = setTimeout(() => killProcessGroup(\"SIGKILL\"), 5_000);\n forceKillTimer.unref();\n }\n };\n const onSigint = () => {\n interrupted = \"interrupted by SIGINT\";\n stopError = interrupted;\n requestStop(\"SIGINT\");\n };\n const onSigterm = () => {\n interrupted = \"interrupted by SIGTERM\";\n stopError = interrupted;\n requestStop(\"SIGTERM\");\n };\n const finish = (result: CommandResult) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n resolveResult(result);\n };\n const timer = setTimeout(() => {\n stopError = `timed out after ${timeoutMs}ms`;\n requestStop();\n }, timeoutMs);\n timer.unref();\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk) => { stdout += chunk; });\n child.stderr.on(\"data\", (chunk) => { stderr += chunk; });\n child.on(\"error\", (error) => {\n finish({ code: null, stdout, stderr, error: error.message });\n });\n child.on(\"close\", (code) => {\n finish({ code: stopError ? null : code, stdout, stderr, error: stopError });\n });\n });\n if (interrupted) throw new Error(interrupted);\n return result;\n}\n\nfunction firstLine(value: string): string {\n return value.trim().split(/\\r?\\n/)[0] ?? \"\";\n}\n\nfunction commandText(command: string, args: string[]): string {\n return [command, ...args].map((part) => /\\s/.test(part) ? JSON.stringify(part) : part).join(\" \");\n}\n\nasync function writableDirectoryCheck(name: string, path: string): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n const probePath = join(resolvedPath, `.tt-local-write-probe-${process.pid}-${Date.now()}`);\n try {\n await mkdir(resolvedPath, { recursive: true });\n await access(resolvedPath, constants.R_OK | constants.W_OK);\n await writeFile(probePath, \"ok\\n\", { flag: \"wx\" });\n await unlink(probePath);\n const fs = await statfs(resolvedPath);\n const freeBytes = Number(fs.bavail) * Number(fs.bsize);\n return {\n name,\n ok: true,\n message: `${resolvedPath} is writable (${Math.round(freeBytes / (1024 ** 3) * 10) / 10} GiB available)`,\n details: { path: resolvedPath, free_bytes: freeBytes },\n };\n } catch (error) {\n await unlink(probePath).catch(() => undefined);\n return {\n name,\n ok: false,\n message: `${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`,\n details: { path: resolvedPath },\n };\n }\n}\n\ninterface PythonProbePlan {\n name: \"python-runtime\";\n command: string;\n args: string[];\n env: NodeJS.ProcessEnv;\n}\n\nfunction pythonProbeSource(device: LocalRunnerConfig[\"evaluation\"][\"inference\"][\"device\"]): string {\n return [\n \"import json\",\n \"import torch, transformers, peft, huggingface_hub\",\n `requested = ${JSON.stringify(device)}`,\n \"assert torch.cuda.is_available(), 'TT Local training requires CUDA but torch.cuda.is_available() is false'\",\n \"props = torch.cuda.get_device_properties(0)\",\n \"print(json.dumps({'python_ok': True, 'torch': torch.__version__, 'transformers': transformers.__version__, 'cuda_available': True, 'cuda_device': torch.cuda.get_device_name(0), 'compute_capability': list(torch.cuda.get_device_capability(0)), 'total_memory_bytes': props.total_memory, 'evaluation_device': requested}))\",\n ].join(\"; \");\n}\n\nfunction pythonProbePlan(args: {\n device: LocalRunnerConfig[\"evaluation\"][\"inference\"][\"device\"];\n modelCache?: string;\n}): PythonProbePlan {\n const entrypoint = buildBundledPythonCommand(\n \"-c\",\n [pythonProbeSource(args.device)],\n );\n const env = withBundledPythonEnvironment(\n withHuggingFaceCacheEnvironment(\n minimalMachineLearningEnvironment(process.env),\n args.modelCache,\n ),\n );\n return {\n name: \"python-runtime\",\n command: entrypoint.command,\n args: entrypoint.commandArgs,\n env,\n };\n}\n\n/** Build the exact bundled uv environment that every real stage uses. */\nexport function buildDoctorPythonPlans(config: LocalRunnerConfig): PythonProbePlan[] {\n if (config.dryRun) return [];\n return [\n pythonProbePlan({\n device: config.evaluation.inference.device,\n modelCache: config.paths.modelCache,\n }),\n ];\n}\n\nfunction placeholderSpecCheck(request: FineTuneRunRequest): DoctorCheck {\n const placeholder = request.spec_snapshot.examples.some((example) =>\n /replace this with/i.test(example.input) || /replace this with/i.test(example.output)\n ) || /describe the behavior this local model should learn/i.test(request.spec_snapshot.system_prompt);\n return {\n name: \"spec-content\",\n ok: !placeholder,\n message: placeholder\n ? \"The spec still contains generated placeholder content; edit it before training.\"\n : `${request.spec_snapshot.examples.length} spec example(s); base model ${request.spec_snapshot.base_model}`,\n };\n}\n\nasync function localBaseModelCheck(\n path: string,\n expectedModelId?: string,\n modelCache?: string,\n): Promise<DoctorCheck> {\n const resolvedPath = resolve(path);\n try {\n const verified = await verifyLocalBaseModel(resolvedPath, expectedModelId, modelCache);\n return {\n name: \"local-base-model\",\n ok: true,\n message: `${resolvedPath} is a valid local Hugging Face snapshot directory.`,\n details: { path: resolvedPath, file_count: verified.fileCount, size_bytes: verified.sizeBytes },\n };\n } catch (error) {\n return {\n name: \"local-base-model\",\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n details: { path: resolvedPath },\n };\n }\n}\n\nexport async function runDoctor(config: LocalRunnerConfig, request?: FineTuneRunRequest): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n const nodeVersion = process.versions.node;\n const nodeMajor = Number(nodeVersion.split(\".\")[0]);\n checks.push({ name: \"node\", ok: nodeMajor >= 22, message: `Node ${nodeVersion}` });\n\n checks.push(await writableDirectoryCheck(\"artifact-root\", config.artifactRoot));\n checks.push(await writableDirectoryCheck(\"store-root\", config.storeRoot ?? defaultLocalHome()));\n checks.push(await writableDirectoryCheck(\n \"model-cache\",\n config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), \".cache\", \"huggingface\"),\n ));\n if (config.paths.baseModel) {\n checks.push(await localBaseModelCheck(\n config.paths.baseModel,\n request?.spec_snapshot.base_model,\n config.paths.modelCache,\n ));\n }\n\n if (request) {\n checks.push(placeholderSpecCheck(request));\n resolveTrainingModel(request.spec_snapshot.base_model);\n }\n const pythonPlans = buildDoctorPythonPlans(config);\n if (pythonPlans.length > 0) {\n const uvVersion = await runCommand(\"uv\", [\"--version\"]);\n checks.push({\n name: \"uv\",\n ok: uvVersion.code === 0,\n message: uvVersion.code === 0\n ? firstLine(uvVersion.stdout)\n : uvVersion.error ?? (firstLine(uvVersion.stderr) || \"uv is not available\"),\n });\n\n if (uvVersion.code === 0) {\n const uniquePlans = new Map<string, PythonProbePlan>();\n for (const plan of pythonPlans) {\n const key = JSON.stringify([plan.command, plan.args, plan.env]);\n if (!uniquePlans.has(key)) uniquePlans.set(key, plan);\n }\n for (const plan of uniquePlans.values()) {\n const result = await runCommand(plan.command, plan.args, {\n env: plan.env,\n timeoutMs: 1_800_000,\n });\n checks.push({\n name: plan.name,\n ok: result.code === 0,\n message: result.code === 0\n ? firstLine(result.stdout)\n : result.error ?? (firstLine(result.stderr) || `${plan.command} exited ${result.code}`),\n details: { command: commandText(plan.command, plan.args) },\n });\n }\n }\n } else {\n checks.push({\n name: \"python-runtime\",\n ok: true,\n message: config.dryRun\n ? \"Python dependency checks skipped because dryRun is enabled.\"\n : \"Python dependency checks were skipped.\",\n });\n }\n\n const device = config.evaluation.inference.device;\n if (!config.dryRun) {\n const nvidiaSmi = await runCommand(\"nvidia-smi\", []);\n checks.push({\n name: \"nvidia-smi\",\n ok: nvidiaSmi.code === 0,\n message: nvidiaSmi.code === 0\n ? firstLine(nvidiaSmi.stdout)\n : nvidiaSmi.error ?? (firstLine(nvidiaSmi.stderr) || \"nvidia-smi not available\"),\n });\n } else {\n checks.push({\n name: \"nvidia-smi\",\n ok: true,\n message: config.dryRun\n ? \"GPU checks skipped because dryRun is enabled.\"\n : `nvidia-smi is not required for device=${device}.`,\n });\n }\n\n const trainingCommand = buildBundledPythonCommand(\"train.py\").displayCommand;\n checks.push({\n name: \"effective-plan\",\n ok: true,\n message: \"Resolved the configured training and evaluation plan.\",\n details: {\n training_command: trainingCommand ?? null,\n evaluation_provider: \"transformers\",\n evaluation_device: device,\n artifact_root: resolve(config.artifactRoot),\n store_root: resolve(config.storeRoot ?? defaultLocalHome()),\n model_cache: resolve(config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), \".cache\", \"huggingface\")),\n base_model: request?.spec_snapshot.base_model ?? null,\n scoring_mode: config.evaluation.scoring.mode,\n },\n });\n\n return checks;\n}\n","import { spawn } from \"node:child_process\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { LocalRunnerConfig } from \"./contracts.js\";\nimport {\n minimalMachineLearningEnvironment,\n withOfflineHuggingFaceCacheEnvironment,\n} from \"./huggingface-cache.js\";\nimport {\n defaultBaseModelRevision,\n resolveModelLoader,\n resolveRequestedBaseModelRevision,\n} from \"./model-registry.js\";\nimport {\n buildBundledPythonCommand,\n withBundledPythonEnvironment,\n} from \"./process-runner.js\";\nimport type { LocalModelRecord } from \"./store.js\";\nimport { verifyLocalBaseModel } from \"./prefetch.js\";\n\nexport interface LocalModelServeOptions {\n host?: string;\n port?: number;\n device?: \"cpu\" | \"cuda\";\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n systemPrompt?: string;\n allowRemote?: boolean;\n apiKeyEnv?: string;\n maxConcurrentRequests?: number;\n baseModelRevision?: string;\n baseModelArtifactUri?: string;\n}\n\nexport interface LocalModelServerLaunch {\n command: string;\n commandArgs: string[];\n displayCommand: string[];\n env: NodeJS.ProcessEnv;\n url: string;\n modelName: string;\n artifactPath?: string;\n}\n\nfunction localArtifactPath(uri: string): string {\n if (uri.startsWith(\"file://\")) return fileURLToPath(uri);\n if (/^[a-z][a-z0-9+.-]*:/i.test(uri)) {\n throw new Error(`TT Local serving requires a local file artifact, got: ${uri}`);\n }\n return resolve(uri);\n}\n\nfunction boundedNumber(name: string, value: number, minimum: number, maximum: number, integer = false): number {\n if (!Number.isFinite(value) || value < minimum || value > maximum || (integer && !Number.isInteger(value))) {\n throw new Error(`${name} must be between ${minimum} and ${maximum}`);\n }\n return value;\n}\n\nfunction isLoopbackHost(host: string): boolean {\n return host === \"127.0.0.1\" || host === \"localhost\" || host === \"::1\" || host === \"[::1]\";\n}\n\nfunction httpHost(host: string): string {\n return host.includes(\":\") && !host.startsWith(\"[\") ? `[${host}]` : host;\n}\n\nfunction buildModelServerLaunch(args: {\n modelName: string;\n baseModel: string;\n artifactUri?: string;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n const options = args.options ?? {};\n const host = options.host ?? \"127.0.0.1\";\n const remote = !isLoopbackHost(host);\n if (remote && !options.allowRemote) {\n throw new Error(\"Refusing a non-loopback model server bind without --allow-remote.\");\n }\n const apiKey = options.apiKeyEnv ? process.env[options.apiKeyEnv]?.trim() : undefined;\n if (options.apiKeyEnv && !apiKey) throw new Error(`${options.apiKeyEnv} is not set.`);\n if (remote && !apiKey) {\n throw new Error(\"Non-loopback serving requires --api-key-env with a populated environment variable.\");\n }\n const port = boundedNumber(\"port\", options.port ?? 8000, 1, 65_535, true);\n const maxTokens = boundedNumber(\"maxTokens\", options.maxTokens ?? 512, 1, 8192, true);\n const temperature = boundedNumber(\"temperature\", options.temperature ?? 0, 0, 5);\n const topP = boundedNumber(\"topP\", options.topP ?? 1, 0, 1);\n const maxConcurrentRequests = boundedNumber(\n \"maxConcurrentRequests\",\n options.maxConcurrentRequests ?? 1,\n 1,\n 8,\n true,\n );\n const artifactPath = args.artifactUri\n ? localArtifactPath(args.artifactUri)\n : undefined;\n const recordedBaseModelPath = options.baseModelArtifactUri\n ? localArtifactPath(options.baseModelArtifactUri)\n : undefined;\n const configuredBaseModelPath = args.config.paths.baseModel\n ? resolve(args.config.paths.baseModel)\n : undefined;\n if (\n recordedBaseModelPath\n && configuredBaseModelPath\n && resolve(recordedBaseModelPath) !== configuredBaseModelPath\n ) {\n throw new Error(\n `Configured paths.baseModel ${configuredBaseModelPath} does not match the base model recorded for this artifact: `\n + recordedBaseModelPath,\n );\n }\n const localBaseModelPath = recordedBaseModelPath ?? configuredBaseModelPath;\n const requestedBaseModelRevision = resolveRequestedBaseModelRevision(\n args.baseModel,\n options.baseModelRevision,\n );\n const baseModelRevision = localBaseModelPath\n ? defaultBaseModelRevision(args.baseModel)\n : requestedBaseModelRevision;\n const entrypoint = buildBundledPythonCommand(\"serve.py\");\n const env = withBundledPythonEnvironment(\n withOfflineHuggingFaceCacheEnvironment({\n ...minimalMachineLearningEnvironment(process.env),\n ...(artifactPath ? { TT_MODEL_ARTIFACT: artifactPath } : {}),\n TT_BASE_MODEL: args.baseModel,\n ...(localBaseModelPath ? { TT_MODEL_SOURCE: localBaseModelPath } : {}),\n ...(baseModelRevision\n ? { TT_BASE_MODEL_REVISION: baseModelRevision }\n : {}),\n TT_MODEL_NAME: args.modelName,\n TT_MODEL_LOADER: resolveModelLoader(args.baseModel),\n TT_HOST: host,\n TT_PORT: String(port),\n TT_DEVICE: options.device ?? args.config.evaluation.inference.device,\n TT_MAX_TOKENS: String(maxTokens),\n TT_TEMPERATURE: String(temperature),\n TT_TOP_P: String(topP),\n TT_TRUST_REMOTE_CODE: \"false\",\n TT_MAX_CONCURRENT_REQUESTS: String(maxConcurrentRequests),\n ...(options.systemPrompt ? { TT_SYSTEM_PROMPT: options.systemPrompt } : {}),\n ...(apiKey ? { TT_API_KEY: apiKey } : {}),\n }, args.config.paths.modelCache),\n );\n return {\n command: entrypoint.command,\n commandArgs: entrypoint.commandArgs,\n displayCommand: entrypoint.displayCommand,\n env,\n url: `http://${httpHost(host)}:${port}`,\n modelName: args.modelName,\n artifactPath,\n };\n}\n\nexport function buildLocalModelServerLaunch(args: {\n model: LocalModelRecord;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n return buildModelServerLaunch({\n modelName: args.model.id,\n baseModel: args.model.base_model,\n artifactUri: args.model.artifact_uri,\n config: args.config,\n options: args.options,\n });\n}\n\nexport function buildLocalBaseModelServerLaunch(args: {\n baseModel: string;\n config: LocalRunnerConfig;\n options?: LocalModelServeOptions;\n}): LocalModelServerLaunch {\n return buildModelServerLaunch({\n modelName: `base:${args.baseModel}`,\n baseModel: args.baseModel,\n config: args.config,\n options: args.options,\n });\n}\n\nexport async function verifyLocalModelServerLaunch(\n launch: LocalModelServerLaunch,\n): Promise<void> {\n const modelSource = launch.env.TT_MODEL_SOURCE;\n const expectedModelId = launch.env.TT_BASE_MODEL;\n if (modelSource && expectedModelId) {\n await verifyLocalBaseModel(modelSource, expectedModelId, launch.env.HF_HOME);\n }\n}\n\nexport async function serveLocalModel(launch: LocalModelServerLaunch): Promise<void> {\n await verifyLocalModelServerLaunch(launch);\n await new Promise<void>((resolveServer, reject) => {\n const child = spawn(launch.command, launch.commandArgs, {\n env: launch.env,\n stdio: \"inherit\",\n detached: process.platform !== \"win32\",\n });\n let stopping = false;\n let forceKillTimer: NodeJS.Timeout | undefined;\n const killProcessGroup = (signal: NodeJS.Signals) => {\n if (child.pid && process.platform !== \"win32\") {\n try {\n process.kill(-child.pid, signal);\n return;\n } catch {\n // Fall through when the process group has already exited.\n }\n }\n child.kill(signal);\n };\n const stop = (signal: NodeJS.Signals) => {\n if (stopping) return;\n stopping = true;\n killProcessGroup(signal);\n forceKillTimer = setTimeout(() => killProcessGroup(\"SIGKILL\"), 5_000);\n forceKillTimer.unref();\n };\n const onSigint = () => stop(\"SIGINT\");\n const onSigterm = () => stop(\"SIGTERM\");\n const cleanup = () => {\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n if (forceKillTimer) clearTimeout(forceKillTimer);\n };\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n child.once(\"error\", (error) => {\n cleanup();\n reject(error);\n });\n child.once(\"close\", (code, signal) => {\n cleanup();\n if (stopping || signal === \"SIGINT\" || signal === \"SIGTERM\") {\n resolveServer();\n } else if (code === 0) {\n resolveServer();\n } else {\n reject(new Error(`Local model server exited with code ${code ?? \"unknown\"}.`));\n }\n });\n });\n}\n","import { appendFile, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { writeJsonAtomic } from \"./artifacts.js\";\nimport { runReportSchema } from \"./contracts.js\";\nimport type { LocalModelRecord, LocalStore } from \"./store.js\";\n\nexport interface ActiveModelPointer {\n schema_version: 1;\n model_id: string | null;\n run_id: string | null;\n previous_model_id: string | null;\n activated_at: string;\n action: \"activate\" | \"rollback\";\n}\n\nexport interface ActiveModelState {\n pointer: ActiveModelPointer | null;\n model: LocalModelRecord | null;\n}\n\nfunction pointerPath(store: LocalStore): string {\n return join(store.root, \"active-model.json\");\n}\n\nfunction historyPath(store: LocalStore): string {\n return join(store.root, \"activation-history.jsonl\");\n}\n\nasync function readPointer(store: LocalStore): Promise<ActiveModelPointer | null> {\n try {\n const value = JSON.parse(await readFile(pointerPath(store), \"utf8\")) as ActiveModelPointer;\n if (\n value.schema_version !== 1\n || ![\"activate\", \"rollback\"].includes(value.action)\n || (value.model_id !== null && typeof value.model_id !== \"string\")\n || (value.run_id !== null && typeof value.run_id !== \"string\")\n || (value.previous_model_id !== null && typeof value.previous_model_id !== \"string\")\n ) {\n throw new Error(\"Active model pointer has an invalid shape.\");\n }\n return value;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nasync function assertModelCanActivate(\n store: LocalStore,\n modelId: string,\n): Promise<LocalModelRecord> {\n const model = await store.getModel(modelId);\n const run = await store.getRun(model.run_id);\n if (run.status !== \"completed\") {\n throw new Error(`Model ${model.id} belongs to run ${run.id}, which is not completed.`);\n }\n const report = runReportSchema.parse(\n JSON.parse(await readFile(join(model.artifact_dir, \"run-report.json\"), \"utf8\")),\n );\n if (!report.general_regression) {\n throw new Error(`Model ${model.id} has no general regression evaluation.`);\n }\n if (!report.general_regression.passed) {\n throw new Error(\n `Model ${model.id} failed general regression: `\n + (report.general_regression.failures.join(\" \") || \"regression budget exceeded\"),\n );\n }\n return model;\n}\n\nasync function publishPointer(\n store: LocalStore,\n pointer: ActiveModelPointer,\n): Promise<ActiveModelPointer> {\n await store.ensure();\n await writeJsonAtomic(pointerPath(store), pointer);\n await appendFile(historyPath(store), `${JSON.stringify(pointer)}\\n`, \"utf8\");\n return pointer;\n}\n\nexport async function getActiveModel(store: LocalStore): Promise<ActiveModelState> {\n const pointer = await readPointer(store);\n if (!pointer?.model_id) return { pointer, model: null };\n return { pointer, model: await store.getModel(pointer.model_id) };\n}\n\nexport async function activateModel(\n store: LocalStore,\n modelId: string,\n): Promise<ActiveModelPointer> {\n const [model, current] = await Promise.all([\n assertModelCanActivate(store, modelId),\n readPointer(store),\n ]);\n if (current?.model_id === model.id) return current;\n return publishPointer(store, {\n schema_version: 1,\n model_id: model.id,\n run_id: model.run_id,\n previous_model_id: current?.model_id ?? null,\n activated_at: new Date().toISOString(),\n action: \"activate\",\n });\n}\n\nexport async function rollbackActiveModel(store: LocalStore): Promise<ActiveModelPointer> {\n const current = await readPointer(store);\n if (!current) throw new Error(\"No active-model history exists to roll back.\");\n const targetId = current.previous_model_id;\n const target = targetId ? await assertModelCanActivate(store, targetId) : null;\n return publishPointer(store, {\n schema_version: 1,\n model_id: target?.id ?? null,\n run_id: target?.run_id ?? null,\n previous_model_id: current.model_id,\n activated_at: new Date().toISOString(),\n action: \"rollback\",\n });\n}\n"],"mappings":"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","names":["readFile","join","resolve","fileURLToPath","result","spawn","resolve","resolve","spawn","join","join","resolve","join","readFile","fileURLToPath"]}
|
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
This repository is the maintenance-mode local runtime behind the unified
|
|
4
4
|
`tt local` workflow. The standalone `tt-local` product surface is deprecated;
|
|
5
5
|
see [the deprecation note](../DEPRECATION.md). Its supported runtime boundary
|
|
6
|
-
is text SFT of
|
|
6
|
+
is text SFT of a registry-certified Transformers causal LM into a LoRA adapter
|
|
7
|
+
on CUDA. Certified checkpoints are `Qwen/Qwen3.5-2B`,
|
|
8
|
+
`nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16`, and
|
|
9
|
+
`meta-models/Muse-Glimmer-30B`. Muse Glimmer is a vision-language checkpoint
|
|
10
|
+
whose text tower is loaded through `AutoModelForImageTextToText` (its text
|
|
11
|
+
tower is not exposed in the causal-LM auto mapping) with the vision tower
|
|
12
|
+
frozen and unused during text SFT.
|
|
7
13
|
|
|
8
14
|
## Workflow
|
|
9
15
|
|
|
@@ -40,7 +46,7 @@ The bundled Python project owns four small operations:
|
|
|
40
46
|
|
|
41
47
|
- `prefetch.py`: download and verify the pinned Hugging Face snapshot;
|
|
42
48
|
- `evaluate.py`: generate predictions without receiving reference answers;
|
|
43
|
-
- `train.py`: perform CUDA-only
|
|
49
|
+
- `train.py`: perform CUDA-only, model-specific LoRA SFT;
|
|
44
50
|
- `serve.py`: load the base model and verified adapter for inference.
|
|
45
51
|
|
|
46
52
|
Training uses assistant-only loss. Prompt tokens have label `-100`, and
|