@knowzai/cli 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/portable/releases.json +33 -0
- package/assets/selfhosted/.env.example +22 -1
- package/assets/selfhosted/docker-compose.mssql.yml +113 -0
- package/assets/selfhosted/docker-compose.yml +22 -14
- package/assets/selfhosted/lmstudio-azure-bridge.mjs +73 -0
- package/assets/selfhosted/releases.json +34 -3
- package/dist/.tsbuildinfo +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +1 -0
- package/dist/commands/up.js.map +1 -1
- package/dist/lib/platform-frontdoor-runtime.d.ts.map +1 -1
- package/dist/lib/platform-frontdoor-runtime.js +2 -9
- package/dist/lib/platform-frontdoor-runtime.js.map +1 -1
- package/dist/lib/platform-frontdoor.d.ts +2 -2
- package/dist/lib/platform-frontdoor.d.ts.map +1 -1
- package/dist/lib/platform-frontdoor.js +3 -1
- package/dist/lib/platform-frontdoor.js.map +1 -1
- package/dist/lib/platform-onboarding.d.ts +10 -0
- package/dist/lib/platform-onboarding.d.ts.map +1 -1
- package/dist/lib/platform-onboarding.js +21 -0
- package/dist/lib/platform-onboarding.js.map +1 -1
- package/dist/lib/selfhosted-lifecycle.d.ts +23 -5
- package/dist/lib/selfhosted-lifecycle.d.ts.map +1 -1
- package/dist/lib/selfhosted-lifecycle.js +132 -10
- package/dist/lib/selfhosted-lifecycle.js.map +1 -1
- package/dist/lib/setup-console.d.ts +3 -0
- package/dist/lib/setup-console.d.ts.map +1 -1
- package/dist/lib/setup-console.js +35 -3
- package/dist/lib/setup-console.js.map +1 -1
- package/dist/lib/setup-page.d.ts.map +1 -1
- package/dist/lib/setup-page.js +21 -10
- package/dist/lib/setup-page.js.map +1 -1
- package/dist/lib/setup-plan.d.ts.map +1 -1
- package/dist/lib/setup-plan.js +2 -1
- package/dist/lib/setup-plan.js.map +1 -1
- package/dist/lib/setup-server.d.ts.map +1 -1
- package/dist/lib/setup-server.js +14 -1
- package/dist/lib/setup-server.js.map +1 -1
- package/oclif.manifest.json +1920 -1920
- package/package.json +6 -6
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"releases": [
|
|
3
|
+
{
|
|
4
|
+
"version": "0.44.1",
|
|
5
|
+
"flavors": [
|
|
6
|
+
"portable",
|
|
7
|
+
"portable-gcp"
|
|
8
|
+
],
|
|
9
|
+
"releasedAt": "2026-09-04T05:26:59Z",
|
|
10
|
+
"minCliVersion": "0.3.0",
|
|
11
|
+
"notes": "Interview Studio v1, guest answer flow, honest knowledge dates. Supersedes v0.44.0 (web image build failed). Commercial grant required for portable pull.",
|
|
12
|
+
"digests": null
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"version": "0.43.0",
|
|
16
|
+
"flavors": [
|
|
17
|
+
"portable",
|
|
18
|
+
"portable-gcp"
|
|
19
|
+
],
|
|
20
|
+
"releasedAt": "2026-09-02T00:00:00Z",
|
|
21
|
+
"minCliVersion": "0.3.0",
|
|
22
|
+
"notes": "Commercial grant required for portable pull. Registration alone does not entitle image pulls.",
|
|
23
|
+
"digests": null
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"version": "0.42.0",
|
|
27
|
+
"flavors": [
|
|
28
|
+
"portable",
|
|
29
|
+
"portable-gcp"
|
|
30
|
+
],
|
|
31
|
+
"releasedAt": "2026-09-02T00:00:00Z",
|
|
32
|
+
"minCliVersion": "0.3.0",
|
|
33
|
+
"notes": "Commercial grant required for portable pull. Registration alone does not entitle image pulls.",
|
|
34
|
+
"digests": null
|
|
35
|
+
},
|
|
3
36
|
{
|
|
4
37
|
"version": "0.41.0",
|
|
5
38
|
"flavors": [
|
|
@@ -5,14 +5,35 @@ KNOWZ_SELFHOSTED_VERSION=0.15.1
|
|
|
5
5
|
API_PORT=5000
|
|
6
6
|
WEB_PORT=3000
|
|
7
7
|
MCP_PORT=3001
|
|
8
|
-
|
|
8
|
+
# Database host port (loopback only). `knowz up` derives API_PORT+10432 so a local Postgres or a
|
|
9
|
+
# second instance never collides; set it explicitly for hand-written .env files.
|
|
10
|
+
DB_PORT=5432
|
|
9
11
|
|
|
12
|
+
POSTGRES_PASSWORD=
|
|
10
13
|
SA_PASSWORD=
|
|
11
14
|
JWT_SECRET=
|
|
12
15
|
ADMIN_USERNAME=admin
|
|
13
16
|
ADMIN_PASSWORD=
|
|
17
|
+
# The CLI sets true only for a freshly generated first-boot password.
|
|
18
|
+
ADMIN_PASSWORD_REQUIRES_CHANGE=false
|
|
14
19
|
MCP_SERVICE_KEY=
|
|
15
20
|
|
|
21
|
+
# Optional: native OpenAI-compatible AI (LM Studio / Ollama / vLLM / OpenAI)
|
|
22
|
+
# For a model server on this host, the CLI rewrites localhost to host.docker.internal.
|
|
23
|
+
# OPENAI_COMPAT_ENDPOINT=http://host.docker.internal:1234/v1
|
|
24
|
+
# OPENAI_COMPAT_APIKEY=
|
|
25
|
+
# OPENAI_COMPAT_CHAT_MODEL=your-chat-model
|
|
26
|
+
# OPENAI_COMPAT_EMBEDDING_MODEL=your-embedding-model
|
|
27
|
+
# EMBEDDING_DIMENSIONS=768
|
|
28
|
+
|
|
29
|
+
# SQL-era public releases use an internal compatibility adapter automatically.
|
|
30
|
+
# These are derived by the CLI from the OpenAI-compatible values above; users
|
|
31
|
+
# do not need Azure credentials.
|
|
32
|
+
# AZURE_OPENAI_ENDPOINT=http://lmstudio-bridge:12345
|
|
33
|
+
# AZURE_OPENAI_APIKEY=local-compatible-adapter
|
|
34
|
+
# AZURE_OPENAI_DEPLOYMENT=your-chat-model
|
|
35
|
+
# AZURE_OPENAI_EMBEDDING=your-embedding-model
|
|
36
|
+
|
|
16
37
|
# Optional: AI via Knowz mothership (operator-supplied; never baked)
|
|
17
38
|
# KNOWZ_PLATFORM_ENABLED=true
|
|
18
39
|
# KNOWZ_PLATFORM_URL=https://api.knowz.io
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Knowz Self-Hosted — compatibility kit for SQL-era public releases.
|
|
2
|
+
# Selected automatically from releases.json; do not use for native Postgres images.
|
|
3
|
+
# The optional local adapter lets legacy Azure-shaped APIs consume the provider
|
|
4
|
+
# already tested as OpenAI-compatible by the guided setup UI.
|
|
5
|
+
|
|
6
|
+
services:
|
|
7
|
+
lmstudio-bridge:
|
|
8
|
+
image: node:20-alpine
|
|
9
|
+
command: ["node", "/app/lmstudio-azure-bridge.mjs"]
|
|
10
|
+
environment:
|
|
11
|
+
OPENAI_COMPAT_ENDPOINT: "${OPENAI_COMPAT_ENDPOINT:-http://host.docker.internal:1234/v1}"
|
|
12
|
+
OPENAI_COMPAT_APIKEY: "${OPENAI_COMPAT_APIKEY:-}"
|
|
13
|
+
PORT: "12345"
|
|
14
|
+
extra_hosts:
|
|
15
|
+
- "host.docker.internal:host-gateway"
|
|
16
|
+
volumes:
|
|
17
|
+
- ./lmstudio-azure-bridge.mjs:/app/lmstudio-azure-bridge.mjs:ro
|
|
18
|
+
healthcheck:
|
|
19
|
+
test: ["CMD", "wget", "-q", "-O", "-", "http://127.0.0.1:12345/healthz"]
|
|
20
|
+
interval: 10s
|
|
21
|
+
timeout: 5s
|
|
22
|
+
retries: 5
|
|
23
|
+
|
|
24
|
+
db:
|
|
25
|
+
image: mcr.microsoft.com/mssql/server:2022-CU26-ubuntu-22.04
|
|
26
|
+
environment:
|
|
27
|
+
ACCEPT_EULA: "Y"
|
|
28
|
+
MSSQL_SA_PASSWORD: "${SA_PASSWORD:?SA_PASSWORD must be set in .env (>=12 chars, SQL Server complexity rules)}"
|
|
29
|
+
MSSQL_PID: "Express"
|
|
30
|
+
ports:
|
|
31
|
+
- "127.0.0.1:${DB_PORT:-1433}:1433"
|
|
32
|
+
volumes:
|
|
33
|
+
- knowz-db-data:/var/opt/mssql
|
|
34
|
+
healthcheck:
|
|
35
|
+
test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$${MSSQL_SA_PASSWORD}" -Q "SELECT 1" -C -b
|
|
36
|
+
interval: 10s
|
|
37
|
+
timeout: 5s
|
|
38
|
+
retries: 10
|
|
39
|
+
start_period: 30s
|
|
40
|
+
|
|
41
|
+
api:
|
|
42
|
+
image: ghcr.io/knowz-io/knowz-selfhosted-api:${KNOWZ_SELFHOSTED_VERSION:?KNOWZ_SELFHOSTED_VERSION must be set}
|
|
43
|
+
ports:
|
|
44
|
+
- "${API_PORT:-5000}:8080"
|
|
45
|
+
depends_on:
|
|
46
|
+
db:
|
|
47
|
+
condition: service_healthy
|
|
48
|
+
lmstudio-bridge:
|
|
49
|
+
condition: service_healthy
|
|
50
|
+
environment:
|
|
51
|
+
ConnectionStrings__McpDb: "Server=db,1433;Database=KnowzSelfHosted;User Id=sa;Password=${SA_PASSWORD:?SA_PASSWORD must be set};TrustServerCertificate=True;Encrypt=True"
|
|
52
|
+
Database__AutoMigrate: "true"
|
|
53
|
+
SelfHosted__JwtSecret: "${JWT_SECRET:?JWT_SECRET must be set in .env (>=32 chars)}"
|
|
54
|
+
SelfHosted__SuperAdminUsername: "${ADMIN_USERNAME:?ADMIN_USERNAME must be set in .env}"
|
|
55
|
+
SelfHosted__SuperAdminPassword: "${ADMIN_PASSWORD:?ADMIN_PASSWORD must be set in .env}"
|
|
56
|
+
SelfHosted__RequireSuperAdminPasswordChange: "${ADMIN_PASSWORD_REQUIRES_CHANGE:-false}"
|
|
57
|
+
SelfHosted__AllowedOrigins__0: "http://localhost:${WEB_PORT:-3000}"
|
|
58
|
+
SelfHosted__RateLimiting__Enabled: "true"
|
|
59
|
+
MCP__ServiceKey: "${MCP_SERVICE_KEY:?MCP_SERVICE_KEY must be set in .env}"
|
|
60
|
+
Storage__Provider: "LocalFileSystem"
|
|
61
|
+
Storage__Local__RootPath: "/data/files"
|
|
62
|
+
AzureOpenAI__Endpoint: "${AZURE_OPENAI_ENDPOINT:-}"
|
|
63
|
+
AzureOpenAI__ApiKey: "${AZURE_OPENAI_APIKEY:-}"
|
|
64
|
+
AzureOpenAI__DeploymentName: "${AZURE_OPENAI_DEPLOYMENT:-gpt-5.4}"
|
|
65
|
+
AzureOpenAI__EmbeddingDeploymentName: "${AZURE_OPENAI_EMBEDDING:-text-embedding-3-large}"
|
|
66
|
+
Embedding__ModelName: "${EMBEDDING_MODEL_NAME:-text-embedding-3-large}"
|
|
67
|
+
Embedding__Dimensions: "${EMBEDDING_DIMENSIONS:-3072}"
|
|
68
|
+
AzureAISearch__Endpoint: "${AZURE_SEARCH_ENDPOINT:-}"
|
|
69
|
+
AzureAISearch__ApiKey: "${AZURE_SEARCH_APIKEY:-}"
|
|
70
|
+
AzureAISearch__IndexName: "${AZURE_SEARCH_INDEX:-knowz-selfhosted}"
|
|
71
|
+
KnowzPlatform__Enabled: "${KNOWZ_PLATFORM_ENABLED:-false}"
|
|
72
|
+
KnowzPlatform__BaseUrl: "${KNOWZ_PLATFORM_URL:-}"
|
|
73
|
+
KnowzPlatform__ApiKey: "${KNOWZ_PLATFORM_APIKEY:-}"
|
|
74
|
+
volumes:
|
|
75
|
+
- knowz-file-storage:/data/files
|
|
76
|
+
healthcheck:
|
|
77
|
+
test: curl -f http://localhost:8080/healthz || exit 1
|
|
78
|
+
interval: 30s
|
|
79
|
+
timeout: 10s
|
|
80
|
+
retries: 5
|
|
81
|
+
start_period: 30s
|
|
82
|
+
|
|
83
|
+
web:
|
|
84
|
+
image: ghcr.io/knowz-io/knowz-selfhosted-web:${KNOWZ_SELFHOSTED_VERSION:?KNOWZ_SELFHOSTED_VERSION must be set}
|
|
85
|
+
ports:
|
|
86
|
+
- "${WEB_PORT:-3000}:8080"
|
|
87
|
+
depends_on:
|
|
88
|
+
api:
|
|
89
|
+
condition: service_started
|
|
90
|
+
|
|
91
|
+
mcp:
|
|
92
|
+
image: ghcr.io/knowz-io/knowz-selfhosted-mcp:${KNOWZ_SELFHOSTED_VERSION:?KNOWZ_SELFHOSTED_VERSION must be set}
|
|
93
|
+
ports:
|
|
94
|
+
- "${MCP_PORT:-3001}:8080"
|
|
95
|
+
depends_on:
|
|
96
|
+
api:
|
|
97
|
+
condition: service_healthy
|
|
98
|
+
environment:
|
|
99
|
+
Knowz__BaseUrl: "${MCP_API_URL:-http://api:8080}"
|
|
100
|
+
MCP__BackendMode: "${MCP_BACKEND_MODE:-selfhosted}"
|
|
101
|
+
MCP__ApiKeyValidationEndpoint: "${MCP_API_KEY_VALIDATION_ENDPOINT:-/api/vaults}"
|
|
102
|
+
MCP__ServiceKey: "${MCP_SERVICE_KEY:?MCP_SERVICE_KEY must be set in .env}"
|
|
103
|
+
Authentication__ValidateApiKey: "${MCP_VALIDATE_API_KEY:-true}"
|
|
104
|
+
healthcheck:
|
|
105
|
+
test: curl -f http://localhost:8080/.well-known/oauth-authorization-server || exit 1
|
|
106
|
+
interval: 30s
|
|
107
|
+
timeout: 10s
|
|
108
|
+
retries: 5
|
|
109
|
+
start_period: 15s
|
|
110
|
+
|
|
111
|
+
volumes:
|
|
112
|
+
knowz-db-data:
|
|
113
|
+
knowz-file-storage:
|
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
# Canonical source: this file. The npm CLI copies it via sync-selfhosted-assets.mjs.
|
|
3
3
|
# Source-build remains selfhosted/docker-compose.yml (build: contexts).
|
|
4
4
|
#
|
|
5
|
-
# FAIL-CLOSED:
|
|
5
|
+
# FAIL-CLOSED: POSTGRES_PASSWORD, JWT_SECRET, ADMIN_USERNAME, ADMIN_PASSWORD, MCP_SERVICE_KEY
|
|
6
6
|
# have no defaults. The CLI mints them into a 0600 .env on first up.
|
|
7
7
|
# Pin KNOWZ_SELFHOSTED_VERSION to a concrete semver — never `latest`.
|
|
8
8
|
|
|
9
9
|
services:
|
|
10
10
|
db:
|
|
11
|
-
image:
|
|
11
|
+
image: pgvector/pgvector:pg16
|
|
12
12
|
environment:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
POSTGRES_USER: knowz
|
|
14
|
+
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set in .env}"
|
|
15
|
+
POSTGRES_DB: knowz_selfhosted
|
|
16
16
|
ports:
|
|
17
|
-
- "
|
|
17
|
+
- "127.0.0.1:${DB_PORT:-5432}:5432"
|
|
18
18
|
volumes:
|
|
19
|
-
- knowz-db-data:/var/
|
|
19
|
+
- knowz-db-data:/var/lib/postgresql/data
|
|
20
20
|
healthcheck:
|
|
21
|
-
test:
|
|
22
|
-
interval:
|
|
21
|
+
test: ["CMD-SHELL", "pg_isready -U knowz -d knowz_selfhosted"]
|
|
22
|
+
interval: 5s
|
|
23
23
|
timeout: 5s
|
|
24
24
|
retries: 10
|
|
25
|
-
start_period:
|
|
25
|
+
start_period: 10s
|
|
26
26
|
|
|
27
27
|
api:
|
|
28
28
|
image: ghcr.io/knowz-io/knowz-selfhosted-api:${KNOWZ_SELFHOSTED_VERSION:?KNOWZ_SELFHOSTED_VERSION must be set}
|
|
@@ -32,22 +32,28 @@ services:
|
|
|
32
32
|
db:
|
|
33
33
|
condition: service_healthy
|
|
34
34
|
environment:
|
|
35
|
-
ConnectionStrings__McpDb: "
|
|
35
|
+
ConnectionStrings__McpDb: "Host=db;Port=5432;Database=knowz_selfhosted;Username=knowz;Password=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set}"
|
|
36
36
|
Database__AutoMigrate: "true"
|
|
37
37
|
SelfHosted__JwtSecret: "${JWT_SECRET:?JWT_SECRET must be set in .env (>=32 chars)}"
|
|
38
38
|
SelfHosted__SuperAdminUsername: "${ADMIN_USERNAME:?ADMIN_USERNAME must be set in .env}"
|
|
39
39
|
SelfHosted__SuperAdminPassword: "${ADMIN_PASSWORD:?ADMIN_PASSWORD must be set in .env}"
|
|
40
|
+
SelfHosted__RequireSuperAdminPasswordChange: "${ADMIN_PASSWORD_REQUIRES_CHANGE:-false}"
|
|
40
41
|
SelfHosted__AllowedOrigins__0: "http://localhost:${WEB_PORT:-3000}"
|
|
41
42
|
SelfHosted__RateLimiting__Enabled: "true"
|
|
42
43
|
MCP__ServiceKey: "${MCP_SERVICE_KEY:?MCP_SERVICE_KEY must be set in .env}"
|
|
43
44
|
Storage__Provider: "LocalFileSystem"
|
|
44
45
|
Storage__Local__RootPath: "/data/files"
|
|
46
|
+
OpenAiCompatible__Endpoint: "${OPENAI_COMPAT_ENDPOINT:-}"
|
|
47
|
+
OpenAiCompatible__ApiKey: "${OPENAI_COMPAT_APIKEY:-}"
|
|
48
|
+
OpenAiCompatible__ChatModel: "${OPENAI_COMPAT_CHAT_MODEL:-}"
|
|
49
|
+
OpenAiCompatible__EmbeddingModel: "${OPENAI_COMPAT_EMBEDDING_MODEL:-}"
|
|
50
|
+
OpenAiCompatible__EmbeddingDimensions: "${EMBEDDING_DIMENSIONS:-1536}"
|
|
45
51
|
AzureOpenAI__Endpoint: "${AZURE_OPENAI_ENDPOINT:-}"
|
|
46
52
|
AzureOpenAI__ApiKey: "${AZURE_OPENAI_APIKEY:-}"
|
|
47
53
|
AzureOpenAI__DeploymentName: "${AZURE_OPENAI_DEPLOYMENT:-gpt-5.4}"
|
|
48
|
-
AzureOpenAI__EmbeddingDeploymentName: "${AZURE_OPENAI_EMBEDDING:-text-embedding-3-
|
|
49
|
-
Embedding__ModelName: "${EMBEDDING_MODEL_NAME:-text-embedding-3-
|
|
50
|
-
Embedding__Dimensions: "${EMBEDDING_DIMENSIONS:-
|
|
54
|
+
AzureOpenAI__EmbeddingDeploymentName: "${AZURE_OPENAI_EMBEDDING:-text-embedding-3-small}"
|
|
55
|
+
Embedding__ModelName: "${EMBEDDING_MODEL_NAME:-text-embedding-3-small}"
|
|
56
|
+
Embedding__Dimensions: "${EMBEDDING_DIMENSIONS:-1536}"
|
|
51
57
|
AzureAISearch__Endpoint: "${AZURE_SEARCH_ENDPOINT:-}"
|
|
52
58
|
AzureAISearch__ApiKey: "${AZURE_SEARCH_APIKEY:-}"
|
|
53
59
|
AzureAISearch__IndexName: "${AZURE_SEARCH_INDEX:-knowz-selfhosted}"
|
|
@@ -56,6 +62,8 @@ services:
|
|
|
56
62
|
KnowzPlatform__ApiKey: "${KNOWZ_PLATFORM_APIKEY:-}"
|
|
57
63
|
volumes:
|
|
58
64
|
- knowz-file-storage:/data/files
|
|
65
|
+
extra_hosts:
|
|
66
|
+
- "host.docker.internal:host-gateway"
|
|
59
67
|
healthcheck:
|
|
60
68
|
test: curl -f http://localhost:8080/healthz || exit 1
|
|
61
69
|
interval: 30s
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { Readable } from 'node:stream';
|
|
3
|
+
|
|
4
|
+
const listenPort = Number(process.env.PORT || 12345);
|
|
5
|
+
const upstreamBase = (process.env.OPENAI_COMPAT_ENDPOINT || 'http://host.docker.internal:1234/v1')
|
|
6
|
+
.replace(/\/$/, '');
|
|
7
|
+
const upstreamApiKey = process.env.OPENAI_COMPAT_APIKEY || 'local-compatible-adapter';
|
|
8
|
+
|
|
9
|
+
function sendJson(response, statusCode, payload) {
|
|
10
|
+
response.writeHead(statusCode, { 'content-type': 'application/json' });
|
|
11
|
+
response.end(JSON.stringify(payload));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const server = http.createServer(async (request, response) => {
|
|
15
|
+
if (request.method === 'GET' && request.url === '/healthz') {
|
|
16
|
+
sendJson(response, 200, { status: 'healthy' });
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const route = request.url?.match(
|
|
21
|
+
/^\/openai\/deployments\/([^/]+)\/(chat\/completions|embeddings)(?:\?.*)?$/,
|
|
22
|
+
);
|
|
23
|
+
if (request.method !== 'POST' || !route) {
|
|
24
|
+
sendJson(response, 404, { error: { message: 'Unsupported compatibility route' } });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const chunks = [];
|
|
29
|
+
for await (const chunk of request) chunks.push(chunk);
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const deployment = decodeURIComponent(route[1]);
|
|
33
|
+
const body = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
34
|
+
body.model = deployment;
|
|
35
|
+
|
|
36
|
+
const upstream = await fetch(`${upstreamBase}/${route[2]}`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: {
|
|
39
|
+
'content-type': 'application/json',
|
|
40
|
+
accept: request.headers.accept || 'application/json',
|
|
41
|
+
authorization: `Bearer ${upstreamApiKey}`,
|
|
42
|
+
},
|
|
43
|
+
body: JSON.stringify(body),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
if (route[2] === 'embeddings' && upstream.ok) {
|
|
47
|
+
const payload = await upstream.json();
|
|
48
|
+
for (const item of payload.data || []) {
|
|
49
|
+
if (!Array.isArray(item.embedding)) continue;
|
|
50
|
+
const packed = Buffer.allocUnsafe(item.embedding.length * 4);
|
|
51
|
+
item.embedding.forEach((value, index) => packed.writeFloatLE(value, index * 4));
|
|
52
|
+
item.embedding = packed.toString('base64');
|
|
53
|
+
}
|
|
54
|
+
response.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
55
|
+
response.end(JSON.stringify(payload));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const headers = {};
|
|
60
|
+
for (const [key, value] of upstream.headers) {
|
|
61
|
+
if (key !== 'content-length' && key !== 'transfer-encoding') headers[key] = value;
|
|
62
|
+
}
|
|
63
|
+
response.writeHead(upstream.status, headers);
|
|
64
|
+
if (upstream.body) Readable.fromWeb(upstream.body).pipe(response);
|
|
65
|
+
else response.end();
|
|
66
|
+
} catch (error) {
|
|
67
|
+
sendJson(response, 502, {
|
|
68
|
+
error: { message: `OpenAI-compatible adapter request failed: ${error.message}` },
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
server.listen(listenPort, '0.0.0.0');
|
|
@@ -1,28 +1,59 @@
|
|
|
1
1
|
{
|
|
2
2
|
"releases": [
|
|
3
|
+
{
|
|
4
|
+
"version": "0.16.0",
|
|
5
|
+
"status": "complete",
|
|
6
|
+
"flavors": ["selfhosted"],
|
|
7
|
+
"releasedAt": "2026-09-04T05:28:39Z",
|
|
8
|
+
"minCliVersion": "0.4.0",
|
|
9
|
+
"notes": "Native PostgreSQL 16 + pgvector. Limited edition (honesty). MCP 26/36. Azure deploy not offered. File-sync uses PlatformConnection credentials.",
|
|
10
|
+
"digests": null,
|
|
11
|
+
"runtime": {
|
|
12
|
+
"database": "postgres",
|
|
13
|
+
"composeAsset": "docker-compose.yml"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
3
16
|
{
|
|
4
17
|
"version": "0.15.1",
|
|
18
|
+
"status": "complete",
|
|
5
19
|
"flavors": ["selfhosted"],
|
|
6
20
|
"releasedAt": "2026-09-01T12:49:00Z",
|
|
7
21
|
"minCliVersion": null,
|
|
8
22
|
"notes": "User-role mothership connect/browse/pull. Anonymous GHCR triple.",
|
|
9
|
-
"digests": null
|
|
23
|
+
"digests": null,
|
|
24
|
+
"runtime": {
|
|
25
|
+
"database": "mssql",
|
|
26
|
+
"composeAsset": "docker-compose.mssql.yml",
|
|
27
|
+
"compatibleProviderAdapter": "lmstudio-azure-bridge.mjs"
|
|
28
|
+
}
|
|
10
29
|
},
|
|
11
30
|
{
|
|
12
31
|
"version": "0.15.0",
|
|
32
|
+
"status": "complete",
|
|
13
33
|
"flavors": ["selfhosted"],
|
|
14
34
|
"releasedAt": "2026-09-01T12:15:00Z",
|
|
15
35
|
"minCliVersion": null,
|
|
16
36
|
"notes": "Look/feel restyle, session decrypt, fail-closed compose, vite-only web image. First complete public GHCR triple since the split 0.14.x tags.",
|
|
17
|
-
"digests": null
|
|
37
|
+
"digests": null,
|
|
38
|
+
"runtime": {
|
|
39
|
+
"database": "mssql",
|
|
40
|
+
"composeAsset": "docker-compose.mssql.yml",
|
|
41
|
+
"compatibleProviderAdapter": "lmstudio-azure-bridge.mjs"
|
|
42
|
+
}
|
|
18
43
|
},
|
|
19
44
|
{
|
|
20
45
|
"version": "0.14.11",
|
|
46
|
+
"status": "incomplete",
|
|
21
47
|
"flavors": ["selfhosted"],
|
|
22
48
|
"releasedAt": "2026-05-28T00:00:00Z",
|
|
23
49
|
"minCliVersion": null,
|
|
24
50
|
"notes": "Incomplete GHCR set: api:0.14.11 exists; web/mcp 0.14.11 404 (web/mcp last published at 0.14.10). Do not pin.",
|
|
25
|
-
"digests": null
|
|
51
|
+
"digests": null,
|
|
52
|
+
"runtime": {
|
|
53
|
+
"database": "mssql",
|
|
54
|
+
"composeAsset": "docker-compose.mssql.yml",
|
|
55
|
+
"compatibleProviderAdapter": "lmstudio-azure-bridge.mjs"
|
|
56
|
+
}
|
|
26
57
|
}
|
|
27
58
|
]
|
|
28
59
|
}
|