jinzd-ai-cli 0.1.43 → 0.1.45

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/CLAUDE.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 项目简介
4
4
 
5
- 一个跨平台的 REPL 风格 AI 对话工具,支持多个主流 AI 提供商(Claude、Gemini、DeepSeek、智谱清言、Kimi),
5
+ 一个跨平台的 REPL 风格 AI 对话工具,支持多个主流 AI 提供商(OpenAI、Claude、Gemini、DeepSeek、智谱清言、Kimi),
6
6
  带有 **AI 工具调用(Agentic)** 能力,支持执行 bash 命令、读写文件、运行交互式程序、流式生成大文档。
7
7
  代理支持(`proxy` 配置字段 + 环境变量),Gemini 完整支持(2.5 Pro/Flash,array items schema 修复)。
8
8
  **MCP 协议支持**:可接入外部 MCP 服务器,自动发现并注册工具,无缝融入 agentic 循环。
@@ -31,6 +31,7 @@ src/
31
31
  │ ├── openai-compatible.ts # DeepSeek/Zhipu/Kimi 共用基类;实现 chatWithTools + buildToolResultMessages
32
32
  │ ├── claude.ts # Anthropic SDK provider
33
33
  │ ├── gemini.ts # Google Generative AI provider(role: assistant → model)
34
+ │ ├── openai.ts # OpenAI provider(GPT-5.4/5/4.1/4o/o3/o4-mini)
34
35
  │ ├── deepseek.ts / zhipu.ts / kimi.ts # 继承 OpenAICompatibleProvider,只声明 defaultBaseUrl 和 info
35
36
  ├── config/
36
37
  │ ├── schema.ts # Zod schema(含 timeouts / customBaseUrls / defaultModels)
@@ -158,6 +159,7 @@ MCP 工具名格式:`mcp__<serverId>__<toolName>`,如 `mcp__filesystem__read
158
159
  ## 环境变量(优先级高于配置文件)
159
160
 
160
161
  ```
162
+ AICLI_API_KEY_OPENAI OpenAI API Key
161
163
  AICLI_API_KEY_CLAUDE Claude API Key
162
164
  AICLI_API_KEY_GEMINI Gemini API Key
163
165
  AICLI_API_KEY_DEEPSEEK DeepSeek API Key
@@ -8,7 +8,7 @@ import { platform } from "os";
8
8
  import chalk from "chalk";
9
9
 
10
10
  // src/core/constants.ts
11
- var VERSION = "0.1.43";
11
+ var VERSION = "0.1.45";
12
12
  var APP_NAME = "ai-cli";
13
13
  var CONFIG_DIR_NAME = ".aicli";
14
14
  var CONFIG_FILE_NAME = "config.json";
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ import {
29
29
  SUBAGENT_MAX_ROUNDS_LIMIT,
30
30
  VERSION,
31
31
  runTestsTool
32
- } from "./chunk-4MVOMCLY.js";
32
+ } from "./chunk-ZF62G7VO.js";
33
33
 
34
34
  // src/index.ts
35
35
  import { program } from "commander";
@@ -176,6 +176,7 @@ var ENV_KEY_MAP = {
176
176
  deepseek: "AICLI_API_KEY_DEEPSEEK",
177
177
  zhipu: "AICLI_API_KEY_ZHIPU",
178
178
  kimi: "AICLI_API_KEY_KIMI",
179
+ openai: "AICLI_API_KEY_OPENAI",
179
180
  "google-search": "AICLI_API_KEY_GOOGLESEARCH"
180
181
  };
