base_parts_ai 1.0.54 → 1.0.55

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/lib/setapi_cx.js +27 -60
  2. package/package.json +3 -3
package/lib/setapi_cx.js CHANGED
@@ -10,7 +10,7 @@ var fs = require('fs');
10
10
  var inquirer = require('inquirer');
11
11
  var utils = require('./ai_utils');
12
12
  var childProcess = require('child_process');
13
- var TOML = require('smol-toml');
13
+ var TOML = require('@ltd/j-toml');
14
14
 
15
15
  // Codex 配置清除选项使用固定内部值,避免与服务端渠道 id 冲突。
16
16
  var CLEAR_CODEX_CONFIG = '__clear_codex_config__';
@@ -96,12 +96,12 @@ function parseTomlConfig(toml) {
96
96
  * @returns {string}
97
97
  */
98
98
  function stringifyTomlConfig(config) {
99
- var content = TOML.stringify(config || {});
100
- // smol-toml 默认把嵌套对象输出为子表;此固定请求头需按 Codex 支持的内联表格式写入。
101
- content = content.replace(
102
- /\n\[model_providers\.jcodex\.http_headers\]\n(?:"?x-openai-actor-authorization"?) = "local-image-extension"\n/g,
103
- '\nhttp_headers = { "x-openai-actor-authorization" = "local-image-extension" }\n'
104
- );
99
+ var content = TOML.stringify(config || {}, {
100
+ newline: '\n',
101
+ newlineAround: 'section',
102
+ });
103
+ // j-toml 默认在文档开头保留空行,此处统一为原有配置文件格式。
104
+ content = content.replace(/^\n/, '');
105
105
  return content ? content.replace(/\s+$/, '') + '\n' : '';
106
106
  }
107
107
 
@@ -177,7 +177,7 @@ function hasTopLevelKey(toml, key) {
177
177
  function ensureSandboxMode(toml) {
178
178
  var config = parseTomlConfig(toml);
179
179
  if (!Object.prototype.hasOwnProperty.call(config, 'sandbox_mode')) {
180
- config.sandbox_mode = 'danger-full-access';
180
+ config.sandbox_mode = TOML.basic('danger-full-access');
181
181
  }
182
182
  return stringifyTomlConfig(config);
183
183
  }
@@ -241,62 +241,32 @@ function removeJcodexProviderBlock(toml) {
241
241
  * @param {string} toml 原 TOML 内容
242
242
  * @param {string} baseUrl provider base_url
243
243
  * @param {string} wireApi provider wire_api,空值表示删除该字段
244
+ * @param {string} openAiKey 当前渠道生效的 OPENAI_API_KEY
244
245
  * @returns {string}
245
246
  */
246
- function setJcodexProvider(toml, baseUrl, wireApi) {
247
+ function setJcodexProvider(toml, baseUrl, wireApi, openAiKey) {
248
+ if (typeof openAiKey !== 'string' || !openAiKey.trim()) {
249
+ throw new Error('写入 jcodex provider 时 OPENAI_API_KEY 不能为空');
250
+ }
247
251
  var config = parseTomlConfig(toml);
248
252
  var providers = ensureTable(config, 'model_providers');
249
- config.model_provider = 'jcodex';
250
- providers.jcodex = {
251
- name: 'jcodex',
252
- base_url: baseUrl,
253
- // jcodex 使用本地图片扩展身份,不要求 Codex 注入 OpenAI 鉴权。
253
+ config.model_provider = TOML.basic('jcodex');
254
+ providers.jcodex = TOML.Section({
255
+ name: TOML.basic('jcodex'),
256
+ base_url: TOML.basic(baseUrl),
257
+
258
+ // jcodex 使用本地图片扩展身份 - 该方法 codex 0.149.0 版本会导致401错误,需要增加Authorization请求头
254
259
  requires_openai_auth: false,
255
- http_headers: {
256
- 'x-openai-actor-authorization': 'local-image-extension',
257
- },
258
- };
260
+ http_headers: TOML.inline({
261
+ 'x-openai-actor-authorization': TOML.basic('local-image-extension'),
262
+ Authorization: TOML.basic('Bearer ' + openAiKey),
263
+ }),
264
+
265
+ });
259
266
  // wire_api 是 Codex provider 私有字段,非空时强制写入到 model_providers.jcodex 下
260
267
  if (wireApi) {
261
- providers.jcodex.wire_api = wireApi;
262
- }
263
- return stringifyTomlConfig(config);
264
- }
265
-
266
- /**
267
- * 删除已有 jcodex provider 段中的 wire_api 字段,保留其它配置
268
- * @param {string} toml TOML 内容
269
- * @returns {string}
270
- */
271
- function removeJcodexWireApi(toml) {
272
- var config = parseTomlConfig(toml);
273
- var provider = config.model_providers && config.model_providers.jcodex;
274
- // wire_api 为空时只删除 jcodex provider 下的私有字段,不影响其它段落
275
- if (provider && typeof provider === 'object' && !Array.isArray(provider)) {
276
- delete provider.wire_api;
277
- }
278
- return stringifyTomlConfig(config);
279
- }
280
-
281
- /**
282
- * 写入 jcodex provider 段中的 wire_api 字段,已有字段会被强制覆盖
283
- * @param {string} toml TOML 内容
284
- * @param {string} wireApi provider wire_api
285
- * @returns {string}
286
- */
287
- function setJcodexWireApi(toml, wireApi) {
288
- var config = parseTomlConfig(toml);
289
- var providers = ensureTable(config, 'model_providers');
290
- var provider = ensureTable(providers, 'jcodex');
291
- if (!provider.name) {
292
- provider.name = 'jcodex';
268
+ providers.jcodex.wire_api = TOML.basic(wireApi);
293
269
  }
294
- // 即使渠道只配置 wire_api,也要补齐 jcodex 的固定鉴权参数。
295
- provider.requires_openai_auth = false;
296
- provider.http_headers = {
297
- 'x-openai-actor-authorization': 'local-image-extension',
298
- };
299
- provider.wire_api = wireApi;
300
270
  return stringifyTomlConfig(config);
301
271
  }
302
272
 
@@ -547,10 +517,9 @@ async function setapiCx(cmd, buildCfg) {
547
517
  utils.writeJsonFile(buildCfg.codexAuthPath, auth);
548
518
 
549
519
  if (baseUrl) {
550
- toml = setJcodexProvider(toml, baseUrl, wireApi);
520
+ toml = setJcodexProvider(toml, baseUrl, wireApi, forcedKey);
551
521
  } else {
552
522
  toml = removeTopLevelModelProvider(toml);
553
- toml = wireApi ? setJcodexWireApi(toml, wireApi) : removeJcodexWireApi(toml);
554
523
  }
555
524
  toml = ensureSandboxMode(toml);
556
525
  toml = removeEditorInsertNewlineKeymap(toml);
@@ -576,8 +545,6 @@ setapiCx._private = {
576
545
  removeEditorInsertNewlineKeymap: removeEditorInsertNewlineKeymap,
577
546
  removeTopLevelModelProvider: removeTopLevelModelProvider,
578
547
  removeJcodexProviderBlock: removeJcodexProviderBlock,
579
- removeJcodexWireApi: removeJcodexWireApi,
580
- setJcodexWireApi: setJcodexWireApi,
581
548
  setJcodexProvider: setJcodexProvider,
582
549
  getCurrentCodexChannelId: getCurrentCodexChannelId,
583
550
  saveLastManualOpenAiKey: saveLastManualOpenAiKey,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "base_parts_ai",
3
- "version": "1.0.54",
3
+ "version": "1.0.55",
4
4
  "description": "jaskle base_parts_ai",
5
5
  "main": "./main.js",
6
6
  "registry": true,
@@ -31,8 +31,8 @@
31
31
  "author": "jaskle",
32
32
  "license": "ISC",
33
33
  "dependencies": {
34
+ "@ltd/j-toml": "^1.38.0",
34
35
  "commander": "^14.0.3",
35
- "inquirer": "^8.2.7",
36
- "smol-toml": "^1.6.1"
36
+ "inquirer": "^8.2.7"
37
37
  }
38
38
  }