@archimonde12/llm-proxy 1.0.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/LICENSE +20 -0
- package/README.md +272 -0
- package/dist/adapters/base.js +2 -0
- package/dist/adapters/deepseek.js +78 -0
- package/dist/adapters/index.js +20 -0
- package/dist/adapters/ollama.js +182 -0
- package/dist/adapters/openaiCompatible.js +50 -0
- package/dist/admin/auth.js +37 -0
- package/dist/admin/configStore.js +80 -0
- package/dist/admin/envStore.js +149 -0
- package/dist/admin/routes.js +360 -0
- package/dist/cli/bin.js +10 -0
- package/dist/cli/commands/config.js +31 -0
- package/dist/cli/commands/doctor.js +107 -0
- package/dist/cli/commands/init.js +68 -0
- package/dist/cli/commands/start.js +38 -0
- package/dist/cli/commands/status.js +23 -0
- package/dist/cli/index.js +22 -0
- package/dist/config/defaultModelsFile.js +16 -0
- package/dist/config/load.js +221 -0
- package/dist/config/mergeHeaders.js +33 -0
- package/dist/config/paths.js +45 -0
- package/dist/config/schema.js +59 -0
- package/dist/config.js +25 -0
- package/dist/http.js +69 -0
- package/dist/index.js +30 -0
- package/dist/observability/metrics.js +102 -0
- package/dist/observability/modelMessageDebugStore.js +69 -0
- package/dist/observability/modelRequestStore.js +52 -0
- package/dist/observability/requestId.js +21 -0
- package/dist/observability/requestRecorder.js +48 -0
- package/dist/observability/summary.js +56 -0
- package/dist/observability/tokenUsage.js +46 -0
- package/dist/server.js +442 -0
- package/dist/startupLog.js +114 -0
- package/dist/types.js +2 -0
- package/dist/upstreamProbe.js +53 -0
- package/dist/version.js +19 -0
- package/package.json +73 -0
- package/ui/dist/assets/index-CDUAKry5.css +1 -0
- package/ui/dist/assets/index-Dq3YzAqp.js +13 -0
- package/ui/dist/index.html +16 -0
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@archimonde12/llm-proxy",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A lightweight gateway that routes OpenAI-compatible requests to local and remote LLM backends.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./dist/index.js",
|
|
8
|
+
"./package.json": "./package.json",
|
|
9
|
+
"./cli": "./dist/cli/bin.js"
|
|
10
|
+
},
|
|
11
|
+
"bin": {
|
|
12
|
+
"llm-proxy": "dist/cli/bin.js"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"ui/dist"
|
|
17
|
+
],
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=20"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "tsx watch src/index.ts",
|
|
23
|
+
"build": "vite build --config ui/vite.config.ts && tsc -p tsconfig.build.json",
|
|
24
|
+
"build:ui": "vite build --config ui/vite.config.ts",
|
|
25
|
+
"prepublishOnly": "npm run build",
|
|
26
|
+
"start": "node dist/index.js",
|
|
27
|
+
"cli": "node dist/cli/bin.js",
|
|
28
|
+
"test": "vitest run",
|
|
29
|
+
"test:watch": "vitest"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"llm",
|
|
33
|
+
"proxy",
|
|
34
|
+
"gateway",
|
|
35
|
+
"openai",
|
|
36
|
+
"ollama",
|
|
37
|
+
"cli",
|
|
38
|
+
"ai"
|
|
39
|
+
],
|
|
40
|
+
"author": "llmog",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://github.com/llmog/llm-proxy.git"
|
|
45
|
+
},
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/llmog/llm-proxy/issues"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/llmog/llm-proxy#readme",
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@fastify/static": "^9.1.0",
|
|
52
|
+
"commander": "^14.0.1",
|
|
53
|
+
"dotenv": "^17.2.2",
|
|
54
|
+
"fastify": "^5.8.4",
|
|
55
|
+
"prom-client": "^15.1.3",
|
|
56
|
+
"prompts": "^2.4.2",
|
|
57
|
+
"zod": "^4.1.5"
|
|
58
|
+
},
|
|
59
|
+
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319",
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@types/node": "^25.5.2",
|
|
62
|
+
"@types/prompts": "^2.4.9",
|
|
63
|
+
"@types/react": "^19.2.14",
|
|
64
|
+
"@types/react-dom": "^19.2.3",
|
|
65
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
66
|
+
"react": "^19.2.4",
|
|
67
|
+
"react-dom": "^19.2.4",
|
|
68
|
+
"tsx": "^4.21.0",
|
|
69
|
+
"typescript": "^6.0.2",
|
|
70
|
+
"vite": "^8.0.7",
|
|
71
|
+
"vitest": "^3.2.4"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--background:#0b0d12;--card:#111522;--popover:#0f1118;--border:#ffffff14;--text:#ffffffeb;--muted:#ffffff9e;--bad:#ff5c5c;--good:#4ade80;--radius:10px;--shadow:0 10px 30px #00000059;--chart-in:#7dd3fc;--chart-out:#a78bfa;--chart-ok:#4ade80;--chart-err:#ff5c5c;color:var(--text);background:var(--background);font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.45}*{box-sizing:border-box}body{margin:0}a{color:#8ab4f8}.shell{grid-template-columns:240px 1fr;min-height:100vh;display:grid}.sidebar{border-right:1px solid var(--border);background:#ffffff05;flex-direction:column;gap:.75rem;padding:1rem;display:flex}.brand{letter-spacing:.2px;font-size:.95rem;font-weight:650}.nav{flex-direction:column;gap:.25rem;display:flex}.navItem{text-align:left;color:var(--text);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;padding:.55rem .6rem;font-size:.9rem}.navItem:hover{background:#ffffff08}.navItem.active{background:#7dd3fc14;border-color:#7dd3fc40}.sidebarFooter{margin-top:auto;font-size:.78rem}.content{max-width:1320px;padding:1rem 1rem 2rem}.page{flex-direction:column;gap:1rem;display:flex}.row{flex-wrap:wrap;align-items:center;gap:.5rem;margin-bottom:.75rem;display:flex}input,select,textarea{border:1px solid var(--border);color:var(--text);background:#ffffff08;border-radius:8px;padding:.35rem .5rem;font-size:.9rem}textarea.raw{width:100%;min-height:220px;font-family:ui-monospace,monospace;font-size:.8rem}.btn{border:1px solid var(--border);color:var(--text);cursor:pointer;background:#ffffff0a;border-radius:10px;padding:.45rem .8rem;font-size:.9rem}.btn:hover{background:#ffffff0f}.btn.mini{border-radius:8px;padding:.25rem .5rem;font-size:.8rem}.btn.mini.modeOn{background:#7dd3fc24;border-color:#7dd3fc52}.btn.ghost{background:0 0}button:disabled{opacity:.55;cursor:not-allowed}.btn.btnPrimary{color:#e8f7ff;background:#7dd3fc38;border-color:#7dd3fc73;font-weight:650}.btn.btnPrimary:hover:not(:disabled){background:#7dd3fc4d}button.btn.btnPrimary:disabled{opacity:.35;cursor:not-allowed}.btn.btnDanger{color:#ffffffeb;background:#ff5c5c24;border-color:#ff5c5c73;font-weight:650}.btn.btnDanger:hover:not(:disabled){background:#ff5c5c38}.alert{border-radius:var(--radius);border:1px solid var(--border);background:#ffffff08;padding:.6rem .75rem;font-size:.85rem}.alert.err{background:#ff5c5c14;border-color:#ff5c5c59}.alert.okHint{color:#ffffffeb;background:#4ade801a;border-color:#4ade8066}.muted{color:var(--muted)}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.bad{color:var(--bad)}.good{color:var(--good)}.spacer{flex:1}.topbar{border:1px solid var(--border);border-radius:var(--radius);background:#ffffff05;align-items:center;gap:.75rem;padding:.75rem;display:flex}.topbarTitle{font-weight:650}.field{align-items:center;gap:.5rem;display:flex}.fieldLabel{color:var(--muted);font-size:.8rem}.panel{border:1px solid var(--border);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow);padding:.9rem}.panelSub{border:1px solid var(--border);border-radius:var(--radius);background:#ffffff05;padding:.75rem}.panelHeader{align-items:baseline;gap:.75rem;margin-bottom:.75rem;display:flex}.panelTitle{font-weight:650}.panelHint{color:var(--muted);font-size:.82rem}.gridCards{grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem;display:grid}.card{border:1px solid var(--border);border-radius:var(--radius);background:#ffffff05;padding:.75rem .85rem}.card .k{color:var(--muted);font-size:.78rem}.card .v{margin-top:.2rem;font-size:1.15rem;font-weight:700}.filters{flex-wrap:wrap;gap:.75rem;margin-bottom:.75rem;display:flex}.tableWrap{border:1px solid var(--border);border-radius:10px;overflow:auto}table{border-collapse:collapse;width:100%;font-size:.85rem}table.tableCompact{font-size:.76rem}table.tableCompact th,table.tableCompact td{padding:.35rem .45rem}.tableCellClip{text-overflow:ellipsis;white-space:nowrap;max-width:0;overflow:hidden}th.tableCellErr,td.tableCellErr{width:5.5rem;max-width:5.5rem;font-size:.72rem}th,td{border-bottom:1px solid var(--border);text-align:left;padding:.5rem .6rem}th{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#ffffff08;position:sticky;top:0}.clickable{cursor:pointer}.clickable:hover td{background:#ffffff05}.selectedRow td{background:#7dd3fc12}.split{grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;gap:1rem;display:grid}.split.split3070{grid-template-columns:minmax(0,3fr) minmax(0,7fr)}.split>.panel{min-width:0}.formGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;display:grid}.formGrid.formStack{grid-template-columns:1fr}.formGrid.formStack .col2{grid-column:auto}.formGrid .field{flex-direction:column;align-items:stretch;gap:.35rem}.formGrid .field .fieldLabel{align-self:start}.formGrid .field input,.formGrid .field select,.formGrid .field textarea{width:100%;min-width:0}.apiKeyActions{flex-direction:column;align-items:stretch;gap:.65rem;display:flex}.apiKeyModeRow{flex-wrap:wrap;gap:.4rem;display:flex}.apiKeyActions .field{flex-direction:column;align-items:stretch;gap:.35rem;min-width:0}.apiKeyActions .field input,.apiKeyActions .field select,.apiKeyActions .field textarea{width:100%;min-width:0}.col2{grid-column:1/span 2}.chart{border:1px solid var(--border);background:#00000026;border-radius:12px;grid-auto-columns:1fr;grid-auto-flow:column;align-items:end;gap:6px;height:180px;padding:.5rem;display:grid}.chartBar{align-items:end;height:100%;display:flex}.chartBarStack{border:1px solid #ffffff0f;border-radius:8px;flex-direction:column;width:100%;display:flex;overflow:hidden}.chartBarIn{background:var(--chart-in);opacity:.9}.chartBarOut{background:var(--chart-out);opacity:.85}.chartBarOk{background:var(--chart-ok);opacity:.75}.chartBarErr{background:var(--chart-err);opacity:.9}.tooltip{border:1px solid var(--border);box-shadow:var(--shadow);z-index:200;pointer-events:none;background:#0f1118fa;border-radius:10px;min-width:220px;padding:.55rem .6rem;position:fixed;transform:translate(-50%,calc(-100% - 10px))}.tipBody{flex-direction:column;gap:.4rem;display:flex}.tipGrid{grid-template-columns:1fr auto;gap:.25rem .75rem;font-size:.82rem;display:grid}.legend{color:var(--muted);gap:.75rem;margin-top:.6rem;font-size:.82rem;display:flex}.legendItem{align-items:center;gap:.4rem;display:flex}.swatch{border-radius:3px;width:10px;height:10px;display:inline-block}.swatch.in{background:var(--chart-in)}.swatch.out{background:var(--chart-out)}.swatch.ok{background:var(--chart-ok)}.swatch.err{background:var(--chart-err)}.drawerOverlay{z-index:100;background:#0000008c;justify-content:flex-end;display:flex;position:fixed;inset:0}.drawer{background:var(--popover);border-left:1px solid var(--border);width:min(560px,92vw);height:100%;box-shadow:var(--shadow);flex-direction:column;display:flex}.drawerHeader{border-bottom:1px solid var(--border);align-items:center;gap:.75rem;padding:.85rem;display:flex}.drawerTitle{font-weight:650}.drawerBody{padding:.85rem;overflow:auto}.kv{flex-direction:column;gap:.5rem;display:flex}.kvRow{grid-template-columns:160px 1fr;align-items:start;gap:.75rem;display:grid}.kvRow .k{color:var(--muted);font-size:.82rem}.kvRow .v{font-size:.9rem}.list{flex-direction:column;gap:.5rem;display:flex}.listItem{text-align:left;border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;color:var(--text);background:#ffffff05;padding:.65rem .75rem}.listItem:hover{background:#ffffff08}.listItemTop{align-items:center;gap:.75rem;margin-bottom:.4rem;display:flex}.pill{border:1px solid var(--border);color:var(--muted);border-radius:999px;padding:.15rem .45rem;font-size:.75rem}.pill.system{color:#a78bfaf2;border-color:#a78bfa59}.pill.user{color:#7dd3fcf2;border-color:#7dd3fc59}.msgPreview{white-space:pre-wrap;color:var(--text);opacity:.92;margin:0;font-family:inherit}.pre{border:1px solid var(--border);white-space:pre-wrap;background:#0000002e;border-radius:10px;max-height:55vh;margin:0;padding:.75rem;overflow:auto}.stack{flex-direction:column;gap:.75rem;display:flex}@media (width<=960px){.shell{grid-template-columns:1fr}.sidebar{z-index:2;flex-direction:row;align-items:center;position:sticky;top:0}.nav{flex-direction:row}.sidebarFooter{display:none}.gridCards{grid-template-columns:repeat(2,minmax(0,1fr))}.split,.formGrid{grid-template-columns:1fr}.col2{grid-column:auto}}
|