feat: add minimum docker version (#1333)
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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(() => {
|
||||||
|
|||||||
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