@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.
Files changed (2) hide show
  1. package/dist/cli.js +59 -14
  2. 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 body = {
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
- if (req.onDelta) return stream2(base2, headers, body, req.onDelta, req.signal);
2968
- const res = await fetch(`${base2}/messages`, { method: "POST", headers, body: JSON.stringify(body), signal: req.signal });
2969
- if (!res.ok) throw new Error(`llm ${res.status}: ${(await res.text()).slice(0, 300)}`);
2970
- const data = await res.json();
2971
- return fromReply(data);
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 r2 = await fetch("https://api.anthropic.com/v1/models", { headers: { "x-api-key": cfg2.apiKey, "anthropic-version": "2023-06-01" } });
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.5",
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) => ({ label: o.model, hint: labelOf(o.provider), value: `${o.provider}|${o.model}`, detail: `provider: ${labelOf(o.provider)}${`${labelOf(o.provider)} \xB7 ${o.model}` === m.current ? " (current)" : ""}` })),
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.current = `${labelOf(provider2)} \xB7 ${model2}`;
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("(" + labelOf(provider2) + ")")}`);
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: `${labelOf(provider)} \xB7 ${model}`,
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: `${labelOf(provider)} \xB7 ${model}` };
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guangnao/agent-cli",
3
- "version": "1.1.5",
3
+ "version": "1.1.6",
4
4
  "description": "AgentOS terminal CLI — drive a real LLM agent on the microkernel; strongest-UX shell, advanced agent core",
5
5
  "type": "module",
6
6
  "bin": {