feat: add minimum docker version (#1333)
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
import modelsData from "../models.json";
|
||||
import { OPENAI_CODEX_PROVIDER_NAME } from "../providers/openai-codex-provider";
|
||||
|
||||
export const models = modelsData;
|
||||
export const models = modelsData.models;
|
||||
|
||||
export type ModelReasoningEffort =
|
||||
| "none"
|
||||
|
||||
@@ -370,6 +370,10 @@ async function main(): Promise<void> {
|
||||
const { checkAndAutoUpdate } = await import("./updater/auto-update");
|
||||
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)
|
||||
const { cleanupOldOverflowFiles } = await import("./tools/impl/overflow");
|
||||
Promise.resolve().then(() => {
|
||||
|
||||
2866
src/models.json
2866
src/models.json
File diff suppressed because it is too large
Load Diff
47
src/startup-docker-check.ts
Normal file
47
src/startup-docker-check.ts
Normal 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
49
src/utils/version.ts
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user