mimo2codex 0.1.3 → 0.1.5
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/AGENTS.md +20 -5
- package/README.md +139 -14
- package/README.zh.md +140 -15
- package/dist/admin/router.js +288 -0
- package/dist/admin/router.js.map +1 -0
- package/dist/cli.js +83 -7
- package/dist/cli.js.map +1 -1
- package/dist/config.js +89 -10
- package/dist/config.js.map +1 -1
- package/dist/db/dataDir.js +14 -0
- package/dist/db/dataDir.js.map +1 -0
- package/dist/db/index.js +110 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/logs.js +94 -0
- package/dist/db/logs.js.map +1 -0
- package/dist/db/models.js +114 -0
- package/dist/db/models.js.map +1 -0
- package/dist/db/schema.js +74 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/settings.js +44 -0
- package/dist/db/settings.js.map +1 -0
- package/dist/providers/deepseek.js +76 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/mimo.js +88 -0
- package/dist/providers/mimo.js.map +1 -0
- package/dist/providers/registry.js +25 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/server.js +281 -67
- package/dist/server.js.map +1 -1
- package/dist/upstream/{mimoClient.js → openaiCompatClient.js} +21 -32
- package/dist/upstream/openaiCompatClient.js.map +1 -0
- package/dist/web/assets/index-DAJbSznk.css +1 -0
- package/dist/web/assets/index-DwvEnXbj.js +67 -0
- package/dist/web/index.html +13 -0
- package/package.json +9 -3
- package/dist/upstream/mimoClient.js.map +0 -1
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { extname, join, normalize, resolve } from "node:path";
|
|
3
|
+
import { PROVIDER_LIST } from "../providers/registry.js";
|
|
4
|
+
import { aggregateMappings, aggregateStats, deleteLogsBefore, queryLogs, } from "../db/logs.js";
|
|
5
|
+
import { deleteModel, insertCustomModel, listAliases, listModels, patchModel, upsertAlias, deleteAlias, } from "../db/models.js";
|
|
6
|
+
import { deleteSetting, ForbiddenSettingError, isForbiddenSettingKey, listSettings, setSetting, } from "../db/settings.js";
|
|
7
|
+
import { isProviderId } from "../providers/registry.js";
|
|
8
|
+
import { log } from "../util/log.js";
|
|
9
|
+
const STATIC_ROOT = (() => {
|
|
10
|
+
// dist/web/ is created when `web/` is built (vite.config.ts → outDir).
|
|
11
|
+
// tsc separately writes the admin handler bundle to dist/admin/, so the two
|
|
12
|
+
// paths cannot be the same — that's why the static root lives under
|
|
13
|
+
// dist/web/ rather than dist/admin/.
|
|
14
|
+
const candidate = resolve(process.cwd(), "dist", "web");
|
|
15
|
+
return candidate;
|
|
16
|
+
})();
|
|
17
|
+
const MIME = {
|
|
18
|
+
".html": "text/html; charset=utf-8",
|
|
19
|
+
".js": "application/javascript; charset=utf-8",
|
|
20
|
+
".css": "text/css; charset=utf-8",
|
|
21
|
+
".json": "application/json; charset=utf-8",
|
|
22
|
+
".svg": "image/svg+xml",
|
|
23
|
+
".png": "image/png",
|
|
24
|
+
".jpg": "image/jpeg",
|
|
25
|
+
".jpeg": "image/jpeg",
|
|
26
|
+
".ico": "image/x-icon",
|
|
27
|
+
".woff": "font/woff",
|
|
28
|
+
".woff2": "font/woff2",
|
|
29
|
+
};
|
|
30
|
+
function sendJson(res, status, body) {
|
|
31
|
+
res.statusCode = status;
|
|
32
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
33
|
+
res.end(JSON.stringify(body));
|
|
34
|
+
}
|
|
35
|
+
function sendError(res, status, code, message) {
|
|
36
|
+
sendJson(res, status, { error: { code, message, status } });
|
|
37
|
+
}
|
|
38
|
+
async function readJsonBody(req, maxBytes = 1024 * 1024) {
|
|
39
|
+
return await new Promise((resolve, reject) => {
|
|
40
|
+
const chunks = [];
|
|
41
|
+
let total = 0;
|
|
42
|
+
req.on("data", (c) => {
|
|
43
|
+
total += c.length;
|
|
44
|
+
if (total > maxBytes) {
|
|
45
|
+
reject(new Error("admin body too large"));
|
|
46
|
+
req.destroy();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
chunks.push(c);
|
|
50
|
+
});
|
|
51
|
+
req.on("end", () => {
|
|
52
|
+
try {
|
|
53
|
+
const text = Buffer.concat(chunks).toString("utf-8");
|
|
54
|
+
if (!text)
|
|
55
|
+
return resolve({});
|
|
56
|
+
resolve(JSON.parse(text));
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
reject(err);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
req.on("error", reject);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function parseUrl(req) {
|
|
66
|
+
const u = new URL(req.url ?? "/", "http://localhost");
|
|
67
|
+
return { pathname: u.pathname, query: u.searchParams };
|
|
68
|
+
}
|
|
69
|
+
function providerStateFor(cfg) {
|
|
70
|
+
return PROVIDER_LIST.map((p) => {
|
|
71
|
+
const runtime = cfg.providers[p.id];
|
|
72
|
+
return {
|
|
73
|
+
id: p.id,
|
|
74
|
+
shortcut: p.shortcut,
|
|
75
|
+
display_name: p.displayName,
|
|
76
|
+
default: cfg.defaultProviderId === p.id,
|
|
77
|
+
enabled: !!runtime,
|
|
78
|
+
api_key_present: !!runtime,
|
|
79
|
+
api_key_env: p.envKeys,
|
|
80
|
+
base_url: runtime?.baseUrl ?? p.defaultBaseUrl,
|
|
81
|
+
default_model: p.defaultModel,
|
|
82
|
+
flags: runtime?.flags ?? {},
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async function handleApi(ctx) {
|
|
87
|
+
const { cfg, req, res, pathname, query } = ctx;
|
|
88
|
+
// GET /admin/api/health — quick liveness probe for the UI
|
|
89
|
+
if (req.method === "GET" && pathname === "/admin/api/health") {
|
|
90
|
+
return sendJson(res, 200, { ok: true, dataDir: cfg.dataDir });
|
|
91
|
+
}
|
|
92
|
+
if (req.method === "GET" && pathname === "/admin/api/providers") {
|
|
93
|
+
return sendJson(res, 200, { providers: providerStateFor(cfg) });
|
|
94
|
+
}
|
|
95
|
+
// /admin/api/providers/:id/models
|
|
96
|
+
const provModels = pathname.match(/^\/admin\/api\/providers\/([^/]+)\/models$/);
|
|
97
|
+
if (provModels) {
|
|
98
|
+
const id = provModels[1];
|
|
99
|
+
if (!isProviderId(id))
|
|
100
|
+
return sendError(res, 404, "unknown_provider", `unknown provider ${id}`);
|
|
101
|
+
if (req.method === "GET") {
|
|
102
|
+
return sendJson(res, 200, { models: listModels(id) });
|
|
103
|
+
}
|
|
104
|
+
if (req.method === "POST") {
|
|
105
|
+
const body = await readJsonBody(req);
|
|
106
|
+
if (!body.upstream_id)
|
|
107
|
+
return sendError(res, 400, "missing_upstream_id", "upstream_id required");
|
|
108
|
+
try {
|
|
109
|
+
const row = insertCustomModel(id, {
|
|
110
|
+
upstream_id: body.upstream_id,
|
|
111
|
+
display_name: body.display_name,
|
|
112
|
+
});
|
|
113
|
+
return sendJson(res, 201, { model: row });
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
return sendError(res, 400, "insert_failed", err.message);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return sendError(res, 405, "method_not_allowed", "use GET or POST");
|
|
120
|
+
}
|
|
121
|
+
// /admin/api/models/:id
|
|
122
|
+
const modelId = pathname.match(/^\/admin\/api\/models\/(\d+)$/);
|
|
123
|
+
if (modelId) {
|
|
124
|
+
const id = Number(modelId[1]);
|
|
125
|
+
if (req.method === "PATCH") {
|
|
126
|
+
const body = await readJsonBody(req);
|
|
127
|
+
try {
|
|
128
|
+
const row = patchModel(id, body);
|
|
129
|
+
if (!row)
|
|
130
|
+
return sendError(res, 404, "not_found", `model ${id} not found`);
|
|
131
|
+
return sendJson(res, 200, { model: row });
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
return sendError(res, 400, "patch_failed", err.message);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (req.method === "DELETE") {
|
|
138
|
+
try {
|
|
139
|
+
const ok = deleteModel(id);
|
|
140
|
+
if (!ok)
|
|
141
|
+
return sendError(res, 404, "not_found", `model ${id} not found`);
|
|
142
|
+
return sendJson(res, 200, { deleted: true });
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
return sendError(res, 400, "delete_failed", err.message);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return sendError(res, 405, "method_not_allowed", "use PATCH or DELETE");
|
|
149
|
+
}
|
|
150
|
+
if (pathname === "/admin/api/aliases") {
|
|
151
|
+
if (req.method === "GET") {
|
|
152
|
+
return sendJson(res, 200, { aliases: listAliases() });
|
|
153
|
+
}
|
|
154
|
+
if (req.method === "POST") {
|
|
155
|
+
const body = await readJsonBody(req);
|
|
156
|
+
if (!body.alias || !body.provider_id || !body.upstream_id) {
|
|
157
|
+
return sendError(res, 400, "missing_fields", "alias, provider_id and upstream_id required");
|
|
158
|
+
}
|
|
159
|
+
if (!isProviderId(body.provider_id)) {
|
|
160
|
+
return sendError(res, 400, "unknown_provider", `unknown provider ${body.provider_id}`);
|
|
161
|
+
}
|
|
162
|
+
upsertAlias({
|
|
163
|
+
alias: body.alias,
|
|
164
|
+
provider_id: body.provider_id,
|
|
165
|
+
upstream_id: body.upstream_id,
|
|
166
|
+
});
|
|
167
|
+
return sendJson(res, 201, { alias: body.alias });
|
|
168
|
+
}
|
|
169
|
+
return sendError(res, 405, "method_not_allowed", "use GET or POST");
|
|
170
|
+
}
|
|
171
|
+
const aliasMatch = pathname.match(/^\/admin\/api\/aliases\/(.+)$/);
|
|
172
|
+
if (aliasMatch && req.method === "DELETE") {
|
|
173
|
+
const alias = decodeURIComponent(aliasMatch[1]);
|
|
174
|
+
const ok = deleteAlias(alias);
|
|
175
|
+
if (!ok)
|
|
176
|
+
return sendError(res, 404, "not_found", `alias ${alias} not found`);
|
|
177
|
+
return sendJson(res, 200, { deleted: true });
|
|
178
|
+
}
|
|
179
|
+
if (req.method === "GET" && pathname === "/admin/api/logs") {
|
|
180
|
+
const provider = query.get("provider") ?? undefined;
|
|
181
|
+
const from = query.get("from") ? Number(query.get("from")) : undefined;
|
|
182
|
+
const to = query.get("to") ? Number(query.get("to")) : undefined;
|
|
183
|
+
const limit = query.get("limit") ? Number(query.get("limit")) : undefined;
|
|
184
|
+
const offset = query.get("offset") ? Number(query.get("offset")) : undefined;
|
|
185
|
+
return sendJson(res, 200, { logs: queryLogs({ provider, from, to, limit, offset }) });
|
|
186
|
+
}
|
|
187
|
+
if (req.method === "DELETE" && pathname === "/admin/api/logs") {
|
|
188
|
+
const before = query.get("before");
|
|
189
|
+
if (!before)
|
|
190
|
+
return sendError(res, 400, "missing_before", "?before=<ts_ms> required");
|
|
191
|
+
const removed = deleteLogsBefore(Number(before));
|
|
192
|
+
return sendJson(res, 200, { removed });
|
|
193
|
+
}
|
|
194
|
+
if (req.method === "GET" && pathname === "/admin/api/mappings") {
|
|
195
|
+
return sendJson(res, 200, { mappings: aggregateMappings() });
|
|
196
|
+
}
|
|
197
|
+
if (req.method === "GET" && pathname === "/admin/api/stats") {
|
|
198
|
+
const range = query.get("range") ?? "24h";
|
|
199
|
+
return sendJson(res, 200, aggregateStats(range));
|
|
200
|
+
}
|
|
201
|
+
if (req.method === "GET" && pathname === "/admin/api/settings") {
|
|
202
|
+
return sendJson(res, 200, { settings: listSettings() });
|
|
203
|
+
}
|
|
204
|
+
const settingKey = pathname.match(/^\/admin\/api\/settings\/([^/]+)$/);
|
|
205
|
+
if (settingKey) {
|
|
206
|
+
const key = decodeURIComponent(settingKey[1]);
|
|
207
|
+
if (req.method === "PUT") {
|
|
208
|
+
if (isForbiddenSettingKey(key)) {
|
|
209
|
+
return sendError(res, 400, "forbidden_setting", `${key} cannot be stored in the UI — set the corresponding env var instead (MIMO_API_KEY, DS_API_KEY, DEEPSEEK_API_KEY) and restart mimo2codex.`);
|
|
210
|
+
}
|
|
211
|
+
const body = await readJsonBody(req);
|
|
212
|
+
if (typeof body.value !== "string") {
|
|
213
|
+
return sendError(res, 400, "invalid_value", "value must be a string");
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
setSetting(key, body.value);
|
|
217
|
+
return sendJson(res, 200, { key, value: body.value });
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
if (err instanceof ForbiddenSettingError) {
|
|
221
|
+
return sendError(res, 400, "forbidden_setting", err.message);
|
|
222
|
+
}
|
|
223
|
+
throw err;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (req.method === "DELETE") {
|
|
227
|
+
const ok = deleteSetting(key);
|
|
228
|
+
if (!ok)
|
|
229
|
+
return sendError(res, 404, "not_found", `setting ${key} not found`);
|
|
230
|
+
return sendJson(res, 200, { deleted: true });
|
|
231
|
+
}
|
|
232
|
+
return sendError(res, 405, "method_not_allowed", "use PUT or DELETE");
|
|
233
|
+
}
|
|
234
|
+
return sendError(res, 404, "not_found", `no admin route for ${req.method} ${pathname}`);
|
|
235
|
+
}
|
|
236
|
+
function serveStatic(res, pathname) {
|
|
237
|
+
if (!existsSync(STATIC_ROOT)) {
|
|
238
|
+
res.statusCode = 503;
|
|
239
|
+
res.setHeader("Content-Type", "text/plain; charset=utf-8");
|
|
240
|
+
res.end("Admin UI not built. Run `npm run web:build` (or `npm run build:all`) to populate dist/admin/.\n");
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
// Strip /admin prefix.
|
|
244
|
+
const rel = pathname.replace(/^\/admin\/?/, "") || "index.html";
|
|
245
|
+
const safe = normalize(rel).replace(/^[/\\]+/, "");
|
|
246
|
+
if (safe.includes("..")) {
|
|
247
|
+
res.statusCode = 400;
|
|
248
|
+
res.end("bad path");
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
let filePath = join(STATIC_ROOT, safe);
|
|
252
|
+
if (existsSync(filePath) && statSync(filePath).isDirectory()) {
|
|
253
|
+
filePath = join(filePath, "index.html");
|
|
254
|
+
}
|
|
255
|
+
if (!existsSync(filePath)) {
|
|
256
|
+
// SPA fallback
|
|
257
|
+
filePath = join(STATIC_ROOT, "index.html");
|
|
258
|
+
if (!existsSync(filePath)) {
|
|
259
|
+
res.statusCode = 404;
|
|
260
|
+
res.end("not found");
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const ct = MIME[extname(filePath).toLowerCase()] ?? "application/octet-stream";
|
|
265
|
+
res.statusCode = 200;
|
|
266
|
+
res.setHeader("Content-Type", ct);
|
|
267
|
+
res.end(readFileSync(filePath));
|
|
268
|
+
}
|
|
269
|
+
export async function handleAdmin(cfg, req, res) {
|
|
270
|
+
const { pathname, query } = parseUrl(req);
|
|
271
|
+
try {
|
|
272
|
+
if (pathname.startsWith("/admin/api/")) {
|
|
273
|
+
await handleApi({ cfg, req, res, pathname, query });
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
if (req.method === "GET" && (pathname === "/admin" || pathname.startsWith("/admin/"))) {
|
|
277
|
+
serveStatic(res, pathname);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
sendError(res, 404, "not_found", `no admin route for ${req.method} ${pathname}`);
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
log.error("admin handler error", { error: err.message, stack: err.stack });
|
|
284
|
+
if (!res.headersSent)
|
|
285
|
+
sendError(res, 500, "internal_error", err.message);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/admin/router.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -3,8 +3,9 @@ import { createRequire } from "node:module";
|
|
|
3
3
|
import { buildConfig, parseArgv } from "./config.js";
|
|
4
4
|
import { startServer } from "./server.js";
|
|
5
5
|
import { setVerbose, log, redactKey } from "./util/log.js";
|
|
6
|
+
import { closeDb, openDb } from "./db/index.js";
|
|
6
7
|
const VERSION = createRequire(import.meta.url)("../package.json").version;
|
|
7
|
-
const HELP = `mimo2codex v${VERSION} — local proxy: Codex Responses API →
|
|
8
|
+
const HELP = `mimo2codex v${VERSION} — local proxy: Codex Responses API → Chat Completions (MiMo / DeepSeek)
|
|
8
9
|
|
|
9
10
|
USAGE
|
|
10
11
|
mimo2codex [options]
|
|
@@ -14,14 +15,26 @@ USAGE
|
|
|
14
15
|
OPTIONS
|
|
15
16
|
-p, --port <n> listen port (default: 8788, env: MIMO2CODEX_PORT)
|
|
16
17
|
--host <h> bind host (default: 127.0.0.1, env: MIMO2CODEX_HOST)
|
|
17
|
-
--
|
|
18
|
-
--
|
|
19
|
-
--
|
|
18
|
+
--model <shortcut> default upstream provider: "mimo" (default) or "ds" (DeepSeek)
|
|
19
|
+
--base-url <url> base url for the default provider (env: MIMO_BASE_URL / DEEPSEEK_BASE_URL)
|
|
20
|
+
--api-key <key> api key for the default provider (env varies — see below) — required
|
|
21
|
+
--no-reasoning hide reasoning_content from Codex (still re-injected for multi-turn quality)
|
|
20
22
|
--reasoning force reasoning passthrough (default)
|
|
23
|
+
--data-dir <path> admin sqlite + UI data directory (default: ~/.mimo2codex,
|
|
24
|
+
env: MIMO2CODEX_DATA_DIR)
|
|
25
|
+
--no-admin disable the local admin UI + sqlite logging
|
|
26
|
+
(env: MIMO2CODEX_NO_ADMIN=1)
|
|
21
27
|
-v, --verbose log every request (env: MIMO2CODEX_VERBOSE=1)
|
|
22
28
|
-V, --version print version
|
|
23
29
|
-h, --help show this help
|
|
24
30
|
|
|
31
|
+
PROVIDER KEYS
|
|
32
|
+
MiMo: MIMO_API_KEY (default base: https://api.xiaomimimo.com/v1)
|
|
33
|
+
DeepSeek: DS_API_KEY or DEEPSEEK_API_KEY (default base: https://api.deepseek.com/v1)
|
|
34
|
+
Set the key for whichever provider --model selects. Other providers are
|
|
35
|
+
registered automatically when their key is present (per-request routing
|
|
36
|
+
lands in a follow-up release).
|
|
37
|
+
|
|
25
38
|
DEFAULTS BAKED IN (no flag needed)
|
|
26
39
|
✓ MiMo thinking mode ON — model generates reasoning_content; use
|
|
27
40
|
--no-reasoning to hide it from the Codex terminal (still preserved
|
|
@@ -135,17 +148,61 @@ ${configToml}
|
|
|
135
148
|
# on the machine running mimo2codex.
|
|
136
149
|
`;
|
|
137
150
|
}
|
|
151
|
+
function checkMimoHostMismatch(cfg) {
|
|
152
|
+
// Catch the most common foot-gun: tp-* key sent at the pay-as-you-go host
|
|
153
|
+
// (or sk-* key sent at the token-plan host) — usually because MIMO_BASE_URL
|
|
154
|
+
// is left over in the shell from a previous session. Yields 401 or
|
|
155
|
+
// confusing 400s upstream; cheaper to warn at startup.
|
|
156
|
+
if (cfg.defaultProviderId !== "mimo")
|
|
157
|
+
return null;
|
|
158
|
+
const isTpKey = cfg.apiKey.startsWith("tp-");
|
|
159
|
+
const isSkKey = cfg.apiKey.startsWith("sk-");
|
|
160
|
+
const hostIsTokenPlan = /token-plan/i.test(cfg.baseUrl);
|
|
161
|
+
if (isTpKey && !hostIsTokenPlan) {
|
|
162
|
+
return `tp-* key 通常需要 token-plan 主机,但当前 baseUrl 是 ${cfg.baseUrl}。检查 MIMO_BASE_URL / --base-url 是否覆盖了自动推断。`;
|
|
163
|
+
}
|
|
164
|
+
if (isSkKey && hostIsTokenPlan) {
|
|
165
|
+
return `sk-* key 通常需要 pay-as-you-go 主机,但当前 baseUrl 是 ${cfg.baseUrl}。检查 MIMO_BASE_URL / --base-url 是否泄漏(PowerShell: Remove-Item Env:MIMO_BASE_URL)。`;
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
138
169
|
function printStartupBanner(cfg) {
|
|
139
170
|
// eslint-disable-next-line no-console
|
|
140
171
|
console.log(`mimo2codex v${VERSION} listening on http://${cfg.host}:${cfg.port}`);
|
|
141
172
|
// eslint-disable-next-line no-console
|
|
173
|
+
console.log(`provider: ${cfg.defaultProviderId}`);
|
|
174
|
+
// eslint-disable-next-line no-console
|
|
142
175
|
console.log(`upstream: ${cfg.baseUrl}`);
|
|
143
176
|
// eslint-disable-next-line no-console
|
|
144
177
|
console.log(`api key: ${redactKey(cfg.apiKey)}`);
|
|
145
|
-
|
|
146
|
-
|
|
178
|
+
const mismatch = checkMimoHostMismatch(cfg);
|
|
179
|
+
if (mismatch) {
|
|
180
|
+
// eslint-disable-next-line no-console
|
|
181
|
+
console.log(`⚠ 警告: ${mismatch}`);
|
|
182
|
+
}
|
|
183
|
+
if (cfg.defaultProviderId === "mimo") {
|
|
184
|
+
// eslint-disable-next-line no-console
|
|
185
|
+
console.log(`plan: ${cfg.isTokenPlan ? "token-plan (web_search auto-disabled — plugin not available)" : "pay-as-you-go"}`);
|
|
186
|
+
}
|
|
147
187
|
// eslint-disable-next-line no-console
|
|
148
188
|
console.log(`reasoning: ${cfg.exposeReasoning ? "passthrough" : "hidden"}`);
|
|
189
|
+
const others = Object.keys(cfg.providers)
|
|
190
|
+
.filter((id) => id !== cfg.defaultProviderId && cfg.providers[id])
|
|
191
|
+
.join(", ");
|
|
192
|
+
if (others) {
|
|
193
|
+
// eslint-disable-next-line no-console
|
|
194
|
+
console.log(`registered: ${others} (model-routed when client picks one of those ids)`);
|
|
195
|
+
}
|
|
196
|
+
if (cfg.adminEnabled) {
|
|
197
|
+
// eslint-disable-next-line no-console
|
|
198
|
+
console.log(`admin UI: http://${cfg.host}:${cfg.port}/admin/`);
|
|
199
|
+
// eslint-disable-next-line no-console
|
|
200
|
+
console.log(`data dir: ${cfg.dataDir}`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// eslint-disable-next-line no-console
|
|
204
|
+
console.log(`admin UI: disabled (--no-admin)`);
|
|
205
|
+
}
|
|
149
206
|
// eslint-disable-next-line no-console
|
|
150
207
|
console.log("");
|
|
151
208
|
// eslint-disable-next-line no-console
|
|
@@ -196,6 +253,17 @@ function main() {
|
|
|
196
253
|
process.exit(2);
|
|
197
254
|
}
|
|
198
255
|
setVerbose(cfg.verbose);
|
|
256
|
+
if (cfg.adminEnabled) {
|
|
257
|
+
try {
|
|
258
|
+
openDb(cfg.dataDir);
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
// eslint-disable-next-line no-console
|
|
262
|
+
console.error(`error: failed to open admin database at ${cfg.dataDir}: ${err.message}\n` +
|
|
263
|
+
`Pass --no-admin to disable persistence, or --data-dir <path> to choose a writable location.`);
|
|
264
|
+
process.exit(2);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
199
267
|
printStartupBanner(cfg);
|
|
200
268
|
const server = startServer(cfg);
|
|
201
269
|
server.on("listening", () => {
|
|
@@ -207,7 +275,15 @@ function main() {
|
|
|
207
275
|
});
|
|
208
276
|
const shutdown = (sig) => {
|
|
209
277
|
log.info(`received ${sig}, shutting down`);
|
|
210
|
-
server.close(() =>
|
|
278
|
+
server.close(() => {
|
|
279
|
+
try {
|
|
280
|
+
closeDb();
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
// ignore
|
|
284
|
+
}
|
|
285
|
+
process.exit(0);
|
|
286
|
+
});
|
|
211
287
|
setTimeout(() => process.exit(1), 5000).unref();
|
|
212
288
|
};
|
|
213
289
|
process.on("SIGINT", () => shutdown("SIGINT"));
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { byShortcut, isProviderId, PROVIDER_LIST, PROVIDERS } from "./providers/registry.js";
|
|
2
|
+
import { resolveDataDir } from "./db/dataDir.js";
|
|
1
3
|
const DEFAULTS = {
|
|
2
4
|
host: "127.0.0.1",
|
|
3
5
|
port: 8788,
|
|
4
|
-
baseUrl: "https://api.xiaomimimo.com/v1",
|
|
5
6
|
};
|
|
6
7
|
export function parseArgv(argv) {
|
|
7
8
|
const out = { positional: [], showHelp: false, showVersion: false };
|
|
@@ -31,6 +32,9 @@ export function parseArgv(argv) {
|
|
|
31
32
|
case "--api-key":
|
|
32
33
|
out.apiKey = next();
|
|
33
34
|
break;
|
|
35
|
+
case "--model":
|
|
36
|
+
out.model = next();
|
|
37
|
+
break;
|
|
34
38
|
case "--no-reasoning":
|
|
35
39
|
out.exposeReasoning = false;
|
|
36
40
|
break;
|
|
@@ -44,6 +48,12 @@ export function parseArgv(argv) {
|
|
|
44
48
|
case "--env-key":
|
|
45
49
|
out.envKey = true;
|
|
46
50
|
break;
|
|
51
|
+
case "--data-dir":
|
|
52
|
+
out.dataDir = next();
|
|
53
|
+
break;
|
|
54
|
+
case "--no-admin":
|
|
55
|
+
out.noAdmin = true;
|
|
56
|
+
break;
|
|
47
57
|
case "--help":
|
|
48
58
|
case "-h":
|
|
49
59
|
out.showHelp = true;
|
|
@@ -61,29 +71,98 @@ export function parseArgv(argv) {
|
|
|
61
71
|
}
|
|
62
72
|
return out;
|
|
63
73
|
}
|
|
74
|
+
function resolveProviderRuntime(provider, isDefault, parsed, env) {
|
|
75
|
+
// CLI --api-key / --base-url apply only to the default provider.
|
|
76
|
+
const apiKeyFromCli = isDefault ? parsed.apiKey : undefined;
|
|
77
|
+
const baseUrlFromCli = isDefault ? parsed.baseUrl : undefined;
|
|
78
|
+
let apiKey = apiKeyFromCli;
|
|
79
|
+
if (!apiKey) {
|
|
80
|
+
for (const k of provider.envKeys) {
|
|
81
|
+
const v = env[k];
|
|
82
|
+
if (v) {
|
|
83
|
+
apiKey = v;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (!apiKey)
|
|
89
|
+
return null;
|
|
90
|
+
// Priority: CLI --base-url > env > key-based inference > defaultBaseUrl.
|
|
91
|
+
// Key-based inference handles MiMo's tp-* / sk-* tiers — using the wrong
|
|
92
|
+
// host with a tp-* key 401s, so this auto-switches to the right one when
|
|
93
|
+
// the user hasn't overridden it explicitly.
|
|
94
|
+
const baseUrl = baseUrlFromCli ??
|
|
95
|
+
env[provider.baseUrlEnv] ??
|
|
96
|
+
provider.inferBaseUrlFromKey?.(apiKey) ??
|
|
97
|
+
provider.defaultBaseUrl;
|
|
98
|
+
return {
|
|
99
|
+
apiKey,
|
|
100
|
+
baseUrl,
|
|
101
|
+
flags: provider.detectFlags(apiKey, baseUrl),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
64
104
|
export function buildConfig(parsed, env, version) {
|
|
65
105
|
const exposeReasoningEnv = env.MIMO2CODEX_NO_REASONING ? false : true;
|
|
66
106
|
const verboseEnv = !!env.MIMO2CODEX_VERBOSE;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
107
|
+
// Resolve default provider. --model accepts either a known shortcut ("ds")
|
|
108
|
+
// or a full provider id ("deepseek"). Default = mimo.
|
|
109
|
+
let defaultProviderId = "mimo";
|
|
110
|
+
if (parsed.model) {
|
|
111
|
+
const p = byShortcut(parsed.model);
|
|
112
|
+
if (!p) {
|
|
113
|
+
const known = PROVIDER_LIST.map((x) => `${x.shortcut} (${x.id})`).join(", ");
|
|
114
|
+
throw new Error(`unknown --model "${parsed.model}". Known providers: ${known}`);
|
|
115
|
+
}
|
|
116
|
+
defaultProviderId = p.id;
|
|
117
|
+
}
|
|
118
|
+
else if (env.MIMO2CODEX_DEFAULT_PROVIDER) {
|
|
119
|
+
if (!isProviderId(env.MIMO2CODEX_DEFAULT_PROVIDER)) {
|
|
120
|
+
throw new Error(`MIMO2CODEX_DEFAULT_PROVIDER must be one of: ${PROVIDER_LIST.map((p) => p.id).join(", ")}`);
|
|
121
|
+
}
|
|
122
|
+
defaultProviderId = env.MIMO2CODEX_DEFAULT_PROVIDER;
|
|
123
|
+
}
|
|
124
|
+
// Resolve runtime for every provider; null when no key is available. We
|
|
125
|
+
// register all providers up-front so PR2's per-request routing can dispatch
|
|
126
|
+
// to a non-default provider when its key is present.
|
|
127
|
+
const providers = {
|
|
128
|
+
mimo: null,
|
|
129
|
+
deepseek: null,
|
|
130
|
+
};
|
|
131
|
+
for (const p of PROVIDER_LIST) {
|
|
132
|
+
providers[p.id] = resolveProviderRuntime(p, p.id === defaultProviderId, parsed, env);
|
|
133
|
+
}
|
|
134
|
+
const defaultRuntime = providers[defaultProviderId];
|
|
135
|
+
if (!defaultRuntime) {
|
|
136
|
+
const def = PROVIDERS[defaultProviderId];
|
|
137
|
+
const envHint = def.envKeys.join(" or ");
|
|
138
|
+
const docs = def.id === "mimo"
|
|
139
|
+
? "Get one at https://platform.xiaomimimo.com/#/console/api-keys"
|
|
140
|
+
: "Get one at https://platform.deepseek.com/api_keys";
|
|
141
|
+
throw new Error(`missing API key for ${def.displayName} — set ${envHint} env var or pass --api-key. ${docs}`);
|
|
71
142
|
}
|
|
72
143
|
const portFromEnv = env.MIMO2CODEX_PORT ? Number(env.MIMO2CODEX_PORT) : undefined;
|
|
73
144
|
if (portFromEnv !== undefined && Number.isNaN(portFromEnv)) {
|
|
74
145
|
throw new Error("MIMO2CODEX_PORT must be a number");
|
|
75
146
|
}
|
|
76
|
-
const
|
|
77
|
-
|
|
147
|
+
const adminEnabled = parsed.noAdmin
|
|
148
|
+
? false
|
|
149
|
+
: env.MIMO2CODEX_NO_ADMIN
|
|
150
|
+
? false
|
|
151
|
+
: true;
|
|
152
|
+
const dataDir = adminEnabled ? resolveDataDir(parsed.dataDir, env) : "";
|
|
78
153
|
return {
|
|
79
154
|
host: parsed.host ?? env.MIMO2CODEX_HOST ?? DEFAULTS.host,
|
|
80
155
|
port: parsed.port ?? portFromEnv ?? DEFAULTS.port,
|
|
81
|
-
baseUrl,
|
|
82
|
-
apiKey,
|
|
156
|
+
baseUrl: defaultRuntime.baseUrl,
|
|
157
|
+
apiKey: defaultRuntime.apiKey,
|
|
83
158
|
exposeReasoning: parsed.exposeReasoning ?? exposeReasoningEnv,
|
|
84
159
|
verbose: parsed.verbose ?? verboseEnv,
|
|
85
160
|
userAgent: `mimo2codex/${version}`,
|
|
86
|
-
|
|
161
|
+
defaultProviderId,
|
|
162
|
+
providers,
|
|
163
|
+
isTokenPlan: !!defaultRuntime.flags.isTokenPlan,
|
|
164
|
+
dataDir,
|
|
165
|
+
adminEnabled,
|
|
87
166
|
};
|
|
88
167
|
}
|
|
89
168
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|