181
182
  var EnvLoader = class {
@@ -941,11 +942,21 @@ var OpenAICompatibleProvider = class extends BaseProvider {
941
942
  if (options?.timeout !== void 0) {
942
943
  this.defaultTimeout = options.timeout;
943
944
  }
944
- this.client = new OpenAI({
945
+ const clientOptions = {
945
946
  apiKey,
946
947
  baseURL: options?.baseUrl ?? this.defaultBaseUrl,
947
948
  timeout: this.defaultTimeout
948
- });
949
+ };
950
+ const proxyUrl = options?.proxy;
951
+ if (proxyUrl) {
952
+ try {
953
+ const { ProxyAgent, fetch: undiciFetch } = await import("undici");
954
+ const agent = new ProxyAgent({ uri: proxyUrl });
955
+ clientOptions.fetch = ((url, init) => undiciFetch(url, { ...init, dispatcher: agent }));
956
+ } catch {
957
+ }
958
+ }
959
+ this.client = new OpenAI(clientOptions);
949
960
  }
950
961
  /** 将 systemPrompt + messages 合并为 OpenAI messages 数组(system 消息放首位)。 */
951
962
  buildMessages(request) {
@@ -1478,6 +1489,104 @@ var KimiProvider = class extends OpenAICompatibleProvider {
1478
1489
  }
1479
1490
  };
1480
1491
 
1492
+ // src/providers/openai.ts
1493
+ var OpenAIProvider = class extends OpenAICompatibleProvider {
1494
+ defaultBaseUrl = "https://api.openai.com/v1";
1495
+ info = {
1496
+ id: "openai",
1497
+ displayName: "OpenAI",
1498
+ defaultModel: "gpt-4o",
1499
+ apiKeyEnvVar: "AICLI_API_KEY_OPENAI",
1500
+ requiresApiKey: true,
1501
+ baseUrl: this.defaultBaseUrl,
1502
+ models: [
1503
+ // GPT-5.4 系列(最新旗舰,1.05M 上下文)
1504
+ {
1505
+ id: "gpt-5.4",
1506
+ displayName: "GPT-5.4",
1507
+ contextWindow: 105e4,
1508
+ supportsStreaming: true
1509
+ },
1510
+ {
1511
+ id: "gpt-5.4-pro",
1512
+ displayName: "GPT-5.4 Pro",
1513
+ contextWindow: 105e4,
1514
+ supportsStreaming: true
1515
+ },
1516
+ // GPT-5 系列(400K 上下文)
1517
+ {
1518
+ id: "gpt-5",
1519
+ displayName: "GPT-5",
1520
+ contextWindow: 4e5,
1521
+ supportsStreaming: true
1522
+ },
1523
+ {
1524
+ id: "gpt-5-mini",
1525
+ displayName: "GPT-5 Mini",
1526
+ contextWindow: 4e5,
1527
+ supportsStreaming: true
1528
+ },
1529
+ {
1530
+ id: "gpt-5-nano",
1531
+ displayName: "GPT-5 Nano",
1532
+ contextWindow: 4e5,
1533
+ supportsStreaming: true
1534
+ },
1535
+ // GPT-4.1 系列(1M 上下文)
1536
+ {
1537
+ id: "gpt-4.1",
1538
+ displayName: "GPT-4.1",
1539
+ contextWindow: 1048576,
1540
+ supportsStreaming: true
1541
+ },
1542
+ {
1543
+ id: "gpt-4.1-mini",
1544
+ displayName: "GPT-4.1 Mini",
1545
+ contextWindow: 1048576,
1546
+ supportsStreaming: true
1547
+ },
1548
+ {
1549
+ id: "gpt-4.1-nano",
1550
+ displayName: "GPT-4.1 Nano",
1551
+ contextWindow: 1048576,
1552
+ supportsStreaming: true
1553
+ },
1554
+ // GPT-4o 系列(128K 上下文)
1555
+ {
1556
+ id: "gpt-4o",
1557
+ displayName: "GPT-4o",
1558
+ contextWindow: 128e3,
1559
+ supportsStreaming: true
1560
+ },
1561
+ {
1562
+ id: "gpt-4o-mini",
1563
+ displayName: "GPT-4o Mini",
1564
+ contextWindow: 128e3,
1565
+ supportsStreaming: true
1566
+ },
1567
+ // 推理模型(200K 上下文)
1568
+ {
1569
+ id: "o3",
1570
+ displayName: "o3",
1571
+ contextWindow: 2e5,
1572
+ supportsStreaming: true
1573
+ },
1574
+ {
1575
+ id: "o3-mini",
1576
+ displayName: "o3 Mini",
1577
+ contextWindow: 2e5,
1578
+ supportsStreaming: true
1579
+ },
1580
+ {
1581
+ id: "o4-mini",
1582
+ displayName: "o4 Mini",
1583
+ contextWindow: 2e5,
1584
+ supportsStreaming: true
1585
+ }
1586
+ ]
1587
+ };
1588
+ };
1589
+
1481
1590
  // src/providers/custom.ts
1482
1591
  var CustomProvider = class extends OpenAICompatibleProvider {
1483
1592
  defaultBaseUrl;
@@ -1518,7 +1627,8 @@ var BUILT_IN_PROVIDERS = [
1518
1627
  GeminiProvider,
1519
1628
  DeepSeekProvider,
1520
1629
  ZhipuProvider,
1521
- KimiProvider
1630
+ KimiProvider,
1631
+ OpenAIProvider
1522
1632
  ];
1523
1633
  var ProviderRegistry = class {
1524
1634
  providers = /* @__PURE__ */ new Map();
@@ -2055,8 +2165,8 @@ var Renderer = class {
2055
2165
  console.log(label("\u63CF\u8FF0") + chalk2.white(DESCRIPTION));
2056
2166
  console.log(label("\u4F5C\u8005") + theme.warning(AUTHOR) + theme.dim(" <" + AUTHOR_EMAIL + ">"));
2057
2167
  console.log(HR);
2058
- console.log(theme.dim(" \u652F\u6301\u7684 Provider\uFF086\u4E2A\uFF09\uFF1A"));
2059
- console.log(theme.dim(" DeepSeek \xB7 Kimi (Moonshot) \xB7 Claude (Anthropic)"));
2168
+ console.log(theme.dim(" \u652F\u6301\u7684 Provider\uFF087\u4E2A\uFF09\uFF1A"));
2169
+ console.log(theme.dim(" OpenAI \xB7 DeepSeek \xB7 Kimi (Moonshot) \xB7 Claude (Anthropic)"));
2060
2170
  console.log(theme.dim(" Gemini (Google) \xB7 \u667A\u8C31\u6E05\u8A00 \xB7 \u81EA\u5B9A\u4E49 OpenAI \u517C\u5BB9"));
2061
2171
  console.log(HR);
2062
2172
  const mcpToolCount = mcpInfo?.tools ?? 0;
@@ -3788,7 +3898,7 @@ ${hint}` : "")
3788
3898
  description: "Run project tests and show structured report",
3789
3899
  usage: "/test [command|filter]",
3790
3900
  async execute(args, _ctx) {
3791
- const { executeTests } = await import("./run-tests-EDLA43LE.js");
3901
+ const { executeTests } = await import("./run-tests-XB4TDIP3.js");
3792
3902
  const argStr = args.join(" ").trim();
3793
3903
  let testArgs = {};
3794
3904
  if (argStr) {
@@ -6886,7 +6996,8 @@ var PROVIDERS = [
6886
6996
  { value: "gemini", name: "Gemini (Google)" },
6887
6997
  { value: "deepseek", name: "DeepSeek" },
6888
6998
  { value: "zhipu", name: "\u667A\u8C31\u6E05\u8A00 (GLM)" },
6889
- { value: "kimi", name: "Kimi (Moonshot AI)" }
6999
+ { value: "kimi", name: "Kimi (Moonshot AI)" },
7000
+ { value: "openai", name: "OpenAI" }
6890
7001
  ];
6891
7002
  function maskKey(key) {
6892
7003
  if (key.length <= 10) return "****";
@@ -9791,7 +9902,8 @@ async function runHeadless(options) {
9791
9902
  (id) => config.getApiKey(id),
9792
9903
  (id) => ({
9793
9904
  baseUrl: config.get("customBaseUrls")[id],
9794
- timeout: config.get("timeouts")[id]
9905
+ timeout: config.get("timeouts")[id],
9906
+ proxy: config.get("proxy")
9795
9907
  }),
9796
9908
  config.get("customProviders")
9797
9909
  );
@@ -9929,7 +10041,8 @@ async function startRepl(options) {
9929
10041
  (id) => config.getApiKey(id),
9930
10042
  (id) => ({
9931
10043
  baseUrl: config.get("customBaseUrls")[id],
9932
- timeout: config.get("timeouts")[id]
10044
+ timeout: config.get("timeouts")[id],
10045
+ proxy: config.get("proxy")
9933
10046
  }),
9934
10047
  config.get("customProviders")
9935
10048
  );
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  executeTests,
4
4
  runTestsTool
5
- } from "./chunk-4MVOMCLY.js";
5
+ } from "./chunk-ZF62G7VO.js";
6
6
  export {
7
7
  executeTests,
8
8
  runTestsTool
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jinzd-ai-cli",
3
- "version": "0.1.43",
3
+ "version": "0.1.45",
4
4
  "description": "Cross-platform REPL-style AI CLI with multi-provider support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",