@guangnao/agent-cli 1.1.5 → 1.1.6
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/dist/cli.js +59 -14
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -2950,27 +2950,44 @@ function parseImageUrl(url) {
|
|
|
2950
2950
|
var isDataImage = (r) => "base64" in r;
|
|
2951
2951
|
|
|
2952
2952
|
// src/llm/anthropic.ts
|
|
2953
|
+
var noTemperature = /* @__PURE__ */ new Set();
|
|
2954
|
+
var TEMP_DEPRECATED = /temperature.{0,40}deprecated|deprecated.{0,40}temperature/i;
|
|
2953
2955
|
var anthropic = (cfg2) => {
|
|
2954
2956
|
const base2 = (cfg2.baseUrl ?? "https://api.anthropic.com/v1").replace(/\/$/, "");
|
|
2955
2957
|
const headers = { "content-type": "application/json", "x-api-key": cfg2.apiKey, "anthropic-version": "2023-06-01" };
|
|
2956
2958
|
return async (req) => {
|
|
2957
2959
|
const system = req.messages.filter((m) => m.role === "system").map((m) => m.content).join("\n");
|
|
2958
|
-
const
|
|
2960
|
+
const mkBody = (withTemp) => ({
|
|
2959
2961
|
model: cfg2.model,
|
|
2960
2962
|
max_tokens: req.maxTokens ?? 4096,
|
|
2961
2963
|
// Anthropic requires this
|
|
2962
|
-
temperature: cfg2.temperature ?? 0,
|
|
2964
|
+
...withTemp ? { temperature: cfg2.temperature ?? 0 } : {},
|
|
2965
|
+
// newest models deprecated it → omit (see below)
|
|
2963
2966
|
...system ? { system } : {},
|
|
2964
2967
|
messages: toMsgs(req.messages),
|
|
2965
2968
|
...req.tools?.length ? { tools: req.tools.map(toTool2) } : {}
|
|
2969
|
+
});
|
|
2970
|
+
const run2 = (withTemp) => {
|
|
2971
|
+
const body = mkBody(withTemp);
|
|
2972
|
+
if (req.onDelta) return stream2(base2, headers, body, req.onDelta, req.signal);
|
|
2973
|
+
return blocking(base2, headers, body, req.signal);
|
|
2966
2974
|
};
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2970
|
-
|
|
2971
|
-
|
|
2975
|
+
try {
|
|
2976
|
+
return await run2(!noTemperature.has(cfg2.model));
|
|
2977
|
+
} catch (e) {
|
|
2978
|
+
if (!noTemperature.has(cfg2.model) && TEMP_DEPRECATED.test(String(e.message))) {
|
|
2979
|
+
noTemperature.add(cfg2.model);
|
|
2980
|
+
return await run2(false);
|
|
2981
|
+
}
|
|
2982
|
+
throw e;
|
|
2983
|
+
}
|
|
2972
2984
|
};
|
|
2973
2985
|
};
|
|
2986
|
+
async function blocking(base2, headers, body, signal) {
|
|
2987
|
+
const res = await fetch(`${base2}/messages`, { method: "POST", headers, body: JSON.stringify(body), signal });
|
|
2988
|
+
if (!res.ok) throw new Error(`llm ${res.status}: ${(await res.text()).slice(0, 300)}`);
|
|
2989
|
+
return fromReply(await res.json());
|
|
2990
|
+
}
|
|
2974
2991
|
function fromReply(data) {
|
|
2975
2992
|
const blocks = data.content ?? [];
|
|
2976
2993
|
const text2 = blocks.filter((b) => b.type === "text").map((b) => b.text).join("") || void 0;
|
|
@@ -3175,6 +3192,22 @@ var PROVIDER_LABEL = {
|
|
|
3175
3192
|
google: "Gemini"
|
|
3176
3193
|
};
|
|
3177
3194
|
var labelOf = (provider2) => PROVIDER_LABEL[provider2.toLowerCase()] ?? provider2;
|
|
3195
|
+
var VENDOR_PREFIX = [
|
|
3196
|
+
["claude", "Anthropic"],
|
|
3197
|
+
["gpt", "OpenAI"],
|
|
3198
|
+
["codex", "OpenAI"],
|
|
3199
|
+
["chatgpt", "OpenAI"],
|
|
3200
|
+
["o1", "OpenAI"],
|
|
3201
|
+
["o3", "OpenAI"],
|
|
3202
|
+
["o4", "OpenAI"],
|
|
3203
|
+
["gemini", "Gemini"],
|
|
3204
|
+
["deepseek", "DeepSeek"]
|
|
3205
|
+
];
|
|
3206
|
+
function modelProviderLabel(modelId, fallbackProvider) {
|
|
3207
|
+
const id = modelId.toLowerCase();
|
|
3208
|
+
for (const [prefix, vendor] of VENDOR_PREFIX) if (id.startsWith(prefix)) return vendor;
|
|
3209
|
+
return labelOf(fallbackProvider);
|
|
3210
|
+
}
|
|
3178
3211
|
var defaultModel = {
|
|
3179
3212
|
gapi: "gmodel-pro",
|
|
3180
3213
|
gmodel: "gmodel-pro",
|
|
@@ -3247,7 +3280,9 @@ async function listModels(provider2, cfg2) {
|
|
|
3247
3280
|
return (d2.models ?? []).filter((m) => m.supportedGenerationMethods?.includes("generateContent")).map((m) => (m.name ?? "").replace(/^models\//, "")).filter(Boolean);
|
|
3248
3281
|
}
|
|
3249
3282
|
if (p === "anthropic" || p === "claude") {
|
|
3250
|
-
const
|
|
3283
|
+
const base3 = cfg2.baseUrl?.replace(/\/$/, "");
|
|
3284
|
+
const url = base3 ? `${base3}/models` : "https://api.anthropic.com/v1/models";
|
|
3285
|
+
const r2 = await fetch(url, { headers: { "x-api-key": cfg2.apiKey, authorization: `Bearer ${cfg2.apiKey}`, "anthropic-version": "2023-06-01" } });
|
|
3251
3286
|
if (!r2.ok) return [];
|
|
3252
3287
|
const d2 = await r2.json();
|
|
3253
3288
|
return (d2.data ?? []).map((m) => m.id ?? "").filter(Boolean);
|
|
@@ -9952,7 +9987,7 @@ import { statSync as statSync6, readFileSync as readFileSync14, unlinkSync as un
|
|
|
9952
9987
|
// package.json
|
|
9953
9988
|
var package_default = {
|
|
9954
9989
|
name: "@guangnao/agent-cli",
|
|
9955
|
-
version: "1.1.
|
|
9990
|
+
version: "1.1.6",
|
|
9956
9991
|
description: "AgentOS terminal CLI \u2014 drive a real LLM agent on the microkernel; strongest-UX shell, advanced agent core",
|
|
9957
9992
|
type: "module",
|
|
9958
9993
|
bin: {
|
|
@@ -11675,7 +11710,10 @@ ${c.dim(cut(p.system, 300))}`);
|
|
|
11675
11710
|
return;
|
|
11676
11711
|
}
|
|
11677
11712
|
const choice = await this.dock.requestSplitSelect(
|
|
11678
|
-
opts.map((o) =>
|
|
11713
|
+
opts.map((o) => {
|
|
11714
|
+
const vendor = modelProviderLabel(o.model, o.provider);
|
|
11715
|
+
return { label: o.model, hint: vendor, value: `${o.provider}|${o.model}`, detail: `provider: ${vendor}${`${vendor} \xB7 ${o.model}` === m.current ? " (current)" : ""}` };
|
|
11716
|
+
}),
|
|
11679
11717
|
"switch model"
|
|
11680
11718
|
);
|
|
11681
11719
|
if (choice) this.switchModel(choice);
|
|
@@ -11683,12 +11721,13 @@ ${c.dim(cut(p.system, 300))}`);
|
|
|
11683
11721
|
switchModel(v) {
|
|
11684
11722
|
const sep = v.indexOf("|"), provider2 = v.slice(0, sep), model2 = v.slice(sep + 1);
|
|
11685
11723
|
this.chat = this.opts.modelMenu.build(provider2, model2);
|
|
11686
|
-
this.opts.modelMenu.
|
|
11724
|
+
this.opts.modelMenu.persist?.(provider2, model2);
|
|
11725
|
+
this.opts.modelMenu.current = `${modelProviderLabel(model2, provider2)} \xB7 ${model2}`;
|
|
11687
11726
|
const history = this.convo?.dump();
|
|
11688
11727
|
this.convo?.close();
|
|
11689
11728
|
this.convo = void 0;
|
|
11690
11729
|
if (history?.length) this.ensureConvo(history);
|
|
11691
|
-
this.note(`${c.done("model")} ${c.dim("\u2192")} ${c.bold(model2)} ${c.dim("(" +
|
|
11730
|
+
this.note(`${c.done("model")} ${c.dim("\u2192")} ${c.bold(model2)} ${c.dim("(" + modelProviderLabel(model2, provider2) + ")")}`);
|
|
11692
11731
|
this.dock.setStatusLine(this.statusLine());
|
|
11693
11732
|
}
|
|
11694
11733
|
/** /login — re-run the first-run setup wizard (pick provider → paste key → pick model), exactly the flow a
|
|
@@ -12257,8 +12296,14 @@ var keyOf = (p) => ({
|
|
|
12257
12296
|
function modelMenu() {
|
|
12258
12297
|
const keyed = ["gapi", "deepseek", "openai", "openai-responses", "gemini", "anthropic"].filter((p) => keyOf(p));
|
|
12259
12298
|
return {
|
|
12260
|
-
current: `${
|
|
12299
|
+
current: `${modelProviderLabel(model, provider)} \xB7 ${model}`,
|
|
12261
12300
|
build: (p, m) => makeChat(p, { apiKey: keyOf(p) ?? apiKey, model: m, baseUrl }),
|
|
12301
|
+
persist: (p, m) => {
|
|
12302
|
+
provider = p;
|
|
12303
|
+
model = m;
|
|
12304
|
+
saveConfig({ provider: p, model: m });
|
|
12305
|
+
},
|
|
12306
|
+
// /models choice survives restart (apiKey/baseUrl already saved)
|
|
12262
12307
|
async list() {
|
|
12263
12308
|
const lists = await Promise.all(keyed.map(async (p) => {
|
|
12264
12309
|
const ids = await listModels(p, { apiKey: keyOf(p) ?? apiKey, model: defaultModel[p] ?? model, baseUrl });
|
|
@@ -12277,7 +12322,7 @@ async function relogin() {
|
|
|
12277
12322
|
model = r.model;
|
|
12278
12323
|
baseUrl = process.env.LLM_BASE_URL ?? loadConfig().baseUrl;
|
|
12279
12324
|
buildChats();
|
|
12280
|
-
return { chat: rawChat, cheapChat, label: `${
|
|
12325
|
+
return { chat: rawChat, cheapChat, label: `${modelProviderLabel(model, provider)} \xB7 ${model}` };
|
|
12281
12326
|
}
|
|
12282
12327
|
async function main() {
|
|
12283
12328
|
if (!apiKey && !process.env.AGENTOS_OFFLINE) {
|