feat: add minimum docker version (#1333)

This commit is contained in:
cthomas
2026-03-10 14:56:54 -07:00
committed by GitHub
parent 4451e50281
commit 95c0d8aefa
5 changed files with 1535 additions and 1433 deletions

View File

@@ -4,7 +4,7 @@
import modelsData from "../models.json"; import modelsData from "../models.json";
import { OPENAI_CODEX_PROVIDER_NAME } from "../providers/openai-codex-provider"; import { OPENAI_CODEX_PROVIDER_NAME } from "../providers/openai-codex-provider";
export const models = modelsData; export const models = modelsData.models;
export type ModelReasoningEffort = export type ModelReasoningEffort =
| "none" | "none"

View File

@@ -370,6 +370,10 @@ async function main(): Promise<void> {
const { checkAndAutoUpdate } = await import("./updater/auto-update"); const { checkAndAutoUpdate } = await import("./updater/auto-update");
const autoUpdatePromise = startStartupAutoUpdateCheck(checkAndAutoUpdate); const autoUpdatePromise = startStartupAutoUpdateCheck(checkAndAutoUpdate);
// Check Docker version for self-hosted users (non-blocking)
const { startDockerVersionCheck } = await import("./startup-docker-check");
startDockerVersionCheck().catch(() => {});
// Clean up old overflow files (non-blocking, 24h retention) // Clean up old overflow files (non-blocking, 24h retention)
const { cleanupOldOverflowFiles } = await import("./tools/impl/overflow"); const { cleanupOldOverflowFiles } = await import("./tools/impl/overflow");
Promise.resolve().then(() => { Promise.resolve().then(() => {

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,47 @@
import { getServerUrl } from "./agent/client";
import { settingsManager } from "./settings-manager";
const MINIMUM_DOCKER_VERSION = "0.16.6";
import { isVersionBelow } from "./utils/version";
/**
* Check if the Docker image version meets minimum requirements
* For self-hosted users only - warns if version is outdated
*/
export async function startDockerVersionCheck(): Promise<void> {
const baseURL = getServerUrl();
// Only check for self-hosted servers
if (baseURL.includes("api.letta.com")) {
return;
}
try {
const settings = await settingsManager.getSettingsWithSecureTokens();
const apiKey =
process.env.LETTA_API_KEY || settings.env?.LETTA_API_KEY || "";
// Fetch server version with timeout
const res = await fetch(`${baseURL}/v1/health`, {
headers: { Authorization: `Bearer ${apiKey}` },
signal: AbortSignal.timeout(3000),
});
if (!res.ok) return;
const data = (await res.json()) as { version?: string };
const serverVersion = data.version;
if (!serverVersion) return;
// Check if version is below minimum
if (isVersionBelow(serverVersion, MINIMUM_DOCKER_VERSION)) {
console.warn(
`\n⚠ Warning: Your Docker image is outdated (v${serverVersion}). Minimum recommended: v${MINIMUM_DOCKER_VERSION}.\n Please update with: docker pull letta/letta-server:latest\n`,
);
}
} catch {
// Best-effort - don't block startup
}
}

49
src/utils/version.ts Normal file
View File

@@ -0,0 +1,49 @@
/**
* Semver comparison utilities
*/
/**
* Parse a semver string into [major, minor, patch]
* Returns null if invalid format
*/
export function parseSemver(version: string): [number, number, number] | null {
const match = version.match(/^(\d+)\.(\d+)\.(\d+)/);
if (!match) return null;
const [, major, minor, patch] = match;
return [
parseInt(major ?? "0", 10),
parseInt(minor ?? "0", 10),
parseInt(patch ?? "0", 10),
];
}
/**
* Compare two semver versions
* Returns:
* -1 if a < b
* 0 if a === b
* 1 if a > b
* Returns null if either version is invalid
*/
export function compareSemver(a: string, b: string): -1 | 0 | 1 | null {
const aParts = parseSemver(a);
const bParts = parseSemver(b);
if (!aParts || !bParts) return null;
for (let i = 0; i < 3; i++) {
const a = aParts[i] ?? 0;
const b = bParts[i] ?? 0;
if (a < b) return -1;
if (a > b) return 1;
}
return 0;
}
/**
* Check if version is less than minimum
* Returns false if either version is invalid
*/
export function isVersionBelow(version: string, minimum: string): boolean {
const result = compareSemver(version, minimum);
return result === -1;
}