@tuned-tensor/cli 0.4.15 → 0.4.16

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 CHANGED
@@ -38,6 +38,12 @@ tt runs start <spec-id>
38
38
  tt runs watch <run-id>
39
39
  ```
40
40
 
41
+ To continue training from a completed fine-tuned model artifact:
42
+
43
+ ```bash
44
+ tt runs start <spec-id> --parent-model <model-id>
45
+ ```
46
+
41
47
  Useful discovery commands:
42
48
 
43
49
  ```bash
@@ -49,8 +55,8 @@ tt models base
49
55
  tt balance
50
56
  ```
51
57
 
52
- For the full command reference, including dataset-backed runs, evaluation caps,
53
- local model serving, configuration, and billing, see the
58
+ For the full command reference, including dataset-backed runs, continued
59
+ fine-tuning, evaluation caps, local model serving, configuration, and billing, see the
54
60
  [CLI docs](https://tunedtensor.com/docs/cli).
55
61
 
56
62
  ## Development
package/dist/index.js CHANGED
@@ -791,11 +791,14 @@ Eval Results (${data._evals.length}):`);
791
791
  );
792
792
  }
793
793
  });
794
- runs.command("start").description("Start a new run for a behaviour spec").argument("<spec-id>", "Behaviour spec ID (full UUID or 8+ char prefix)").option("--no-augment", "Disable data augmentation").option("--no-llm-judge", "Disable LLM judging").option("--epochs <n>", "Number of training epochs").option("--lr <rate>", "Learning rate").option("--batch-size <n>", "Batch size").option("--dataset <id>", "Dataset ID to use instead of inline spec examples (full UUID or 4+ char prefix)").option("--train-ratio <ratio>", "Dataset training split ratio (default: 0.8 when any split ratio is set)").option("--validation-ratio <ratio>", "Dataset validation split ratio (default: 0.1 when any split ratio is set)").option("--test-ratio <ratio>", "Dataset test split ratio (default: 0.1 when any split ratio is set)").option("--lora-rank <n>", "LoRA rank").option("--lora-alpha <n>", "LoRA alpha").option("--max-eval-examples <n>", "Max examples for the primary eval pass").option("--max-test-eval-examples <n>", "Max examples for the secondary test eval pass").action(async (specId, cmdOpts) => {
794
+ runs.command("start").description("Start a new run for a behaviour spec").argument("<spec-id>", "Behaviour spec ID (full UUID or 8+ char prefix)").option("--no-augment", "Disable data augmentation").option("--no-llm-judge", "Disable LLM judging").option("--epochs <n>", "Number of training epochs").option("--lr <rate>", "Learning rate").option("--batch-size <n>", "Batch size").option("--dataset <id>", "Dataset ID to use instead of inline spec examples (full UUID or 4+ char prefix)").option("--parent-model <id>", "Fine-tuned model ID to continue training from (full UUID or 4+ char prefix)").option("--train-ratio <ratio>", "Dataset training split ratio (default: 0.8 when any split ratio is set)").option("--validation-ratio <ratio>", "Dataset validation split ratio (default: 0.1 when any split ratio is set)").option("--test-ratio <ratio>", "Dataset test split ratio (default: 0.1 when any split ratio is set)").option("--lora-rank <n>", "LoRA rank").option("--lora-alpha <n>", "LoRA alpha").option("--max-eval-examples <n>", "Max examples for the primary eval pass").option("--max-test-eval-examples <n>", "Max examples for the secondary test eval pass").action(async (specId, cmdOpts) => {
795
795
  const opts = parent.opts();
796
796
  const body = {};
797
797
  if (cmdOpts.augment === false) body.augment = false;
798
798
  if (cmdOpts.dataset) body.dataset_id = await resolveDatasetId(cmdOpts.dataset, opts);
799
+ if (cmdOpts.parentModel) {
800
+ body.parent_model_id = await resolveModelId(cmdOpts.parentModel, opts);
801
+ }
799
802
  const splitRatioOptions = [
800
803
  cmdOpts.trainRatio,
801
804
  cmdOpts.validationRatio,
@@ -2881,7 +2884,7 @@ function registerPushCommand(parent) {
2881
2884
 
2882
2885
  // src/index.ts
2883
2886
  var program = new Command();
2884
- program.name("tt").description("Tuned Tensor CLI \u2014 fine-tune and evaluate LLMs").version("0.4.15").option("-k, --api-key <key>", "API key (overrides stored key)").option(
2887
+ program.name("tt").description("Tuned Tensor CLI \u2014 fine-tune and evaluate LLMs").version("0.4.16").option("-k, --api-key <key>", "API key (overrides stored key)").option(
2885
2888
  "-u, --base-url <url>",
2886
2889
  "API base URL (default: https://tunedtensor.com)"
2887
2890
  ).option("--json", "Output raw JSON").option("--no-color", "Disable colors").hook("preAction", (_thisCommand, actionCommand) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/output.ts","../src/client.ts","../src/config.ts","../src/commands/auth.ts","../src/commands/specs.ts","../src/resolve.ts","../src/base-models.ts","../src/commands/runs.ts","../src/commands/datasets.ts","../src/commands/models.ts","../src/commands/init.ts","../src/serve-manager.ts","../src/commands/balance.ts","../src/commands/topup.ts","../src/commands/eval.ts","../src/eval/rules.ts","../src/commands/push.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { setJsonMode, reportError } from \"./output.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerSpecsCommands } from \"./commands/specs.js\";\nimport { registerRunsCommands } from \"./commands/runs.js\";\nimport { registerDatasetsCommands } from \"./commands/datasets.js\";\nimport { registerModelsCommands } from \"./commands/models.js\";\n\nimport { registerBalanceCommands } from \"./commands/balance.js\";\nimport { registerTopupCommands } from \"./commands/topup.js\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerEvalCommand } from \"./commands/eval.js\";\nimport { registerPushCommand } from \"./commands/push.js\";\n\ndeclare const __TT_VERSION__: string;\n\nconst program = new Command();\n\nprogram\n .name(\"tt\")\n .description(\"Tuned Tensor CLI — fine-tune and evaluate LLMs\")\n .version(__TT_VERSION__)\n .option(\"-k, --api-key <key>\", \"API key (overrides stored key)\")\n .option(\n \"-u, --base-url <url>\",\n \"API base URL (default: https://tunedtensor.com)\",\n )\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--no-color\", \"Disable colors\")\n .hook(\"preAction\", (_thisCommand, actionCommand) => {\n const rootOpts = program.opts();\n if (rootOpts.json) setJsonMode(true);\n if (rootOpts.color === false) {\n process.env.FORCE_COLOR = \"0\";\n }\n });\n\nregisterAuthCommands(program);\nregisterSpecsCommands(program);\nregisterRunsCommands(program);\nregisterDatasetsCommands(program);\nregisterModelsCommands(program);\n\nregisterBalanceCommands(program);\nregisterTopupCommands(program);\nregisterInitCommand(program);\nregisterEvalCommand(program);\nregisterPushCommand(program);\n\n// Honor --json even when parsing fails before the preAction hook runs\n// (e.g. on unknown commands). Cheap argv sniff is fine here.\nif (process.argv.includes(\"--json\")) setJsonMode(true);\n\nprogram.parseAsync().catch((err) => {\n reportError(err);\n process.exit(1);\n});\n","import chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport { ApiError } from \"./client.js\";\n\nlet jsonMode = false;\n\nexport function setJsonMode(enabled: boolean) {\n jsonMode = enabled;\n}\n\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function printJson(data: unknown) {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printTable(\n headers: string[],\n rows: string[][],\n meta?: { page: number; per_page: number; total: number },\n) {\n const table = new Table({\n head: headers.map((h) => chalk.bold.cyan(h)),\n style: { head: [], border: [] },\n });\n for (const row of rows) {\n table.push(row);\n }\n console.log(table.toString());\n\n if (meta) {\n const totalPages = Math.ceil(meta.total / meta.per_page);\n console.log(\n chalk.dim(\n `\\nPage ${meta.page}/${totalPages} (${meta.total} total)`,\n ),\n );\n }\n}\n\nexport function printDetail(fields: [string, string | undefined][]) {\n const maxLabel = Math.max(...fields.map(([l]) => l.length));\n for (const [label, value] of fields) {\n const paddedLabel = label.padEnd(maxLabel);\n console.log(`${chalk.bold.cyan(paddedLabel)} ${value ?? chalk.dim(\"—\")}`);\n }\n}\n\nexport function printSuccess(message: string) {\n console.log(chalk.green(\"✓\") + \" \" + message);\n}\n\nexport function printWarning(message: string) {\n console.log(chalk.yellow(\"!\") + \" \" + message);\n}\n\nexport function printError(message: string) {\n console.error(chalk.red(\"✗\") + \" \" + message);\n}\n\nexport function reportError(err: unknown): void {\n const isApi = err instanceof ApiError;\n const message = (err as Error)?.message || String(err);\n\n if (jsonMode) {\n printJson({\n error: {\n status: isApi ? err.status : null,\n code: isApi ? err.code : \"CLI_ERROR\",\n message,\n },\n });\n } else if (isApi) {\n printError(`[${err.status}] ${message}`);\n } else {\n printError(message);\n }\n}\n\nexport function formatDate(iso?: string | null): string {\n if (!iso) return \"—\";\n return new Date(iso).toLocaleString();\n}\n\nexport function formatStatus(status: string): string {\n const map: Record<string, (s: string) => string> = {\n completed: chalk.green,\n running: chalk.blue,\n training: chalk.blue,\n evaluating: chalk.blue,\n preparing: chalk.yellow,\n pending: chalk.yellow,\n uploading: chalk.yellow,\n failed: chalk.red,\n cancelled: chalk.dim,\n validated: chalk.green,\n invalid: chalk.red,\n };\n const colorFn = map[status] || chalk.white;\n return colorFn(status);\n}\n\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + \"…\";\n}\n\nexport function shortId(id: string): string {\n return id.slice(0, 8);\n}\n","import { readFileSync, statSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { getApiKey, getBaseUrl } from \"./config.js\";\n\nexport interface ApiResponse<T> {\n data: T;\n meta?: { page: number; per_page: number; total: number };\n}\n\nexport interface ApiErrorBody {\n error: { code: string; message: string };\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n public code: string,\n message: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport interface ClientOpts {\n apiKey?: string;\n baseUrl?: string;\n}\n\nfunction resolveKey(opts?: ClientOpts): string {\n const key = getApiKey(opts);\n if (!key) {\n throw new ApiError(\n 401,\n \"NO_API_KEY\",\n \"No API key found. Run `tt auth login` or set TUNED_TENSOR_API_KEY.\",\n );\n }\n return key;\n}\n\nfunction buildUrl(\n path: string,\n query?: Record<string, string | number | undefined>,\n opts?: ClientOpts,\n): string {\n const base = getBaseUrl(opts);\n const url = new URL(`/api/v1${path}`, base);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nasync function request<T>(\n method: string,\n path: string,\n options: {\n query?: Record<string, string | number | undefined>;\n body?: unknown;\n opts?: ClientOpts;\n } = {},\n): Promise<ApiResponse<T>> {\n const key = resolveKey(options.opts);\n const url = buildUrl(path, options.query, options.opts);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${key}`,\n };\n\n let bodyPayload: string | undefined;\n if (options.body) {\n headers[\"Content-Type\"] = \"application/json\";\n bodyPayload = JSON.stringify(options.body);\n }\n\n const res = await fetch(url, { method, headers, body: bodyPayload });\n\n if (!res.ok) {\n let errBody: ApiErrorBody;\n try {\n errBody = (await res.json()) as ApiErrorBody;\n } catch {\n throw new ApiError(res.status, \"UNKNOWN\", res.statusText);\n }\n throw new ApiError(\n res.status,\n errBody.error?.code || \"UNKNOWN\",\n errBody.error?.message || res.statusText,\n );\n }\n\n if (res.status === 204) return { data: null as T };\n return (await res.json()) as ApiResponse<T>;\n}\n\nexport function get<T>(\n path: string,\n query?: Record<string, string | number | undefined>,\n opts?: ClientOpts,\n) {\n return request<T>(\"GET\", path, { query, opts });\n}\n\nexport function post<T>(\n path: string,\n body?: unknown,\n opts?: ClientOpts,\n) {\n return request<T>(\"POST\", path, { body, opts });\n}\n\nexport function put<T>(\n path: string,\n body?: unknown,\n opts?: ClientOpts,\n) {\n return request<T>(\"PUT\", path, { body, opts });\n}\n\nexport function patch<T>(\n path: string,\n body?: unknown,\n opts?: ClientOpts,\n) {\n return request<T>(\"PATCH\", path, { body, opts });\n}\n\nexport function del<T>(path: string, opts?: ClientOpts) {\n return request<T>(\"DELETE\", path, { opts });\n}\n\nexport async function upload<T>(\n path: string,\n filePath: string,\n fields: Record<string, string>,\n opts?: ClientOpts,\n): Promise<ApiResponse<T>> {\n const key = resolveKey(opts);\n const url = buildUrl(path, undefined, opts);\n\n const form = new FormData();\n for (const [k, v] of Object.entries(fields)) {\n form.append(k, v);\n }\n\n const fileBytes = readFileSync(filePath);\n const fileSize = statSync(filePath).size;\n const blob = new Blob([fileBytes], { type: \"application/jsonl\" });\n form.append(\"file\", blob, basename(filePath));\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}` },\n body: form,\n });\n\n if (!res.ok) {\n let errBody: ApiErrorBody;\n try {\n errBody = (await res.json()) as ApiErrorBody;\n } catch {\n throw new ApiError(res.status, \"UNKNOWN\", res.statusText);\n }\n throw new ApiError(\n res.status,\n errBody.error?.code || \"UNKNOWN\",\n errBody.error?.message || res.statusText,\n );\n }\n\n return (await res.json()) as ApiResponse<T>;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface Config {\n api_key?: string;\n base_url?: string;\n}\n\nconst CONFIG_DIR_NAME = \"tuned-tensor\";\nconst CONFIG_FILE_NAME = \"config.json\";\n\nfunction getConfigDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME;\n const base = xdg || join(homedir(), \".config\");\n return join(base, CONFIG_DIR_NAME);\n}\n\nfunction getConfigPath(): string {\n return join(getConfigDir(), CONFIG_FILE_NAME);\n}\n\nexport function readConfig(): Config {\n const path = getConfigPath();\n if (!existsSync(path)) return {};\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: Config): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(getConfigPath(), JSON.stringify(config, null, 2) + \"\\n\");\n}\n\nexport function updateConfig(partial: Partial<Config>): void {\n const current = readConfig();\n writeConfig({ ...current, ...partial });\n}\n\nexport function clearConfig(): void {\n const path = getConfigPath();\n if (existsSync(path)) writeFileSync(path, \"{}\\n\");\n}\n\nexport const DEFAULT_BASE_URL = \"https://tunedtensor.com\";\n\nexport function getBaseUrl(opts?: { baseUrl?: string }): string {\n return opts?.baseUrl || process.env.TUNED_TENSOR_URL || readConfig().base_url || DEFAULT_BASE_URL;\n}\n\nexport function getApiKey(opts?: { apiKey?: string }): string | undefined {\n return opts?.apiKey || process.env.TUNED_TENSOR_API_KEY || readConfig().api_key;\n}\n","import { Command } from \"commander\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin, stdout } from \"node:process\";\nimport {\n readConfig,\n updateConfig,\n clearConfig,\n getApiKey,\n getBaseUrl,\n DEFAULT_BASE_URL,\n} from \"../config.js\";\nimport {\n printSuccess,\n printDetail,\n printError,\n printWarning,\n isJsonMode,\n printJson,\n} from \"../output.js\";\nimport chalk from \"chalk\";\n\nexport function registerAuthCommands(parent: Command) {\n const auth = parent.command(\"auth\").description(\"Manage authentication\");\n\n auth\n .command(\"login\")\n .description(\"Store an API key for authentication\")\n .argument(\"[key]\", \"API key (tt_...). If omitted, you will be prompted.\")\n .action(async (key?: string) => {\n let apiKey = key;\n\n if (!apiKey) {\n const settingsUrl = `${DEFAULT_BASE_URL}/dashboard/settings`;\n console.log();\n console.log(\n ` To get your API key, go to ${chalk.bold(\"Settings → API Keys\")} in the Tuned Tensor dashboard:`,\n );\n console.log(` ${chalk.cyan.underline(settingsUrl)}`);\n console.log();\n\n const rl = createInterface({ input: stdin, output: stdout });\n apiKey = await rl.question(\"Enter your API key (tt_...): \");\n rl.close();\n }\n\n apiKey = apiKey.trim();\n\n if (!apiKey.startsWith(\"tt_\") || apiKey.length !== 51) {\n printError(\n \"Invalid API key format. Keys start with tt_ and are 51 characters long.\",\n );\n process.exit(1);\n }\n\n updateConfig({ api_key: apiKey });\n printSuccess(\n `API key stored (${apiKey.slice(0, 8)}...). You're ready to go.`,\n );\n });\n\n auth\n .command(\"logout\")\n .description(\"Remove stored credentials\")\n .action(() => {\n clearConfig();\n printSuccess(\"Credentials removed.\");\n });\n\n auth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(() => {\n const opts = parent.opts();\n const apiKey = getApiKey(opts);\n const baseUrl = getBaseUrl(opts);\n\n if (isJsonMode()) {\n printJson({\n authenticated: !!apiKey,\n key_prefix: apiKey ? apiKey.slice(0, 8) + \"...\" : null,\n base_url: baseUrl,\n });\n return;\n }\n\n if (apiKey) {\n printDetail([\n [\"Authenticated\", \"Yes\"],\n [\"API Key\", apiKey.slice(0, 8) + \"...\"],\n [\"Base URL\", baseUrl],\n ]);\n } else {\n printWarning(\n \"Not authenticated. Run `tt auth login` to store an API key.\",\n );\n printDetail([[\"Base URL\", baseUrl]]);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { get, post, put, del, type ClientOpts } from \"../client.js\";\nimport { resolveSpecId } from \"../resolve.js\";\nimport { canonicalizeBaseModel, canonicalizeSpecBaseModel } from \"../base-models.js\";\nimport {\n printTable,\n printDetail,\n printSuccess,\n printWarning,\n printJson,\n isJsonMode,\n formatDate,\n formatStatus,\n truncate,\n shortId,\n} from \"../output.js\";\n\nconst SPEC_BODY_KEYS = new Set([\n \"name\",\n \"description\",\n \"base_model\",\n \"system_prompt\",\n \"guidelines\",\n \"constraints\",\n \"examples\",\n]);\n\nconst RUN_INPUT_KEYS = [\"run_id\", \"behavior_spec_id\", \"spec_snapshot\", \"run_number\"];\n\nclass SpecBodyError extends Error {}\n\nfunction loadSpecBody(filePath: string, mode: \"create\" | \"update\"): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch (e) {\n throw new SpecBodyError(\n `Could not parse ${filePath}: ${(e as Error).message}`,\n );\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new SpecBodyError(\n `${filePath} must contain a JSON object at the top level.`,\n );\n }\n\n const body = parsed as Record<string, unknown>;\n\n const runInputHits = RUN_INPUT_KEYS.filter((k) => k in body);\n if (runInputHits.length >= 2 || \"spec_snapshot\" in body) {\n const hint = \"spec_snapshot\" in body\n ? `This file looks like a run-input payload (top-level keys: ${runInputHits.join(\", \")}). The actual spec is nested under \"spec_snapshot\". Try:\\n jq '.spec_snapshot' ${filePath} > spec.json\\n tt specs ${mode === \"create\" ? \"create\" : \"update <id>\"} --file spec.json`\n : `This file looks like a run-input payload (top-level keys: ${runInputHits.join(\", \")}), not a behaviour spec. To start a run on an existing spec, use: tt runs start <spec-id>`;\n throw new SpecBodyError(hint);\n }\n\n if (mode === \"create\" && typeof body.name !== \"string\") {\n throw new SpecBodyError(\n `${filePath} is missing required field \"name\" (string).`,\n );\n }\n\n const unknown = Object.keys(body).filter(\n (k) => !SPEC_BODY_KEYS.has(k) && k !== \"id\" && k !== \"eval_cases\",\n );\n if (unknown.length && !isJsonMode()) {\n printWarning(\n `Unknown spec field(s) in ${filePath}: ${unknown.join(\", \")}. They will be sent but may be rejected by the API.`,\n );\n }\n\n return canonicalizeSpecBaseModel(body);\n}\n\ninterface BehaviorSpec {\n id: string;\n name: string;\n description: string;\n system_prompt: string;\n guidelines: string[];\n examples: { input: string; output: string }[];\n constraints: string[];\n base_model: string;\n created_at: string;\n updated_at: string;\n _run_count?: number;\n _latest_run_status?: string;\n _latest_run_score?: number;\n _runs?: unknown[];\n}\n\nexport function registerSpecsCommands(parent: Command) {\n const specs = parent\n .command(\"specs\")\n .description(\"Manage behaviour specs\");\n\n specs\n .command(\"list\")\n .description(\"List behaviour specs\")\n .option(\"-p, --page <n>\", \"Page number\", \"1\")\n .option(\"--per-page <n>\", \"Results per page\", \"20\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const { data, meta } = await get<BehaviorSpec[]>(\n \"/behavior-specs\",\n { page: cmdOpts.page, per_page: cmdOpts.perPage },\n opts,\n );\n\n if (isJsonMode()) return printJson({ data, meta });\n\n printTable(\n [\"ID\", \"Name\", \"Model\", \"Examples\", \"Runs\", \"Status\", \"Updated\"],\n data.map((s) => [\n shortId(s.id),\n truncate(s.name, 30),\n s.base_model.split(\"/\").pop() || s.base_model,\n String(s.examples?.length ?? 0),\n String(s._run_count ?? 0),\n s._latest_run_status ? formatStatus(s._latest_run_status) : \"—\",\n formatDate(s.updated_at),\n ]),\n meta,\n );\n });\n\n specs\n .command(\"get\")\n .description(\"Show spec details\")\n .argument(\"<id>\", \"Spec ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveSpecId(id, opts);\n const { data } = await get<BehaviorSpec>(`/behavior-specs/${fullId}`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n\n printDetail([\n [\"ID\", data.id],\n [\"Name\", data.name],\n [\"Description\", data.description || undefined],\n [\"Base Model\", data.base_model],\n [\"System Prompt\", data.system_prompt ? truncate(data.system_prompt, 80) : undefined],\n [\"Guidelines\", data.guidelines?.length ? data.guidelines.join(\", \") : undefined],\n [\"Constraints\", data.constraints?.length ? data.constraints.join(\", \") : undefined],\n [\"Examples\", String(data.examples?.length ?? 0)],\n [\"Runs\", String(data._run_count ?? data._runs?.length ?? 0)],\n [\"Created\", formatDate(data.created_at)],\n [\"Updated\", formatDate(data.updated_at)],\n ]);\n\n if (data.examples?.length) {\n console.log(\"\\nExamples:\");\n for (const [i, ex] of data.examples.slice(0, 5).entries()) {\n console.log(` ${i + 1}. Input: ${truncate(ex.input, 60)}`);\n console.log(` Output: ${truncate(ex.output, 60)}`);\n }\n if (data.examples.length > 5) {\n console.log(` ... and ${data.examples.length - 5} more`);\n }\n }\n });\n\n specs\n .command(\"create\")\n .description(\"Create a behaviour spec\")\n .option(\"-f, --file <path>\", \"JSON file with spec definition\")\n .option(\"-n, --name <name>\", \"Spec name\")\n .option(\"--model <model>\", \"Base model ID\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n let body: Record<string, unknown>;\n\n if (cmdOpts.file) {\n body = loadSpecBody(cmdOpts.file, \"create\");\n } else if (cmdOpts.name) {\n body = { name: cmdOpts.name };\n if (cmdOpts.model) body.base_model = canonicalizeBaseModel(cmdOpts.model);\n } else {\n throw new SpecBodyError(\"Provide --file or --name\");\n }\n\n const { data } = await post<BehaviorSpec>(\"/behavior-specs\", body, opts);\n\n if (isJsonMode()) return printJson(data);\n printSuccess(`Spec created: ${data.name} (${shortId(data.id)})`);\n });\n\n specs\n .command(\"update\")\n .description(\"Update a behaviour spec\")\n .argument(\"<id>\", \"Spec ID (full UUID or 8+ char prefix)\")\n .option(\"-f, --file <path>\", \"JSON file with fields to update\")\n .option(\"-n, --name <name>\", \"New name\")\n .option(\"--model <model>\", \"New base model ID\")\n .action(async (id: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n let body: Record<string, unknown>;\n\n if (cmdOpts.file) {\n body = loadSpecBody(cmdOpts.file, \"update\");\n } else {\n body = {};\n if (cmdOpts.name) body.name = cmdOpts.name;\n if (cmdOpts.model) body.base_model = canonicalizeBaseModel(cmdOpts.model);\n }\n\n const fullId = await resolveSpecId(id, opts);\n const { data } = await put<BehaviorSpec>(\n `/behavior-specs/${fullId}`,\n body,\n opts,\n );\n\n if (isJsonMode()) return printJson(data);\n printSuccess(`Spec updated: ${data.name} (${shortId(data.id)})`);\n });\n\n specs\n .command(\"delete\")\n .description(\"Delete a behaviour spec\")\n .argument(\"<id>\", \"Spec ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveSpecId(id, opts);\n await del(`/behavior-specs/${fullId}`, opts);\n\n if (isJsonMode()) return printJson({ id: fullId, deleted: true });\n printSuccess(`Spec deleted: ${shortId(fullId)}`);\n });\n}\n","import { get, type ClientOpts } from \"./client.js\";\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst RESOLVE_PAGE_SIZE = 100;\nconst MIN_PREFIX_LEN = 4;\n\ninterface Identifiable {\n id: string;\n name?: string;\n run_number?: number;\n}\n\ninterface Listed<T> {\n data: T[];\n meta?: { page: number; per_page: number; total: number };\n}\n\nexport class ResolveError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ResolveError\";\n }\n}\n\nexport function isFullUuid(value: string): boolean {\n return UUID_RE.test(value);\n}\n\nasync function resolvePrefix<T extends Identifiable>(\n prefix: string,\n kind: \"spec\" | \"run\" | \"dataset\" | \"model\",\n listPath: string,\n describe: (item: T) => string,\n opts?: ClientOpts,\n): Promise<string> {\n if (isFullUuid(prefix)) return prefix;\n\n const noun = kind;\n const listCmd = `tt ${kind}s list --json`;\n\n if (prefix.length < MIN_PREFIX_LEN) {\n throw new ResolveError(\n `${capitalize(noun)} ID prefix \"${prefix}\" is too short — provide at least ${MIN_PREFIX_LEN} characters or the full UUID.`,\n );\n }\n\n const lower = prefix.toLowerCase();\n const { data, meta } = (await get<T[]>(\n listPath,\n { page: 1, per_page: RESOLVE_PAGE_SIZE },\n opts,\n )) as Listed<T>;\n\n const matches = data.filter((item) => item.id.toLowerCase().startsWith(lower));\n\n if (matches.length === 1) return matches[0].id;\n\n if (matches.length === 0) {\n if (meta && meta.total > data.length) {\n throw new ResolveError(\n `No ${noun} found with ID prefix \"${prefix}\" in the first ${data.length} ${noun}s (you have ${meta.total} total). Use the full UUID — see \\`${listCmd}\\`.`,\n );\n }\n throw new ResolveError(`No ${noun} found with ID prefix \"${prefix}\".`);\n }\n\n const list = matches.map((m) => ` ${describe(m)}`).join(\"\\n\");\n throw new ResolveError(\n `${capitalize(noun)} ID prefix \"${prefix}\" is ambiguous (${matches.length} matches):\\n${list}\\nProvide more characters or the full UUID.`,\n );\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport function resolveSpecId(prefix: string, opts?: ClientOpts): Promise<string> {\n return resolvePrefix<Identifiable>(\n prefix,\n \"spec\",\n \"/behavior-specs\",\n (s) => `${s.id}${s.name ? ` (${s.name})` : \"\"}`,\n opts,\n );\n}\n\nexport function resolveRunId(prefix: string, opts?: ClientOpts): Promise<string> {\n return resolvePrefix<Identifiable>(\n prefix,\n \"run\",\n \"/runs\",\n (r) => `${r.id}${r.run_number != null ? ` (run #${r.run_number})` : \"\"}`,\n opts,\n );\n}\n\nexport function resolveDatasetId(prefix: string, opts?: ClientOpts): Promise<string> {\n return resolvePrefix<Identifiable>(\n prefix,\n \"dataset\",\n \"/datasets\",\n (d) => `${d.id}${d.name ? ` (${d.name})` : \"\"}`,\n opts,\n );\n}\n\nexport function resolveModelId(prefix: string, opts?: ClientOpts): Promise<string> {\n return resolvePrefix<Identifiable>(\n prefix,\n \"model\",\n \"/models\",\n (m) => `${m.id}${m.name ? ` (${m.name})` : \"\"}`,\n opts,\n );\n}\n","export const SUPPORTED_BASE_MODELS = [\n \"google/gemma-4-E2B-it\",\n \"google/gemma-4-E4B-it\",\n \"Qwen/Qwen3.5-2B\",\n \"Qwen/Qwen3.5-4B\",\n \"meta-llama/Llama-3.2-3B-Instruct\",\n \"microsoft/Phi-4-mini-instruct\",\n \"ibm-granite/granite-3.3-2b-instruct\",\n \"bigcode/starcoder2-3b\",\n] as const;\n\nexport type SupportedBaseModel = (typeof SUPPORTED_BASE_MODELS)[number];\n\nconst BASE_MODEL_ALIASES = new Map<string, SupportedBaseModel>();\n\nfor (const model of SUPPORTED_BASE_MODELS) {\n BASE_MODEL_ALIASES.set(model.toLowerCase(), model);\n}\n\nfor (const [alias, model] of [\n [\"google/gemma-4-E2B\", \"google/gemma-4-E2B-it\"],\n [\"google/gemma-4-e2b\", \"google/gemma-4-E2B-it\"],\n [\"google/gemma-4-e2b-it\", \"google/gemma-4-E2B-it\"],\n [\"google/gemma-4-E4B\", \"google/gemma-4-E4B-it\"],\n [\"google/gemma-4-e4b\", \"google/gemma-4-E4B-it\"],\n [\"google/gemma-4-e4b-it\", \"google/gemma-4-E4B-it\"],\n [\"qwen/qwen3.5-2b\", \"Qwen/Qwen3.5-2B\"],\n [\"Qwen/Qwen3.5-2B-Base\", \"Qwen/Qwen3.5-2B\"],\n [\"qwen/qwen3.5-2b-base\", \"Qwen/Qwen3.5-2B\"],\n [\"qwen/qwen3.5-4b\", \"Qwen/Qwen3.5-4B\"],\n [\"Qwen/Qwen3.5-4B-Base\", \"Qwen/Qwen3.5-4B\"],\n [\"qwen/qwen3.5-4b-base\", \"Qwen/Qwen3.5-4B\"],\n [\"meta-llama/llama-3.2-3b-instruct\", \"meta-llama/Llama-3.2-3B-Instruct\"],\n [\"meta-llama/Llama-3.2-3B\", \"meta-llama/Llama-3.2-3B-Instruct\"],\n [\"meta-llama/llama-3.2-3b\", \"meta-llama/Llama-3.2-3B-Instruct\"],\n [\"microsoft/phi-4-mini-instruct\", \"microsoft/Phi-4-mini-instruct\"],\n [\"phi-4-mini-instruct\", \"microsoft/Phi-4-mini-instruct\"],\n [\"ibm-granite/granite-3.3-2b-instruct\", \"ibm-granite/granite-3.3-2b-instruct\"],\n [\"granite-3.3-2b-instruct\", \"ibm-granite/granite-3.3-2b-instruct\"],\n [\"bigcode/starcoder2-3b\", \"bigcode/starcoder2-3b\"],\n [\"starcoder2-3b\", \"bigcode/starcoder2-3b\"],\n] as const) {\n BASE_MODEL_ALIASES.set(alias.toLowerCase(), model);\n}\n\nexport class UnsupportedBaseModelError extends Error {\n constructor(model: unknown) {\n const supported = SUPPORTED_BASE_MODELS.join(\", \");\n super(\n `Unsupported base_model \"${String(model)}\". Supported base models: ${supported}`,\n );\n this.name = \"UnsupportedBaseModelError\";\n }\n}\n\nexport function canonicalizeBaseModel(model: unknown): SupportedBaseModel {\n if (typeof model !== \"string\" || !model.trim()) {\n throw new UnsupportedBaseModelError(model);\n }\n\n const canonical = BASE_MODEL_ALIASES.get(model.trim().toLowerCase());\n if (!canonical) {\n throw new UnsupportedBaseModelError(model);\n }\n\n return canonical;\n}\n\nexport function canonicalizeSpecBaseModel<T extends Record<string, unknown>>(body: T): T {\n if (\"base_model\" in body && body.base_model !== undefined) {\n return { ...body, base_model: canonicalizeBaseModel(body.base_model) };\n }\n\n return body;\n}\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { get, post, type ClientOpts } from \"../client.js\";\nimport { resolveSpecId, resolveRunId, resolveDatasetId } from \"../resolve.js\";\nimport {\n printTable,\n printDetail,\n printSuccess,\n printJson,\n isJsonMode,\n formatDate,\n formatStatus,\n shortId,\n truncate,\n} from \"../output.js\";\n\ninterface Run {\n id: string;\n behavior_spec_id: string;\n run_number: number;\n status: string;\n current_stage?: string | null;\n stage_label?: string | null;\n progress_pct?: number | null;\n status_message?: string | null;\n hyperparameters: Record<string, unknown> | null;\n eval_summary: RunEvalSummary | null;\n error: string | null;\n started_at: string | null;\n completed_at: string | null;\n created_at: string;\n updated_at: string;\n _spec_name?: string;\n _evals?: RunEval[];\n _events?: RunEvent[];\n}\n\ninterface RunEvalSummary {\n avg_score?: number;\n mean_score?: number;\n pass_rate?: number;\n output_diagnostics?: RunOutputDiagnostics;\n}\n\ninterface EvalOutputDiagnostics {\n total: number;\n avg_output_chars?: number;\n max_output_chars?: number;\n starts_json_count: number;\n starts_json_rate: number;\n valid_json_count: number;\n valid_json_rate: number;\n strict_json_count: number;\n strict_json_rate: number;\n expected_schema_keys_count: number;\n expected_schema_keys_rate: number;\n non_json_prefix_count: number;\n non_json_prefix_rate: number;\n visible_reasoning_prefix_count: number;\n visible_reasoning_prefix_rate: number;\n}\n\ninterface RunOutputDiagnostics {\n baseline: EvalOutputDiagnostics;\n candidate: EvalOutputDiagnostics;\n test?: {\n baseline: EvalOutputDiagnostics;\n candidate: EvalOutputDiagnostics;\n };\n insights?: string[];\n}\n\ninterface RunEval {\n id: string;\n prompt: string;\n expected: string;\n actual: string;\n passed: boolean;\n score: number | null;\n reasoning: string | null;\n latency_ms: number | null;\n}\n\ninterface RunEvent {\n id: string;\n stage: string;\n label: string;\n status: string;\n message: string | null;\n occurred_at: string;\n}\n\ninterface RunDiagnostics {\n run_id: string;\n status: string;\n stage: string | null;\n stage_label: string | null;\n progress_pct: number | null;\n status_message: string | null;\n summary: string;\n insights: string[];\n output_diagnostics?: RunOutputDiagnostics;\n training: {\n state: string;\n phase: string | null;\n started_at: string | null;\n completed_at: string | null;\n last_updated_at: string | null;\n curve: {\n target_epochs: number | null;\n latest_epoch: number | null;\n latest_loss: number | null;\n previous_loss: number | null;\n latest_token_accuracy: number | null;\n epoch_rate_per_minute: number | null;\n estimated_minutes_remaining: number | null;\n latest_log_at: string | null;\n samples: {\n timestamp: string;\n epoch: number;\n loss?: number;\n learning_rate?: number;\n token_accuracy?: number;\n }[];\n };\n };\n generated_at: string;\n}\n\nfunction formatProgress(run: Run): string | undefined {\n if (run.progress_pct == null && !run.stage_label) return undefined;\n const label = run.stage_label ?? run.current_stage ?? \"Progress\";\n return run.progress_pct == null ? label : `${label} (${run.progress_pct}%)`;\n}\n\nfunction getEvalScore(run: Run): number | undefined {\n return run.eval_summary?.avg_score ?? run.eval_summary?.mean_score;\n}\n\nfunction formatEvalScore(run: Run): string | undefined {\n const score = getEvalScore(run);\n return score == null ? undefined : (score * 100).toFixed(1) + \"%\";\n}\n\nfunction formatPercent(rate: number | undefined): string | undefined {\n return rate == null ? undefined : (rate * 100).toFixed(1) + \"%\";\n}\n\nfunction formatCountRate(count: number | undefined, total: number | undefined, rate: number | undefined): string | undefined {\n if (count == null || total == null || rate == null) return undefined;\n return `${formatPercent(rate)} (${count}/${total})`;\n}\n\nfunction formatMinutes(minutes?: number | null): string | undefined {\n if (minutes == null) return undefined;\n if (minutes < 60) return `${Math.max(1, Math.round(minutes))}m`;\n return `${(minutes / 60).toFixed(1)}h`;\n}\n\nfunction formatEpochProgress(diagnostics: RunDiagnostics): string | undefined {\n const curve = diagnostics.training.curve;\n if (curve.latest_epoch == null) return undefined;\n if (curve.target_epochs == null) return curve.latest_epoch.toFixed(4);\n return `${curve.latest_epoch.toFixed(4)} / ${curve.target_epochs.toFixed(2)}`;\n}\n\nfunction printDiagnostics(diagnostics: RunDiagnostics) {\n const curve = diagnostics.training.curve;\n const perFive = curve.epoch_rate_per_minute == null\n ? undefined\n : (curve.epoch_rate_per_minute * 5).toFixed(4);\n\n printDetail([\n [\"Run\", shortId(diagnostics.run_id)],\n [\"Status\", formatStatus(diagnostics.status)],\n [\"Stage\", diagnostics.stage_label ?? diagnostics.stage ?? undefined],\n [\"Summary\", diagnostics.summary],\n [\"Training\", diagnostics.training.state],\n [\"Phase\", diagnostics.training.phase ?? undefined],\n [\"Epoch\", formatEpochProgress(diagnostics)],\n [\"Latest Loss\", curve.latest_loss == null ? undefined : curve.latest_loss.toFixed(4)],\n [\n \"Token Accuracy\",\n curve.latest_token_accuracy == null\n ? undefined\n : (curve.latest_token_accuracy * 100).toFixed(1) + \"%\",\n ],\n [\"Pace\", perFive ? `${perFive} epoch / 5m` : undefined],\n [\"ETA\", formatMinutes(curve.estimated_minutes_remaining)],\n [\"Latest Update\", formatDate(diagnostics.training.last_updated_at)],\n ]);\n\n if (diagnostics.insights.length) {\n console.log(\"\\nInsights:\");\n for (const insight of diagnostics.insights) {\n console.log(` - ${insight}`);\n }\n }\n\n printEvalOutputDiagnostics(diagnostics.output_diagnostics);\n}\n\nfunction printEvalOutputDiagnostics(diagnostics: RunOutputDiagnostics | undefined) {\n if (!diagnostics) return;\n const candidate = diagnostics.candidate;\n const baseline = diagnostics.baseline;\n\n console.log(\"\\nOutput Diagnostics:\");\n printDetail([\n [\"Tuned Valid JSON\", formatCountRate(candidate.valid_json_count, candidate.total, candidate.valid_json_rate)],\n [\"Tuned Strict JSON\", formatCountRate(candidate.strict_json_count, candidate.total, candidate.strict_json_rate)],\n [\n \"Tuned Schema Keys\",\n formatCountRate(candidate.expected_schema_keys_count, candidate.total, candidate.expected_schema_keys_rate),\n ],\n [\n \"Tuned Non-JSON Prefix\",\n formatCountRate(candidate.non_json_prefix_count, candidate.total, candidate.non_json_prefix_rate),\n ],\n [\n \"Tuned Reasoning Prefix\",\n formatCountRate(\n candidate.visible_reasoning_prefix_count,\n candidate.total,\n candidate.visible_reasoning_prefix_rate,\n ),\n ],\n [\"Tuned Avg Output\", candidate.avg_output_chars == null ? undefined : `${candidate.avg_output_chars} chars`],\n [\"Base Valid JSON\", formatCountRate(baseline.valid_json_count, baseline.total, baseline.valid_json_rate)],\n [\n \"Base Reasoning Prefix\",\n formatCountRate(\n baseline.visible_reasoning_prefix_count,\n baseline.total,\n baseline.visible_reasoning_prefix_rate,\n ),\n ],\n ]);\n\n if (diagnostics.test) {\n console.log(\"\\nTest Output Diagnostics:\");\n printDetail([\n [\n \"Tuned Valid JSON\",\n formatCountRate(\n diagnostics.test.candidate.valid_json_count,\n diagnostics.test.candidate.total,\n diagnostics.test.candidate.valid_json_rate,\n ),\n ],\n [\n \"Tuned Strict JSON\",\n formatCountRate(\n diagnostics.test.candidate.strict_json_count,\n diagnostics.test.candidate.total,\n diagnostics.test.candidate.strict_json_rate,\n ),\n ],\n [\n \"Tuned Reasoning Prefix\",\n formatCountRate(\n diagnostics.test.candidate.visible_reasoning_prefix_count,\n diagnostics.test.candidate.total,\n diagnostics.test.candidate.visible_reasoning_prefix_rate,\n ),\n ],\n ]);\n }\n\n if (diagnostics.insights?.length) {\n console.log(\"\\nEvaluation Insights:\");\n for (const insight of diagnostics.insights) {\n console.log(` - ${insight}`);\n }\n }\n}\n\nexport function registerRunsCommands(parent: Command) {\n const runs = parent.command(\"runs\").description(\"Manage runs\");\n\n runs\n .command(\"list\")\n .description(\"List runs\")\n .option(\"-s, --spec <id>\", \"Filter by spec ID (full UUID or 8+ char prefix)\")\n .option(\"-p, --page <n>\", \"Page number\", \"1\")\n .option(\"--per-page <n>\", \"Results per page\", \"20\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n\n let path = \"/runs\";\n const query: Record<string, string | number> = {\n page: cmdOpts.page,\n per_page: cmdOpts.perPage,\n };\n\n if (cmdOpts.spec) {\n const fullSpecId = await resolveSpecId(cmdOpts.spec, opts);\n path = `/behavior-specs/${fullSpecId}/runs`;\n }\n\n const { data, meta } = await get<Run[]>(path, query, opts);\n\n if (isJsonMode()) return printJson({ data, meta });\n\n printTable(\n [\"ID\", \"Spec\", \"#\", \"Status\", \"Score\", \"Started\", \"Completed\"],\n data.map((r) => [\n shortId(r.id),\n r._spec_name ? truncate(r._spec_name, 20) : shortId(r.behavior_spec_id),\n String(r.run_number),\n formatStatus(r.status),\n formatEvalScore(r) ?? \"—\",\n formatDate(r.started_at),\n formatDate(r.completed_at),\n ]),\n meta,\n );\n });\n\n runs\n .command(\"get\")\n .description(\"Show run details and eval results\")\n .argument(\"<id>\", \"Run ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveRunId(id, opts);\n const { data } = await get<Run>(`/runs/${fullId}`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n\n printDetail([\n [\"ID\", data.id],\n [\"Spec\", data._spec_name ?? shortId(data.behavior_spec_id)],\n [\"Run #\", String(data.run_number)],\n [\"Status\", formatStatus(data.status)],\n [\"Stage\", formatProgress(data)],\n [\"Message\", data.status_message ?? undefined],\n [\"Score\", formatEvalScore(data)],\n [\"Pass Rate\", data.eval_summary?.pass_rate != null\n ? (data.eval_summary.pass_rate * 100).toFixed(1) + \"%\"\n : undefined],\n [\"Error\", data.error ?? undefined],\n [\"Started\", formatDate(data.started_at)],\n [\"Completed\", formatDate(data.completed_at)],\n [\"Created\", formatDate(data.created_at)],\n ]);\n\n if (data.hyperparameters && Object.keys(data.hyperparameters).length) {\n console.log(\"\\nHyperparameters:\");\n for (const [k, v] of Object.entries(data.hyperparameters)) {\n console.log(` ${k}: ${v}`);\n }\n }\n\n printEvalOutputDiagnostics(data.eval_summary?.output_diagnostics);\n\n if (data._events?.length) {\n console.log(\"\\nLatest Updates:\");\n for (const event of data._events.slice(-5)) {\n const time = formatDate(event.occurred_at);\n console.log(\n ` ${time} ${formatStatus(event.status)} ${event.label}${event.message ? ` — ${event.message}` : \"\"}`,\n );\n }\n }\n\n if (data._evals?.length) {\n console.log(`\\nEval Results (${data._evals.length}):`);\n printTable(\n [\"#\", \"Passed\", \"Score\", \"Prompt\", \"Latency\"],\n data._evals.map((e, i) => [\n String(i + 1),\n e.passed ? \"✓\" : \"✗\",\n e.score != null ? e.score.toFixed(2) : \"—\",\n truncate(e.prompt, 40),\n e.latency_ms != null ? `${e.latency_ms}ms` : \"—\",\n ]),\n );\n }\n });\n\n runs\n .command(\"start\")\n .description(\"Start a new run for a behaviour spec\")\n .argument(\"<spec-id>\", \"Behaviour spec ID (full UUID or 8+ char prefix)\")\n .option(\"--no-augment\", \"Disable data augmentation\")\n .option(\"--no-llm-judge\", \"Disable LLM judging\")\n .option(\"--epochs <n>\", \"Number of training epochs\")\n .option(\"--lr <rate>\", \"Learning rate\")\n .option(\"--batch-size <n>\", \"Batch size\")\n .option(\"--dataset <id>\", \"Dataset ID to use instead of inline spec examples (full UUID or 4+ char prefix)\")\n .option(\"--train-ratio <ratio>\", \"Dataset training split ratio (default: 0.8 when any split ratio is set)\")\n .option(\"--validation-ratio <ratio>\", \"Dataset validation split ratio (default: 0.1 when any split ratio is set)\")\n .option(\"--test-ratio <ratio>\", \"Dataset test split ratio (default: 0.1 when any split ratio is set)\")\n .option(\"--lora-rank <n>\", \"LoRA rank\")\n .option(\"--lora-alpha <n>\", \"LoRA alpha\")\n .option(\"--max-eval-examples <n>\", \"Max examples for the primary eval pass\")\n .option(\"--max-test-eval-examples <n>\", \"Max examples for the secondary test eval pass\")\n .action(async (specId: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const body: Record<string, unknown> = {};\n\n if (cmdOpts.augment === false) body.augment = false;\n if (cmdOpts.dataset) body.dataset_id = await resolveDatasetId(cmdOpts.dataset, opts);\n\n const splitRatioOptions = [\n cmdOpts.trainRatio,\n cmdOpts.validationRatio,\n cmdOpts.testRatio,\n ];\n if (splitRatioOptions.some((value) => value != null)) {\n body.split_ratios = {\n train: cmdOpts.trainRatio != null ? Number(cmdOpts.trainRatio) : 0.8,\n validation:\n cmdOpts.validationRatio != null ? Number(cmdOpts.validationRatio) : 0.1,\n test: cmdOpts.testRatio != null ? Number(cmdOpts.testRatio) : 0.1,\n };\n }\n\n const hp: Record<string, unknown> = {};\n if (cmdOpts.epochs) hp.n_epochs = Number(cmdOpts.epochs);\n if (cmdOpts.lr) hp.learning_rate = Number(cmdOpts.lr);\n if (cmdOpts.batchSize) hp.batch_size = Number(cmdOpts.batchSize);\n if (cmdOpts.loraRank) hp.lora_rank = Number(cmdOpts.loraRank);\n if (cmdOpts.loraAlpha) hp.lora_alpha = Number(cmdOpts.loraAlpha);\n if (cmdOpts.maxEvalExamples) hp.max_eval_examples = Number(cmdOpts.maxEvalExamples);\n if (cmdOpts.maxTestEvalExamples) hp.max_test_eval_examples = Number(cmdOpts.maxTestEvalExamples);\n if (cmdOpts.llmJudge === false) body.use_llm_judge = false;\n if (Object.keys(hp).length) body.hyperparameters = hp;\n\n const fullSpecId = await resolveSpecId(specId, opts);\n const { data } = await post<Run>(\n `/behavior-specs/${fullSpecId}/runs`,\n body,\n opts,\n );\n\n if (isJsonMode()) return printJson(data);\n printSuccess(\n `Run #${data.run_number} started (${shortId(data.id)}). ${formatProgress(data) ?? `Status: ${formatStatus(data.status)}`}`,\n );\n });\n\n runs\n .command(\"cancel\")\n .description(\"Cancel a running run\")\n .argument(\"<id>\", \"Run ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveRunId(id, opts);\n const { data } = await post<Run>(`/runs/${fullId}/cancel`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n printSuccess(`Run ${shortId(fullId)} cancelled.`);\n });\n\n runs\n .command(\"watch\")\n .description(\"Watch a run until it completes\")\n .argument(\"<id>\", \"Run ID (full UUID or 8+ char prefix)\")\n .option(\"--interval <ms>\", \"Poll interval in milliseconds\", \"5000\")\n .action(async (id: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const interval = Number(cmdOpts.interval);\n const fullId = await resolveRunId(id, opts);\n const spinner = ora(`Watching run ${shortId(fullId)}...`).start();\n\n const terminalStates = new Set([\n \"completed\",\n \"failed\",\n \"cancelled\",\n ]);\n\n let run: Run;\n while (true) {\n const { data } = await get<Run>(`/runs/${fullId}`, undefined, opts);\n run = data;\n spinner.text = `Run ${shortId(fullId)} — ${formatProgress(run) ?? formatStatus(run.status)}`;\n\n if (terminalStates.has(run.status)) break;\n await new Promise((r) => setTimeout(r, interval));\n }\n\n spinner.stop();\n\n if (isJsonMode()) return printJson(run);\n\n printDetail([\n [\"Run\", shortId(run.id)],\n [\"Status\", formatStatus(run.status)],\n [\"Stage\", formatProgress(run)],\n [\"Message\", run.status_message ?? undefined],\n [\"Score\", formatEvalScore(run)],\n [\"Error\", run.error ?? undefined],\n [\"Completed\", formatDate(run.completed_at)],\n ]);\n });\n\n runs\n .command(\"diagnose\")\n .description(\"Show live run diagnostics\")\n .argument(\"<id>\", \"Run ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveRunId(id, opts);\n const { data } = await get<RunDiagnostics>(\n `/runs/${fullId}/diagnostics`,\n undefined,\n opts,\n );\n\n if (isJsonMode()) return printJson(data);\n printDiagnostics(data);\n });\n}\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { get, del, post, type ClientOpts } from \"../client.js\";\nimport { resolveDatasetId } from \"../resolve.js\";\nimport {\n printTable,\n printDetail,\n printSuccess,\n printJson,\n printError,\n isJsonMode,\n formatDate,\n formatStatus,\n shortId,\n truncate,\n} from \"../output.js\";\n\ninterface Dataset {\n id: string;\n name: string;\n description: string | null;\n storage_path: string;\n file_size_bytes: number;\n row_count: number;\n format: string;\n status: string;\n validation_errors: string[] | null;\n created_at: string;\n updated_at: string;\n}\n\ninterface DatasetUploadUrl {\n path: string;\n upload_url: string;\n method: \"PUT\";\n headers?: Record<string, string>;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// Invisible characters that JSON parsers accept but downstream JSONL consumers\n// often mishandle. Concretely: Python's str.splitlines() treats every char in\n// this set as a line break, so a row containing one of them gets cut in half\n// before json.loads sees it. We strip these at validate-time so the failure\n// mode is \"row 1099 has U+0085 at offset 4078\" (seconds, locally) instead of\n// \"AlgorithmError: exit code 1\" after a training launch (minutes, remote).\nconst FORBIDDEN_CONTROL_CODEPOINTS: ReadonlyArray<{ code: number; name: string }> = [\n // C0 control chars except whitespace we explicitly allow inside string values.\n // U+0009 TAB, U+000A LF, U+000D CR are kept since they appear in normal text.\n { code: 0x00, name: \"NULL\" },\n { code: 0x01, name: \"START OF HEADING\" },\n { code: 0x02, name: \"START OF TEXT\" },\n { code: 0x03, name: \"END OF TEXT\" },\n { code: 0x04, name: \"END OF TRANSMISSION\" },\n { code: 0x05, name: \"ENQUIRY\" },\n { code: 0x06, name: \"ACKNOWLEDGE\" },\n { code: 0x07, name: \"BELL\" },\n { code: 0x08, name: \"BACKSPACE\" },\n { code: 0x0b, name: \"VERTICAL TAB\" },\n { code: 0x0c, name: \"FORM FEED\" },\n { code: 0x0e, name: \"SHIFT OUT\" },\n { code: 0x0f, name: \"SHIFT IN\" },\n // 0x10..0x1F all rejected; named lookup falls back to \"CONTROL CHARACTER\".\n { code: 0x1c, name: \"FILE SEPARATOR\" },\n { code: 0x1d, name: \"GROUP SEPARATOR\" },\n { code: 0x1e, name: \"RECORD SEPARATOR\" },\n // C1 control range U+0080..U+009F (all invisible, often mojibake from\n // Windows-1252 smart quotes mis-tagged as Unicode codepoints).\n { code: 0x0085, name: \"NEXT LINE\" },\n // Unicode line/paragraph separators - cut lines too.\n { code: 0x2028, name: \"LINE SEPARATOR\" },\n { code: 0x2029, name: \"PARAGRAPH SEPARATOR\" },\n];\n\nfunction findControlChar(value: string): { codepoint: number; offset: number; name: string } | null {\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n // Whitelist real whitespace; everything in C0 below 0x20 (besides tab/LF/CR) is hazardous.\n if (code < 0x20 && code !== 0x09 && code !== 0x0a && code !== 0x0d) {\n const named = FORBIDDEN_CONTROL_CODEPOINTS.find((entry) => entry.code === code);\n return { codepoint: code, offset: i, name: named?.name ?? \"CONTROL CHARACTER\" };\n }\n // C1 control range - all hazardous (NEL, etc.); JSON parsers accept these\n // but Python's splitlines() splits on several of them.\n if (code >= 0x80 && code <= 0x9f) {\n const named = FORBIDDEN_CONTROL_CODEPOINTS.find((entry) => entry.code === code);\n return { codepoint: code, offset: i, name: named?.name ?? \"C1 CONTROL CHARACTER\" };\n }\n if (code === 0x2028 || code === 0x2029) {\n const named = FORBIDDEN_CONTROL_CODEPOINTS.find((entry) => entry.code === code);\n return { codepoint: code, offset: i, name: named?.name ?? \"LINE BREAK\" };\n }\n }\n return null;\n}\n\nfunction formatCodepoint(code: number): string {\n return `U+${code.toString(16).toUpperCase().padStart(4, \"0\")}`;\n}\n\nfunction validateDatasetFile(file: string): void {\n const lines = readFileSync(file, \"utf8\").split(/\\r?\\n/);\n const errors: string[] = [];\n let rowCount = 0;\n\n for (const [index, rawLine] of lines.entries()) {\n const line = rawLine.trim();\n if (!line) continue;\n\n rowCount += 1;\n const rowNumber = index + 1;\n let row: unknown;\n\n try {\n row = JSON.parse(line);\n } catch {\n errors.push(`Row ${rowNumber}: invalid JSON`);\n continue;\n }\n\n if (!row || typeof row !== \"object\" || Array.isArray(row)) {\n errors.push(`Row ${rowNumber}: expected an object with \"input\" and \"output\" fields`);\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (\"messages\" in record && !(\"input\" in record) && !(\"output\" in record)) {\n errors.push(\n `Row ${rowNumber}: found OpenAI SFT-style \"messages\"; Tuned Tensor datasets require flat \"input\" and \"output\" strings`,\n );\n continue;\n }\n\n if (typeof record.input !== \"string\") {\n errors.push(`Row ${rowNumber}: missing string \"input\" field`);\n }\n if (typeof record.output !== \"string\") {\n errors.push(`Row ${rowNumber}: missing string \"output\" field`);\n }\n\n for (const field of [\"input\", \"output\"] as const) {\n const value = record[field];\n if (typeof value !== \"string\") continue;\n const hit = findControlChar(value);\n if (hit) {\n errors.push(\n `Row ${rowNumber}: field \"${field}\" contains invisible control character ${formatCodepoint(hit.codepoint)} (${hit.name}) at offset ${hit.offset} — strip or escape before uploading; some training paths split on it`,\n );\n }\n }\n }\n\n if (rowCount === 0) {\n errors.push(\"File contains no JSONL rows\");\n }\n\n if (errors.length > 0) {\n const preview = errors.slice(0, 5).join(\"\\n\");\n const suffix = errors.length > 5 ? `\\n...and ${errors.length - 5} more error(s)` : \"\";\n throw new Error(\n `Invalid dataset format. Each JSONL row must be {\"input\": \"...\", \"output\": \"...\"}.\\n${preview}${suffix}`,\n );\n }\n}\n\nexport function registerDatasetsCommands(parent: Command) {\n const datasets = parent\n .command(\"datasets\")\n .description(\"Manage datasets\");\n\n datasets\n .command(\"list\")\n .description(\"List datasets\")\n .option(\"-p, --page <n>\", \"Page number\", \"1\")\n .option(\"--per-page <n>\", \"Results per page\", \"20\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const { data, meta } = await get<Dataset[]>(\n \"/datasets\",\n { page: cmdOpts.page, per_page: cmdOpts.perPage },\n opts,\n );\n\n if (isJsonMode()) return printJson({ data, meta });\n\n printTable(\n [\"ID\", \"Name\", \"Rows\", \"Size\", \"Status\", \"Created\"],\n data.map((d) => [\n shortId(d.id),\n truncate(d.name, 30),\n String(d.row_count),\n formatBytes(d.file_size_bytes),\n formatStatus(d.status),\n formatDate(d.created_at),\n ]),\n meta,\n );\n });\n\n datasets\n .command(\"get\")\n .description(\"Show dataset details\")\n .argument(\"<id>\", \"Dataset ID (full UUID or 4+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveDatasetId(id, opts);\n const { data } = await get<Dataset>(`/datasets/${fullId}`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n\n printDetail([\n [\"ID\", data.id],\n [\"Name\", data.name],\n [\"Description\", data.description ?? undefined],\n [\"Format\", data.format],\n [\"Rows\", String(data.row_count)],\n [\"Size\", formatBytes(data.file_size_bytes)],\n [\"Status\", formatStatus(data.status)],\n [\"Created\", formatDate(data.created_at)],\n [\"Updated\", formatDate(data.updated_at)],\n ]);\n\n if (data.validation_errors?.length) {\n console.log(\"\\nValidation Errors:\");\n for (const err of data.validation_errors) {\n console.log(` - ${err}`);\n }\n }\n });\n\n datasets\n .command(\"upload\")\n .description(\"Upload a JSONL dataset file\")\n .argument(\"<file>\", \"Path to JSONL file\")\n .option(\"-n, --name <name>\", \"Dataset name (defaults to filename)\")\n .option(\"-d, --description <desc>\", \"Dataset description\")\n .action(async (file: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n\n if (!existsSync(file)) {\n printError(`File not found: ${file}`);\n process.exit(1);\n }\n\n validateDatasetFile(file);\n\n const name = cmdOpts.name || file.split(\"/\").pop()!.replace(/\\.jsonl?$/, \"\");\n const fileBytes = readFileSync(file);\n const uploadUrl = await post<DatasetUploadUrl>(\n \"/datasets/upload-url\",\n {\n name,\n description: cmdOpts.description ?? null,\n filename: file.split(\"/\").pop()!,\n size: statSync(file).size,\n contentType: \"application/jsonl\",\n },\n opts,\n );\n\n const uploadRes = await fetch(uploadUrl.data.upload_url, {\n method: uploadUrl.data.method,\n headers: uploadUrl.data.headers ?? { \"Content-Type\": \"application/jsonl\" },\n body: new Blob([fileBytes], { type: \"application/jsonl\" }),\n });\n if (!uploadRes.ok) {\n throw new Error(`Dataset upload failed: ${uploadRes.status} ${uploadRes.statusText}`);\n }\n\n const { data } = await post<Dataset>(\n \"/datasets/finalize\",\n {\n path: uploadUrl.data.path,\n name,\n description: cmdOpts.description ?? null,\n },\n opts,\n );\n\n if (isJsonMode()) return printJson(data);\n printSuccess(\n `Dataset uploaded: ${data.name} (${shortId(data.id)}) — ${data.row_count} rows`,\n );\n });\n\n datasets\n .command(\"delete\")\n .description(\"Delete a dataset\")\n .argument(\"<id>\", \"Dataset ID (full UUID or 4+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveDatasetId(id, opts);\n await del(`/datasets/${fullId}`, opts);\n\n if (isJsonMode()) return printJson({ id: fullId, deleted: true });\n printSuccess(`Dataset deleted: ${shortId(fullId)}`);\n });\n}\n","import { Command } from \"commander\";\nimport { spawn, execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport {\n existsSync,\n mkdirSync,\n statSync,\n createWriteStream,\n unlinkSync,\n readFileSync,\n writeFileSync,\n readdirSync,\n rmSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve, basename } from \"node:path\";\nimport { Readable, Transform } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { get, del, type ClientOpts } from \"../client.js\";\nimport { resolveModelId } from \"../resolve.js\";\nimport { SUPPORTED_BASE_MODELS } from \"../base-models.js\";\nimport { DEFAULT_SPEC_FILE } from \"./init.js\";\nimport type { LocalSpec } from \"../eval/types.js\";\nimport { startManagedModelServer } from \"../serve-manager.js\";\nimport {\n printTable,\n printDetail,\n printSuccess,\n printJson,\n isJsonMode,\n formatDate,\n shortId,\n truncate,\n printWarning,\n} from \"../output.js\";\n\ninterface Model {\n id: string;\n name: string;\n provider: string;\n provider_model_id: string;\n base_model: string;\n description: string | null;\n created_at: string;\n}\n\ninterface ModelDownload {\n url: string;\n filename: string;\n expires_at: string;\n}\n\ninterface ServeTarget {\n modelPath: string;\n modelName: string;\n source: \"local-directory\" | \"local-archive\" | \"downloaded-model\";\n modelId?: string;\n}\n\nconst REFERENCE_SERVER_SCRIPT = String.raw`#!/usr/bin/env python3\nimport json\nimport os\nimport time\nimport uuid\nfrom http.server import BaseHTTPRequestHandler, ThreadingHTTPServer\n\nMODEL_PATH = os.environ[\"TT_MODEL_PATH\"]\nMODEL_NAME = os.environ.get(\"TT_MODEL_NAME\", os.path.basename(MODEL_PATH.rstrip(\"/\")) or \"tuned-tensor-model\")\nSYSTEM_PROMPT = os.environ.get(\"TT_SYSTEM_PROMPT\", \"\").strip()\nHOST = os.environ.get(\"TT_HOST\", \"127.0.0.1\")\nPORT = int(os.environ.get(\"TT_PORT\", \"8000\"))\nDEFAULT_MAX_TOKENS = int(os.environ.get(\"TT_MAX_TOKENS\", \"512\"))\nDEFAULT_TEMPERATURE = float(os.environ.get(\"TT_TEMPERATURE\", \"0.7\"))\nTRUST_REMOTE_CODE = os.environ.get(\"TT_TRUST_REMOTE_CODE\", \"false\").lower() in {\"1\", \"true\", \"yes\", \"y\"}\nREQUESTED_DEVICE = os.environ.get(\"TT_DEVICE\", \"auto\").lower()\nJSON_REPAIR_ATTEMPTS = int(os.environ.get(\"TT_JSON_REPAIR_ATTEMPTS\", \"1\"))\nDEFAULT_JSON_SCHEMA = None\nif os.environ.get(\"TT_JSON_SCHEMA\"):\n DEFAULT_JSON_SCHEMA = json.loads(os.environ[\"TT_JSON_SCHEMA\"])\n\n\ndef choose_device(torch):\n if REQUESTED_DEVICE not in {\"auto\", \"cpu\", \"cuda\", \"mps\"}:\n raise RuntimeError(\"TT_DEVICE must be one of: auto, cpu, cuda, mps\")\n if REQUESTED_DEVICE == \"cuda\" and not torch.cuda.is_available():\n raise RuntimeError(\"TT_DEVICE=cuda requested, but CUDA is not available\")\n if REQUESTED_DEVICE == \"mps\" and not (\n hasattr(torch.backends, \"mps\") and torch.backends.mps.is_available()\n ):\n raise RuntimeError(\"TT_DEVICE=mps requested, but Apple MPS is not available\")\n if REQUESTED_DEVICE != \"auto\":\n return REQUESTED_DEVICE\n if torch.cuda.is_available():\n return \"cuda\"\n if hasattr(torch.backends, \"mps\") and torch.backends.mps.is_available():\n return \"mps\"\n return \"cpu\"\n\n\ndef load_model():\n try:\n import torch\n from transformers import (\n AutoModelForCausalLM,\n AutoModelForImageTextToText,\n AutoProcessor,\n AutoTokenizer,\n )\n except Exception as exc:\n raise RuntimeError(\n \"Missing Python serving dependencies. Install them with: \"\n \"python -m pip install torch transformers accelerate\"\n ) from exc\n\n try:\n processor = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=TRUST_REMOTE_CODE)\n except Exception:\n processor = AutoProcessor.from_pretrained(MODEL_PATH, trust_remote_code=TRUST_REMOTE_CODE)\n tokenizer = getattr(processor, \"tokenizer\", processor)\n if getattr(tokenizer, \"pad_token\", None) is None:\n tokenizer.pad_token = tokenizer.eos_token\n\n device = choose_device(torch)\n kwargs = {\n \"trust_remote_code\": TRUST_REMOTE_CODE,\n \"torch_dtype\": \"auto\",\n \"low_cpu_mem_usage\": True,\n }\n if device == \"cuda\":\n kwargs[\"device_map\"] = \"auto\"\n elif device == \"mps\":\n kwargs[\"torch_dtype\"] = torch.float16\n\n try:\n model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, **kwargs)\n except Exception:\n model = AutoModelForImageTextToText.from_pretrained(MODEL_PATH, **kwargs)\n if device != \"cuda\":\n model.to(device)\n model.eval()\n return torch, tokenizer, model, device\n\n\ntorch, tokenizer, model, DEVICE = load_model()\n\n\ndef content_to_text(content):\n if isinstance(content, str):\n return content\n return json.dumps(content, ensure_ascii=False)\n\n\ndef normalize_messages(raw_messages):\n messages = []\n for item in raw_messages:\n if not isinstance(item, dict):\n continue\n role = item.get(\"role\")\n if role not in {\"system\", \"user\", \"assistant\", \"tool\"}:\n continue\n messages.append({\"role\": role, \"content\": content_to_text(item.get(\"content\", \"\"))})\n\n if SYSTEM_PROMPT and not any(message[\"role\"] == \"system\" for message in messages):\n messages.insert(0, {\"role\": \"system\", \"content\": SYSTEM_PROMPT})\n return messages\n\n\ndef response_json_contract(body):\n response_format = body.get(\"response_format\")\n schema = DEFAULT_JSON_SCHEMA\n mode = \"json_schema\" if schema else \"text\"\n\n if isinstance(response_format, dict):\n format_type = response_format.get(\"type\")\n if format_type == \"json_object\":\n mode = \"json_object\"\n elif format_type == \"json_schema\":\n mode = \"json_schema\"\n json_schema = response_format.get(\"json_schema\")\n if isinstance(json_schema, dict):\n schema = json_schema.get(\"schema\") if isinstance(json_schema.get(\"schema\"), dict) else json_schema\n\n return mode, schema\n\n\ndef with_json_contract(messages, mode, schema):\n if mode == \"text\":\n return messages\n\n if schema:\n contract = (\n \"Return only a valid JSON object matching this JSON Schema. \"\n \"Do not include markdown, code fences, comments, or prose outside the JSON object.\\n\"\n + json.dumps(schema, ensure_ascii=False, separators=(\",\", \":\"))\n )\n else:\n contract = (\n \"Return only a valid JSON object. Do not include markdown, code fences, \"\n \"comments, or prose outside the JSON object.\"\n )\n\n contracted = [dict(message) for message in messages]\n for message in contracted:\n if message[\"role\"] == \"system\":\n message[\"content\"] = (message[\"content\"].rstrip() + \"\\n\\n\" + contract).strip()\n return contracted\n\n contracted.insert(0, {\"role\": \"system\", \"content\": contract})\n return contracted\n\n\ndef render_prompt(messages):\n chat_template = getattr(tokenizer, \"chat_template\", None)\n if hasattr(tokenizer, \"apply_chat_template\") and chat_template:\n return tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)\n\n rendered = []\n for message in messages:\n rendered.append(f\"{message['role'].upper()}: {message['content']}\")\n rendered.append(\"ASSISTANT:\")\n return \"\\n\".join(rendered)\n\n\ndef generate_completion(messages, max_tokens, temperature):\n prompt = render_prompt(messages)\n inputs = tokenizer(prompt, return_tensors=\"pt\")\n input_device = getattr(model, \"device\", None)\n if input_device is None:\n input_device = next(model.parameters()).device\n inputs = {key: value.to(input_device) for key, value in inputs.items()}\n\n generate_kwargs = {\n **inputs,\n \"max_new_tokens\": max_tokens,\n \"pad_token_id\": tokenizer.pad_token_id or tokenizer.eos_token_id,\n }\n if temperature > 0:\n generate_kwargs[\"do_sample\"] = True\n generate_kwargs[\"temperature\"] = temperature\n else:\n generate_kwargs[\"do_sample\"] = False\n\n with torch.no_grad():\n output_ids = model.generate(**generate_kwargs)\n\n prompt_tokens = int(inputs[\"input_ids\"].shape[-1])\n completion_ids = output_ids[0][prompt_tokens:]\n content = tokenizer.decode(completion_ids, skip_special_tokens=True).strip()\n return content, prompt_tokens, int(completion_ids.shape[-1])\n\n\ndef extract_json_value(content):\n decoder = json.JSONDecoder()\n text = content.strip()\n try:\n return json.loads(text), None\n except Exception:\n pass\n\n for index, char in enumerate(text):\n if char not in \"{[\":\n continue\n try:\n value, end = decoder.raw_decode(text[index:])\n trailing = text[index + end :].strip()\n if trailing:\n continue\n return value, None\n except Exception:\n continue\n return None, \"response is not valid JSON\"\n\n\ndef json_type_matches(value, expected):\n if expected == \"object\":\n return isinstance(value, dict)\n if expected == \"array\":\n return isinstance(value, list)\n if expected == \"string\":\n return isinstance(value, str)\n if expected == \"boolean\":\n return isinstance(value, bool)\n if expected == \"integer\":\n return isinstance(value, int) and not isinstance(value, bool)\n if expected == \"number\":\n return (isinstance(value, int) or isinstance(value, float)) and not isinstance(value, bool)\n if expected == \"null\":\n return value is None\n return True\n\n\ndef validate_json_schema(value, schema, path=\"$\"):\n if not isinstance(schema, dict):\n return []\n\n errors = []\n expected_type = schema.get(\"type\")\n if isinstance(expected_type, list):\n if not any(json_type_matches(value, item) for item in expected_type):\n errors.append(f\"{path} has wrong type\")\n return errors\n elif isinstance(expected_type, str) and not json_type_matches(value, expected_type):\n errors.append(f\"{path} must be {expected_type}\")\n return errors\n\n if \"enum\" in schema and value not in schema[\"enum\"]:\n errors.append(f\"{path} must be one of {schema['enum']}\")\n\n if isinstance(value, dict):\n required = schema.get(\"required\") if isinstance(schema.get(\"required\"), list) else []\n for key in required:\n if key not in value:\n errors.append(f\"{path}.{key} is required\")\n\n properties = schema.get(\"properties\") if isinstance(schema.get(\"properties\"), dict) else {}\n for key, child_schema in properties.items():\n if key in value:\n errors.extend(validate_json_schema(value[key], child_schema, f\"{path}.{key}\"))\n\n if schema.get(\"additionalProperties\") is False:\n extras = sorted(set(value.keys()) - set(properties.keys()))\n for key in extras:\n errors.append(f\"{path}.{key} is not allowed\")\n\n if isinstance(value, list) and isinstance(schema.get(\"items\"), dict):\n for index, item in enumerate(value):\n errors.extend(validate_json_schema(item, schema[\"items\"], f\"{path}[{index}]\"))\n\n return errors\n\n\ndef normalize_json_content(content, mode, schema):\n if mode == \"text\":\n return content, []\n\n value, error = extract_json_value(content)\n if error:\n return content, [error]\n if mode in {\"json_object\", \"json_schema\"} and not isinstance(value, dict):\n return content, [\"response must be a JSON object\"]\n\n errors = validate_json_schema(value, schema) if schema else []\n if errors:\n return content, errors\n\n return json.dumps(value, ensure_ascii=False, separators=(\",\", \":\")), []\n\n\ndef generate_validated_completion(messages, max_tokens, temperature, mode, schema):\n contracted_messages = with_json_contract(messages, mode, schema)\n attempts = max(0, JSON_REPAIR_ATTEMPTS) + 1\n last_content = \"\"\n last_prompt_tokens = 0\n last_completion_tokens = 0\n last_errors = []\n\n for attempt in range(attempts):\n content, prompt_tokens, completion_tokens = generate_completion(\n contracted_messages,\n max_tokens,\n temperature,\n )\n normalized, errors = normalize_json_content(content, mode, schema)\n if not errors:\n return normalized, prompt_tokens, completion_tokens, []\n\n last_content = content\n last_prompt_tokens = prompt_tokens\n last_completion_tokens = completion_tokens\n last_errors = errors\n\n if attempt < attempts - 1:\n contracted_messages = contracted_messages + [\n {\"role\": \"assistant\", \"content\": content},\n {\n \"role\": \"user\",\n \"content\": (\n \"The previous response was invalid: \"\n + \"; \".join(errors[:5])\n + \". Return only a corrected JSON object.\"\n ),\n },\n ]\n\n return last_content, last_prompt_tokens, last_completion_tokens, last_errors\n\n\nclass Handler(BaseHTTPRequestHandler):\n server_version = \"TunedTensorReferenceServer/0.1\"\n\n def send_json(self, status, payload):\n body = json.dumps(payload).encode(\"utf-8\")\n self.send_response(status)\n self.send_header(\"Content-Type\", \"application/json\")\n self.send_header(\"Content-Length\", str(len(body)))\n self.send_header(\"Access-Control-Allow-Origin\", \"*\")\n self.send_header(\"Access-Control-Allow-Headers\", \"authorization, content-type\")\n self.send_header(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\")\n self.end_headers()\n self.wfile.write(body)\n\n def do_OPTIONS(self):\n self.send_json(204, {})\n\n def do_GET(self):\n if self.path == \"/health\":\n self.send_json(200, {\n \"status\": \"ok\",\n \"model\": MODEL_NAME,\n \"spec_prompt\": bool(SYSTEM_PROMPT),\n \"device\": DEVICE,\n })\n return\n self.send_json(404, {\"error\": {\"message\": \"Not found\"}})\n\n def do_POST(self):\n if self.path not in {\"/v1/chat/completions\", \"/chat/completions\"}:\n self.send_json(404, {\"error\": {\"message\": \"Not found\"}})\n return\n\n try:\n length = int(self.headers.get(\"content-length\", \"0\"))\n body = json.loads(self.rfile.read(length) or b\"{}\")\n if body.get(\"stream\"):\n self.send_json(400, {\"error\": {\"message\": \"Streaming is not supported by tt models serve yet.\"}})\n return\n\n raw_messages = body.get(\"messages\")\n if not isinstance(raw_messages, list) or not raw_messages:\n self.send_json(400, {\"error\": {\"message\": \"Request must include a non-empty messages array.\"}})\n return\n\n max_tokens = int(body.get(\"max_tokens\") or DEFAULT_MAX_TOKENS)\n temperature = float(body.get(\"temperature\") if body.get(\"temperature\") is not None else DEFAULT_TEMPERATURE)\n messages = normalize_messages(raw_messages)\n json_mode, json_schema = response_json_contract(body)\n content, prompt_tokens, completion_tokens, validation_errors = generate_validated_completion(\n messages,\n max_tokens,\n temperature,\n json_mode,\n json_schema,\n )\n if validation_errors:\n self.send_json(422, {\n \"error\": {\n \"message\": \"Model did not produce valid JSON for the requested response_format.\",\n \"details\": validation_errors,\n \"content\": content,\n }\n })\n return\n\n self.send_json(200, {\n \"id\": \"chatcmpl-\" + uuid.uuid4().hex,\n \"object\": \"chat.completion\",\n \"created\": int(time.time()),\n \"model\": body.get(\"model\") or MODEL_NAME,\n \"choices\": [{\n \"index\": 0,\n \"message\": {\"role\": \"assistant\", \"content\": content},\n \"finish_reason\": \"stop\",\n }],\n \"usage\": {\n \"prompt_tokens\": prompt_tokens,\n \"completion_tokens\": completion_tokens,\n \"total_tokens\": prompt_tokens + completion_tokens,\n },\n })\n except Exception as exc:\n self.send_json(500, {\"error\": {\"message\": str(exc)}})\n\n def log_message(self, fmt, *args):\n print(\"%s - %s\" % (self.address_string(), fmt % args))\n\n\ndef main():\n print(f\"Serving {MODEL_NAME} from {MODEL_PATH}\")\n print(f\"Listening on http://{HOST}:{PORT}/v1/chat/completions\")\n if SYSTEM_PROMPT:\n print(\"Behavior spec prompt: enabled\")\n else:\n print(\"Behavior spec prompt: disabled\")\n print(f\"Device: {DEVICE}\")\n ThreadingHTTPServer((HOST, PORT), Handler).serve_forever()\n\n\nif __name__ == \"__main__\":\n main()\n`;\n\nfunction resolveOutputPath(output: string | undefined, filename: string): string {\n if (!output) return filename;\n if (existsSync(output) && statSync(output).isDirectory()) {\n return join(output, filename);\n }\n return output;\n}\n\nfunction parseContentLength(value: string | null): number | null {\n if (!value) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;\n}\n\nfunction formatBytes(bytes: number): string {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit += 1;\n }\n const precision = unit === 0 || value >= 10 ? 0 : 1;\n return `${value.toFixed(precision)} ${units[unit]}`;\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return \"--\";\n const rounded = Math.max(1, Math.round(seconds));\n const hours = Math.floor(rounded / 3600);\n const minutes = Math.floor((rounded % 3600) / 60);\n const secs = rounded % 60;\n if (hours > 0) return `${hours}h ${minutes}m`;\n if (minutes > 0) return `${minutes}m ${secs}s`;\n return `${secs}s`;\n}\n\nfunction chunkLength(chunk: unknown): number {\n if (typeof chunk === \"string\") return Buffer.byteLength(chunk);\n if (chunk instanceof Uint8Array) return chunk.byteLength;\n return Buffer.byteLength(String(chunk));\n}\n\nfunction createDownloadProgress(totalBytes: number | null, enabled: boolean) {\n const stream = process.stderr;\n const start = Date.now();\n let lastRender = 0;\n let rendered = false;\n\n function render(downloadedBytes: number, force = false) {\n if (!enabled) return;\n const now = Date.now();\n if (!force && now - lastRender < 100 && downloadedBytes !== totalBytes) return;\n lastRender = now;\n rendered = true;\n\n const elapsedSeconds = Math.max((now - start) / 1000, 0.001);\n const rate = downloadedBytes / elapsedSeconds;\n const rateText = `${formatBytes(rate)}/s`;\n\n let line: string;\n if (totalBytes != null && totalBytes > 0) {\n const ratio = Math.min(downloadedBytes / totalBytes, 1);\n const barWidth = 24;\n const filled = Math.round(ratio * barWidth);\n const bar = \"#\".repeat(filled) + \"-\".repeat(barWidth - filled);\n const etaSeconds = rate > 0 ? (totalBytes - downloadedBytes) / rate : Number.NaN;\n line = `Downloading [${bar}] ${(ratio * 100).toFixed(1).padStart(5)}% ${formatBytes(downloadedBytes)}/${formatBytes(totalBytes)} ${rateText} ETA ${formatDuration(etaSeconds)}`;\n } else {\n line = `Downloading ${formatBytes(downloadedBytes)} ${rateText} elapsed ${formatDuration(elapsedSeconds)}`;\n }\n\n const columns = stream.columns || 120;\n stream.write(`\\r\\x1b[K${line.slice(0, Math.max(columns - 1, 0))}`);\n }\n\n function stop() {\n if (enabled && rendered) stream.write(\"\\n\");\n }\n\n return { render, stop };\n}\n\nasync function downloadUrlToFile(url: string, outputPath: string): Promise<number | null> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Download failed: ${res.status} ${res.statusText}`);\n }\n if (!res.body) {\n throw new Error(\"Download failed: response body was empty\");\n }\n\n mkdirSync(dirname(outputPath), { recursive: true });\n const file = createWriteStream(outputPath);\n const contentLength = parseContentLength(res.headers.get(\"content-length\"));\n const progress = createDownloadProgress(\n contentLength,\n !isJsonMode() && process.stderr.isTTY === true,\n );\n let downloadedBytes = 0;\n const progressStream = new Transform({\n transform(chunk, _encoding, callback) {\n downloadedBytes += chunkLength(chunk);\n progress.render(downloadedBytes);\n callback(null, chunk);\n },\n });\n\n try {\n progress.render(0, true);\n await pipeline(Readable.fromWeb(res.body), progressStream, file);\n progress.render(downloadedBytes, true);\n progress.stop();\n } catch (err) {\n progress.stop();\n try {\n unlinkSync(outputPath);\n } catch {\n // Best effort cleanup for partially written downloads.\n }\n throw err;\n }\n\n return contentLength;\n}\n\nfunction defaultCacheDir(): string {\n const root = process.env.XDG_CACHE_HOME || join(homedir(), \".cache\");\n return join(root, \"tuned-tensor\", \"models\");\n}\n\nfunction runtimeDir(cacheDir: string): string {\n return join(cacheDir, \"_runtime\");\n}\n\nfunction runtimePythonPath(cacheDir: string): string {\n const dir = runtimeDir(cacheDir);\n return process.platform === \"win32\"\n ? join(dir, \"Scripts\", \"python.exe\")\n : join(dir, \"bin\", \"python\");\n}\n\nfunction resolveServePython(cacheDir: string, explicitPython?: string): string {\n if (explicitPython) return explicitPython;\n const managedPython = runtimePythonPath(cacheDir);\n return existsSync(managedPython) ? managedPython : \"python3\";\n}\n\nfunction commandExists(command: string): boolean {\n try {\n execFileSync(command, [\"--version\"], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pythonMinorVersion(command: string): number | null {\n try {\n const out = execFileSync(\n command,\n [\"-c\", \"import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')\"],\n { encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n const [major, minor] = out.split(\".\").map((part) => Number(part));\n if (major !== 3 || !Number.isFinite(minor)) return null;\n return minor;\n } catch {\n return null;\n }\n}\n\nfunction pickRuntimePython(explicitPython?: string): string {\n const candidates = explicitPython\n ? [explicitPython]\n : [\"python3.12\", \"python3.11\", \"python3.10\", \"python3\"];\n for (const candidate of candidates) {\n if (!commandExists(candidate)) continue;\n const minor = pythonMinorVersion(candidate);\n if (minor != null && minor >= 10 && minor <= 12) return candidate;\n if (explicitPython) {\n throw new Error(\n `${candidate} is Python 3.${minor ?? \"?\"}. The local serving runtime requires Python 3.10, 3.11, or 3.12 because torch wheels may not be available for newer versions.`,\n );\n }\n }\n throw new Error(\n \"Could not find Python 3.10, 3.11, or 3.12. Install one, then run `tt models setup-runtime --python <path>`.\",\n );\n}\n\nfunction ensureServingRuntime(python: string, cacheDir: string): void {\n const check = `\nimport importlib.util\nimport json\nrequired = [\"torch\", \"transformers\", \"accelerate\", \"safetensors\"]\nmissing = [name for name in required if importlib.util.find_spec(name) is None]\nprint(json.dumps({\"missing\": missing}))\n`;\n let missing: string[];\n try {\n const out = execFileSync(python, [\"-c\", check], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n missing = JSON.parse(out).missing;\n } catch (err) {\n const suffix = python === runtimePythonPath(cacheDir)\n ? \" Re-run `tt models setup-runtime` to repair it.\"\n : \" Run `tt models setup-runtime` to create an isolated serving runtime.\";\n throw new Error(`Python serving runtime check failed for ${python}.${suffix}`);\n }\n\n if (missing.length > 0) {\n const managedPython = runtimePythonPath(cacheDir);\n const installHint = python === managedPython\n ? \"Run `tt models setup-runtime --force` to repair it.\"\n : \"Run `tt models setup-runtime` first, or pass --python <path> to a Python environment with the serving dependencies installed.\";\n throw new Error(\n `Python serving runtime is missing: ${missing.join(\", \")}. ${installHint}`,\n );\n }\n}\n\nfunction setupRuntimeCommands(python: string, venvDir: string, deps: string[]): string[][] {\n const venvPython = process.platform === \"win32\"\n ? join(venvDir, \"Scripts\", \"python.exe\")\n : join(venvDir, \"bin\", \"python\");\n return [\n [python, \"-m\", \"venv\", venvDir],\n [venvPython, \"-m\", \"pip\", \"install\", \"--upgrade\", \"pip\"],\n [venvPython, \"-m\", \"pip\", \"install\", ...deps],\n ];\n}\n\nfunction safeSegment(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"model\";\n}\n\nfunction directoryHasFiles(path: string): boolean {\n return existsSync(path) && statSync(path).isDirectory() && readdirSync(path).length > 0;\n}\n\nfunction extractArchive(archivePath: string, targetDir: string, force: boolean): string {\n if (directoryHasFiles(targetDir) && !force) return targetDir;\n if (existsSync(targetDir)) rmSync(targetDir, { recursive: true, force: true });\n mkdirSync(targetDir, { recursive: true });\n execFileSync(\"tar\", [\"-xzf\", archivePath, \"-C\", targetDir], { stdio: \"inherit\" });\n return targetDir;\n}\n\nfunction localArchiveCacheDir(archivePath: string, cacheDir: string): string {\n const resolved = resolve(archivePath);\n const digest = createHash(\"sha256\").update(resolved).digest(\"hex\").slice(0, 12);\n return join(cacheDir, `local-${safeSegment(basename(archivePath))}-${digest}`);\n}\n\nfunction buildSystemPrompt(spec: Pick<LocalSpec, \"system_prompt\" | \"guidelines\" | \"constraints\">): string {\n const parts: string[] = [];\n if (spec.system_prompt?.trim()) parts.push(spec.system_prompt.trim());\n if (Array.isArray(spec.guidelines) && spec.guidelines.length > 0) {\n parts.push(`Guidelines:\\n${spec.guidelines.map((g) => `- ${g}`).join(\"\\n\")}`);\n }\n if (Array.isArray(spec.constraints) && spec.constraints.length > 0) {\n parts.push(`Constraints:\\n${spec.constraints.map((c) => `- ${c}`).join(\"\\n\")}`);\n }\n return parts.join(\"\\n\\n\");\n}\n\nfunction findSpecPath(explicitPath: string | undefined, modelPath: string): string | null {\n const candidates = explicitPath\n ? [explicitPath]\n : [join(process.cwd(), DEFAULT_SPEC_FILE), join(modelPath, DEFAULT_SPEC_FILE)];\n for (const candidate of candidates) {\n const resolved = resolve(candidate);\n if (existsSync(resolved) && statSync(resolved).isFile()) return resolved;\n }\n return null;\n}\n\nfunction loadSystemPromptFromSpec(specPath: string): string {\n const spec = JSON.parse(readFileSync(specPath, \"utf8\")) as LocalSpec;\n return buildSystemPrompt(spec);\n}\n\nfunction loadJsonSchemaForServe(schemaPath: string): string {\n const resolved = resolve(schemaPath);\n if (!existsSync(resolved) || !statSync(resolved).isFile()) {\n throw new Error(`JSON schema file not found: ${schemaPath}`);\n }\n\n try {\n const schema = JSON.parse(readFileSync(resolved, \"utf8\"));\n return JSON.stringify(schema);\n } catch (err) {\n throw new Error(`JSON schema file is not valid JSON: ${schemaPath}`);\n }\n}\n\nfunction writeReferenceServerScript(cacheDir: string): string {\n const scriptDir = join(cacheDir, \"_server\");\n mkdirSync(scriptDir, { recursive: true });\n const scriptPath = join(scriptDir, \"openai_reference_server.py\");\n writeFileSync(scriptPath, REFERENCE_SERVER_SCRIPT, \"utf8\");\n return scriptPath;\n}\n\nasync function resolveServeTarget(\n target: string,\n opts: ClientOpts,\n cacheDir: string,\n forceDownload: boolean,\n): Promise<ServeTarget> {\n if (existsSync(target)) {\n const resolved = resolve(target);\n const stats = statSync(resolved);\n if (stats.isDirectory()) {\n return {\n modelPath: resolved,\n modelName: basename(resolved),\n source: \"local-directory\",\n };\n }\n if (stats.isFile() && (resolved.endsWith(\".tar.gz\") || resolved.endsWith(\".tgz\"))) {\n const extractDir = join(localArchiveCacheDir(resolved, cacheDir), \"model\");\n return {\n modelPath: extractArchive(resolved, extractDir, forceDownload),\n modelName: basename(resolved).replace(/\\.t(ar\\.)?gz$/, \"\"),\n source: \"local-archive\",\n };\n }\n throw new Error(`Unsupported model path: ${target}. Use a model directory or .tar.gz artifact.`);\n }\n\n const fullId = await resolveModelId(target, opts);\n const { data: model } = await get<Model>(`/models/${fullId}`, undefined, opts);\n const { data } = await get<ModelDownload>(`/models/${fullId}/download`, undefined, opts);\n const modelCacheDir = join(cacheDir, fullId);\n const archivePath = join(modelCacheDir, data.filename);\n const extractDir = join(modelCacheDir, \"model\");\n\n if (!existsSync(archivePath) || forceDownload) {\n await downloadUrlToFile(data.url, archivePath);\n }\n extractArchive(archivePath, extractDir, forceDownload);\n\n return {\n modelPath: extractDir,\n modelName: model.name || fullId,\n source: \"downloaded-model\",\n modelId: fullId,\n };\n}\n\nfunction quoteCommandPart(part: string): string {\n if (/^[a-zA-Z0-9_./:=@-]+$/.test(part)) return part;\n return `'${part.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction parseServeInteger(value: string | number, label: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`${label} must be a non-negative integer.`);\n }\n return parsed;\n}\n\nfunction printServeCommand(\n command: string,\n args: string[],\n env: Record<string, string>,\n managed?: {\n enabled: boolean;\n host: string;\n port: number;\n idle_timeout_seconds: number;\n restart_after_requests: number;\n gate_field: string;\n log_file?: string;\n },\n) {\n const envKeys = Object.keys(env).sort();\n const commandLine = [command, ...args].map(quoteCommandPart).join(\" \");\n if (isJsonMode()) {\n return printJson({ command, args, env_keys: envKeys, command_line: commandLine, managed });\n }\n const fields: [string, string | undefined][] = [\n [\"Command\", commandLine],\n [\"Environment\", envKeys.join(\", \")],\n ];\n if (managed?.enabled) {\n fields.push(\n [\"Managed\", \"enabled\"],\n [\"Wrapper\", `http://${managed.host}:${managed.port}`],\n [\"Idle timeout\", `${managed.idle_timeout_seconds}s`],\n [\"Restart after\", managed.restart_after_requests === 0 ? \"disabled\" : `${managed.restart_after_requests} requests`],\n [\"Gate field\", managed.gate_field],\n [\"Log file\", managed.log_file],\n );\n }\n printDetail(fields);\n}\n\nexport function registerModelsCommands(parent: Command) {\n const models = parent.command(\"models\").description(\"Manage fine-tuned models\");\n\n models\n .command(\"base\")\n .description(\"List supported base models\")\n .action(async () => {\n const data = SUPPORTED_BASE_MODELS.map((model) => ({\n id: model,\n name: model.split(\"/\").pop() || model,\n type: \"base\" as const,\n }));\n\n if (isJsonMode()) return printJson({ data });\n\n printTable(\n [\"ID\", \"Name\", \"Type\"],\n data.map((m) => [m.id, m.name, m.type]),\n );\n });\n\n models\n .command(\"list\")\n .description(\"List fine-tuned models\")\n .option(\"-p, --page <n>\", \"Page number\", \"1\")\n .option(\"--per-page <n>\", \"Results per page\", \"20\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const { data, meta } = await get<Model[]>(\n \"/models\",\n { page: cmdOpts.page, per_page: cmdOpts.perPage },\n opts,\n );\n\n if (isJsonMode()) return printJson({ data, meta });\n\n printTable(\n [\"ID\", \"Name\", \"Base Model\", \"Provider\", \"Created\"],\n data.map((m) => [\n shortId(m.id),\n truncate(m.name, 30),\n m.base_model.split(\"/\").pop() || m.base_model,\n m.provider,\n formatDate(m.created_at),\n ]),\n meta,\n );\n });\n\n models\n .command(\"get\")\n .description(\"Show model details\")\n .argument(\"<id>\", \"Model ID (full UUID or 4+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveModelId(id, opts);\n const { data } = await get<Model>(`/models/${fullId}`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n\n printDetail([\n [\"ID\", data.id],\n [\"Name\", data.name],\n [\"Base Model\", data.base_model],\n [\"Provider\", data.provider],\n [\"Hosted Model\", data.provider_model_id],\n [\"Description\", data.description ?? undefined],\n [\"Created\", formatDate(data.created_at)],\n ]);\n });\n\n models\n .command(\"download\")\n .description(\"Download a fine-tuned model artifact\")\n .argument(\"<id>\", \"Model ID (full UUID or 4+ char prefix)\")\n .option(\"-o, --output <path>\", \"Output file or directory\")\n .option(\"-f, --force\", \"Overwrite the output file if it already exists\")\n .action(async (id: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveModelId(id, opts);\n const { data } = await get<ModelDownload>(\n `/models/${fullId}/download`,\n undefined,\n opts,\n );\n\n const outputPath = resolveOutputPath(cmdOpts.output, data.filename);\n if (existsSync(outputPath) && !cmdOpts.force) {\n throw new Error(`Output file already exists: ${outputPath}. Use --force to overwrite.`);\n }\n\n const bytes = await downloadUrlToFile(data.url, outputPath);\n\n if (isJsonMode()) {\n return printJson({\n id: fullId,\n output_path: outputPath,\n filename: data.filename,\n bytes,\n expires_at: data.expires_at,\n });\n }\n\n const size = bytes == null ? \"\" : ` (${bytes} bytes)`;\n printSuccess(`Model downloaded to ${outputPath}${size}`);\n });\n\n models\n .command(\"setup-runtime\")\n .description(\"Install an isolated Python runtime for local model serving\")\n .option(\"--python <path>\", \"Python 3.10-3.12 executable to create the runtime\")\n .option(\"--cache-dir <path>\", \"Cache directory for the managed runtime\")\n .option(\"-f, --force\", \"Recreate the runtime if it already exists\")\n .option(\"--print-command\", \"Print the setup commands without running them\")\n .action(async (cmdOpts) => {\n const cacheDir = resolve(cmdOpts.cacheDir || defaultCacheDir());\n const venvDir = runtimeDir(cacheDir);\n const venvPython = runtimePythonPath(cacheDir);\n const python = pickRuntimePython(cmdOpts.python);\n const deps = [\"torch\", \"transformers\", \"accelerate\", \"safetensors\"];\n const commands = setupRuntimeCommands(python, venvDir, deps);\n\n if (cmdOpts.printCommand) {\n const commandLines = commands.map((cmd) => cmd.map(quoteCommandPart).join(\" \"));\n if (isJsonMode()) {\n return printJson({\n python,\n runtime_dir: venvDir,\n runtime_python: venvPython,\n commands: commandLines,\n });\n }\n printDetail([\n [\"Python\", python],\n [\"Runtime\", venvDir],\n [\"Commands\", commandLines.join(\"\\n\")],\n ]);\n return;\n }\n\n if (existsSync(venvDir) && cmdOpts.force) {\n rmSync(venvDir, { recursive: true, force: true });\n }\n if (!existsSync(venvPython)) {\n mkdirSync(cacheDir, { recursive: true });\n execFileSync(commands[0][0], commands[0].slice(1), { stdio: \"inherit\" });\n }\n\n execFileSync(commands[1][0], commands[1].slice(1), { stdio: \"inherit\" });\n execFileSync(commands[2][0], commands[2].slice(1), { stdio: \"inherit\" });\n ensureServingRuntime(venvPython, cacheDir);\n\n if (isJsonMode()) {\n return printJson({\n runtime_dir: venvDir,\n runtime_python: venvPython,\n installed: true,\n dependencies: deps,\n });\n }\n\n printSuccess(`Serving runtime ready at ${venvDir}`);\n console.log(`Use it with: tt models serve <model-id> --spec ${DEFAULT_SPEC_FILE}`);\n });\n\n models\n .command(\"serve\")\n .description(\"Serve a downloaded model with an OpenAI-compatible local API\")\n .argument(\"<target>\", \"Model ID/prefix, model directory, or .tar.gz artifact\")\n .option(\"--spec <path>\", \"Behavior spec JSON to apply as the default system prompt\")\n .option(\"--no-spec-prompt\", \"Do not auto-apply a behavior spec system prompt\")\n .option(\"--host <host>\", \"Host to bind\", \"127.0.0.1\")\n .option(\"--port <port>\", \"Port to bind\", \"8000\")\n .option(\"--python <path>\", \"Python executable\")\n .option(\"--cache-dir <path>\", \"Cache directory for downloaded/extracted models\")\n .option(\"--device <device>\", \"Inference device: auto, cpu, cuda, or mps\", \"auto\")\n .option(\"--force-download\", \"Re-download and re-extract model artifacts\")\n .option(\"--max-tokens <n>\", \"Default max completion tokens\", \"512\")\n .option(\"--temperature <n>\", \"Default sampling temperature\", \"0.7\")\n .option(\"--json-schema <path>\", \"JSON Schema file to enforce by default for chat completions\")\n .option(\"--json-repair-attempts <n>\", \"Number of JSON/schema repair retries\", \"1\")\n .option(\"--trust-remote-code\", \"Pass trust_remote_code=True to transformers\")\n .option(\"--managed\", \"Run a local lifecycle manager in front of the model server\")\n .option(\"--idle-timeout <seconds>\", \"Managed mode idle timeout before stopping the model\", \"300\")\n .option(\"--restart-after-requests <n>\", \"Managed mode restart threshold; 0 disables request-count restarts\", \"100\")\n .option(\"--gate-field <field>\", \"Response JSON field to log as the managed serving gate result\", \"should_process\")\n .option(\"--log-file <path>\", \"Write managed serving JSONL request logs to a file\")\n .option(\"--print-command\", \"Print the underlying Python command without starting it\")\n .action(async (target: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const cacheDir = resolve(cmdOpts.cacheDir || defaultCacheDir());\n mkdirSync(cacheDir, { recursive: true });\n const python = resolveServePython(cacheDir, cmdOpts.python);\n if (!cmdOpts.printCommand) ensureServingRuntime(python, cacheDir);\n\n const serveTarget = await resolveServeTarget(\n target,\n opts,\n cacheDir,\n Boolean(cmdOpts.forceDownload),\n );\n const serverScript = writeReferenceServerScript(cacheDir);\n\n let specPath: string | null = null;\n let systemPrompt = \"\";\n if (cmdOpts.specPrompt !== false) {\n specPath = findSpecPath(cmdOpts.spec, serveTarget.modelPath);\n if (cmdOpts.spec && !specPath) {\n throw new Error(`Spec file not found: ${cmdOpts.spec}`);\n }\n if (specPath) {\n systemPrompt = loadSystemPromptFromSpec(specPath);\n }\n }\n\n const env: Record<string, string> = {\n TT_MODEL_PATH: serveTarget.modelPath,\n TT_MODEL_NAME: serveTarget.modelName,\n TT_HOST: cmdOpts.host,\n TT_PORT: String(cmdOpts.port),\n TT_MAX_TOKENS: String(cmdOpts.maxTokens),\n TT_TEMPERATURE: String(cmdOpts.temperature),\n TT_JSON_REPAIR_ATTEMPTS: String(cmdOpts.jsonRepairAttempts),\n TT_TRUST_REMOTE_CODE: cmdOpts.trustRemoteCode ? \"true\" : \"false\",\n TT_DEVICE: String(cmdOpts.device),\n };\n if (systemPrompt) env.TT_SYSTEM_PROMPT = systemPrompt;\n if (cmdOpts.jsonSchema) env.TT_JSON_SCHEMA = loadJsonSchemaForServe(cmdOpts.jsonSchema);\n\n const args = [serverScript];\n const idleTimeoutSeconds = parseServeInteger(cmdOpts.idleTimeout, \"--idle-timeout\");\n const restartAfterRequests = parseServeInteger(\n cmdOpts.restartAfterRequests,\n \"--restart-after-requests\",\n );\n const publicPort = parseServeInteger(cmdOpts.port, \"--port\");\n const managedConfig = cmdOpts.managed\n ? {\n enabled: true,\n host: String(cmdOpts.host),\n port: publicPort,\n idle_timeout_seconds: idleTimeoutSeconds,\n restart_after_requests: restartAfterRequests,\n gate_field: String(cmdOpts.gateField),\n log_file: cmdOpts.logFile ? resolve(cmdOpts.logFile) : undefined,\n }\n : undefined;\n if (cmdOpts.printCommand) return printServeCommand(python, args, env, managedConfig);\n\n if (!isJsonMode()) {\n printSuccess(\n cmdOpts.managed\n ? `Serving ${serveTarget.modelName} through a managed local wrapper`\n : `Serving ${serveTarget.modelName} from ${serveTarget.modelPath}`,\n );\n if (systemPrompt && specPath) {\n printSuccess(`Behavior spec prompt loaded from ${specPath}`);\n } else if (cmdOpts.specPrompt !== false) {\n printWarning(\n `No ${DEFAULT_SPEC_FILE} found. Pass --spec <path> to preserve the behavior prompt.`,\n );\n }\n console.log(`OpenAI-compatible endpoint: http://${cmdOpts.host}:${cmdOpts.port}/v1/chat/completions`);\n console.log(`Health check: http://${cmdOpts.host}:${cmdOpts.port}/health`);\n console.log(`Python runtime: ${python}`);\n if (cmdOpts.managed) {\n console.log(`Managed idle timeout: ${idleTimeoutSeconds}s`);\n console.log(\n `Managed restart threshold: ${\n restartAfterRequests === 0 ? \"disabled\" : `${restartAfterRequests} requests`\n }`,\n );\n console.log(`Managed gate field: ${cmdOpts.gateField}`);\n }\n }\n\n if (cmdOpts.managed) {\n await startManagedModelServer({\n publicHost: String(cmdOpts.host),\n publicPort,\n python,\n args,\n env,\n modelName: serveTarget.modelName,\n modelPath: serveTarget.modelPath,\n idleTimeoutSeconds,\n restartAfterRequests,\n gateField: String(cmdOpts.gateField),\n logFile: cmdOpts.logFile ? resolve(cmdOpts.logFile) : undefined,\n });\n return;\n }\n\n await new Promise<void>((resolvePromise, reject) => {\n const child = spawn(python, args, {\n stdio: \"inherit\",\n env: { ...process.env, ...env },\n });\n child.on(\"error\", reject);\n child.on(\"exit\", (code, signal) => {\n if (code === 0) return resolvePromise();\n reject(new Error(`Model server exited with ${signal ?? `code ${code}`}`));\n });\n });\n });\n\n models\n .command(\"delete\")\n .description(\"Delete a model\")\n .argument(\"<id>\", \"Model ID (full UUID or 4+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveModelId(id, opts);\n await del(`/models/${fullId}`, opts);\n\n if (isJsonMode()) return printJson({ id: fullId, deleted: true });\n printSuccess(`Model deleted: ${shortId(fullId)}`);\n });\n}\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { printSuccess, printError, printWarning } from \"../output.js\";\nimport type { LocalSpec } from \"../eval/types.js\";\nimport { canonicalizeBaseModel } from \"../base-models.js\";\n\nconst DEFAULT_SPEC_FILE = \"tunedtensor.json\";\n\nconst SCAFFOLD: LocalSpec = {\n name: \"My Agent\",\n description: \"\",\n base_model: \"Qwen/Qwen3.5-2B\",\n system_prompt: \"You are a helpful assistant.\",\n guidelines: [],\n constraints: [],\n examples: [\n { input: \"Hello\", output: \"Hi! How can I help you today?\" },\n ],\n eval_cases: [],\n};\n\nexport function registerInitCommand(parent: Command) {\n parent\n .command(\"init\")\n .description(\"Create a local behaviour spec file\")\n .option(\"-n, --name <name>\", \"Spec name\")\n .option(\"--model <model>\", \"Base model ID\")\n .option(\"-f, --file <path>\", \"Output file path\", DEFAULT_SPEC_FILE)\n .action(async (cmdOpts) => {\n const filePath = resolve(cmdOpts.file);\n\n if (existsSync(filePath)) {\n printWarning(`${cmdOpts.file} already exists. Use tt eval to validate it or edit it directly.`);\n return;\n }\n\n const spec: LocalSpec = { ...SCAFFOLD };\n if (cmdOpts.name) spec.name = cmdOpts.name;\n if (cmdOpts.model) spec.base_model = canonicalizeBaseModel(cmdOpts.model);\n\n writeFileSync(filePath, JSON.stringify(spec, null, 2) + \"\\n\");\n printSuccess(`Created ${cmdOpts.file}`);\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Edit the spec: system_prompt, guidelines, examples\");\n console.log(\" 2. Validate spec: tt eval\");\n console.log(\" 3. Push to remote: tt push\");\n });\n}\n\nexport function loadSpec(filePath?: string): LocalSpec {\n const resolved = resolve(filePath || DEFAULT_SPEC_FILE);\n if (!existsSync(resolved)) {\n printError(\n `Spec file not found: ${filePath || DEFAULT_SPEC_FILE}\\nRun \\`tt init\\` to create one.`,\n );\n process.exit(1);\n }\n\n const raw = JSON.parse(readFileSync(resolved, \"utf-8\"));\n return raw as LocalSpec;\n}\n\nexport { DEFAULT_SPEC_FILE };\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { appendFileSync, mkdirSync } from \"node:fs\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { dirname } from \"node:path\";\n\ntype SpawnModelServer = (\n command: string,\n args: string[],\n options: { env: NodeJS.ProcessEnv; stdio: \"inherit\" },\n) => ChildProcess;\n\nexport interface ManagedServeOptions {\n publicHost: string;\n publicPort: number;\n python: string;\n args: string[];\n env: Record<string, string>;\n modelName: string;\n modelPath: string;\n idleTimeoutSeconds: number;\n restartAfterRequests: number;\n gateField: string;\n logFile?: string;\n spawnModelServer?: SpawnModelServer;\n logRecord?: (record: ManagedServeLogRecord) => void;\n}\n\nexport interface ManagedServeLogRecord {\n timestamp: string;\n request_id: string;\n route: string;\n model_target: { name: string; path: string };\n request_bytes: number;\n response_status: number;\n latency_ms: number;\n queued_ms: number;\n prompt_tokens: number | null;\n completion_tokens: number | null;\n total_tokens: number | null;\n schema_validity: boolean | null;\n gate_field: string;\n gate_result: unknown;\n restart_count: number;\n error_summary: string | null;\n}\n\ninterface ForwardResult {\n status: number;\n headers: Headers;\n body: string;\n parsed: unknown;\n}\n\nconst COMPLETION_ROUTES = new Set([\"/v1/chat/completions\", \"/chat/completions\"]);\n\nfunction parsePositiveInteger(value: number, fallback: number): number {\n return Number.isInteger(value) && value >= 0 ? value : fallback;\n}\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction readRequestBody(req: IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => chunks.push(Buffer.from(chunk)));\n req.on(\"end\", () => resolve(Buffer.concat(chunks)));\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, payload: unknown) {\n const body = Buffer.from(JSON.stringify(payload), \"utf8\");\n res.writeHead(status, {\n \"content-type\": \"application/json\",\n \"content-length\": String(body.byteLength),\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-headers\": \"authorization, content-type\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n });\n res.end(body);\n}\n\nfunction copyResponseHeaders(headers: Headers): Record<string, string> {\n const copied: Record<string, string> = {\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-headers\": \"authorization, content-type\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n };\n const contentType = headers.get(\"content-type\");\n if (contentType) copied[\"content-type\"] = contentType;\n return copied;\n}\n\nfunction tryJsonParse(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction readPath(value: unknown, path: string): unknown {\n if (!path) return null;\n let current = value;\n for (const part of path.split(\".\")) {\n if (!part) return null;\n if (!current || typeof current !== \"object\" || !(part in current)) return null;\n current = (current as Record<string, unknown>)[part];\n }\n return current ?? null;\n}\n\nfunction extractAssistantContent(response: unknown): string | null {\n if (!response || typeof response !== \"object\") return null;\n const choices = (response as { choices?: unknown }).choices;\n if (!Array.isArray(choices) || choices.length === 0) return null;\n const first = choices[0];\n if (!first || typeof first !== \"object\") return null;\n const message = (first as { message?: unknown }).message;\n if (!message || typeof message !== \"object\") return null;\n const content = (message as { content?: unknown }).content;\n return typeof content === \"string\" ? content : null;\n}\n\nfunction usageNumber(response: unknown, key: string): number | null {\n if (!response || typeof response !== \"object\") return null;\n const usage = (response as { usage?: unknown }).usage;\n if (!usage || typeof usage !== \"object\") return null;\n const value = (usage as Record<string, unknown>)[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction errorSummary(response: unknown, fallback: string | null): string | null {\n if (!response || typeof response !== \"object\") return fallback;\n const error = (response as { error?: unknown }).error;\n if (!error || typeof error !== \"object\") return fallback;\n const message = (error as { message?: unknown }).message;\n return typeof message === \"string\" ? message : fallback;\n}\n\nasync function allocatePort(host: string): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createNetServer();\n server.on(\"error\", reject);\n server.listen(0, host, () => {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close(() => reject(new Error(\"Could not allocate an internal port\")));\n return;\n }\n const port = address.port;\n server.close(() => resolve(port));\n });\n });\n}\n\nexport class ManagedModelServer {\n private readonly spawnModelServer: SpawnModelServer;\n private readonly idleTimeoutMs: number;\n private readonly restartAfterRequests: number;\n private readonly logRecordOverride?: (record: ManagedServeLogRecord) => void;\n private server: Server | null = null;\n private child: ChildProcess | null = null;\n private internalPort: number | null = null;\n private queue: Promise<void> = Promise.resolve();\n private idleTimer: NodeJS.Timeout | null = null;\n private activeRequests = 0;\n private queuedRequests = 0;\n private requestsSinceStart = 0;\n private restartCount = 0;\n private stoppingChild = false;\n\n constructor(private readonly options: ManagedServeOptions) {\n this.spawnModelServer = options.spawnModelServer ?? spawn;\n this.idleTimeoutMs = parsePositiveInteger(options.idleTimeoutSeconds, 300) * 1000;\n this.restartAfterRequests = parsePositiveInteger(options.restartAfterRequests, 100);\n this.logRecordOverride = options.logRecord;\n }\n\n get isModelRunning(): boolean {\n return this.child != null;\n }\n\n get restarts(): number {\n return this.restartCount;\n }\n\n async start(): Promise<void> {\n if (this.server) return;\n this.internalPort = await allocatePort(\"127.0.0.1\");\n this.server = createServer((req, res) => {\n this.handle(req, res).catch((err) => {\n sendJson(res, 500, { error: { message: err instanceof Error ? err.message : String(err) } });\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n this.server?.once(\"error\", reject);\n this.server?.listen(this.options.publicPort, this.options.publicHost, () => {\n this.server?.off(\"error\", reject);\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n this.clearIdleTimer();\n await this.stopChild();\n if (!this.server) return;\n const server = this.server;\n this.server = null;\n await new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n });\n }\n\n async run(): Promise<void> {\n await this.start();\n await new Promise<void>((resolve, reject) => {\n this.server?.once(\"error\", reject);\n this.server?.once(\"close\", resolve);\n });\n }\n\n private async handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const route = new URL(req.url || \"/\", \"http://localhost\").pathname;\n if (req.method === \"OPTIONS\") {\n sendJson(res, 204, {});\n return;\n }\n\n if (req.method === \"GET\" && route === \"/health\") {\n await this.handleHealth(res);\n return;\n }\n\n if (req.method === \"POST\" && COMPLETION_ROUTES.has(route)) {\n const receivedAt = Date.now();\n const body = await readRequestBody(req);\n this.queuedRequests += 1;\n const work = this.queue.then(() => this.processGeneration(route, body, res, receivedAt));\n this.queue = work.catch(() => undefined);\n try {\n await work;\n } finally {\n this.queuedRequests -= 1;\n this.scheduleIdleStop();\n }\n return;\n }\n\n sendJson(res, 404, { error: { message: \"Not found\" } });\n }\n\n private async handleHealth(res: ServerResponse): Promise<void> {\n if (!this.child) {\n sendJson(res, 200, {\n status: \"ok\",\n wrapper: \"ok\",\n model_status: \"cold\",\n restart_count: this.restartCount,\n });\n return;\n }\n\n if (this.activeRequests > 0 || this.queuedRequests > 0) {\n sendJson(res, 200, {\n status: \"ok\",\n wrapper: \"ok\",\n model_status: \"busy\",\n restart_count: this.restartCount,\n });\n return;\n }\n\n const health = await this.checkHealth();\n if (health.ok) {\n sendJson(res, 200, {\n status: \"ok\",\n wrapper: \"ok\",\n model_status: \"warm\",\n restart_count: this.restartCount,\n model: health.body,\n });\n return;\n }\n\n await this.restartChild();\n sendJson(res, 200, {\n status: \"ok\",\n wrapper: \"ok\",\n model_status: \"restarted\",\n restart_count: this.restartCount,\n });\n }\n\n private async processGeneration(\n route: string,\n body: Buffer,\n res: ServerResponse,\n receivedAt: number,\n ): Promise<void> {\n const requestId = `ttreq-${randomUUID()}`;\n const startedAt = Date.now();\n const queuedMs = startedAt - receivedAt;\n this.activeRequests += 1;\n this.clearIdleTimer();\n\n let status = 500;\n let parsed: unknown = null;\n let failure: string | null = null;\n\n try {\n await this.ensureModelReady();\n const forwarded = await this.forwardGeneration(route, body);\n status = forwarded.status;\n parsed = forwarded.parsed;\n res.writeHead(status, {\n ...copyResponseHeaders(forwarded.headers),\n \"content-length\": String(Buffer.byteLength(forwarded.body)),\n });\n res.end(forwarded.body);\n this.requestsSinceStart += 1;\n failure = errorSummary(parsed, null);\n } catch (err) {\n failure = err instanceof Error ? err.message : String(err);\n status = 502;\n sendJson(res, status, { error: { message: failure } });\n } finally {\n const finishedAt = Date.now();\n this.activeRequests -= 1;\n this.writeLog({\n timestamp: new Date(finishedAt).toISOString(),\n request_id: requestId,\n route,\n model_target: {\n name: this.options.modelName,\n path: this.options.modelPath,\n },\n request_bytes: body.byteLength,\n response_status: status,\n latency_ms: finishedAt - receivedAt,\n queued_ms: queuedMs,\n prompt_tokens: usageNumber(parsed, \"prompt_tokens\"),\n completion_tokens: usageNumber(parsed, \"completion_tokens\"),\n total_tokens: usageNumber(parsed, \"total_tokens\"),\n schema_validity: status < 400 ? true : status === 422 ? false : null,\n gate_field: this.options.gateField,\n gate_result: this.extractGateResult(parsed),\n restart_count: this.restartCount,\n error_summary: failure,\n });\n }\n }\n\n private async ensureModelReady(): Promise<void> {\n if (this.child && this.restartAfterRequests > 0 && this.requestsSinceStart >= this.restartAfterRequests) {\n await this.restartChild();\n return;\n }\n\n if (this.child) {\n const health = await this.checkHealth();\n if (health.ok) return;\n await this.restartChild();\n return;\n }\n\n await this.startChild();\n }\n\n private async startChild(): Promise<void> {\n if (this.internalPort == null) {\n this.internalPort = await allocatePort(\"127.0.0.1\");\n }\n\n const env = {\n ...process.env,\n ...this.options.env,\n TT_HOST: \"127.0.0.1\",\n TT_PORT: String(this.internalPort),\n };\n this.child = this.spawnModelServer(this.options.python, this.options.args, {\n stdio: \"inherit\",\n env,\n });\n this.child.once(\"exit\", () => {\n if (!this.stoppingChild) {\n this.child = null;\n this.requestsSinceStart = 0;\n }\n });\n try {\n await this.waitForHealth();\n this.scheduleIdleStop();\n } catch (err) {\n await this.stopChild();\n throw err;\n }\n }\n\n private async restartChild(): Promise<void> {\n await this.stopChild();\n this.restartCount += 1;\n this.requestsSinceStart = 0;\n await this.startChild();\n }\n\n private async stopChild(): Promise<void> {\n if (!this.child) return;\n const child = this.child;\n this.child = null;\n this.requestsSinceStart = 0;\n this.stoppingChild = true;\n try {\n child.kill(\"SIGTERM\");\n await Promise.race([\n new Promise<void>((resolve) => child.once(\"exit\", () => resolve())),\n sleep(5000).then(() => {\n if (child.exitCode == null && child.signalCode == null) child.kill(\"SIGKILL\");\n }),\n ]);\n } finally {\n this.stoppingChild = false;\n }\n }\n\n private async checkHealth(): Promise<{ ok: boolean; body: unknown }> {\n if (this.internalPort == null) return { ok: false, body: null };\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n try {\n const response = await fetch(`http://127.0.0.1:${this.internalPort}/health`, {\n signal: controller.signal,\n });\n const text = await response.text();\n return { ok: response.ok, body: tryJsonParse(text) };\n } catch {\n return { ok: false, body: null };\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async waitForHealth(): Promise<void> {\n const deadline = Date.now() + 120_000;\n while (Date.now() < deadline) {\n const health = await this.checkHealth();\n if (health.ok) return;\n if (!this.child) break;\n await sleep(50);\n }\n throw new Error(\"Model server did not become healthy within 120 seconds\");\n }\n\n private async forwardGeneration(route: string, body: Buffer): Promise<ForwardResult> {\n if (this.internalPort == null) throw new Error(\"Internal server port is not allocated\");\n const response = await fetch(`http://127.0.0.1:${this.internalPort}${route}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body,\n });\n const text = await response.text();\n return {\n status: response.status,\n headers: response.headers,\n body: text,\n parsed: tryJsonParse(text),\n };\n }\n\n private extractGateResult(response: unknown): unknown {\n const content = extractAssistantContent(response);\n if (!content) return null;\n const parsedContent = tryJsonParse(content);\n return readPath(parsedContent, this.options.gateField);\n }\n\n private scheduleIdleStop() {\n this.clearIdleTimer();\n if (!this.child || this.activeRequests > 0 || this.queuedRequests > 0) return;\n this.idleTimer = setTimeout(() => {\n this.stopChild().catch((err) => {\n this.writeDiagnosticError(err);\n });\n }, this.idleTimeoutMs);\n }\n\n private clearIdleTimer() {\n if (!this.idleTimer) return;\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n\n private writeLog(record: ManagedServeLogRecord) {\n if (this.logRecordOverride) {\n this.logRecordOverride(record);\n return;\n }\n const line = `${JSON.stringify(record)}\\n`;\n if (this.options.logFile) {\n mkdirSync(dirname(this.options.logFile), { recursive: true });\n appendFileSync(this.options.logFile, line, \"utf8\");\n return;\n }\n process.stderr.write(line);\n }\n\n private writeDiagnosticError(err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`${JSON.stringify({ timestamp: new Date().toISOString(), error: message })}\\n`);\n }\n}\n\nexport async function startManagedModelServer(options: ManagedServeOptions): Promise<void> {\n const server = new ManagedModelServer(options);\n const stop = () => {\n server.stop().catch(() => undefined);\n };\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n try {\n await server.run();\n } finally {\n process.off(\"SIGINT\", stop);\n process.off(\"SIGTERM\", stop);\n await server.stop();\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { get, type ClientOpts } from \"../client.js\";\nimport {\n printDetail,\n printJson,\n printTable,\n isJsonMode,\n formatDate,\n formatStatus,\n shortId,\n} from \"../output.js\";\n\ninterface BalanceResponse {\n balance_cents: number;\n reserved_cents: number;\n available_cents: number;\n lifetime_topup_cents: number;\n}\n\ntype CreditKind =\n | \"signup_bonus\"\n | \"topup\"\n | \"debit_run\"\n | \"debit_autotune\"\n | \"refund\"\n | \"adjustment\";\n\ninterface LedgerRow {\n id: string;\n kind: CreditKind;\n amount_cents: number;\n balance_after_cents: number;\n reference_id: string | null;\n created_at: string;\n}\n\nconst KIND_LABELS: Record<CreditKind, string> = {\n signup_bonus: \"Signup bonus\",\n topup: \"Top-up\",\n debit_run: \"Run\",\n debit_autotune: \"Auto-tune\",\n refund: \"Refund\",\n adjustment: \"Adjustment\",\n};\n\nfunction formatCents(cents: number): string {\n const sign = cents < 0 ? \"-\" : \"\";\n const abs = Math.abs(cents);\n return `${sign}$${(abs / 100).toFixed(2)}`;\n}\n\nfunction formatSigned(cents: number): string {\n if (cents > 0) return chalk.green(`+${formatCents(cents)}`);\n if (cents < 0) return chalk.red(formatCents(cents));\n return formatCents(cents);\n}\n\nexport function registerBalanceCommands(parent: Command) {\n parent\n .command(\"balance\")\n .description(\"Show credit balance and recent transactions\")\n .option(\"-n, --limit <n>\", \"Number of transactions to show (default 10)\", \"10\")\n .action(async (options) => {\n const opts = parent.opts() as ClientOpts;\n const limit = Number(options.limit) || 10;\n\n const [{ data: balance }, { data: transactions }] = await Promise.all([\n get<BalanceResponse>(\"/billing/balance\", undefined, opts),\n get<LedgerRow[]>(\"/billing/transactions\", { per_page: limit }, opts),\n ]);\n\n if (isJsonMode()) {\n return printJson({ balance, transactions });\n }\n\n const lowBalance = balance.balance_cents < 100;\n const balanceLine = lowBalance\n ? chalk.red(formatCents(balance.balance_cents)) + chalk.dim(\" (low)\")\n : chalk.bold.green(formatCents(balance.balance_cents));\n\n printDetail([\n [\"Credits\", balanceLine],\n [\"Lifetime top-ups\", formatCents(balance.lifetime_topup_cents)],\n ]);\n\n if (transactions && transactions.length > 0) {\n console.log(`\\n${chalk.bold(\"Recent transactions\")}`);\n printTable(\n [\"Date\", \"Type\", \"Amount\", \"Balance\", \"Reference\"],\n transactions.map((row) => [\n formatDate(row.created_at),\n KIND_LABELS[row.kind] ?? row.kind,\n formatSigned(row.amount_cents),\n formatCents(row.balance_after_cents),\n row.reference_id ? shortId(row.reference_id) : chalk.dim(\"—\"),\n ])\n );\n } else {\n console.log(\n `\\n${chalk.dim(\"No transactions yet — run `tt topup` to add credits.\")}`\n );\n }\n\n if (lowBalance) {\n console.log(\n `\\n${formatStatus(\"preparing\")} ${chalk.yellow(\n \"Run `tt topup` to add more credits before starting a run.\"\n )}`\n );\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport open from \"open\";\nimport { post, type ClientOpts } from \"../client.js\";\nimport { printJson, isJsonMode, printSuccess } from \"../output.js\";\n\ninterface TopupResponse {\n checkout_url: string;\n session_id: string;\n}\n\nconst PRESETS_USD = [10, 25, 50, 100];\nconst MIN_USD = 5;\nconst MAX_USD = 10000;\n\nfunction parseAmount(input: string | undefined): number | null {\n if (!input) return null;\n const cleaned = input.replace(/^\\$/, \"\").trim();\n const num = Number(cleaned);\n if (!Number.isFinite(num) || num <= 0) return null;\n return num;\n}\n\nasync function readLine(prompt: string): Promise<string> {\n const readline = await import(\"node:readline/promises\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n return (await rl.question(prompt)).trim();\n } finally {\n rl.close();\n }\n}\n\nexport function registerTopupCommands(parent: Command) {\n parent\n .command(\"topup\")\n .description(\"Add prepaid credits via Stripe Checkout\")\n .option(\"-a, --amount <usd>\", \"Amount in USD (e.g. 25)\")\n .option(\"--no-open\", \"Print checkout URL instead of opening the browser\")\n .action(async (options) => {\n const opts = parent.opts() as ClientOpts;\n\n let amountUsd: number | null;\n\n if (options.amount !== undefined) {\n amountUsd = parseAmount(options.amount);\n if (amountUsd === null) {\n throw new Error(\"Invalid amount\");\n }\n } else {\n if (isJsonMode()) {\n throw new Error(\n \"amount is required in --json mode (use --amount <usd>)\"\n );\n }\n console.log(chalk.bold(\"Add credits via Stripe Checkout\"));\n console.log(\n chalk.dim(\n `Quick picks: ${PRESETS_USD.map((n) => `$${n}`).join(\", \")}`\n )\n );\n const input = await readLine(`Amount in USD (min $${MIN_USD}): `);\n amountUsd = parseAmount(input);\n if (amountUsd === null) {\n throw new Error(\"Invalid amount\");\n }\n }\n\n if (amountUsd < MIN_USD) {\n throw new Error(`Minimum top-up is $${MIN_USD}`);\n }\n if (amountUsd > MAX_USD) {\n throw new Error(`Maximum top-up is $${MAX_USD}`);\n }\n\n const amountCents = Math.round(amountUsd * 100);\n\n const { data } = await post<TopupResponse>(\n \"/billing/topup\",\n { amount_cents: amountCents },\n opts\n );\n\n if (isJsonMode()) {\n return printJson(data);\n }\n\n const url = data.checkout_url;\n console.log(\n `${chalk.bold(\"Checkout URL:\")} ${chalk.cyan(url)}\\n` +\n chalk.dim(\"Complete the payment to credit your account.\")\n );\n\n if (options.open !== false) {\n try {\n await open(url);\n printSuccess(\"Opened Stripe Checkout in your browser.\");\n } catch {\n console.log(\n chalk.yellow(\n \"Could not open browser automatically — copy the URL above.\"\n )\n );\n }\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n printJson,\n isJsonMode,\n} from \"../output.js\";\nimport { loadSpec, DEFAULT_SPEC_FILE } from \"./init.js\";\nimport { validateSpec } from \"../eval/rules.js\";\nimport type { ValidationCheck } from \"../eval/types.js\";\n\nexport function registerEvalCommand(parent: Command) {\n parent\n .command(\"eval\")\n .description(\"Validate a local behaviour spec\")\n .option(\"-m, --model <model>\", \"Deprecated; ignored because tt eval only validates the local spec\")\n .option(\"-f, --file <path>\", \"Spec file path\", DEFAULT_SPEC_FILE)\n .action(async (cmdOpts) => {\n const spec = loadSpec(cmdOpts.file);\n const validation = validateSpec(spec);\n\n if (!isJsonMode()) {\n console.log(chalk.dim(`\\nSpec: ${cmdOpts.file}\\n`));\n }\n\n if (isJsonMode()) {\n printJson(validation);\n } else {\n printValidation(validation.checks);\n }\n\n if (!validation.valid) {\n process.exitCode = 1;\n }\n });\n}\n\nfunction printValidation(checks: ValidationCheck[]) {\n console.log(chalk.bold(\"Spec Validation\"));\n for (const check of checks) {\n const icon = check.passed ? chalk.green(\"✓\") : chalk.red(\"✗\");\n const msg = check.message\n ? chalk.dim(` — ${check.message}`)\n : \"\";\n console.log(` ${icon} ${check.name}${msg}`);\n }\n}\n","import type {\n AssertionResult,\n LocalSpec,\n ValidationCheck,\n ValidationResult,\n} from \"./types.js\";\n\nexport function validateSpec(spec: LocalSpec): ValidationResult {\n const checks: ValidationCheck[] = [];\n\n checks.push({\n name: \"Has name\",\n passed: Boolean(spec.name?.trim()),\n message: spec.name?.trim() ? undefined : \"Spec is missing a name\",\n });\n\n checks.push({\n name: \"Has system prompt\",\n passed: Boolean(spec.system_prompt?.trim()),\n message: spec.system_prompt?.trim()\n ? undefined\n : \"Spec is missing a system_prompt\",\n });\n\n checks.push({\n name: \"Has base model\",\n passed: Boolean(spec.base_model?.trim()),\n message: spec.base_model?.trim()\n ? undefined\n : \"Spec is missing a base_model\",\n });\n\n const exCount = spec.examples?.length ?? 0;\n checks.push({\n name: \"Has examples\",\n passed: exCount > 0,\n message: exCount > 0 ? `${exCount} example(s)` : \"Add at least one example\",\n });\n\n checks.push({\n name: \"Has guidelines\",\n passed: (spec.guidelines?.length ?? 0) > 0,\n message:\n (spec.guidelines?.length ?? 0) > 0\n ? undefined\n : \"Consider adding guidelines for better eval coverage\",\n });\n\n if (spec.constraints?.length && spec.examples?.length) {\n const violations = checkExamplesAgainstConstraints(spec);\n checks.push({\n name: \"Examples satisfy constraints\",\n passed: violations.length === 0,\n message:\n violations.length === 0\n ? undefined\n : violations.join(\"; \"),\n });\n }\n\n return {\n valid: checks.every((c) => c.passed),\n checks,\n };\n}\n\nfunction checkExamplesAgainstConstraints(spec: LocalSpec): string[] {\n const violations: string[] = [];\n for (const [i, ex] of spec.examples.entries()) {\n for (const constraint of spec.constraints) {\n const result = evaluateConstraint(ex.output, constraint);\n if (!result.passed) {\n violations.push(`Example ${i + 1} violates \"${constraint}\": ${result.message}`);\n }\n }\n }\n return violations;\n}\n\nfunction evaluateConstraint(\n text: string,\n constraint: string,\n): { passed: boolean; message?: string } {\n const lower = constraint.toLowerCase();\n\n const neverMatch = lower.match(/^never (?:share|mention|include|reveal|use|say|output|return|give|provide|show|disclose|expose)\\s+(.+)/);\n if (neverMatch) {\n const forbidden = neverMatch[1].replace(/['\"]/g, \"\").trim();\n if (text.toLowerCase().includes(forbidden.toLowerCase())) {\n return { passed: false, message: `Output contains \"${forbidden}\"` };\n }\n return { passed: true };\n }\n\n const alwaysMatch = lower.match(/^always (?:include|use|start with|end with|contain|respond in|reply in)\\s+(.+)/);\n if (alwaysMatch) {\n const required = alwaysMatch[1].replace(/['\"]/g, \"\").trim();\n if (!text.toLowerCase().includes(required.toLowerCase())) {\n return { passed: false, message: `Output missing \"${required}\"` };\n }\n return { passed: true };\n }\n\n return {\n passed: true,\n message: `Constraint not enforceable by rules: \"${constraint}\" (will be checked by LLM judge if a provider is configured)`,\n };\n}\n\nexport function runAssertions(\n text: string,\n assertions: string[],\n): AssertionResult[] {\n return assertions.map((assertion) => runSingleAssertion(text, assertion));\n}\n\nfunction runSingleAssertion(text: string, assertion: string): AssertionResult {\n const [type, ...rest] = assertion.split(\":\");\n const value = rest.join(\":\");\n\n switch (type) {\n case \"contains\":\n return {\n assertion,\n passed: text.includes(value),\n message: text.includes(value)\n ? undefined\n : `Expected output to contain \"${value}\"`,\n };\n\n case \"not-contains\":\n return {\n assertion,\n passed: !text.includes(value),\n message: !text.includes(value)\n ? undefined\n : `Expected output to not contain \"${value}\"`,\n };\n\n case \"matches\": {\n const re = new RegExp(value);\n const match = re.test(text);\n return {\n assertion,\n passed: match,\n message: match ? undefined : `Output did not match pattern /${value}/`,\n };\n }\n\n case \"max-length\": {\n const max = Number(value);\n return {\n assertion,\n passed: text.length <= max,\n message:\n text.length <= max\n ? undefined\n : `Output length ${text.length} exceeds max ${max}`,\n };\n }\n\n case \"min-length\": {\n const min = Number(value);\n return {\n assertion,\n passed: text.length >= min,\n message:\n text.length >= min\n ? undefined\n : `Output length ${text.length} below min ${min}`,\n };\n }\n\n case \"is-json\": {\n let valid = false;\n try {\n JSON.parse(text);\n valid = true;\n } catch {}\n return {\n assertion,\n passed: valid,\n message: valid ? undefined : \"Output is not valid JSON\",\n };\n }\n\n default:\n return {\n assertion,\n passed: true,\n message: `Unknown assertion type: ${type} (skipped)`,\n };\n }\n}\n\nexport function checkConstraints(\n text: string,\n constraints: string[],\n): AssertionResult[] {\n return constraints.map((constraint) => {\n const result = evaluateConstraint(text, constraint);\n return {\n assertion: `constraint: ${constraint}`,\n passed: result.passed,\n message: result.message,\n };\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { post, put, type ClientOpts } from \"../client.js\";\nimport { printSuccess, printJson, isJsonMode, shortId } from \"../output.js\";\nimport { loadSpec, DEFAULT_SPEC_FILE } from \"./init.js\";\nimport { canonicalizeSpecBaseModel } from \"../base-models.js\";\n\ninterface RemoteSpec {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport function registerPushCommand(parent: Command) {\n parent\n .command(\"push\")\n .description(\"Push local spec to the Tuned Tensor API\")\n .option(\"-f, --file <path>\", \"Spec file path\", DEFAULT_SPEC_FILE)\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const filePath = resolve(cmdOpts.file);\n const spec = loadSpec(cmdOpts.file);\n\n const { id, eval_cases, ...rawBody } = spec as unknown as Record<string, unknown>;\n const body = canonicalizeSpecBaseModel(rawBody);\n\n let data: RemoteSpec;\n\n if (id) {\n const res = await put<RemoteSpec>(`/behavior-specs/${id}`, body, opts);\n data = res.data;\n } else {\n const res = await post<RemoteSpec>(\"/behavior-specs\", body, opts);\n data = res.data;\n\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\"));\n raw.id = data.id;\n writeFileSync(filePath, JSON.stringify(raw, null, 2) + \"\\n\");\n }\n\n if (isJsonMode()) return printJson(data);\n printSuccess(\n `Spec ${id ? \"updated\" : \"created\"}: ${data.name} (${shortId(data.id)})`,\n );\n });\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["readFileSync","chalk","readFileSync","readFileSync","existsSync","readFileSync","statSync","readFileSync","existsSync","statSync","spawn","existsSync","mkdirSync","statSync","readFileSync","writeFileSync","homedir","dirname","join","resolve","basename","existsSync","readFileSync","writeFileSync","existsSync","writeFileSync","readFileSync","mkdirSync","resolve","existsSync","statSync","join","formatBytes","mkdirSync","dirname","homedir","resolve","basename","readFileSync","writeFileSync","extractDir","spawn","chalk","chalk","chalk","chalk","chalk","chalk","readFileSync","writeFileSync","resolve","resolve","readFileSync","writeFileSync"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/output.ts","../src/client.ts","../src/config.ts","../src/commands/auth.ts","../src/commands/specs.ts","../src/resolve.ts","../src/base-models.ts","../src/commands/runs.ts","../src/commands/datasets.ts","../src/commands/models.ts","../src/commands/init.ts","../src/serve-manager.ts","../src/commands/balance.ts","../src/commands/topup.ts","../src/commands/eval.ts","../src/eval/rules.ts","../src/commands/push.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { setJsonMode, reportError } from \"./output.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerSpecsCommands } from \"./commands/specs.js\";\nimport { registerRunsCommands } from \"./commands/runs.js\";\nimport { registerDatasetsCommands } from \"./commands/datasets.js\";\nimport { registerModelsCommands } from \"./commands/models.js\";\n\nimport { registerBalanceCommands } from \"./commands/balance.js\";\nimport { registerTopupCommands } from \"./commands/topup.js\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerEvalCommand } from \"./commands/eval.js\";\nimport { registerPushCommand } from \"./commands/push.js\";\n\ndeclare const __TT_VERSION__: string;\n\nconst program = new Command();\n\nprogram\n .name(\"tt\")\n .description(\"Tuned Tensor CLI — fine-tune and evaluate LLMs\")\n .version(__TT_VERSION__)\n .option(\"-k, --api-key <key>\", \"API key (overrides stored key)\")\n .option(\n \"-u, --base-url <url>\",\n \"API base URL (default: https://tunedtensor.com)\",\n )\n .option(\"--json\", \"Output raw JSON\")\n .option(\"--no-color\", \"Disable colors\")\n .hook(\"preAction\", (_thisCommand, actionCommand) => {\n const rootOpts = program.opts();\n if (rootOpts.json) setJsonMode(true);\n if (rootOpts.color === false) {\n process.env.FORCE_COLOR = \"0\";\n }\n });\n\nregisterAuthCommands(program);\nregisterSpecsCommands(program);\nregisterRunsCommands(program);\nregisterDatasetsCommands(program);\nregisterModelsCommands(program);\n\nregisterBalanceCommands(program);\nregisterTopupCommands(program);\nregisterInitCommand(program);\nregisterEvalCommand(program);\nregisterPushCommand(program);\n\n// Honor --json even when parsing fails before the preAction hook runs\n// (e.g. on unknown commands). Cheap argv sniff is fine here.\nif (process.argv.includes(\"--json\")) setJsonMode(true);\n\nprogram.parseAsync().catch((err) => {\n reportError(err);\n process.exit(1);\n});\n","import chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport { ApiError } from \"./client.js\";\n\nlet jsonMode = false;\n\nexport function setJsonMode(enabled: boolean) {\n jsonMode = enabled;\n}\n\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function printJson(data: unknown) {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printTable(\n headers: string[],\n rows: string[][],\n meta?: { page: number; per_page: number; total: number },\n) {\n const table = new Table({\n head: headers.map((h) => chalk.bold.cyan(h)),\n style: { head: [], border: [] },\n });\n for (const row of rows) {\n table.push(row);\n }\n console.log(table.toString());\n\n if (meta) {\n const totalPages = Math.ceil(meta.total / meta.per_page);\n console.log(\n chalk.dim(\n `\\nPage ${meta.page}/${totalPages} (${meta.total} total)`,\n ),\n );\n }\n}\n\nexport function printDetail(fields: [string, string | undefined][]) {\n const maxLabel = Math.max(...fields.map(([l]) => l.length));\n for (const [label, value] of fields) {\n const paddedLabel = label.padEnd(maxLabel);\n console.log(`${chalk.bold.cyan(paddedLabel)} ${value ?? chalk.dim(\"—\")}`);\n }\n}\n\nexport function printSuccess(message: string) {\n console.log(chalk.green(\"✓\") + \" \" + message);\n}\n\nexport function printWarning(message: string) {\n console.log(chalk.yellow(\"!\") + \" \" + message);\n}\n\nexport function printError(message: string) {\n console.error(chalk.red(\"✗\") + \" \" + message);\n}\n\nexport function reportError(err: unknown): void {\n const isApi = err instanceof ApiError;\n const message = (err as Error)?.message || String(err);\n\n if (jsonMode) {\n printJson({\n error: {\n status: isApi ? err.status : null,\n code: isApi ? err.code : \"CLI_ERROR\",\n message,\n },\n });\n } else if (isApi) {\n printError(`[${err.status}] ${message}`);\n } else {\n printError(message);\n }\n}\n\nexport function formatDate(iso?: string | null): string {\n if (!iso) return \"—\";\n return new Date(iso).toLocaleString();\n}\n\nexport function formatStatus(status: string): string {\n const map: Record<string, (s: string) => string> = {\n completed: chalk.green,\n running: chalk.blue,\n training: chalk.blue,\n evaluating: chalk.blue,\n preparing: chalk.yellow,\n pending: chalk.yellow,\n uploading: chalk.yellow,\n failed: chalk.red,\n cancelled: chalk.dim,\n validated: chalk.green,\n invalid: chalk.red,\n };\n const colorFn = map[status] || chalk.white;\n return colorFn(status);\n}\n\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + \"…\";\n}\n\nexport function shortId(id: string): string {\n return id.slice(0, 8);\n}\n","import { readFileSync, statSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { getApiKey, getBaseUrl } from \"./config.js\";\n\nexport interface ApiResponse<T> {\n data: T;\n meta?: { page: number; per_page: number; total: number };\n}\n\nexport interface ApiErrorBody {\n error: { code: string; message: string };\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n public code: string,\n message: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport interface ClientOpts {\n apiKey?: string;\n baseUrl?: string;\n}\n\nfunction resolveKey(opts?: ClientOpts): string {\n const key = getApiKey(opts);\n if (!key) {\n throw new ApiError(\n 401,\n \"NO_API_KEY\",\n \"No API key found. Run `tt auth login` or set TUNED_TENSOR_API_KEY.\",\n );\n }\n return key;\n}\n\nfunction buildUrl(\n path: string,\n query?: Record<string, string | number | undefined>,\n opts?: ClientOpts,\n): string {\n const base = getBaseUrl(opts);\n const url = new URL(`/api/v1${path}`, base);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nasync function request<T>(\n method: string,\n path: string,\n options: {\n query?: Record<string, string | number | undefined>;\n body?: unknown;\n opts?: ClientOpts;\n } = {},\n): Promise<ApiResponse<T>> {\n const key = resolveKey(options.opts);\n const url = buildUrl(path, options.query, options.opts);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${key}`,\n };\n\n let bodyPayload: string | undefined;\n if (options.body) {\n headers[\"Content-Type\"] = \"application/json\";\n bodyPayload = JSON.stringify(options.body);\n }\n\n const res = await fetch(url, { method, headers, body: bodyPayload });\n\n if (!res.ok) {\n let errBody: ApiErrorBody;\n try {\n errBody = (await res.json()) as ApiErrorBody;\n } catch {\n throw new ApiError(res.status, \"UNKNOWN\", res.statusText);\n }\n throw new ApiError(\n res.status,\n errBody.error?.code || \"UNKNOWN\",\n errBody.error?.message || res.statusText,\n );\n }\n\n if (res.status === 204) return { data: null as T };\n return (await res.json()) as ApiResponse<T>;\n}\n\nexport function get<T>(\n path: string,\n query?: Record<string, string | number | undefined>,\n opts?: ClientOpts,\n) {\n return request<T>(\"GET\", path, { query, opts });\n}\n\nexport function post<T>(\n path: string,\n body?: unknown,\n opts?: ClientOpts,\n) {\n return request<T>(\"POST\", path, { body, opts });\n}\n\nexport function put<T>(\n path: string,\n body?: unknown,\n opts?: ClientOpts,\n) {\n return request<T>(\"PUT\", path, { body, opts });\n}\n\nexport function patch<T>(\n path: string,\n body?: unknown,\n opts?: ClientOpts,\n) {\n return request<T>(\"PATCH\", path, { body, opts });\n}\n\nexport function del<T>(path: string, opts?: ClientOpts) {\n return request<T>(\"DELETE\", path, { opts });\n}\n\nexport async function upload<T>(\n path: string,\n filePath: string,\n fields: Record<string, string>,\n opts?: ClientOpts,\n): Promise<ApiResponse<T>> {\n const key = resolveKey(opts);\n const url = buildUrl(path, undefined, opts);\n\n const form = new FormData();\n for (const [k, v] of Object.entries(fields)) {\n form.append(k, v);\n }\n\n const fileBytes = readFileSync(filePath);\n const fileSize = statSync(filePath).size;\n const blob = new Blob([fileBytes], { type: \"application/jsonl\" });\n form.append(\"file\", blob, basename(filePath));\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}` },\n body: form,\n });\n\n if (!res.ok) {\n let errBody: ApiErrorBody;\n try {\n errBody = (await res.json()) as ApiErrorBody;\n } catch {\n throw new ApiError(res.status, \"UNKNOWN\", res.statusText);\n }\n throw new ApiError(\n res.status,\n errBody.error?.code || \"UNKNOWN\",\n errBody.error?.message || res.statusText,\n );\n }\n\n return (await res.json()) as ApiResponse<T>;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface Config {\n api_key?: string;\n base_url?: string;\n}\n\nconst CONFIG_DIR_NAME = \"tuned-tensor\";\nconst CONFIG_FILE_NAME = \"config.json\";\n\nfunction getConfigDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME;\n const base = xdg || join(homedir(), \".config\");\n return join(base, CONFIG_DIR_NAME);\n}\n\nfunction getConfigPath(): string {\n return join(getConfigDir(), CONFIG_FILE_NAME);\n}\n\nexport function readConfig(): Config {\n const path = getConfigPath();\n if (!existsSync(path)) return {};\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: Config): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(getConfigPath(), JSON.stringify(config, null, 2) + \"\\n\");\n}\n\nexport function updateConfig(partial: Partial<Config>): void {\n const current = readConfig();\n writeConfig({ ...current, ...partial });\n}\n\nexport function clearConfig(): void {\n const path = getConfigPath();\n if (existsSync(path)) writeFileSync(path, \"{}\\n\");\n}\n\nexport const DEFAULT_BASE_URL = \"https://tunedtensor.com\";\n\nexport function getBaseUrl(opts?: { baseUrl?: string }): string {\n return opts?.baseUrl || process.env.TUNED_TENSOR_URL || readConfig().base_url || DEFAULT_BASE_URL;\n}\n\nexport function getApiKey(opts?: { apiKey?: string }): string | undefined {\n return opts?.apiKey || process.env.TUNED_TENSOR_API_KEY || readConfig().api_key;\n}\n","import { Command } from \"commander\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin, stdout } from \"node:process\";\nimport {\n readConfig,\n updateConfig,\n clearConfig,\n getApiKey,\n getBaseUrl,\n DEFAULT_BASE_URL,\n} from \"../config.js\";\nimport {\n printSuccess,\n printDetail,\n printError,\n printWarning,\n isJsonMode,\n printJson,\n} from \"../output.js\";\nimport chalk from \"chalk\";\n\nexport function registerAuthCommands(parent: Command) {\n const auth = parent.command(\"auth\").description(\"Manage authentication\");\n\n auth\n .command(\"login\")\n .description(\"Store an API key for authentication\")\n .argument(\"[key]\", \"API key (tt_...). If omitted, you will be prompted.\")\n .action(async (key?: string) => {\n let apiKey = key;\n\n if (!apiKey) {\n const settingsUrl = `${DEFAULT_BASE_URL}/dashboard/settings`;\n console.log();\n console.log(\n ` To get your API key, go to ${chalk.bold(\"Settings → API Keys\")} in the Tuned Tensor dashboard:`,\n );\n console.log(` ${chalk.cyan.underline(settingsUrl)}`);\n console.log();\n\n const rl = createInterface({ input: stdin, output: stdout });\n apiKey = await rl.question(\"Enter your API key (tt_...): \");\n rl.close();\n }\n\n apiKey = apiKey.trim();\n\n if (!apiKey.startsWith(\"tt_\") || apiKey.length !== 51) {\n printError(\n \"Invalid API key format. Keys start with tt_ and are 51 characters long.\",\n );\n process.exit(1);\n }\n\n updateConfig({ api_key: apiKey });\n printSuccess(\n `API key stored (${apiKey.slice(0, 8)}...). You're ready to go.`,\n );\n });\n\n auth\n .command(\"logout\")\n .description(\"Remove stored credentials\")\n .action(() => {\n clearConfig();\n printSuccess(\"Credentials removed.\");\n });\n\n auth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(() => {\n const opts = parent.opts();\n const apiKey = getApiKey(opts);\n const baseUrl = getBaseUrl(opts);\n\n if (isJsonMode()) {\n printJson({\n authenticated: !!apiKey,\n key_prefix: apiKey ? apiKey.slice(0, 8) + \"...\" : null,\n base_url: baseUrl,\n });\n return;\n }\n\n if (apiKey) {\n printDetail([\n [\"Authenticated\", \"Yes\"],\n [\"API Key\", apiKey.slice(0, 8) + \"...\"],\n [\"Base URL\", baseUrl],\n ]);\n } else {\n printWarning(\n \"Not authenticated. Run `tt auth login` to store an API key.\",\n );\n printDetail([[\"Base URL\", baseUrl]]);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { get, post, put, del, type ClientOpts } from \"../client.js\";\nimport { resolveSpecId } from \"../resolve.js\";\nimport { canonicalizeBaseModel, canonicalizeSpecBaseModel } from \"../base-models.js\";\nimport {\n printTable,\n printDetail,\n printSuccess,\n printWarning,\n printJson,\n isJsonMode,\n formatDate,\n formatStatus,\n truncate,\n shortId,\n} from \"../output.js\";\n\nconst SPEC_BODY_KEYS = new Set([\n \"name\",\n \"description\",\n \"base_model\",\n \"system_prompt\",\n \"guidelines\",\n \"constraints\",\n \"examples\",\n]);\n\nconst RUN_INPUT_KEYS = [\"run_id\", \"behavior_spec_id\", \"spec_snapshot\", \"run_number\"];\n\nclass SpecBodyError extends Error {}\n\nfunction loadSpecBody(filePath: string, mode: \"create\" | \"update\"): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch (e) {\n throw new SpecBodyError(\n `Could not parse ${filePath}: ${(e as Error).message}`,\n );\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new SpecBodyError(\n `${filePath} must contain a JSON object at the top level.`,\n );\n }\n\n const body = parsed as Record<string, unknown>;\n\n const runInputHits = RUN_INPUT_KEYS.filter((k) => k in body);\n if (runInputHits.length >= 2 || \"spec_snapshot\" in body) {\n const hint = \"spec_snapshot\" in body\n ? `This file looks like a run-input payload (top-level keys: ${runInputHits.join(\", \")}). The actual spec is nested under \"spec_snapshot\". Try:\\n jq '.spec_snapshot' ${filePath} > spec.json\\n tt specs ${mode === \"create\" ? \"create\" : \"update <id>\"} --file spec.json`\n : `This file looks like a run-input payload (top-level keys: ${runInputHits.join(\", \")}), not a behaviour spec. To start a run on an existing spec, use: tt runs start <spec-id>`;\n throw new SpecBodyError(hint);\n }\n\n if (mode === \"create\" && typeof body.name !== \"string\") {\n throw new SpecBodyError(\n `${filePath} is missing required field \"name\" (string).`,\n );\n }\n\n const unknown = Object.keys(body).filter(\n (k) => !SPEC_BODY_KEYS.has(k) && k !== \"id\" && k !== \"eval_cases\",\n );\n if (unknown.length && !isJsonMode()) {\n printWarning(\n `Unknown spec field(s) in ${filePath}: ${unknown.join(\", \")}. They will be sent but may be rejected by the API.`,\n );\n }\n\n return canonicalizeSpecBaseModel(body);\n}\n\ninterface BehaviorSpec {\n id: string;\n name: string;\n description: string;\n system_prompt: string;\n guidelines: string[];\n examples: { input: string; output: string }[];\n constraints: string[];\n base_model: string;\n created_at: string;\n updated_at: string;\n _run_count?: number;\n _latest_run_status?: string;\n _latest_run_score?: number;\n _runs?: unknown[];\n}\n\nexport function registerSpecsCommands(parent: Command) {\n const specs = parent\n .command(\"specs\")\n .description(\"Manage behaviour specs\");\n\n specs\n .command(\"list\")\n .description(\"List behaviour specs\")\n .option(\"-p, --page <n>\", \"Page number\", \"1\")\n .option(\"--per-page <n>\", \"Results per page\", \"20\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const { data, meta } = await get<BehaviorSpec[]>(\n \"/behavior-specs\",\n { page: cmdOpts.page, per_page: cmdOpts.perPage },\n opts,\n );\n\n if (isJsonMode()) return printJson({ data, meta });\n\n printTable(\n [\"ID\", \"Name\", \"Model\", \"Examples\", \"Runs\", \"Status\", \"Updated\"],\n data.map((s) => [\n shortId(s.id),\n truncate(s.name, 30),\n s.base_model.split(\"/\").pop() || s.base_model,\n String(s.examples?.length ?? 0),\n String(s._run_count ?? 0),\n s._latest_run_status ? formatStatus(s._latest_run_status) : \"—\",\n formatDate(s.updated_at),\n ]),\n meta,\n );\n });\n\n specs\n .command(\"get\")\n .description(\"Show spec details\")\n .argument(\"<id>\", \"Spec ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveSpecId(id, opts);\n const { data } = await get<BehaviorSpec>(`/behavior-specs/${fullId}`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n\n printDetail([\n [\"ID\", data.id],\n [\"Name\", data.name],\n [\"Description\", data.description || undefined],\n [\"Base Model\", data.base_model],\n [\"System Prompt\", data.system_prompt ? truncate(data.system_prompt, 80) : undefined],\n [\"Guidelines\", data.guidelines?.length ? data.guidelines.join(\", \") : undefined],\n [\"Constraints\", data.constraints?.length ? data.constraints.join(\", \") : undefined],\n [\"Examples\", String(data.examples?.length ?? 0)],\n [\"Runs\", String(data._run_count ?? data._runs?.length ?? 0)],\n [\"Created\", formatDate(data.created_at)],\n [\"Updated\", formatDate(data.updated_at)],\n ]);\n\n if (data.examples?.length) {\n console.log(\"\\nExamples:\");\n for (const [i, ex] of data.examples.slice(0, 5).entries()) {\n console.log(` ${i + 1}. Input: ${truncate(ex.input, 60)}`);\n console.log(` Output: ${truncate(ex.output, 60)}`);\n }\n if (data.examples.length > 5) {\n console.log(` ... and ${data.examples.length - 5} more`);\n }\n }\n });\n\n specs\n .command(\"create\")\n .description(\"Create a behaviour spec\")\n .option(\"-f, --file <path>\", \"JSON file with spec definition\")\n .option(\"-n, --name <name>\", \"Spec name\")\n .option(\"--model <model>\", \"Base model ID\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n let body: Record<string, unknown>;\n\n if (cmdOpts.file) {\n body = loadSpecBody(cmdOpts.file, \"create\");\n } else if (cmdOpts.name) {\n body = { name: cmdOpts.name };\n if (cmdOpts.model) body.base_model = canonicalizeBaseModel(cmdOpts.model);\n } else {\n throw new SpecBodyError(\"Provide --file or --name\");\n }\n\n const { data } = await post<BehaviorSpec>(\"/behavior-specs\", body, opts);\n\n if (isJsonMode()) return printJson(data);\n printSuccess(`Spec created: ${data.name} (${shortId(data.id)})`);\n });\n\n specs\n .command(\"update\")\n .description(\"Update a behaviour spec\")\n .argument(\"<id>\", \"Spec ID (full UUID or 8+ char prefix)\")\n .option(\"-f, --file <path>\", \"JSON file with fields to update\")\n .option(\"-n, --name <name>\", \"New name\")\n .option(\"--model <model>\", \"New base model ID\")\n .action(async (id: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n let body: Record<string, unknown>;\n\n if (cmdOpts.file) {\n body = loadSpecBody(cmdOpts.file, \"update\");\n } else {\n body = {};\n if (cmdOpts.name) body.name = cmdOpts.name;\n if (cmdOpts.model) body.base_model = canonicalizeBaseModel(cmdOpts.model);\n }\n\n const fullId = await resolveSpecId(id, opts);\n const { data } = await put<BehaviorSpec>(\n `/behavior-specs/${fullId}`,\n body,\n opts,\n );\n\n if (isJsonMode()) return printJson(data);\n printSuccess(`Spec updated: ${data.name} (${shortId(data.id)})`);\n });\n\n specs\n .command(\"delete\")\n .description(\"Delete a behaviour spec\")\n .argument(\"<id>\", \"Spec ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveSpecId(id, opts);\n await del(`/behavior-specs/${fullId}`, opts);\n\n if (isJsonMode()) return printJson({ id: fullId, deleted: true });\n printSuccess(`Spec deleted: ${shortId(fullId)}`);\n });\n}\n","import { get, type ClientOpts } from \"./client.js\";\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst RESOLVE_PAGE_SIZE = 100;\nconst MIN_PREFIX_LEN = 4;\n\ninterface Identifiable {\n id: string;\n name?: string;\n run_number?: number;\n}\n\ninterface Listed<T> {\n data: T[];\n meta?: { page: number; per_page: number; total: number };\n}\n\nexport class ResolveError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ResolveError\";\n }\n}\n\nexport function isFullUuid(value: string): boolean {\n return UUID_RE.test(value);\n}\n\nasync function resolvePrefix<T extends Identifiable>(\n prefix: string,\n kind: \"spec\" | \"run\" | \"dataset\" | \"model\",\n listPath: string,\n describe: (item: T) => string,\n opts?: ClientOpts,\n): Promise<string> {\n if (isFullUuid(prefix)) return prefix;\n\n const noun = kind;\n const listCmd = `tt ${kind}s list --json`;\n\n if (prefix.length < MIN_PREFIX_LEN) {\n throw new ResolveError(\n `${capitalize(noun)} ID prefix \"${prefix}\" is too short — provide at least ${MIN_PREFIX_LEN} characters or the full UUID.`,\n );\n }\n\n const lower = prefix.toLowerCase();\n const { data, meta } = (await get<T[]>(\n listPath,\n { page: 1, per_page: RESOLVE_PAGE_SIZE },\n opts,\n )) as Listed<T>;\n\n const matches = data.filter((item) => item.id.toLowerCase().startsWith(lower));\n\n if (matches.length === 1) return matches[0].id;\n\n if (matches.length === 0) {\n if (meta && meta.total > data.length) {\n throw new ResolveError(\n `No ${noun} found with ID prefix \"${prefix}\" in the first ${data.length} ${noun}s (you have ${meta.total} total). Use the full UUID — see \\`${listCmd}\\`.`,\n );\n }\n throw new ResolveError(`No ${noun} found with ID prefix \"${prefix}\".`);\n }\n\n const list = matches.map((m) => ` ${describe(m)}`).join(\"\\n\");\n throw new ResolveError(\n `${capitalize(noun)} ID prefix \"${prefix}\" is ambiguous (${matches.length} matches):\\n${list}\\nProvide more characters or the full UUID.`,\n );\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport function resolveSpecId(prefix: string, opts?: ClientOpts): Promise<string> {\n return resolvePrefix<Identifiable>(\n prefix,\n \"spec\",\n \"/behavior-specs\",\n (s) => `${s.id}${s.name ? ` (${s.name})` : \"\"}`,\n opts,\n );\n}\n\nexport function resolveRunId(prefix: string, opts?: ClientOpts): Promise<string> {\n return resolvePrefix<Identifiable>(\n prefix,\n \"run\",\n \"/runs\",\n (r) => `${r.id}${r.run_number != null ? ` (run #${r.run_number})` : \"\"}`,\n opts,\n );\n}\n\nexport function resolveDatasetId(prefix: string, opts?: ClientOpts): Promise<string> {\n return resolvePrefix<Identifiable>(\n prefix,\n \"dataset\",\n \"/datasets\",\n (d) => `${d.id}${d.name ? ` (${d.name})` : \"\"}`,\n opts,\n );\n}\n\nexport function resolveModelId(prefix: string, opts?: ClientOpts): Promise<string> {\n return resolvePrefix<Identifiable>(\n prefix,\n \"model\",\n \"/models\",\n (m) => `${m.id}${m.name ? ` (${m.name})` : \"\"}`,\n opts,\n );\n}\n","export const SUPPORTED_BASE_MODELS = [\n \"google/gemma-4-E2B-it\",\n \"google/gemma-4-E4B-it\",\n \"Qwen/Qwen3.5-2B\",\n \"Qwen/Qwen3.5-4B\",\n \"meta-llama/Llama-3.2-3B-Instruct\",\n \"microsoft/Phi-4-mini-instruct\",\n \"ibm-granite/granite-3.3-2b-instruct\",\n \"bigcode/starcoder2-3b\",\n] as const;\n\nexport type SupportedBaseModel = (typeof SUPPORTED_BASE_MODELS)[number];\n\nconst BASE_MODEL_ALIASES = new Map<string, SupportedBaseModel>();\n\nfor (const model of SUPPORTED_BASE_MODELS) {\n BASE_MODEL_ALIASES.set(model.toLowerCase(), model);\n}\n\nfor (const [alias, model] of [\n [\"google/gemma-4-E2B\", \"google/gemma-4-E2B-it\"],\n [\"google/gemma-4-e2b\", \"google/gemma-4-E2B-it\"],\n [\"google/gemma-4-e2b-it\", \"google/gemma-4-E2B-it\"],\n [\"google/gemma-4-E4B\", \"google/gemma-4-E4B-it\"],\n [\"google/gemma-4-e4b\", \"google/gemma-4-E4B-it\"],\n [\"google/gemma-4-e4b-it\", \"google/gemma-4-E4B-it\"],\n [\"qwen/qwen3.5-2b\", \"Qwen/Qwen3.5-2B\"],\n [\"Qwen/Qwen3.5-2B-Base\", \"Qwen/Qwen3.5-2B\"],\n [\"qwen/qwen3.5-2b-base\", \"Qwen/Qwen3.5-2B\"],\n [\"qwen/qwen3.5-4b\", \"Qwen/Qwen3.5-4B\"],\n [\"Qwen/Qwen3.5-4B-Base\", \"Qwen/Qwen3.5-4B\"],\n [\"qwen/qwen3.5-4b-base\", \"Qwen/Qwen3.5-4B\"],\n [\"meta-llama/llama-3.2-3b-instruct\", \"meta-llama/Llama-3.2-3B-Instruct\"],\n [\"meta-llama/Llama-3.2-3B\", \"meta-llama/Llama-3.2-3B-Instruct\"],\n [\"meta-llama/llama-3.2-3b\", \"meta-llama/Llama-3.2-3B-Instruct\"],\n [\"microsoft/phi-4-mini-instruct\", \"microsoft/Phi-4-mini-instruct\"],\n [\"phi-4-mini-instruct\", \"microsoft/Phi-4-mini-instruct\"],\n [\"ibm-granite/granite-3.3-2b-instruct\", \"ibm-granite/granite-3.3-2b-instruct\"],\n [\"granite-3.3-2b-instruct\", \"ibm-granite/granite-3.3-2b-instruct\"],\n [\"bigcode/starcoder2-3b\", \"bigcode/starcoder2-3b\"],\n [\"starcoder2-3b\", \"bigcode/starcoder2-3b\"],\n] as const) {\n BASE_MODEL_ALIASES.set(alias.toLowerCase(), model);\n}\n\nexport class UnsupportedBaseModelError extends Error {\n constructor(model: unknown) {\n const supported = SUPPORTED_BASE_MODELS.join(\", \");\n super(\n `Unsupported base_model \"${String(model)}\". Supported base models: ${supported}`,\n );\n this.name = \"UnsupportedBaseModelError\";\n }\n}\n\nexport function canonicalizeBaseModel(model: unknown): SupportedBaseModel {\n if (typeof model !== \"string\" || !model.trim()) {\n throw new UnsupportedBaseModelError(model);\n }\n\n const canonical = BASE_MODEL_ALIASES.get(model.trim().toLowerCase());\n if (!canonical) {\n throw new UnsupportedBaseModelError(model);\n }\n\n return canonical;\n}\n\nexport function canonicalizeSpecBaseModel<T extends Record<string, unknown>>(body: T): T {\n if (\"base_model\" in body && body.base_model !== undefined) {\n return { ...body, base_model: canonicalizeBaseModel(body.base_model) };\n }\n\n return body;\n}\n","import { Command } from \"commander\";\nimport ora from \"ora\";\nimport { get, post, type ClientOpts } from \"../client.js\";\nimport { resolveSpecId, resolveRunId, resolveDatasetId, resolveModelId } from \"../resolve.js\";\nimport {\n printTable,\n printDetail,\n printSuccess,\n printJson,\n isJsonMode,\n formatDate,\n formatStatus,\n shortId,\n truncate,\n} from \"../output.js\";\n\ninterface Run {\n id: string;\n behavior_spec_id: string;\n run_number: number;\n status: string;\n current_stage?: string | null;\n stage_label?: string | null;\n progress_pct?: number | null;\n status_message?: string | null;\n hyperparameters: Record<string, unknown> | null;\n eval_summary: RunEvalSummary | null;\n error: string | null;\n started_at: string | null;\n completed_at: string | null;\n created_at: string;\n updated_at: string;\n _spec_name?: string;\n _evals?: RunEval[];\n _events?: RunEvent[];\n}\n\ninterface RunEvalSummary {\n avg_score?: number;\n mean_score?: number;\n pass_rate?: number;\n output_diagnostics?: RunOutputDiagnostics;\n}\n\ninterface EvalOutputDiagnostics {\n total: number;\n avg_output_chars?: number;\n max_output_chars?: number;\n starts_json_count: number;\n starts_json_rate: number;\n valid_json_count: number;\n valid_json_rate: number;\n strict_json_count: number;\n strict_json_rate: number;\n expected_schema_keys_count: number;\n expected_schema_keys_rate: number;\n non_json_prefix_count: number;\n non_json_prefix_rate: number;\n visible_reasoning_prefix_count: number;\n visible_reasoning_prefix_rate: number;\n}\n\ninterface RunOutputDiagnostics {\n baseline: EvalOutputDiagnostics;\n candidate: EvalOutputDiagnostics;\n test?: {\n baseline: EvalOutputDiagnostics;\n candidate: EvalOutputDiagnostics;\n };\n insights?: string[];\n}\n\ninterface RunEval {\n id: string;\n prompt: string;\n expected: string;\n actual: string;\n passed: boolean;\n score: number | null;\n reasoning: string | null;\n latency_ms: number | null;\n}\n\ninterface RunEvent {\n id: string;\n stage: string;\n label: string;\n status: string;\n message: string | null;\n occurred_at: string;\n}\n\ninterface RunDiagnostics {\n run_id: string;\n status: string;\n stage: string | null;\n stage_label: string | null;\n progress_pct: number | null;\n status_message: string | null;\n summary: string;\n insights: string[];\n output_diagnostics?: RunOutputDiagnostics;\n training: {\n state: string;\n phase: string | null;\n started_at: string | null;\n completed_at: string | null;\n last_updated_at: string | null;\n curve: {\n target_epochs: number | null;\n latest_epoch: number | null;\n latest_loss: number | null;\n previous_loss: number | null;\n latest_token_accuracy: number | null;\n epoch_rate_per_minute: number | null;\n estimated_minutes_remaining: number | null;\n latest_log_at: string | null;\n samples: {\n timestamp: string;\n epoch: number;\n loss?: number;\n learning_rate?: number;\n token_accuracy?: number;\n }[];\n };\n };\n generated_at: string;\n}\n\nfunction formatProgress(run: Run): string | undefined {\n if (run.progress_pct == null && !run.stage_label) return undefined;\n const label = run.stage_label ?? run.current_stage ?? \"Progress\";\n return run.progress_pct == null ? label : `${label} (${run.progress_pct}%)`;\n}\n\nfunction getEvalScore(run: Run): number | undefined {\n return run.eval_summary?.avg_score ?? run.eval_summary?.mean_score;\n}\n\nfunction formatEvalScore(run: Run): string | undefined {\n const score = getEvalScore(run);\n return score == null ? undefined : (score * 100).toFixed(1) + \"%\";\n}\n\nfunction formatPercent(rate: number | undefined): string | undefined {\n return rate == null ? undefined : (rate * 100).toFixed(1) + \"%\";\n}\n\nfunction formatCountRate(count: number | undefined, total: number | undefined, rate: number | undefined): string | undefined {\n if (count == null || total == null || rate == null) return undefined;\n return `${formatPercent(rate)} (${count}/${total})`;\n}\n\nfunction formatMinutes(minutes?: number | null): string | undefined {\n if (minutes == null) return undefined;\n if (minutes < 60) return `${Math.max(1, Math.round(minutes))}m`;\n return `${(minutes / 60).toFixed(1)}h`;\n}\n\nfunction formatEpochProgress(diagnostics: RunDiagnostics): string | undefined {\n const curve = diagnostics.training.curve;\n if (curve.latest_epoch == null) return undefined;\n if (curve.target_epochs == null) return curve.latest_epoch.toFixed(4);\n return `${curve.latest_epoch.toFixed(4)} / ${curve.target_epochs.toFixed(2)}`;\n}\n\nfunction printDiagnostics(diagnostics: RunDiagnostics) {\n const curve = diagnostics.training.curve;\n const perFive = curve.epoch_rate_per_minute == null\n ? undefined\n : (curve.epoch_rate_per_minute * 5).toFixed(4);\n\n printDetail([\n [\"Run\", shortId(diagnostics.run_id)],\n [\"Status\", formatStatus(diagnostics.status)],\n [\"Stage\", diagnostics.stage_label ?? diagnostics.stage ?? undefined],\n [\"Summary\", diagnostics.summary],\n [\"Training\", diagnostics.training.state],\n [\"Phase\", diagnostics.training.phase ?? undefined],\n [\"Epoch\", formatEpochProgress(diagnostics)],\n [\"Latest Loss\", curve.latest_loss == null ? undefined : curve.latest_loss.toFixed(4)],\n [\n \"Token Accuracy\",\n curve.latest_token_accuracy == null\n ? undefined\n : (curve.latest_token_accuracy * 100).toFixed(1) + \"%\",\n ],\n [\"Pace\", perFive ? `${perFive} epoch / 5m` : undefined],\n [\"ETA\", formatMinutes(curve.estimated_minutes_remaining)],\n [\"Latest Update\", formatDate(diagnostics.training.last_updated_at)],\n ]);\n\n if (diagnostics.insights.length) {\n console.log(\"\\nInsights:\");\n for (const insight of diagnostics.insights) {\n console.log(` - ${insight}`);\n }\n }\n\n printEvalOutputDiagnostics(diagnostics.output_diagnostics);\n}\n\nfunction printEvalOutputDiagnostics(diagnostics: RunOutputDiagnostics | undefined) {\n if (!diagnostics) return;\n const candidate = diagnostics.candidate;\n const baseline = diagnostics.baseline;\n\n console.log(\"\\nOutput Diagnostics:\");\n printDetail([\n [\"Tuned Valid JSON\", formatCountRate(candidate.valid_json_count, candidate.total, candidate.valid_json_rate)],\n [\"Tuned Strict JSON\", formatCountRate(candidate.strict_json_count, candidate.total, candidate.strict_json_rate)],\n [\n \"Tuned Schema Keys\",\n formatCountRate(candidate.expected_schema_keys_count, candidate.total, candidate.expected_schema_keys_rate),\n ],\n [\n \"Tuned Non-JSON Prefix\",\n formatCountRate(candidate.non_json_prefix_count, candidate.total, candidate.non_json_prefix_rate),\n ],\n [\n \"Tuned Reasoning Prefix\",\n formatCountRate(\n candidate.visible_reasoning_prefix_count,\n candidate.total,\n candidate.visible_reasoning_prefix_rate,\n ),\n ],\n [\"Tuned Avg Output\", candidate.avg_output_chars == null ? undefined : `${candidate.avg_output_chars} chars`],\n [\"Base Valid JSON\", formatCountRate(baseline.valid_json_count, baseline.total, baseline.valid_json_rate)],\n [\n \"Base Reasoning Prefix\",\n formatCountRate(\n baseline.visible_reasoning_prefix_count,\n baseline.total,\n baseline.visible_reasoning_prefix_rate,\n ),\n ],\n ]);\n\n if (diagnostics.test) {\n console.log(\"\\nTest Output Diagnostics:\");\n printDetail([\n [\n \"Tuned Valid JSON\",\n formatCountRate(\n diagnostics.test.candidate.valid_json_count,\n diagnostics.test.candidate.total,\n diagnostics.test.candidate.valid_json_rate,\n ),\n ],\n [\n \"Tuned Strict JSON\",\n formatCountRate(\n diagnostics.test.candidate.strict_json_count,\n diagnostics.test.candidate.total,\n diagnostics.test.candidate.strict_json_rate,\n ),\n ],\n [\n \"Tuned Reasoning Prefix\",\n formatCountRate(\n diagnostics.test.candidate.visible_reasoning_prefix_count,\n diagnostics.test.candidate.total,\n diagnostics.test.candidate.visible_reasoning_prefix_rate,\n ),\n ],\n ]);\n }\n\n if (diagnostics.insights?.length) {\n console.log(\"\\nEvaluation Insights:\");\n for (const insight of diagnostics.insights) {\n console.log(` - ${insight}`);\n }\n }\n}\n\nexport function registerRunsCommands(parent: Command) {\n const runs = parent.command(\"runs\").description(\"Manage runs\");\n\n runs\n .command(\"list\")\n .description(\"List runs\")\n .option(\"-s, --spec <id>\", \"Filter by spec ID (full UUID or 8+ char prefix)\")\n .option(\"-p, --page <n>\", \"Page number\", \"1\")\n .option(\"--per-page <n>\", \"Results per page\", \"20\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n\n let path = \"/runs\";\n const query: Record<string, string | number> = {\n page: cmdOpts.page,\n per_page: cmdOpts.perPage,\n };\n\n if (cmdOpts.spec) {\n const fullSpecId = await resolveSpecId(cmdOpts.spec, opts);\n path = `/behavior-specs/${fullSpecId}/runs`;\n }\n\n const { data, meta } = await get<Run[]>(path, query, opts);\n\n if (isJsonMode()) return printJson({ data, meta });\n\n printTable(\n [\"ID\", \"Spec\", \"#\", \"Status\", \"Score\", \"Started\", \"Completed\"],\n data.map((r) => [\n shortId(r.id),\n r._spec_name ? truncate(r._spec_name, 20) : shortId(r.behavior_spec_id),\n String(r.run_number),\n formatStatus(r.status),\n formatEvalScore(r) ?? \"—\",\n formatDate(r.started_at),\n formatDate(r.completed_at),\n ]),\n meta,\n );\n });\n\n runs\n .command(\"get\")\n .description(\"Show run details and eval results\")\n .argument(\"<id>\", \"Run ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveRunId(id, opts);\n const { data } = await get<Run>(`/runs/${fullId}`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n\n printDetail([\n [\"ID\", data.id],\n [\"Spec\", data._spec_name ?? shortId(data.behavior_spec_id)],\n [\"Run #\", String(data.run_number)],\n [\"Status\", formatStatus(data.status)],\n [\"Stage\", formatProgress(data)],\n [\"Message\", data.status_message ?? undefined],\n [\"Score\", formatEvalScore(data)],\n [\"Pass Rate\", data.eval_summary?.pass_rate != null\n ? (data.eval_summary.pass_rate * 100).toFixed(1) + \"%\"\n : undefined],\n [\"Error\", data.error ?? undefined],\n [\"Started\", formatDate(data.started_at)],\n [\"Completed\", formatDate(data.completed_at)],\n [\"Created\", formatDate(data.created_at)],\n ]);\n\n if (data.hyperparameters && Object.keys(data.hyperparameters).length) {\n console.log(\"\\nHyperparameters:\");\n for (const [k, v] of Object.entries(data.hyperparameters)) {\n console.log(` ${k}: ${v}`);\n }\n }\n\n printEvalOutputDiagnostics(data.eval_summary?.output_diagnostics);\n\n if (data._events?.length) {\n console.log(\"\\nLatest Updates:\");\n for (const event of data._events.slice(-5)) {\n const time = formatDate(event.occurred_at);\n console.log(\n ` ${time} ${formatStatus(event.status)} ${event.label}${event.message ? ` — ${event.message}` : \"\"}`,\n );\n }\n }\n\n if (data._evals?.length) {\n console.log(`\\nEval Results (${data._evals.length}):`);\n printTable(\n [\"#\", \"Passed\", \"Score\", \"Prompt\", \"Latency\"],\n data._evals.map((e, i) => [\n String(i + 1),\n e.passed ? \"✓\" : \"✗\",\n e.score != null ? e.score.toFixed(2) : \"—\",\n truncate(e.prompt, 40),\n e.latency_ms != null ? `${e.latency_ms}ms` : \"—\",\n ]),\n );\n }\n });\n\n runs\n .command(\"start\")\n .description(\"Start a new run for a behaviour spec\")\n .argument(\"<spec-id>\", \"Behaviour spec ID (full UUID or 8+ char prefix)\")\n .option(\"--no-augment\", \"Disable data augmentation\")\n .option(\"--no-llm-judge\", \"Disable LLM judging\")\n .option(\"--epochs <n>\", \"Number of training epochs\")\n .option(\"--lr <rate>\", \"Learning rate\")\n .option(\"--batch-size <n>\", \"Batch size\")\n .option(\"--dataset <id>\", \"Dataset ID to use instead of inline spec examples (full UUID or 4+ char prefix)\")\n .option(\"--parent-model <id>\", \"Fine-tuned model ID to continue training from (full UUID or 4+ char prefix)\")\n .option(\"--train-ratio <ratio>\", \"Dataset training split ratio (default: 0.8 when any split ratio is set)\")\n .option(\"--validation-ratio <ratio>\", \"Dataset validation split ratio (default: 0.1 when any split ratio is set)\")\n .option(\"--test-ratio <ratio>\", \"Dataset test split ratio (default: 0.1 when any split ratio is set)\")\n .option(\"--lora-rank <n>\", \"LoRA rank\")\n .option(\"--lora-alpha <n>\", \"LoRA alpha\")\n .option(\"--max-eval-examples <n>\", \"Max examples for the primary eval pass\")\n .option(\"--max-test-eval-examples <n>\", \"Max examples for the secondary test eval pass\")\n .action(async (specId: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const body: Record<string, unknown> = {};\n\n if (cmdOpts.augment === false) body.augment = false;\n if (cmdOpts.dataset) body.dataset_id = await resolveDatasetId(cmdOpts.dataset, opts);\n if (cmdOpts.parentModel) {\n body.parent_model_id = await resolveModelId(cmdOpts.parentModel, opts);\n }\n\n const splitRatioOptions = [\n cmdOpts.trainRatio,\n cmdOpts.validationRatio,\n cmdOpts.testRatio,\n ];\n if (splitRatioOptions.some((value) => value != null)) {\n body.split_ratios = {\n train: cmdOpts.trainRatio != null ? Number(cmdOpts.trainRatio) : 0.8,\n validation:\n cmdOpts.validationRatio != null ? Number(cmdOpts.validationRatio) : 0.1,\n test: cmdOpts.testRatio != null ? Number(cmdOpts.testRatio) : 0.1,\n };\n }\n\n const hp: Record<string, unknown> = {};\n if (cmdOpts.epochs) hp.n_epochs = Number(cmdOpts.epochs);\n if (cmdOpts.lr) hp.learning_rate = Number(cmdOpts.lr);\n if (cmdOpts.batchSize) hp.batch_size = Number(cmdOpts.batchSize);\n if (cmdOpts.loraRank) hp.lora_rank = Number(cmdOpts.loraRank);\n if (cmdOpts.loraAlpha) hp.lora_alpha = Number(cmdOpts.loraAlpha);\n if (cmdOpts.maxEvalExamples) hp.max_eval_examples = Number(cmdOpts.maxEvalExamples);\n if (cmdOpts.maxTestEvalExamples) hp.max_test_eval_examples = Number(cmdOpts.maxTestEvalExamples);\n if (cmdOpts.llmJudge === false) body.use_llm_judge = false;\n if (Object.keys(hp).length) body.hyperparameters = hp;\n\n const fullSpecId = await resolveSpecId(specId, opts);\n const { data } = await post<Run>(\n `/behavior-specs/${fullSpecId}/runs`,\n body,\n opts,\n );\n\n if (isJsonMode()) return printJson(data);\n printSuccess(\n `Run #${data.run_number} started (${shortId(data.id)}). ${formatProgress(data) ?? `Status: ${formatStatus(data.status)}`}`,\n );\n });\n\n runs\n .command(\"cancel\")\n .description(\"Cancel a running run\")\n .argument(\"<id>\", \"Run ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveRunId(id, opts);\n const { data } = await post<Run>(`/runs/${fullId}/cancel`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n printSuccess(`Run ${shortId(fullId)} cancelled.`);\n });\n\n runs\n .command(\"watch\")\n .description(\"Watch a run until it completes\")\n .argument(\"<id>\", \"Run ID (full UUID or 8+ char prefix)\")\n .option(\"--interval <ms>\", \"Poll interval in milliseconds\", \"5000\")\n .action(async (id: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const interval = Number(cmdOpts.interval);\n const fullId = await resolveRunId(id, opts);\n const spinner = ora(`Watching run ${shortId(fullId)}...`).start();\n\n const terminalStates = new Set([\n \"completed\",\n \"failed\",\n \"cancelled\",\n ]);\n\n let run: Run;\n while (true) {\n const { data } = await get<Run>(`/runs/${fullId}`, undefined, opts);\n run = data;\n spinner.text = `Run ${shortId(fullId)} — ${formatProgress(run) ?? formatStatus(run.status)}`;\n\n if (terminalStates.has(run.status)) break;\n await new Promise((r) => setTimeout(r, interval));\n }\n\n spinner.stop();\n\n if (isJsonMode()) return printJson(run);\n\n printDetail([\n [\"Run\", shortId(run.id)],\n [\"Status\", formatStatus(run.status)],\n [\"Stage\", formatProgress(run)],\n [\"Message\", run.status_message ?? undefined],\n [\"Score\", formatEvalScore(run)],\n [\"Error\", run.error ?? undefined],\n [\"Completed\", formatDate(run.completed_at)],\n ]);\n });\n\n runs\n .command(\"diagnose\")\n .description(\"Show live run diagnostics\")\n .argument(\"<id>\", \"Run ID (full UUID or 8+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveRunId(id, opts);\n const { data } = await get<RunDiagnostics>(\n `/runs/${fullId}/diagnostics`,\n undefined,\n opts,\n );\n\n if (isJsonMode()) return printJson(data);\n printDiagnostics(data);\n });\n}\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { get, del, post, type ClientOpts } from \"../client.js\";\nimport { resolveDatasetId } from \"../resolve.js\";\nimport {\n printTable,\n printDetail,\n printSuccess,\n printJson,\n printError,\n isJsonMode,\n formatDate,\n formatStatus,\n shortId,\n truncate,\n} from \"../output.js\";\n\ninterface Dataset {\n id: string;\n name: string;\n description: string | null;\n storage_path: string;\n file_size_bytes: number;\n row_count: number;\n format: string;\n status: string;\n validation_errors: string[] | null;\n created_at: string;\n updated_at: string;\n}\n\ninterface DatasetUploadUrl {\n path: string;\n upload_url: string;\n method: \"PUT\";\n headers?: Record<string, string>;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// Invisible characters that JSON parsers accept but downstream JSONL consumers\n// often mishandle. Concretely: Python's str.splitlines() treats every char in\n// this set as a line break, so a row containing one of them gets cut in half\n// before json.loads sees it. We strip these at validate-time so the failure\n// mode is \"row 1099 has U+0085 at offset 4078\" (seconds, locally) instead of\n// \"AlgorithmError: exit code 1\" after a training launch (minutes, remote).\nconst FORBIDDEN_CONTROL_CODEPOINTS: ReadonlyArray<{ code: number; name: string }> = [\n // C0 control chars except whitespace we explicitly allow inside string values.\n // U+0009 TAB, U+000A LF, U+000D CR are kept since they appear in normal text.\n { code: 0x00, name: \"NULL\" },\n { code: 0x01, name: \"START OF HEADING\" },\n { code: 0x02, name: \"START OF TEXT\" },\n { code: 0x03, name: \"END OF TEXT\" },\n { code: 0x04, name: \"END OF TRANSMISSION\" },\n { code: 0x05, name: \"ENQUIRY\" },\n { code: 0x06, name: \"ACKNOWLEDGE\" },\n { code: 0x07, name: \"BELL\" },\n { code: 0x08, name: \"BACKSPACE\" },\n { code: 0x0b, name: \"VERTICAL TAB\" },\n { code: 0x0c, name: \"FORM FEED\" },\n { code: 0x0e, name: \"SHIFT OUT\" },\n { code: 0x0f, name: \"SHIFT IN\" },\n // 0x10..0x1F all rejected; named lookup falls back to \"CONTROL CHARACTER\".\n { code: 0x1c, name: \"FILE SEPARATOR\" },\n { code: 0x1d, name: \"GROUP SEPARATOR\" },\n { code: 0x1e, name: \"RECORD SEPARATOR\" },\n // C1 control range U+0080..U+009F (all invisible, often mojibake from\n // Windows-1252 smart quotes mis-tagged as Unicode codepoints).\n { code: 0x0085, name: \"NEXT LINE\" },\n // Unicode line/paragraph separators - cut lines too.\n { code: 0x2028, name: \"LINE SEPARATOR\" },\n { code: 0x2029, name: \"PARAGRAPH SEPARATOR\" },\n];\n\nfunction findControlChar(value: string): { codepoint: number; offset: number; name: string } | null {\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n // Whitelist real whitespace; everything in C0 below 0x20 (besides tab/LF/CR) is hazardous.\n if (code < 0x20 && code !== 0x09 && code !== 0x0a && code !== 0x0d) {\n const named = FORBIDDEN_CONTROL_CODEPOINTS.find((entry) => entry.code === code);\n return { codepoint: code, offset: i, name: named?.name ?? \"CONTROL CHARACTER\" };\n }\n // C1 control range - all hazardous (NEL, etc.); JSON parsers accept these\n // but Python's splitlines() splits on several of them.\n if (code >= 0x80 && code <= 0x9f) {\n const named = FORBIDDEN_CONTROL_CODEPOINTS.find((entry) => entry.code === code);\n return { codepoint: code, offset: i, name: named?.name ?? \"C1 CONTROL CHARACTER\" };\n }\n if (code === 0x2028 || code === 0x2029) {\n const named = FORBIDDEN_CONTROL_CODEPOINTS.find((entry) => entry.code === code);\n return { codepoint: code, offset: i, name: named?.name ?? \"LINE BREAK\" };\n }\n }\n return null;\n}\n\nfunction formatCodepoint(code: number): string {\n return `U+${code.toString(16).toUpperCase().padStart(4, \"0\")}`;\n}\n\nfunction validateDatasetFile(file: string): void {\n const lines = readFileSync(file, \"utf8\").split(/\\r?\\n/);\n const errors: string[] = [];\n let rowCount = 0;\n\n for (const [index, rawLine] of lines.entries()) {\n const line = rawLine.trim();\n if (!line) continue;\n\n rowCount += 1;\n const rowNumber = index + 1;\n let row: unknown;\n\n try {\n row = JSON.parse(line);\n } catch {\n errors.push(`Row ${rowNumber}: invalid JSON`);\n continue;\n }\n\n if (!row || typeof row !== \"object\" || Array.isArray(row)) {\n errors.push(`Row ${rowNumber}: expected an object with \"input\" and \"output\" fields`);\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (\"messages\" in record && !(\"input\" in record) && !(\"output\" in record)) {\n errors.push(\n `Row ${rowNumber}: found OpenAI SFT-style \"messages\"; Tuned Tensor datasets require flat \"input\" and \"output\" strings`,\n );\n continue;\n }\n\n if (typeof record.input !== \"string\") {\n errors.push(`Row ${rowNumber}: missing string \"input\" field`);\n }\n if (typeof record.output !== \"string\") {\n errors.push(`Row ${rowNumber}: missing string \"output\" field`);\n }\n\n for (const field of [\"input\", \"output\"] as const) {\n const value = record[field];\n if (typeof value !== \"string\") continue;\n const hit = findControlChar(value);\n if (hit) {\n errors.push(\n `Row ${rowNumber}: field \"${field}\" contains invisible control character ${formatCodepoint(hit.codepoint)} (${hit.name}) at offset ${hit.offset} — strip or escape before uploading; some training paths split on it`,\n );\n }\n }\n }\n\n if (rowCount === 0) {\n errors.push(\"File contains no JSONL rows\");\n }\n\n if (errors.length > 0) {\n const preview = errors.slice(0, 5).join(\"\\n\");\n const suffix = errors.length > 5 ? `\\n...and ${errors.length - 5} more error(s)` : \"\";\n throw new Error(\n `Invalid dataset format. Each JSONL row must be {\"input\": \"...\", \"output\": \"...\"}.\\n${preview}${suffix}`,\n );\n }\n}\n\nexport function registerDatasetsCommands(parent: Command) {\n const datasets = parent\n .command(\"datasets\")\n .description(\"Manage datasets\");\n\n datasets\n .command(\"list\")\n .description(\"List datasets\")\n .option(\"-p, --page <n>\", \"Page number\", \"1\")\n .option(\"--per-page <n>\", \"Results per page\", \"20\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const { data, meta } = await get<Dataset[]>(\n \"/datasets\",\n { page: cmdOpts.page, per_page: cmdOpts.perPage },\n opts,\n );\n\n if (isJsonMode()) return printJson({ data, meta });\n\n printTable(\n [\"ID\", \"Name\", \"Rows\", \"Size\", \"Status\", \"Created\"],\n data.map((d) => [\n shortId(d.id),\n truncate(d.name, 30),\n String(d.row_count),\n formatBytes(d.file_size_bytes),\n formatStatus(d.status),\n formatDate(d.created_at),\n ]),\n meta,\n );\n });\n\n datasets\n .command(\"get\")\n .description(\"Show dataset details\")\n .argument(\"<id>\", \"Dataset ID (full UUID or 4+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveDatasetId(id, opts);\n const { data } = await get<Dataset>(`/datasets/${fullId}`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n\n printDetail([\n [\"ID\", data.id],\n [\"Name\", data.name],\n [\"Description\", data.description ?? undefined],\n [\"Format\", data.format],\n [\"Rows\", String(data.row_count)],\n [\"Size\", formatBytes(data.file_size_bytes)],\n [\"Status\", formatStatus(data.status)],\n [\"Created\", formatDate(data.created_at)],\n [\"Updated\", formatDate(data.updated_at)],\n ]);\n\n if (data.validation_errors?.length) {\n console.log(\"\\nValidation Errors:\");\n for (const err of data.validation_errors) {\n console.log(` - ${err}`);\n }\n }\n });\n\n datasets\n .command(\"upload\")\n .description(\"Upload a JSONL dataset file\")\n .argument(\"<file>\", \"Path to JSONL file\")\n .option(\"-n, --name <name>\", \"Dataset name (defaults to filename)\")\n .option(\"-d, --description <desc>\", \"Dataset description\")\n .action(async (file: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n\n if (!existsSync(file)) {\n printError(`File not found: ${file}`);\n process.exit(1);\n }\n\n validateDatasetFile(file);\n\n const name = cmdOpts.name || file.split(\"/\").pop()!.replace(/\\.jsonl?$/, \"\");\n const fileBytes = readFileSync(file);\n const uploadUrl = await post<DatasetUploadUrl>(\n \"/datasets/upload-url\",\n {\n name,\n description: cmdOpts.description ?? null,\n filename: file.split(\"/\").pop()!,\n size: statSync(file).size,\n contentType: \"application/jsonl\",\n },\n opts,\n );\n\n const uploadRes = await fetch(uploadUrl.data.upload_url, {\n method: uploadUrl.data.method,\n headers: uploadUrl.data.headers ?? { \"Content-Type\": \"application/jsonl\" },\n body: new Blob([fileBytes], { type: \"application/jsonl\" }),\n });\n if (!uploadRes.ok) {\n throw new Error(`Dataset upload failed: ${uploadRes.status} ${uploadRes.statusText}`);\n }\n\n const { data } = await post<Dataset>(\n \"/datasets/finalize\",\n {\n path: uploadUrl.data.path,\n name,\n description: cmdOpts.description ?? null,\n },\n opts,\n );\n\n if (isJsonMode()) return printJson(data);\n printSuccess(\n `Dataset uploaded: ${data.name} (${shortId(data.id)}) — ${data.row_count} rows`,\n );\n });\n\n datasets\n .command(\"delete\")\n .description(\"Delete a dataset\")\n .argument(\"<id>\", \"Dataset ID (full UUID or 4+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveDatasetId(id, opts);\n await del(`/datasets/${fullId}`, opts);\n\n if (isJsonMode()) return printJson({ id: fullId, deleted: true });\n printSuccess(`Dataset deleted: ${shortId(fullId)}`);\n });\n}\n","import { Command } from \"commander\";\nimport { spawn, execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport {\n existsSync,\n mkdirSync,\n statSync,\n createWriteStream,\n unlinkSync,\n readFileSync,\n writeFileSync,\n readdirSync,\n rmSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve, basename } from \"node:path\";\nimport { Readable, Transform } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { get, del, type ClientOpts } from \"../client.js\";\nimport { resolveModelId } from \"../resolve.js\";\nimport { SUPPORTED_BASE_MODELS } from \"../base-models.js\";\nimport { DEFAULT_SPEC_FILE } from \"./init.js\";\nimport type { LocalSpec } from \"../eval/types.js\";\nimport { startManagedModelServer } from \"../serve-manager.js\";\nimport {\n printTable,\n printDetail,\n printSuccess,\n printJson,\n isJsonMode,\n formatDate,\n shortId,\n truncate,\n printWarning,\n} from \"../output.js\";\n\ninterface Model {\n id: string;\n name: string;\n provider: string;\n provider_model_id: string;\n base_model: string;\n description: string | null;\n created_at: string;\n}\n\ninterface ModelDownload {\n url: string;\n filename: string;\n expires_at: string;\n}\n\ninterface ServeTarget {\n modelPath: string;\n modelName: string;\n source: \"local-directory\" | \"local-archive\" | \"downloaded-model\";\n modelId?: string;\n}\n\nconst REFERENCE_SERVER_SCRIPT = String.raw`#!/usr/bin/env python3\nimport json\nimport os\nimport time\nimport uuid\nfrom http.server import BaseHTTPRequestHandler, ThreadingHTTPServer\n\nMODEL_PATH = os.environ[\"TT_MODEL_PATH\"]\nMODEL_NAME = os.environ.get(\"TT_MODEL_NAME\", os.path.basename(MODEL_PATH.rstrip(\"/\")) or \"tuned-tensor-model\")\nSYSTEM_PROMPT = os.environ.get(\"TT_SYSTEM_PROMPT\", \"\").strip()\nHOST = os.environ.get(\"TT_HOST\", \"127.0.0.1\")\nPORT = int(os.environ.get(\"TT_PORT\", \"8000\"))\nDEFAULT_MAX_TOKENS = int(os.environ.get(\"TT_MAX_TOKENS\", \"512\"))\nDEFAULT_TEMPERATURE = float(os.environ.get(\"TT_TEMPERATURE\", \"0.7\"))\nTRUST_REMOTE_CODE = os.environ.get(\"TT_TRUST_REMOTE_CODE\", \"false\").lower() in {\"1\", \"true\", \"yes\", \"y\"}\nREQUESTED_DEVICE = os.environ.get(\"TT_DEVICE\", \"auto\").lower()\nJSON_REPAIR_ATTEMPTS = int(os.environ.get(\"TT_JSON_REPAIR_ATTEMPTS\", \"1\"))\nDEFAULT_JSON_SCHEMA = None\nif os.environ.get(\"TT_JSON_SCHEMA\"):\n DEFAULT_JSON_SCHEMA = json.loads(os.environ[\"TT_JSON_SCHEMA\"])\n\n\ndef choose_device(torch):\n if REQUESTED_DEVICE not in {\"auto\", \"cpu\", \"cuda\", \"mps\"}:\n raise RuntimeError(\"TT_DEVICE must be one of: auto, cpu, cuda, mps\")\n if REQUESTED_DEVICE == \"cuda\" and not torch.cuda.is_available():\n raise RuntimeError(\"TT_DEVICE=cuda requested, but CUDA is not available\")\n if REQUESTED_DEVICE == \"mps\" and not (\n hasattr(torch.backends, \"mps\") and torch.backends.mps.is_available()\n ):\n raise RuntimeError(\"TT_DEVICE=mps requested, but Apple MPS is not available\")\n if REQUESTED_DEVICE != \"auto\":\n return REQUESTED_DEVICE\n if torch.cuda.is_available():\n return \"cuda\"\n if hasattr(torch.backends, \"mps\") and torch.backends.mps.is_available():\n return \"mps\"\n return \"cpu\"\n\n\ndef load_model():\n try:\n import torch\n from transformers import (\n AutoModelForCausalLM,\n AutoModelForImageTextToText,\n AutoProcessor,\n AutoTokenizer,\n )\n except Exception as exc:\n raise RuntimeError(\n \"Missing Python serving dependencies. Install them with: \"\n \"python -m pip install torch transformers accelerate\"\n ) from exc\n\n try:\n processor = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=TRUST_REMOTE_CODE)\n except Exception:\n processor = AutoProcessor.from_pretrained(MODEL_PATH, trust_remote_code=TRUST_REMOTE_CODE)\n tokenizer = getattr(processor, \"tokenizer\", processor)\n if getattr(tokenizer, \"pad_token\", None) is None:\n tokenizer.pad_token = tokenizer.eos_token\n\n device = choose_device(torch)\n kwargs = {\n \"trust_remote_code\": TRUST_REMOTE_CODE,\n \"torch_dtype\": \"auto\",\n \"low_cpu_mem_usage\": True,\n }\n if device == \"cuda\":\n kwargs[\"device_map\"] = \"auto\"\n elif device == \"mps\":\n kwargs[\"torch_dtype\"] = torch.float16\n\n try:\n model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, **kwargs)\n except Exception:\n model = AutoModelForImageTextToText.from_pretrained(MODEL_PATH, **kwargs)\n if device != \"cuda\":\n model.to(device)\n model.eval()\n return torch, tokenizer, model, device\n\n\ntorch, tokenizer, model, DEVICE = load_model()\n\n\ndef content_to_text(content):\n if isinstance(content, str):\n return content\n return json.dumps(content, ensure_ascii=False)\n\n\ndef normalize_messages(raw_messages):\n messages = []\n for item in raw_messages:\n if not isinstance(item, dict):\n continue\n role = item.get(\"role\")\n if role not in {\"system\", \"user\", \"assistant\", \"tool\"}:\n continue\n messages.append({\"role\": role, \"content\": content_to_text(item.get(\"content\", \"\"))})\n\n if SYSTEM_PROMPT and not any(message[\"role\"] == \"system\" for message in messages):\n messages.insert(0, {\"role\": \"system\", \"content\": SYSTEM_PROMPT})\n return messages\n\n\ndef response_json_contract(body):\n response_format = body.get(\"response_format\")\n schema = DEFAULT_JSON_SCHEMA\n mode = \"json_schema\" if schema else \"text\"\n\n if isinstance(response_format, dict):\n format_type = response_format.get(\"type\")\n if format_type == \"json_object\":\n mode = \"json_object\"\n elif format_type == \"json_schema\":\n mode = \"json_schema\"\n json_schema = response_format.get(\"json_schema\")\n if isinstance(json_schema, dict):\n schema = json_schema.get(\"schema\") if isinstance(json_schema.get(\"schema\"), dict) else json_schema\n\n return mode, schema\n\n\ndef with_json_contract(messages, mode, schema):\n if mode == \"text\":\n return messages\n\n if schema:\n contract = (\n \"Return only a valid JSON object matching this JSON Schema. \"\n \"Do not include markdown, code fences, comments, or prose outside the JSON object.\\n\"\n + json.dumps(schema, ensure_ascii=False, separators=(\",\", \":\"))\n )\n else:\n contract = (\n \"Return only a valid JSON object. Do not include markdown, code fences, \"\n \"comments, or prose outside the JSON object.\"\n )\n\n contracted = [dict(message) for message in messages]\n for message in contracted:\n if message[\"role\"] == \"system\":\n message[\"content\"] = (message[\"content\"].rstrip() + \"\\n\\n\" + contract).strip()\n return contracted\n\n contracted.insert(0, {\"role\": \"system\", \"content\": contract})\n return contracted\n\n\ndef render_prompt(messages):\n chat_template = getattr(tokenizer, \"chat_template\", None)\n if hasattr(tokenizer, \"apply_chat_template\") and chat_template:\n return tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)\n\n rendered = []\n for message in messages:\n rendered.append(f\"{message['role'].upper()}: {message['content']}\")\n rendered.append(\"ASSISTANT:\")\n return \"\\n\".join(rendered)\n\n\ndef generate_completion(messages, max_tokens, temperature):\n prompt = render_prompt(messages)\n inputs = tokenizer(prompt, return_tensors=\"pt\")\n input_device = getattr(model, \"device\", None)\n if input_device is None:\n input_device = next(model.parameters()).device\n inputs = {key: value.to(input_device) for key, value in inputs.items()}\n\n generate_kwargs = {\n **inputs,\n \"max_new_tokens\": max_tokens,\n \"pad_token_id\": tokenizer.pad_token_id or tokenizer.eos_token_id,\n }\n if temperature > 0:\n generate_kwargs[\"do_sample\"] = True\n generate_kwargs[\"temperature\"] = temperature\n else:\n generate_kwargs[\"do_sample\"] = False\n\n with torch.no_grad():\n output_ids = model.generate(**generate_kwargs)\n\n prompt_tokens = int(inputs[\"input_ids\"].shape[-1])\n completion_ids = output_ids[0][prompt_tokens:]\n content = tokenizer.decode(completion_ids, skip_special_tokens=True).strip()\n return content, prompt_tokens, int(completion_ids.shape[-1])\n\n\ndef extract_json_value(content):\n decoder = json.JSONDecoder()\n text = content.strip()\n try:\n return json.loads(text), None\n except Exception:\n pass\n\n for index, char in enumerate(text):\n if char not in \"{[\":\n continue\n try:\n value, end = decoder.raw_decode(text[index:])\n trailing = text[index + end :].strip()\n if trailing:\n continue\n return value, None\n except Exception:\n continue\n return None, \"response is not valid JSON\"\n\n\ndef json_type_matches(value, expected):\n if expected == \"object\":\n return isinstance(value, dict)\n if expected == \"array\":\n return isinstance(value, list)\n if expected == \"string\":\n return isinstance(value, str)\n if expected == \"boolean\":\n return isinstance(value, bool)\n if expected == \"integer\":\n return isinstance(value, int) and not isinstance(value, bool)\n if expected == \"number\":\n return (isinstance(value, int) or isinstance(value, float)) and not isinstance(value, bool)\n if expected == \"null\":\n return value is None\n return True\n\n\ndef validate_json_schema(value, schema, path=\"$\"):\n if not isinstance(schema, dict):\n return []\n\n errors = []\n expected_type = schema.get(\"type\")\n if isinstance(expected_type, list):\n if not any(json_type_matches(value, item) for item in expected_type):\n errors.append(f\"{path} has wrong type\")\n return errors\n elif isinstance(expected_type, str) and not json_type_matches(value, expected_type):\n errors.append(f\"{path} must be {expected_type}\")\n return errors\n\n if \"enum\" in schema and value not in schema[\"enum\"]:\n errors.append(f\"{path} must be one of {schema['enum']}\")\n\n if isinstance(value, dict):\n required = schema.get(\"required\") if isinstance(schema.get(\"required\"), list) else []\n for key in required:\n if key not in value:\n errors.append(f\"{path}.{key} is required\")\n\n properties = schema.get(\"properties\") if isinstance(schema.get(\"properties\"), dict) else {}\n for key, child_schema in properties.items():\n if key in value:\n errors.extend(validate_json_schema(value[key], child_schema, f\"{path}.{key}\"))\n\n if schema.get(\"additionalProperties\") is False:\n extras = sorted(set(value.keys()) - set(properties.keys()))\n for key in extras:\n errors.append(f\"{path}.{key} is not allowed\")\n\n if isinstance(value, list) and isinstance(schema.get(\"items\"), dict):\n for index, item in enumerate(value):\n errors.extend(validate_json_schema(item, schema[\"items\"], f\"{path}[{index}]\"))\n\n return errors\n\n\ndef normalize_json_content(content, mode, schema):\n if mode == \"text\":\n return content, []\n\n value, error = extract_json_value(content)\n if error:\n return content, [error]\n if mode in {\"json_object\", \"json_schema\"} and not isinstance(value, dict):\n return content, [\"response must be a JSON object\"]\n\n errors = validate_json_schema(value, schema) if schema else []\n if errors:\n return content, errors\n\n return json.dumps(value, ensure_ascii=False, separators=(\",\", \":\")), []\n\n\ndef generate_validated_completion(messages, max_tokens, temperature, mode, schema):\n contracted_messages = with_json_contract(messages, mode, schema)\n attempts = max(0, JSON_REPAIR_ATTEMPTS) + 1\n last_content = \"\"\n last_prompt_tokens = 0\n last_completion_tokens = 0\n last_errors = []\n\n for attempt in range(attempts):\n content, prompt_tokens, completion_tokens = generate_completion(\n contracted_messages,\n max_tokens,\n temperature,\n )\n normalized, errors = normalize_json_content(content, mode, schema)\n if not errors:\n return normalized, prompt_tokens, completion_tokens, []\n\n last_content = content\n last_prompt_tokens = prompt_tokens\n last_completion_tokens = completion_tokens\n last_errors = errors\n\n if attempt < attempts - 1:\n contracted_messages = contracted_messages + [\n {\"role\": \"assistant\", \"content\": content},\n {\n \"role\": \"user\",\n \"content\": (\n \"The previous response was invalid: \"\n + \"; \".join(errors[:5])\n + \". Return only a corrected JSON object.\"\n ),\n },\n ]\n\n return last_content, last_prompt_tokens, last_completion_tokens, last_errors\n\n\nclass Handler(BaseHTTPRequestHandler):\n server_version = \"TunedTensorReferenceServer/0.1\"\n\n def send_json(self, status, payload):\n body = json.dumps(payload).encode(\"utf-8\")\n self.send_response(status)\n self.send_header(\"Content-Type\", \"application/json\")\n self.send_header(\"Content-Length\", str(len(body)))\n self.send_header(\"Access-Control-Allow-Origin\", \"*\")\n self.send_header(\"Access-Control-Allow-Headers\", \"authorization, content-type\")\n self.send_header(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\")\n self.end_headers()\n self.wfile.write(body)\n\n def do_OPTIONS(self):\n self.send_json(204, {})\n\n def do_GET(self):\n if self.path == \"/health\":\n self.send_json(200, {\n \"status\": \"ok\",\n \"model\": MODEL_NAME,\n \"spec_prompt\": bool(SYSTEM_PROMPT),\n \"device\": DEVICE,\n })\n return\n self.send_json(404, {\"error\": {\"message\": \"Not found\"}})\n\n def do_POST(self):\n if self.path not in {\"/v1/chat/completions\", \"/chat/completions\"}:\n self.send_json(404, {\"error\": {\"message\": \"Not found\"}})\n return\n\n try:\n length = int(self.headers.get(\"content-length\", \"0\"))\n body = json.loads(self.rfile.read(length) or b\"{}\")\n if body.get(\"stream\"):\n self.send_json(400, {\"error\": {\"message\": \"Streaming is not supported by tt models serve yet.\"}})\n return\n\n raw_messages = body.get(\"messages\")\n if not isinstance(raw_messages, list) or not raw_messages:\n self.send_json(400, {\"error\": {\"message\": \"Request must include a non-empty messages array.\"}})\n return\n\n max_tokens = int(body.get(\"max_tokens\") or DEFAULT_MAX_TOKENS)\n temperature = float(body.get(\"temperature\") if body.get(\"temperature\") is not None else DEFAULT_TEMPERATURE)\n messages = normalize_messages(raw_messages)\n json_mode, json_schema = response_json_contract(body)\n content, prompt_tokens, completion_tokens, validation_errors = generate_validated_completion(\n messages,\n max_tokens,\n temperature,\n json_mode,\n json_schema,\n )\n if validation_errors:\n self.send_json(422, {\n \"error\": {\n \"message\": \"Model did not produce valid JSON for the requested response_format.\",\n \"details\": validation_errors,\n \"content\": content,\n }\n })\n return\n\n self.send_json(200, {\n \"id\": \"chatcmpl-\" + uuid.uuid4().hex,\n \"object\": \"chat.completion\",\n \"created\": int(time.time()),\n \"model\": body.get(\"model\") or MODEL_NAME,\n \"choices\": [{\n \"index\": 0,\n \"message\": {\"role\": \"assistant\", \"content\": content},\n \"finish_reason\": \"stop\",\n }],\n \"usage\": {\n \"prompt_tokens\": prompt_tokens,\n \"completion_tokens\": completion_tokens,\n \"total_tokens\": prompt_tokens + completion_tokens,\n },\n })\n except Exception as exc:\n self.send_json(500, {\"error\": {\"message\": str(exc)}})\n\n def log_message(self, fmt, *args):\n print(\"%s - %s\" % (self.address_string(), fmt % args))\n\n\ndef main():\n print(f\"Serving {MODEL_NAME} from {MODEL_PATH}\")\n print(f\"Listening on http://{HOST}:{PORT}/v1/chat/completions\")\n if SYSTEM_PROMPT:\n print(\"Behavior spec prompt: enabled\")\n else:\n print(\"Behavior spec prompt: disabled\")\n print(f\"Device: {DEVICE}\")\n ThreadingHTTPServer((HOST, PORT), Handler).serve_forever()\n\n\nif __name__ == \"__main__\":\n main()\n`;\n\nfunction resolveOutputPath(output: string | undefined, filename: string): string {\n if (!output) return filename;\n if (existsSync(output) && statSync(output).isDirectory()) {\n return join(output, filename);\n }\n return output;\n}\n\nfunction parseContentLength(value: string | null): number | null {\n if (!value) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;\n}\n\nfunction formatBytes(bytes: number): string {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit += 1;\n }\n const precision = unit === 0 || value >= 10 ? 0 : 1;\n return `${value.toFixed(precision)} ${units[unit]}`;\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return \"--\";\n const rounded = Math.max(1, Math.round(seconds));\n const hours = Math.floor(rounded / 3600);\n const minutes = Math.floor((rounded % 3600) / 60);\n const secs = rounded % 60;\n if (hours > 0) return `${hours}h ${minutes}m`;\n if (minutes > 0) return `${minutes}m ${secs}s`;\n return `${secs}s`;\n}\n\nfunction chunkLength(chunk: unknown): number {\n if (typeof chunk === \"string\") return Buffer.byteLength(chunk);\n if (chunk instanceof Uint8Array) return chunk.byteLength;\n return Buffer.byteLength(String(chunk));\n}\n\nfunction createDownloadProgress(totalBytes: number | null, enabled: boolean) {\n const stream = process.stderr;\n const start = Date.now();\n let lastRender = 0;\n let rendered = false;\n\n function render(downloadedBytes: number, force = false) {\n if (!enabled) return;\n const now = Date.now();\n if (!force && now - lastRender < 100 && downloadedBytes !== totalBytes) return;\n lastRender = now;\n rendered = true;\n\n const elapsedSeconds = Math.max((now - start) / 1000, 0.001);\n const rate = downloadedBytes / elapsedSeconds;\n const rateText = `${formatBytes(rate)}/s`;\n\n let line: string;\n if (totalBytes != null && totalBytes > 0) {\n const ratio = Math.min(downloadedBytes / totalBytes, 1);\n const barWidth = 24;\n const filled = Math.round(ratio * barWidth);\n const bar = \"#\".repeat(filled) + \"-\".repeat(barWidth - filled);\n const etaSeconds = rate > 0 ? (totalBytes - downloadedBytes) / rate : Number.NaN;\n line = `Downloading [${bar}] ${(ratio * 100).toFixed(1).padStart(5)}% ${formatBytes(downloadedBytes)}/${formatBytes(totalBytes)} ${rateText} ETA ${formatDuration(etaSeconds)}`;\n } else {\n line = `Downloading ${formatBytes(downloadedBytes)} ${rateText} elapsed ${formatDuration(elapsedSeconds)}`;\n }\n\n const columns = stream.columns || 120;\n stream.write(`\\r\\x1b[K${line.slice(0, Math.max(columns - 1, 0))}`);\n }\n\n function stop() {\n if (enabled && rendered) stream.write(\"\\n\");\n }\n\n return { render, stop };\n}\n\nasync function downloadUrlToFile(url: string, outputPath: string): Promise<number | null> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Download failed: ${res.status} ${res.statusText}`);\n }\n if (!res.body) {\n throw new Error(\"Download failed: response body was empty\");\n }\n\n mkdirSync(dirname(outputPath), { recursive: true });\n const file = createWriteStream(outputPath);\n const contentLength = parseContentLength(res.headers.get(\"content-length\"));\n const progress = createDownloadProgress(\n contentLength,\n !isJsonMode() && process.stderr.isTTY === true,\n );\n let downloadedBytes = 0;\n const progressStream = new Transform({\n transform(chunk, _encoding, callback) {\n downloadedBytes += chunkLength(chunk);\n progress.render(downloadedBytes);\n callback(null, chunk);\n },\n });\n\n try {\n progress.render(0, true);\n await pipeline(Readable.fromWeb(res.body), progressStream, file);\n progress.render(downloadedBytes, true);\n progress.stop();\n } catch (err) {\n progress.stop();\n try {\n unlinkSync(outputPath);\n } catch {\n // Best effort cleanup for partially written downloads.\n }\n throw err;\n }\n\n return contentLength;\n}\n\nfunction defaultCacheDir(): string {\n const root = process.env.XDG_CACHE_HOME || join(homedir(), \".cache\");\n return join(root, \"tuned-tensor\", \"models\");\n}\n\nfunction runtimeDir(cacheDir: string): string {\n return join(cacheDir, \"_runtime\");\n}\n\nfunction runtimePythonPath(cacheDir: string): string {\n const dir = runtimeDir(cacheDir);\n return process.platform === \"win32\"\n ? join(dir, \"Scripts\", \"python.exe\")\n : join(dir, \"bin\", \"python\");\n}\n\nfunction resolveServePython(cacheDir: string, explicitPython?: string): string {\n if (explicitPython) return explicitPython;\n const managedPython = runtimePythonPath(cacheDir);\n return existsSync(managedPython) ? managedPython : \"python3\";\n}\n\nfunction commandExists(command: string): boolean {\n try {\n execFileSync(command, [\"--version\"], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pythonMinorVersion(command: string): number | null {\n try {\n const out = execFileSync(\n command,\n [\"-c\", \"import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')\"],\n { encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n const [major, minor] = out.split(\".\").map((part) => Number(part));\n if (major !== 3 || !Number.isFinite(minor)) return null;\n return minor;\n } catch {\n return null;\n }\n}\n\nfunction pickRuntimePython(explicitPython?: string): string {\n const candidates = explicitPython\n ? [explicitPython]\n : [\"python3.12\", \"python3.11\", \"python3.10\", \"python3\"];\n for (const candidate of candidates) {\n if (!commandExists(candidate)) continue;\n const minor = pythonMinorVersion(candidate);\n if (minor != null && minor >= 10 && minor <= 12) return candidate;\n if (explicitPython) {\n throw new Error(\n `${candidate} is Python 3.${minor ?? \"?\"}. The local serving runtime requires Python 3.10, 3.11, or 3.12 because torch wheels may not be available for newer versions.`,\n );\n }\n }\n throw new Error(\n \"Could not find Python 3.10, 3.11, or 3.12. Install one, then run `tt models setup-runtime --python <path>`.\",\n );\n}\n\nfunction ensureServingRuntime(python: string, cacheDir: string): void {\n const check = `\nimport importlib.util\nimport json\nrequired = [\"torch\", \"transformers\", \"accelerate\", \"safetensors\"]\nmissing = [name for name in required if importlib.util.find_spec(name) is None]\nprint(json.dumps({\"missing\": missing}))\n`;\n let missing: string[];\n try {\n const out = execFileSync(python, [\"-c\", check], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n missing = JSON.parse(out).missing;\n } catch (err) {\n const suffix = python === runtimePythonPath(cacheDir)\n ? \" Re-run `tt models setup-runtime` to repair it.\"\n : \" Run `tt models setup-runtime` to create an isolated serving runtime.\";\n throw new Error(`Python serving runtime check failed for ${python}.${suffix}`);\n }\n\n if (missing.length > 0) {\n const managedPython = runtimePythonPath(cacheDir);\n const installHint = python === managedPython\n ? \"Run `tt models setup-runtime --force` to repair it.\"\n : \"Run `tt models setup-runtime` first, or pass --python <path> to a Python environment with the serving dependencies installed.\";\n throw new Error(\n `Python serving runtime is missing: ${missing.join(\", \")}. ${installHint}`,\n );\n }\n}\n\nfunction setupRuntimeCommands(python: string, venvDir: string, deps: string[]): string[][] {\n const venvPython = process.platform === \"win32\"\n ? join(venvDir, \"Scripts\", \"python.exe\")\n : join(venvDir, \"bin\", \"python\");\n return [\n [python, \"-m\", \"venv\", venvDir],\n [venvPython, \"-m\", \"pip\", \"install\", \"--upgrade\", \"pip\"],\n [venvPython, \"-m\", \"pip\", \"install\", ...deps],\n ];\n}\n\nfunction safeSegment(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"model\";\n}\n\nfunction directoryHasFiles(path: string): boolean {\n return existsSync(path) && statSync(path).isDirectory() && readdirSync(path).length > 0;\n}\n\nfunction extractArchive(archivePath: string, targetDir: string, force: boolean): string {\n if (directoryHasFiles(targetDir) && !force) return targetDir;\n if (existsSync(targetDir)) rmSync(targetDir, { recursive: true, force: true });\n mkdirSync(targetDir, { recursive: true });\n execFileSync(\"tar\", [\"-xzf\", archivePath, \"-C\", targetDir], { stdio: \"inherit\" });\n return targetDir;\n}\n\nfunction localArchiveCacheDir(archivePath: string, cacheDir: string): string {\n const resolved = resolve(archivePath);\n const digest = createHash(\"sha256\").update(resolved).digest(\"hex\").slice(0, 12);\n return join(cacheDir, `local-${safeSegment(basename(archivePath))}-${digest}`);\n}\n\nfunction buildSystemPrompt(spec: Pick<LocalSpec, \"system_prompt\" | \"guidelines\" | \"constraints\">): string {\n const parts: string[] = [];\n if (spec.system_prompt?.trim()) parts.push(spec.system_prompt.trim());\n if (Array.isArray(spec.guidelines) && spec.guidelines.length > 0) {\n parts.push(`Guidelines:\\n${spec.guidelines.map((g) => `- ${g}`).join(\"\\n\")}`);\n }\n if (Array.isArray(spec.constraints) && spec.constraints.length > 0) {\n parts.push(`Constraints:\\n${spec.constraints.map((c) => `- ${c}`).join(\"\\n\")}`);\n }\n return parts.join(\"\\n\\n\");\n}\n\nfunction findSpecPath(explicitPath: string | undefined, modelPath: string): string | null {\n const candidates = explicitPath\n ? [explicitPath]\n : [join(process.cwd(), DEFAULT_SPEC_FILE), join(modelPath, DEFAULT_SPEC_FILE)];\n for (const candidate of candidates) {\n const resolved = resolve(candidate);\n if (existsSync(resolved) && statSync(resolved).isFile()) return resolved;\n }\n return null;\n}\n\nfunction loadSystemPromptFromSpec(specPath: string): string {\n const spec = JSON.parse(readFileSync(specPath, \"utf8\")) as LocalSpec;\n return buildSystemPrompt(spec);\n}\n\nfunction loadJsonSchemaForServe(schemaPath: string): string {\n const resolved = resolve(schemaPath);\n if (!existsSync(resolved) || !statSync(resolved).isFile()) {\n throw new Error(`JSON schema file not found: ${schemaPath}`);\n }\n\n try {\n const schema = JSON.parse(readFileSync(resolved, \"utf8\"));\n return JSON.stringify(schema);\n } catch (err) {\n throw new Error(`JSON schema file is not valid JSON: ${schemaPath}`);\n }\n}\n\nfunction writeReferenceServerScript(cacheDir: string): string {\n const scriptDir = join(cacheDir, \"_server\");\n mkdirSync(scriptDir, { recursive: true });\n const scriptPath = join(scriptDir, \"openai_reference_server.py\");\n writeFileSync(scriptPath, REFERENCE_SERVER_SCRIPT, \"utf8\");\n return scriptPath;\n}\n\nasync function resolveServeTarget(\n target: string,\n opts: ClientOpts,\n cacheDir: string,\n forceDownload: boolean,\n): Promise<ServeTarget> {\n if (existsSync(target)) {\n const resolved = resolve(target);\n const stats = statSync(resolved);\n if (stats.isDirectory()) {\n return {\n modelPath: resolved,\n modelName: basename(resolved),\n source: \"local-directory\",\n };\n }\n if (stats.isFile() && (resolved.endsWith(\".tar.gz\") || resolved.endsWith(\".tgz\"))) {\n const extractDir = join(localArchiveCacheDir(resolved, cacheDir), \"model\");\n return {\n modelPath: extractArchive(resolved, extractDir, forceDownload),\n modelName: basename(resolved).replace(/\\.t(ar\\.)?gz$/, \"\"),\n source: \"local-archive\",\n };\n }\n throw new Error(`Unsupported model path: ${target}. Use a model directory or .tar.gz artifact.`);\n }\n\n const fullId = await resolveModelId(target, opts);\n const { data: model } = await get<Model>(`/models/${fullId}`, undefined, opts);\n const { data } = await get<ModelDownload>(`/models/${fullId}/download`, undefined, opts);\n const modelCacheDir = join(cacheDir, fullId);\n const archivePath = join(modelCacheDir, data.filename);\n const extractDir = join(modelCacheDir, \"model\");\n\n if (!existsSync(archivePath) || forceDownload) {\n await downloadUrlToFile(data.url, archivePath);\n }\n extractArchive(archivePath, extractDir, forceDownload);\n\n return {\n modelPath: extractDir,\n modelName: model.name || fullId,\n source: \"downloaded-model\",\n modelId: fullId,\n };\n}\n\nfunction quoteCommandPart(part: string): string {\n if (/^[a-zA-Z0-9_./:=@-]+$/.test(part)) return part;\n return `'${part.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction parseServeInteger(value: string | number, label: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`${label} must be a non-negative integer.`);\n }\n return parsed;\n}\n\nfunction printServeCommand(\n command: string,\n args: string[],\n env: Record<string, string>,\n managed?: {\n enabled: boolean;\n host: string;\n port: number;\n idle_timeout_seconds: number;\n restart_after_requests: number;\n gate_field: string;\n log_file?: string;\n },\n) {\n const envKeys = Object.keys(env).sort();\n const commandLine = [command, ...args].map(quoteCommandPart).join(\" \");\n if (isJsonMode()) {\n return printJson({ command, args, env_keys: envKeys, command_line: commandLine, managed });\n }\n const fields: [string, string | undefined][] = [\n [\"Command\", commandLine],\n [\"Environment\", envKeys.join(\", \")],\n ];\n if (managed?.enabled) {\n fields.push(\n [\"Managed\", \"enabled\"],\n [\"Wrapper\", `http://${managed.host}:${managed.port}`],\n [\"Idle timeout\", `${managed.idle_timeout_seconds}s`],\n [\"Restart after\", managed.restart_after_requests === 0 ? \"disabled\" : `${managed.restart_after_requests} requests`],\n [\"Gate field\", managed.gate_field],\n [\"Log file\", managed.log_file],\n );\n }\n printDetail(fields);\n}\n\nexport function registerModelsCommands(parent: Command) {\n const models = parent.command(\"models\").description(\"Manage fine-tuned models\");\n\n models\n .command(\"base\")\n .description(\"List supported base models\")\n .action(async () => {\n const data = SUPPORTED_BASE_MODELS.map((model) => ({\n id: model,\n name: model.split(\"/\").pop() || model,\n type: \"base\" as const,\n }));\n\n if (isJsonMode()) return printJson({ data });\n\n printTable(\n [\"ID\", \"Name\", \"Type\"],\n data.map((m) => [m.id, m.name, m.type]),\n );\n });\n\n models\n .command(\"list\")\n .description(\"List fine-tuned models\")\n .option(\"-p, --page <n>\", \"Page number\", \"1\")\n .option(\"--per-page <n>\", \"Results per page\", \"20\")\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const { data, meta } = await get<Model[]>(\n \"/models\",\n { page: cmdOpts.page, per_page: cmdOpts.perPage },\n opts,\n );\n\n if (isJsonMode()) return printJson({ data, meta });\n\n printTable(\n [\"ID\", \"Name\", \"Base Model\", \"Provider\", \"Created\"],\n data.map((m) => [\n shortId(m.id),\n truncate(m.name, 30),\n m.base_model.split(\"/\").pop() || m.base_model,\n m.provider,\n formatDate(m.created_at),\n ]),\n meta,\n );\n });\n\n models\n .command(\"get\")\n .description(\"Show model details\")\n .argument(\"<id>\", \"Model ID (full UUID or 4+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveModelId(id, opts);\n const { data } = await get<Model>(`/models/${fullId}`, undefined, opts);\n\n if (isJsonMode()) return printJson(data);\n\n printDetail([\n [\"ID\", data.id],\n [\"Name\", data.name],\n [\"Base Model\", data.base_model],\n [\"Provider\", data.provider],\n [\"Hosted Model\", data.provider_model_id],\n [\"Description\", data.description ?? undefined],\n [\"Created\", formatDate(data.created_at)],\n ]);\n });\n\n models\n .command(\"download\")\n .description(\"Download a fine-tuned model artifact\")\n .argument(\"<id>\", \"Model ID (full UUID or 4+ char prefix)\")\n .option(\"-o, --output <path>\", \"Output file or directory\")\n .option(\"-f, --force\", \"Overwrite the output file if it already exists\")\n .action(async (id: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveModelId(id, opts);\n const { data } = await get<ModelDownload>(\n `/models/${fullId}/download`,\n undefined,\n opts,\n );\n\n const outputPath = resolveOutputPath(cmdOpts.output, data.filename);\n if (existsSync(outputPath) && !cmdOpts.force) {\n throw new Error(`Output file already exists: ${outputPath}. Use --force to overwrite.`);\n }\n\n const bytes = await downloadUrlToFile(data.url, outputPath);\n\n if (isJsonMode()) {\n return printJson({\n id: fullId,\n output_path: outputPath,\n filename: data.filename,\n bytes,\n expires_at: data.expires_at,\n });\n }\n\n const size = bytes == null ? \"\" : ` (${bytes} bytes)`;\n printSuccess(`Model downloaded to ${outputPath}${size}`);\n });\n\n models\n .command(\"setup-runtime\")\n .description(\"Install an isolated Python runtime for local model serving\")\n .option(\"--python <path>\", \"Python 3.10-3.12 executable to create the runtime\")\n .option(\"--cache-dir <path>\", \"Cache directory for the managed runtime\")\n .option(\"-f, --force\", \"Recreate the runtime if it already exists\")\n .option(\"--print-command\", \"Print the setup commands without running them\")\n .action(async (cmdOpts) => {\n const cacheDir = resolve(cmdOpts.cacheDir || defaultCacheDir());\n const venvDir = runtimeDir(cacheDir);\n const venvPython = runtimePythonPath(cacheDir);\n const python = pickRuntimePython(cmdOpts.python);\n const deps = [\"torch\", \"transformers\", \"accelerate\", \"safetensors\"];\n const commands = setupRuntimeCommands(python, venvDir, deps);\n\n if (cmdOpts.printCommand) {\n const commandLines = commands.map((cmd) => cmd.map(quoteCommandPart).join(\" \"));\n if (isJsonMode()) {\n return printJson({\n python,\n runtime_dir: venvDir,\n runtime_python: venvPython,\n commands: commandLines,\n });\n }\n printDetail([\n [\"Python\", python],\n [\"Runtime\", venvDir],\n [\"Commands\", commandLines.join(\"\\n\")],\n ]);\n return;\n }\n\n if (existsSync(venvDir) && cmdOpts.force) {\n rmSync(venvDir, { recursive: true, force: true });\n }\n if (!existsSync(venvPython)) {\n mkdirSync(cacheDir, { recursive: true });\n execFileSync(commands[0][0], commands[0].slice(1), { stdio: \"inherit\" });\n }\n\n execFileSync(commands[1][0], commands[1].slice(1), { stdio: \"inherit\" });\n execFileSync(commands[2][0], commands[2].slice(1), { stdio: \"inherit\" });\n ensureServingRuntime(venvPython, cacheDir);\n\n if (isJsonMode()) {\n return printJson({\n runtime_dir: venvDir,\n runtime_python: venvPython,\n installed: true,\n dependencies: deps,\n });\n }\n\n printSuccess(`Serving runtime ready at ${venvDir}`);\n console.log(`Use it with: tt models serve <model-id> --spec ${DEFAULT_SPEC_FILE}`);\n });\n\n models\n .command(\"serve\")\n .description(\"Serve a downloaded model with an OpenAI-compatible local API\")\n .argument(\"<target>\", \"Model ID/prefix, model directory, or .tar.gz artifact\")\n .option(\"--spec <path>\", \"Behavior spec JSON to apply as the default system prompt\")\n .option(\"--no-spec-prompt\", \"Do not auto-apply a behavior spec system prompt\")\n .option(\"--host <host>\", \"Host to bind\", \"127.0.0.1\")\n .option(\"--port <port>\", \"Port to bind\", \"8000\")\n .option(\"--python <path>\", \"Python executable\")\n .option(\"--cache-dir <path>\", \"Cache directory for downloaded/extracted models\")\n .option(\"--device <device>\", \"Inference device: auto, cpu, cuda, or mps\", \"auto\")\n .option(\"--force-download\", \"Re-download and re-extract model artifacts\")\n .option(\"--max-tokens <n>\", \"Default max completion tokens\", \"512\")\n .option(\"--temperature <n>\", \"Default sampling temperature\", \"0.7\")\n .option(\"--json-schema <path>\", \"JSON Schema file to enforce by default for chat completions\")\n .option(\"--json-repair-attempts <n>\", \"Number of JSON/schema repair retries\", \"1\")\n .option(\"--trust-remote-code\", \"Pass trust_remote_code=True to transformers\")\n .option(\"--managed\", \"Run a local lifecycle manager in front of the model server\")\n .option(\"--idle-timeout <seconds>\", \"Managed mode idle timeout before stopping the model\", \"300\")\n .option(\"--restart-after-requests <n>\", \"Managed mode restart threshold; 0 disables request-count restarts\", \"100\")\n .option(\"--gate-field <field>\", \"Response JSON field to log as the managed serving gate result\", \"should_process\")\n .option(\"--log-file <path>\", \"Write managed serving JSONL request logs to a file\")\n .option(\"--print-command\", \"Print the underlying Python command without starting it\")\n .action(async (target: string, cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const cacheDir = resolve(cmdOpts.cacheDir || defaultCacheDir());\n mkdirSync(cacheDir, { recursive: true });\n const python = resolveServePython(cacheDir, cmdOpts.python);\n if (!cmdOpts.printCommand) ensureServingRuntime(python, cacheDir);\n\n const serveTarget = await resolveServeTarget(\n target,\n opts,\n cacheDir,\n Boolean(cmdOpts.forceDownload),\n );\n const serverScript = writeReferenceServerScript(cacheDir);\n\n let specPath: string | null = null;\n let systemPrompt = \"\";\n if (cmdOpts.specPrompt !== false) {\n specPath = findSpecPath(cmdOpts.spec, serveTarget.modelPath);\n if (cmdOpts.spec && !specPath) {\n throw new Error(`Spec file not found: ${cmdOpts.spec}`);\n }\n if (specPath) {\n systemPrompt = loadSystemPromptFromSpec(specPath);\n }\n }\n\n const env: Record<string, string> = {\n TT_MODEL_PATH: serveTarget.modelPath,\n TT_MODEL_NAME: serveTarget.modelName,\n TT_HOST: cmdOpts.host,\n TT_PORT: String(cmdOpts.port),\n TT_MAX_TOKENS: String(cmdOpts.maxTokens),\n TT_TEMPERATURE: String(cmdOpts.temperature),\n TT_JSON_REPAIR_ATTEMPTS: String(cmdOpts.jsonRepairAttempts),\n TT_TRUST_REMOTE_CODE: cmdOpts.trustRemoteCode ? \"true\" : \"false\",\n TT_DEVICE: String(cmdOpts.device),\n };\n if (systemPrompt) env.TT_SYSTEM_PROMPT = systemPrompt;\n if (cmdOpts.jsonSchema) env.TT_JSON_SCHEMA = loadJsonSchemaForServe(cmdOpts.jsonSchema);\n\n const args = [serverScript];\n const idleTimeoutSeconds = parseServeInteger(cmdOpts.idleTimeout, \"--idle-timeout\");\n const restartAfterRequests = parseServeInteger(\n cmdOpts.restartAfterRequests,\n \"--restart-after-requests\",\n );\n const publicPort = parseServeInteger(cmdOpts.port, \"--port\");\n const managedConfig = cmdOpts.managed\n ? {\n enabled: true,\n host: String(cmdOpts.host),\n port: publicPort,\n idle_timeout_seconds: idleTimeoutSeconds,\n restart_after_requests: restartAfterRequests,\n gate_field: String(cmdOpts.gateField),\n log_file: cmdOpts.logFile ? resolve(cmdOpts.logFile) : undefined,\n }\n : undefined;\n if (cmdOpts.printCommand) return printServeCommand(python, args, env, managedConfig);\n\n if (!isJsonMode()) {\n printSuccess(\n cmdOpts.managed\n ? `Serving ${serveTarget.modelName} through a managed local wrapper`\n : `Serving ${serveTarget.modelName} from ${serveTarget.modelPath}`,\n );\n if (systemPrompt && specPath) {\n printSuccess(`Behavior spec prompt loaded from ${specPath}`);\n } else if (cmdOpts.specPrompt !== false) {\n printWarning(\n `No ${DEFAULT_SPEC_FILE} found. Pass --spec <path> to preserve the behavior prompt.`,\n );\n }\n console.log(`OpenAI-compatible endpoint: http://${cmdOpts.host}:${cmdOpts.port}/v1/chat/completions`);\n console.log(`Health check: http://${cmdOpts.host}:${cmdOpts.port}/health`);\n console.log(`Python runtime: ${python}`);\n if (cmdOpts.managed) {\n console.log(`Managed idle timeout: ${idleTimeoutSeconds}s`);\n console.log(\n `Managed restart threshold: ${\n restartAfterRequests === 0 ? \"disabled\" : `${restartAfterRequests} requests`\n }`,\n );\n console.log(`Managed gate field: ${cmdOpts.gateField}`);\n }\n }\n\n if (cmdOpts.managed) {\n await startManagedModelServer({\n publicHost: String(cmdOpts.host),\n publicPort,\n python,\n args,\n env,\n modelName: serveTarget.modelName,\n modelPath: serveTarget.modelPath,\n idleTimeoutSeconds,\n restartAfterRequests,\n gateField: String(cmdOpts.gateField),\n logFile: cmdOpts.logFile ? resolve(cmdOpts.logFile) : undefined,\n });\n return;\n }\n\n await new Promise<void>((resolvePromise, reject) => {\n const child = spawn(python, args, {\n stdio: \"inherit\",\n env: { ...process.env, ...env },\n });\n child.on(\"error\", reject);\n child.on(\"exit\", (code, signal) => {\n if (code === 0) return resolvePromise();\n reject(new Error(`Model server exited with ${signal ?? `code ${code}`}`));\n });\n });\n });\n\n models\n .command(\"delete\")\n .description(\"Delete a model\")\n .argument(\"<id>\", \"Model ID (full UUID or 4+ char prefix)\")\n .action(async (id: string) => {\n const opts = parent.opts() as ClientOpts;\n const fullId = await resolveModelId(id, opts);\n await del(`/models/${fullId}`, opts);\n\n if (isJsonMode()) return printJson({ id: fullId, deleted: true });\n printSuccess(`Model deleted: ${shortId(fullId)}`);\n });\n}\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { printSuccess, printError, printWarning } from \"../output.js\";\nimport type { LocalSpec } from \"../eval/types.js\";\nimport { canonicalizeBaseModel } from \"../base-models.js\";\n\nconst DEFAULT_SPEC_FILE = \"tunedtensor.json\";\n\nconst SCAFFOLD: LocalSpec = {\n name: \"My Agent\",\n description: \"\",\n base_model: \"Qwen/Qwen3.5-2B\",\n system_prompt: \"You are a helpful assistant.\",\n guidelines: [],\n constraints: [],\n examples: [\n { input: \"Hello\", output: \"Hi! How can I help you today?\" },\n ],\n eval_cases: [],\n};\n\nexport function registerInitCommand(parent: Command) {\n parent\n .command(\"init\")\n .description(\"Create a local behaviour spec file\")\n .option(\"-n, --name <name>\", \"Spec name\")\n .option(\"--model <model>\", \"Base model ID\")\n .option(\"-f, --file <path>\", \"Output file path\", DEFAULT_SPEC_FILE)\n .action(async (cmdOpts) => {\n const filePath = resolve(cmdOpts.file);\n\n if (existsSync(filePath)) {\n printWarning(`${cmdOpts.file} already exists. Use tt eval to validate it or edit it directly.`);\n return;\n }\n\n const spec: LocalSpec = { ...SCAFFOLD };\n if (cmdOpts.name) spec.name = cmdOpts.name;\n if (cmdOpts.model) spec.base_model = canonicalizeBaseModel(cmdOpts.model);\n\n writeFileSync(filePath, JSON.stringify(spec, null, 2) + \"\\n\");\n printSuccess(`Created ${cmdOpts.file}`);\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Edit the spec: system_prompt, guidelines, examples\");\n console.log(\" 2. Validate spec: tt eval\");\n console.log(\" 3. Push to remote: tt push\");\n });\n}\n\nexport function loadSpec(filePath?: string): LocalSpec {\n const resolved = resolve(filePath || DEFAULT_SPEC_FILE);\n if (!existsSync(resolved)) {\n printError(\n `Spec file not found: ${filePath || DEFAULT_SPEC_FILE}\\nRun \\`tt init\\` to create one.`,\n );\n process.exit(1);\n }\n\n const raw = JSON.parse(readFileSync(resolved, \"utf-8\"));\n return raw as LocalSpec;\n}\n\nexport { DEFAULT_SPEC_FILE };\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { appendFileSync, mkdirSync } from \"node:fs\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { dirname } from \"node:path\";\n\ntype SpawnModelServer = (\n command: string,\n args: string[],\n options: { env: NodeJS.ProcessEnv; stdio: \"inherit\" },\n) => ChildProcess;\n\nexport interface ManagedServeOptions {\n publicHost: string;\n publicPort: number;\n python: string;\n args: string[];\n env: Record<string, string>;\n modelName: string;\n modelPath: string;\n idleTimeoutSeconds: number;\n restartAfterRequests: number;\n gateField: string;\n logFile?: string;\n spawnModelServer?: SpawnModelServer;\n logRecord?: (record: ManagedServeLogRecord) => void;\n}\n\nexport interface ManagedServeLogRecord {\n timestamp: string;\n request_id: string;\n route: string;\n model_target: { name: string; path: string };\n request_bytes: number;\n response_status: number;\n latency_ms: number;\n queued_ms: number;\n prompt_tokens: number | null;\n completion_tokens: number | null;\n total_tokens: number | null;\n schema_validity: boolean | null;\n gate_field: string;\n gate_result: unknown;\n restart_count: number;\n error_summary: string | null;\n}\n\ninterface ForwardResult {\n status: number;\n headers: Headers;\n body: string;\n parsed: unknown;\n}\n\nconst COMPLETION_ROUTES = new Set([\"/v1/chat/completions\", \"/chat/completions\"]);\n\nfunction parsePositiveInteger(value: number, fallback: number): number {\n return Number.isInteger(value) && value >= 0 ? value : fallback;\n}\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction readRequestBody(req: IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => chunks.push(Buffer.from(chunk)));\n req.on(\"end\", () => resolve(Buffer.concat(chunks)));\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, payload: unknown) {\n const body = Buffer.from(JSON.stringify(payload), \"utf8\");\n res.writeHead(status, {\n \"content-type\": \"application/json\",\n \"content-length\": String(body.byteLength),\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-headers\": \"authorization, content-type\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n });\n res.end(body);\n}\n\nfunction copyResponseHeaders(headers: Headers): Record<string, string> {\n const copied: Record<string, string> = {\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-headers\": \"authorization, content-type\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n };\n const contentType = headers.get(\"content-type\");\n if (contentType) copied[\"content-type\"] = contentType;\n return copied;\n}\n\nfunction tryJsonParse(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction readPath(value: unknown, path: string): unknown {\n if (!path) return null;\n let current = value;\n for (const part of path.split(\".\")) {\n if (!part) return null;\n if (!current || typeof current !== \"object\" || !(part in current)) return null;\n current = (current as Record<string, unknown>)[part];\n }\n return current ?? null;\n}\n\nfunction extractAssistantContent(response: unknown): string | null {\n if (!response || typeof response !== \"object\") return null;\n const choices = (response as { choices?: unknown }).choices;\n if (!Array.isArray(choices) || choices.length === 0) return null;\n const first = choices[0];\n if (!first || typeof first !== \"object\") return null;\n const message = (first as { message?: unknown }).message;\n if (!message || typeof message !== \"object\") return null;\n const content = (message as { content?: unknown }).content;\n return typeof content === \"string\" ? content : null;\n}\n\nfunction usageNumber(response: unknown, key: string): number | null {\n if (!response || typeof response !== \"object\") return null;\n const usage = (response as { usage?: unknown }).usage;\n if (!usage || typeof usage !== \"object\") return null;\n const value = (usage as Record<string, unknown>)[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction errorSummary(response: unknown, fallback: string | null): string | null {\n if (!response || typeof response !== \"object\") return fallback;\n const error = (response as { error?: unknown }).error;\n if (!error || typeof error !== \"object\") return fallback;\n const message = (error as { message?: unknown }).message;\n return typeof message === \"string\" ? message : fallback;\n}\n\nasync function allocatePort(host: string): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createNetServer();\n server.on(\"error\", reject);\n server.listen(0, host, () => {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close(() => reject(new Error(\"Could not allocate an internal port\")));\n return;\n }\n const port = address.port;\n server.close(() => resolve(port));\n });\n });\n}\n\nexport class ManagedModelServer {\n private readonly spawnModelServer: SpawnModelServer;\n private readonly idleTimeoutMs: number;\n private readonly restartAfterRequests: number;\n private readonly logRecordOverride?: (record: ManagedServeLogRecord) => void;\n private server: Server | null = null;\n private child: ChildProcess | null = null;\n private internalPort: number | null = null;\n private queue: Promise<void> = Promise.resolve();\n private idleTimer: NodeJS.Timeout | null = null;\n private activeRequests = 0;\n private queuedRequests = 0;\n private requestsSinceStart = 0;\n private restartCount = 0;\n private stoppingChild = false;\n\n constructor(private readonly options: ManagedServeOptions) {\n this.spawnModelServer = options.spawnModelServer ?? spawn;\n this.idleTimeoutMs = parsePositiveInteger(options.idleTimeoutSeconds, 300) * 1000;\n this.restartAfterRequests = parsePositiveInteger(options.restartAfterRequests, 100);\n this.logRecordOverride = options.logRecord;\n }\n\n get isModelRunning(): boolean {\n return this.child != null;\n }\n\n get restarts(): number {\n return this.restartCount;\n }\n\n async start(): Promise<void> {\n if (this.server) return;\n this.internalPort = await allocatePort(\"127.0.0.1\");\n this.server = createServer((req, res) => {\n this.handle(req, res).catch((err) => {\n sendJson(res, 500, { error: { message: err instanceof Error ? err.message : String(err) } });\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n this.server?.once(\"error\", reject);\n this.server?.listen(this.options.publicPort, this.options.publicHost, () => {\n this.server?.off(\"error\", reject);\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n this.clearIdleTimer();\n await this.stopChild();\n if (!this.server) return;\n const server = this.server;\n this.server = null;\n await new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n });\n }\n\n async run(): Promise<void> {\n await this.start();\n await new Promise<void>((resolve, reject) => {\n this.server?.once(\"error\", reject);\n this.server?.once(\"close\", resolve);\n });\n }\n\n private async handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const route = new URL(req.url || \"/\", \"http://localhost\").pathname;\n if (req.method === \"OPTIONS\") {\n sendJson(res, 204, {});\n return;\n }\n\n if (req.method === \"GET\" && route === \"/health\") {\n await this.handleHealth(res);\n return;\n }\n\n if (req.method === \"POST\" && COMPLETION_ROUTES.has(route)) {\n const receivedAt = Date.now();\n const body = await readRequestBody(req);\n this.queuedRequests += 1;\n const work = this.queue.then(() => this.processGeneration(route, body, res, receivedAt));\n this.queue = work.catch(() => undefined);\n try {\n await work;\n } finally {\n this.queuedRequests -= 1;\n this.scheduleIdleStop();\n }\n return;\n }\n\n sendJson(res, 404, { error: { message: \"Not found\" } });\n }\n\n private async handleHealth(res: ServerResponse): Promise<void> {\n if (!this.child) {\n sendJson(res, 200, {\n status: \"ok\",\n wrapper: \"ok\",\n model_status: \"cold\",\n restart_count: this.restartCount,\n });\n return;\n }\n\n if (this.activeRequests > 0 || this.queuedRequests > 0) {\n sendJson(res, 200, {\n status: \"ok\",\n wrapper: \"ok\",\n model_status: \"busy\",\n restart_count: this.restartCount,\n });\n return;\n }\n\n const health = await this.checkHealth();\n if (health.ok) {\n sendJson(res, 200, {\n status: \"ok\",\n wrapper: \"ok\",\n model_status: \"warm\",\n restart_count: this.restartCount,\n model: health.body,\n });\n return;\n }\n\n await this.restartChild();\n sendJson(res, 200, {\n status: \"ok\",\n wrapper: \"ok\",\n model_status: \"restarted\",\n restart_count: this.restartCount,\n });\n }\n\n private async processGeneration(\n route: string,\n body: Buffer,\n res: ServerResponse,\n receivedAt: number,\n ): Promise<void> {\n const requestId = `ttreq-${randomUUID()}`;\n const startedAt = Date.now();\n const queuedMs = startedAt - receivedAt;\n this.activeRequests += 1;\n this.clearIdleTimer();\n\n let status = 500;\n let parsed: unknown = null;\n let failure: string | null = null;\n\n try {\n await this.ensureModelReady();\n const forwarded = await this.forwardGeneration(route, body);\n status = forwarded.status;\n parsed = forwarded.parsed;\n res.writeHead(status, {\n ...copyResponseHeaders(forwarded.headers),\n \"content-length\": String(Buffer.byteLength(forwarded.body)),\n });\n res.end(forwarded.body);\n this.requestsSinceStart += 1;\n failure = errorSummary(parsed, null);\n } catch (err) {\n failure = err instanceof Error ? err.message : String(err);\n status = 502;\n sendJson(res, status, { error: { message: failure } });\n } finally {\n const finishedAt = Date.now();\n this.activeRequests -= 1;\n this.writeLog({\n timestamp: new Date(finishedAt).toISOString(),\n request_id: requestId,\n route,\n model_target: {\n name: this.options.modelName,\n path: this.options.modelPath,\n },\n request_bytes: body.byteLength,\n response_status: status,\n latency_ms: finishedAt - receivedAt,\n queued_ms: queuedMs,\n prompt_tokens: usageNumber(parsed, \"prompt_tokens\"),\n completion_tokens: usageNumber(parsed, \"completion_tokens\"),\n total_tokens: usageNumber(parsed, \"total_tokens\"),\n schema_validity: status < 400 ? true : status === 422 ? false : null,\n gate_field: this.options.gateField,\n gate_result: this.extractGateResult(parsed),\n restart_count: this.restartCount,\n error_summary: failure,\n });\n }\n }\n\n private async ensureModelReady(): Promise<void> {\n if (this.child && this.restartAfterRequests > 0 && this.requestsSinceStart >= this.restartAfterRequests) {\n await this.restartChild();\n return;\n }\n\n if (this.child) {\n const health = await this.checkHealth();\n if (health.ok) return;\n await this.restartChild();\n return;\n }\n\n await this.startChild();\n }\n\n private async startChild(): Promise<void> {\n if (this.internalPort == null) {\n this.internalPort = await allocatePort(\"127.0.0.1\");\n }\n\n const env = {\n ...process.env,\n ...this.options.env,\n TT_HOST: \"127.0.0.1\",\n TT_PORT: String(this.internalPort),\n };\n this.child = this.spawnModelServer(this.options.python, this.options.args, {\n stdio: \"inherit\",\n env,\n });\n this.child.once(\"exit\", () => {\n if (!this.stoppingChild) {\n this.child = null;\n this.requestsSinceStart = 0;\n }\n });\n try {\n await this.waitForHealth();\n this.scheduleIdleStop();\n } catch (err) {\n await this.stopChild();\n throw err;\n }\n }\n\n private async restartChild(): Promise<void> {\n await this.stopChild();\n this.restartCount += 1;\n this.requestsSinceStart = 0;\n await this.startChild();\n }\n\n private async stopChild(): Promise<void> {\n if (!this.child) return;\n const child = this.child;\n this.child = null;\n this.requestsSinceStart = 0;\n this.stoppingChild = true;\n try {\n child.kill(\"SIGTERM\");\n await Promise.race([\n new Promise<void>((resolve) => child.once(\"exit\", () => resolve())),\n sleep(5000).then(() => {\n if (child.exitCode == null && child.signalCode == null) child.kill(\"SIGKILL\");\n }),\n ]);\n } finally {\n this.stoppingChild = false;\n }\n }\n\n private async checkHealth(): Promise<{ ok: boolean; body: unknown }> {\n if (this.internalPort == null) return { ok: false, body: null };\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n try {\n const response = await fetch(`http://127.0.0.1:${this.internalPort}/health`, {\n signal: controller.signal,\n });\n const text = await response.text();\n return { ok: response.ok, body: tryJsonParse(text) };\n } catch {\n return { ok: false, body: null };\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async waitForHealth(): Promise<void> {\n const deadline = Date.now() + 120_000;\n while (Date.now() < deadline) {\n const health = await this.checkHealth();\n if (health.ok) return;\n if (!this.child) break;\n await sleep(50);\n }\n throw new Error(\"Model server did not become healthy within 120 seconds\");\n }\n\n private async forwardGeneration(route: string, body: Buffer): Promise<ForwardResult> {\n if (this.internalPort == null) throw new Error(\"Internal server port is not allocated\");\n const response = await fetch(`http://127.0.0.1:${this.internalPort}${route}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body,\n });\n const text = await response.text();\n return {\n status: response.status,\n headers: response.headers,\n body: text,\n parsed: tryJsonParse(text),\n };\n }\n\n private extractGateResult(response: unknown): unknown {\n const content = extractAssistantContent(response);\n if (!content) return null;\n const parsedContent = tryJsonParse(content);\n return readPath(parsedContent, this.options.gateField);\n }\n\n private scheduleIdleStop() {\n this.clearIdleTimer();\n if (!this.child || this.activeRequests > 0 || this.queuedRequests > 0) return;\n this.idleTimer = setTimeout(() => {\n this.stopChild().catch((err) => {\n this.writeDiagnosticError(err);\n });\n }, this.idleTimeoutMs);\n }\n\n private clearIdleTimer() {\n if (!this.idleTimer) return;\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n\n private writeLog(record: ManagedServeLogRecord) {\n if (this.logRecordOverride) {\n this.logRecordOverride(record);\n return;\n }\n const line = `${JSON.stringify(record)}\\n`;\n if (this.options.logFile) {\n mkdirSync(dirname(this.options.logFile), { recursive: true });\n appendFileSync(this.options.logFile, line, \"utf8\");\n return;\n }\n process.stderr.write(line);\n }\n\n private writeDiagnosticError(err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`${JSON.stringify({ timestamp: new Date().toISOString(), error: message })}\\n`);\n }\n}\n\nexport async function startManagedModelServer(options: ManagedServeOptions): Promise<void> {\n const server = new ManagedModelServer(options);\n const stop = () => {\n server.stop().catch(() => undefined);\n };\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n try {\n await server.run();\n } finally {\n process.off(\"SIGINT\", stop);\n process.off(\"SIGTERM\", stop);\n await server.stop();\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { get, type ClientOpts } from \"../client.js\";\nimport {\n printDetail,\n printJson,\n printTable,\n isJsonMode,\n formatDate,\n formatStatus,\n shortId,\n} from \"../output.js\";\n\ninterface BalanceResponse {\n balance_cents: number;\n reserved_cents: number;\n available_cents: number;\n lifetime_topup_cents: number;\n}\n\ntype CreditKind =\n | \"signup_bonus\"\n | \"topup\"\n | \"debit_run\"\n | \"debit_autotune\"\n | \"refund\"\n | \"adjustment\";\n\ninterface LedgerRow {\n id: string;\n kind: CreditKind;\n amount_cents: number;\n balance_after_cents: number;\n reference_id: string | null;\n created_at: string;\n}\n\nconst KIND_LABELS: Record<CreditKind, string> = {\n signup_bonus: \"Signup bonus\",\n topup: \"Top-up\",\n debit_run: \"Run\",\n debit_autotune: \"Auto-tune\",\n refund: \"Refund\",\n adjustment: \"Adjustment\",\n};\n\nfunction formatCents(cents: number): string {\n const sign = cents < 0 ? \"-\" : \"\";\n const abs = Math.abs(cents);\n return `${sign}$${(abs / 100).toFixed(2)}`;\n}\n\nfunction formatSigned(cents: number): string {\n if (cents > 0) return chalk.green(`+${formatCents(cents)}`);\n if (cents < 0) return chalk.red(formatCents(cents));\n return formatCents(cents);\n}\n\nexport function registerBalanceCommands(parent: Command) {\n parent\n .command(\"balance\")\n .description(\"Show credit balance and recent transactions\")\n .option(\"-n, --limit <n>\", \"Number of transactions to show (default 10)\", \"10\")\n .action(async (options) => {\n const opts = parent.opts() as ClientOpts;\n const limit = Number(options.limit) || 10;\n\n const [{ data: balance }, { data: transactions }] = await Promise.all([\n get<BalanceResponse>(\"/billing/balance\", undefined, opts),\n get<LedgerRow[]>(\"/billing/transactions\", { per_page: limit }, opts),\n ]);\n\n if (isJsonMode()) {\n return printJson({ balance, transactions });\n }\n\n const lowBalance = balance.balance_cents < 100;\n const balanceLine = lowBalance\n ? chalk.red(formatCents(balance.balance_cents)) + chalk.dim(\" (low)\")\n : chalk.bold.green(formatCents(balance.balance_cents));\n\n printDetail([\n [\"Credits\", balanceLine],\n [\"Lifetime top-ups\", formatCents(balance.lifetime_topup_cents)],\n ]);\n\n if (transactions && transactions.length > 0) {\n console.log(`\\n${chalk.bold(\"Recent transactions\")}`);\n printTable(\n [\"Date\", \"Type\", \"Amount\", \"Balance\", \"Reference\"],\n transactions.map((row) => [\n formatDate(row.created_at),\n KIND_LABELS[row.kind] ?? row.kind,\n formatSigned(row.amount_cents),\n formatCents(row.balance_after_cents),\n row.reference_id ? shortId(row.reference_id) : chalk.dim(\"—\"),\n ])\n );\n } else {\n console.log(\n `\\n${chalk.dim(\"No transactions yet — run `tt topup` to add credits.\")}`\n );\n }\n\n if (lowBalance) {\n console.log(\n `\\n${formatStatus(\"preparing\")} ${chalk.yellow(\n \"Run `tt topup` to add more credits before starting a run.\"\n )}`\n );\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport open from \"open\";\nimport { post, type ClientOpts } from \"../client.js\";\nimport { printJson, isJsonMode, printSuccess } from \"../output.js\";\n\ninterface TopupResponse {\n checkout_url: string;\n session_id: string;\n}\n\nconst PRESETS_USD = [10, 25, 50, 100];\nconst MIN_USD = 5;\nconst MAX_USD = 10000;\n\nfunction parseAmount(input: string | undefined): number | null {\n if (!input) return null;\n const cleaned = input.replace(/^\\$/, \"\").trim();\n const num = Number(cleaned);\n if (!Number.isFinite(num) || num <= 0) return null;\n return num;\n}\n\nasync function readLine(prompt: string): Promise<string> {\n const readline = await import(\"node:readline/promises\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n return (await rl.question(prompt)).trim();\n } finally {\n rl.close();\n }\n}\n\nexport function registerTopupCommands(parent: Command) {\n parent\n .command(\"topup\")\n .description(\"Add prepaid credits via Stripe Checkout\")\n .option(\"-a, --amount <usd>\", \"Amount in USD (e.g. 25)\")\n .option(\"--no-open\", \"Print checkout URL instead of opening the browser\")\n .action(async (options) => {\n const opts = parent.opts() as ClientOpts;\n\n let amountUsd: number | null;\n\n if (options.amount !== undefined) {\n amountUsd = parseAmount(options.amount);\n if (amountUsd === null) {\n throw new Error(\"Invalid amount\");\n }\n } else {\n if (isJsonMode()) {\n throw new Error(\n \"amount is required in --json mode (use --amount <usd>)\"\n );\n }\n console.log(chalk.bold(\"Add credits via Stripe Checkout\"));\n console.log(\n chalk.dim(\n `Quick picks: ${PRESETS_USD.map((n) => `$${n}`).join(\", \")}`\n )\n );\n const input = await readLine(`Amount in USD (min $${MIN_USD}): `);\n amountUsd = parseAmount(input);\n if (amountUsd === null) {\n throw new Error(\"Invalid amount\");\n }\n }\n\n if (amountUsd < MIN_USD) {\n throw new Error(`Minimum top-up is $${MIN_USD}`);\n }\n if (amountUsd > MAX_USD) {\n throw new Error(`Maximum top-up is $${MAX_USD}`);\n }\n\n const amountCents = Math.round(amountUsd * 100);\n\n const { data } = await post<TopupResponse>(\n \"/billing/topup\",\n { amount_cents: amountCents },\n opts\n );\n\n if (isJsonMode()) {\n return printJson(data);\n }\n\n const url = data.checkout_url;\n console.log(\n `${chalk.bold(\"Checkout URL:\")} ${chalk.cyan(url)}\\n` +\n chalk.dim(\"Complete the payment to credit your account.\")\n );\n\n if (options.open !== false) {\n try {\n await open(url);\n printSuccess(\"Opened Stripe Checkout in your browser.\");\n } catch {\n console.log(\n chalk.yellow(\n \"Could not open browser automatically — copy the URL above.\"\n )\n );\n }\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n printJson,\n isJsonMode,\n} from \"../output.js\";\nimport { loadSpec, DEFAULT_SPEC_FILE } from \"./init.js\";\nimport { validateSpec } from \"../eval/rules.js\";\nimport type { ValidationCheck } from \"../eval/types.js\";\n\nexport function registerEvalCommand(parent: Command) {\n parent\n .command(\"eval\")\n .description(\"Validate a local behaviour spec\")\n .option(\"-m, --model <model>\", \"Deprecated; ignored because tt eval only validates the local spec\")\n .option(\"-f, --file <path>\", \"Spec file path\", DEFAULT_SPEC_FILE)\n .action(async (cmdOpts) => {\n const spec = loadSpec(cmdOpts.file);\n const validation = validateSpec(spec);\n\n if (!isJsonMode()) {\n console.log(chalk.dim(`\\nSpec: ${cmdOpts.file}\\n`));\n }\n\n if (isJsonMode()) {\n printJson(validation);\n } else {\n printValidation(validation.checks);\n }\n\n if (!validation.valid) {\n process.exitCode = 1;\n }\n });\n}\n\nfunction printValidation(checks: ValidationCheck[]) {\n console.log(chalk.bold(\"Spec Validation\"));\n for (const check of checks) {\n const icon = check.passed ? chalk.green(\"✓\") : chalk.red(\"✗\");\n const msg = check.message\n ? chalk.dim(` — ${check.message}`)\n : \"\";\n console.log(` ${icon} ${check.name}${msg}`);\n }\n}\n","import type {\n AssertionResult,\n LocalSpec,\n ValidationCheck,\n ValidationResult,\n} from \"./types.js\";\n\nexport function validateSpec(spec: LocalSpec): ValidationResult {\n const checks: ValidationCheck[] = [];\n\n checks.push({\n name: \"Has name\",\n passed: Boolean(spec.name?.trim()),\n message: spec.name?.trim() ? undefined : \"Spec is missing a name\",\n });\n\n checks.push({\n name: \"Has system prompt\",\n passed: Boolean(spec.system_prompt?.trim()),\n message: spec.system_prompt?.trim()\n ? undefined\n : \"Spec is missing a system_prompt\",\n });\n\n checks.push({\n name: \"Has base model\",\n passed: Boolean(spec.base_model?.trim()),\n message: spec.base_model?.trim()\n ? undefined\n : \"Spec is missing a base_model\",\n });\n\n const exCount = spec.examples?.length ?? 0;\n checks.push({\n name: \"Has examples\",\n passed: exCount > 0,\n message: exCount > 0 ? `${exCount} example(s)` : \"Add at least one example\",\n });\n\n checks.push({\n name: \"Has guidelines\",\n passed: (spec.guidelines?.length ?? 0) > 0,\n message:\n (spec.guidelines?.length ?? 0) > 0\n ? undefined\n : \"Consider adding guidelines for better eval coverage\",\n });\n\n if (spec.constraints?.length && spec.examples?.length) {\n const violations = checkExamplesAgainstConstraints(spec);\n checks.push({\n name: \"Examples satisfy constraints\",\n passed: violations.length === 0,\n message:\n violations.length === 0\n ? undefined\n : violations.join(\"; \"),\n });\n }\n\n return {\n valid: checks.every((c) => c.passed),\n checks,\n };\n}\n\nfunction checkExamplesAgainstConstraints(spec: LocalSpec): string[] {\n const violations: string[] = [];\n for (const [i, ex] of spec.examples.entries()) {\n for (const constraint of spec.constraints) {\n const result = evaluateConstraint(ex.output, constraint);\n if (!result.passed) {\n violations.push(`Example ${i + 1} violates \"${constraint}\": ${result.message}`);\n }\n }\n }\n return violations;\n}\n\nfunction evaluateConstraint(\n text: string,\n constraint: string,\n): { passed: boolean; message?: string } {\n const lower = constraint.toLowerCase();\n\n const neverMatch = lower.match(/^never (?:share|mention|include|reveal|use|say|output|return|give|provide|show|disclose|expose)\\s+(.+)/);\n if (neverMatch) {\n const forbidden = neverMatch[1].replace(/['\"]/g, \"\").trim();\n if (text.toLowerCase().includes(forbidden.toLowerCase())) {\n return { passed: false, message: `Output contains \"${forbidden}\"` };\n }\n return { passed: true };\n }\n\n const alwaysMatch = lower.match(/^always (?:include|use|start with|end with|contain|respond in|reply in)\\s+(.+)/);\n if (alwaysMatch) {\n const required = alwaysMatch[1].replace(/['\"]/g, \"\").trim();\n if (!text.toLowerCase().includes(required.toLowerCase())) {\n return { passed: false, message: `Output missing \"${required}\"` };\n }\n return { passed: true };\n }\n\n return {\n passed: true,\n message: `Constraint not enforceable by rules: \"${constraint}\" (will be checked by LLM judge if a provider is configured)`,\n };\n}\n\nexport function runAssertions(\n text: string,\n assertions: string[],\n): AssertionResult[] {\n return assertions.map((assertion) => runSingleAssertion(text, assertion));\n}\n\nfunction runSingleAssertion(text: string, assertion: string): AssertionResult {\n const [type, ...rest] = assertion.split(\":\");\n const value = rest.join(\":\");\n\n switch (type) {\n case \"contains\":\n return {\n assertion,\n passed: text.includes(value),\n message: text.includes(value)\n ? undefined\n : `Expected output to contain \"${value}\"`,\n };\n\n case \"not-contains\":\n return {\n assertion,\n passed: !text.includes(value),\n message: !text.includes(value)\n ? undefined\n : `Expected output to not contain \"${value}\"`,\n };\n\n case \"matches\": {\n const re = new RegExp(value);\n const match = re.test(text);\n return {\n assertion,\n passed: match,\n message: match ? undefined : `Output did not match pattern /${value}/`,\n };\n }\n\n case \"max-length\": {\n const max = Number(value);\n return {\n assertion,\n passed: text.length <= max,\n message:\n text.length <= max\n ? undefined\n : `Output length ${text.length} exceeds max ${max}`,\n };\n }\n\n case \"min-length\": {\n const min = Number(value);\n return {\n assertion,\n passed: text.length >= min,\n message:\n text.length >= min\n ? undefined\n : `Output length ${text.length} below min ${min}`,\n };\n }\n\n case \"is-json\": {\n let valid = false;\n try {\n JSON.parse(text);\n valid = true;\n } catch {}\n return {\n assertion,\n passed: valid,\n message: valid ? undefined : \"Output is not valid JSON\",\n };\n }\n\n default:\n return {\n assertion,\n passed: true,\n message: `Unknown assertion type: ${type} (skipped)`,\n };\n }\n}\n\nexport function checkConstraints(\n text: string,\n constraints: string[],\n): AssertionResult[] {\n return constraints.map((constraint) => {\n const result = evaluateConstraint(text, constraint);\n return {\n assertion: `constraint: ${constraint}`,\n passed: result.passed,\n message: result.message,\n };\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { post, put, type ClientOpts } from \"../client.js\";\nimport { printSuccess, printJson, isJsonMode, shortId } from \"../output.js\";\nimport { loadSpec, DEFAULT_SPEC_FILE } from \"./init.js\";\nimport { canonicalizeSpecBaseModel } from \"../base-models.js\";\n\ninterface RemoteSpec {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport function registerPushCommand(parent: Command) {\n parent\n .command(\"push\")\n .description(\"Push local spec to the Tuned Tensor API\")\n .option(\"-f, --file <path>\", \"Spec file path\", DEFAULT_SPEC_FILE)\n .action(async (cmdOpts) => {\n const opts = parent.opts() as ClientOpts;\n const filePath = resolve(cmdOpts.file);\n const spec = loadSpec(cmdOpts.file);\n\n const { id, eval_cases, ...rawBody } = spec as unknown as Record<string, unknown>;\n const body = canonicalizeSpecBaseModel(rawBody);\n\n let data: RemoteSpec;\n\n if (id) {\n const res = await put<RemoteSpec>(`/behavior-specs/${id}`, body, opts);\n data = res.data;\n } else {\n const res = await post<RemoteSpec>(\"/behavior-specs\", body, opts);\n data = res.data;\n\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\"));\n raw.id = data.id;\n writeFileSync(filePath, JSON.stringify(raw, null, 2) + \"\\n\");\n }\n\n if (isJsonMode()) return printJson(data);\n printSuccess(\n `Spec ${id ? \"updated\" : \"created\"}: ${data.name} (${shortId(data.id)})`,\n );\n });\n}\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["readFileSync","chalk","readFileSync","readFileSync","existsSync","readFileSync","statSync","readFileSync","existsSync","statSync","spawn","existsSync","mkdirSync","statSync","readFileSync","writeFileSync","homedir","dirname","join","resolve","basename","existsSync","readFileSync","writeFileSync","existsSync","writeFileSync","readFileSync","mkdirSync","resolve","existsSync","statSync","join","formatBytes","mkdirSync","dirname","homedir","resolve","basename","readFileSync","writeFileSync","extractDir","spawn","chalk","chalk","chalk","chalk","chalk","chalk","readFileSync","writeFileSync","resolve","resolve","readFileSync","writeFileSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tuned-tensor/cli",
3
- "version": "0.4.15",
3
+ "version": "0.4.16",
4
4
  "description": "CLI for Tuned Tensor — fine-tune and evaluate LLMs from the command line",
5
5
  "type": "module",
6
6
  "bin": {