chatccc 0.2.246 → 0.2.248

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/src/web-ui.ts CHANGED
@@ -68,6 +68,9 @@ interface AppConfig {
68
68
  DEEPSEEK_BASE_URL?: string;
69
69
  model?: string;
70
70
  alternativeModel?: string;
71
+ effort?: string;
72
+ /** 留空("")= 不 override,跟随 DeepCCC 内核配置(~/.deepccc/config.json 或 DEEPCCC_PROVIDER) */
73
+ provider?: "" | "openai" | "anthropic";
71
74
  };
72
75
  }
73
76
 
@@ -530,6 +533,9 @@ export function unflattenConfig(flat: Record<string, unknown>): Record<string, u
530
533
  } else if (key === "CHATCCC_CCC_EFFORT") {
531
534
  result.ccc = result.ccc || {};
532
535
  (result.ccc as Record<string, unknown>).effort = val;
536
+ } else if (key === "CHATCCC_CCC_PROVIDER") {
537
+ result.ccc = result.ccc || {};
538
+ (result.ccc as Record<string, unknown>).provider = val;
533
539
  } else if (key === "CHATCCC_CCC_ENABLED") {
534
540
  result.ccc = result.ccc || {};
535
541
  (result.ccc as Record<string, unknown>).enabled = val === true || val === "true";
@@ -921,6 +927,15 @@ header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500
921
927
  <label>备选模型(选填)</label>
922
928
  <input type="text" id="field-CHATCCC_CCC_ALTERNATIVE_MODEL" placeholder="加入 /model 列表,便于会话内切换">
923
929
  </div>
930
+ <div class="form-group">
931
+ <label>API 协议(选填)</label>
932
+ <select id="field-CHATCCC_CCC_PROVIDER">
933
+ <option value="">跟随 DeepCCC 内核配置(默认)</option>
934
+ <option value="openai">openai - OpenAI 兼容协议</option>
935
+ <option value="anthropic">anthropic - Anthropic Messages 协议</option>
936
+ </select>
937
+ <div class="hint">与 Base URL 强相关:OpenAI 兼容端点选 openai;Anthropic Messages 端点选 anthropic。留空时使用 ~/.deepccc/config.json 或 DEEPCCC_PROVIDER 的值。</div>
938
+ </div>
924
939
  <div class="form-group">
925
940
  <label>Effort(推理强度,选填)</label>
926
941
  <select id="field-CHATCCC_CCC_EFFORT">
@@ -1206,6 +1221,7 @@ header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500
1206
1221
  <div class="section-detail">
1207
1222
  <div class="config-row"><span class="key">API Key</span><span class="val" id="cfg-CCC_API_KEY">-</span></div>
1208
1223
  <div class="config-row"><span class="key">Base URL</span><span class="val" id="cfg-CCC_BASE_URL">-</span></div>
1224
+ <div class="config-row"><span class="key">API 协议</span><span class="val" id="cfg-CCC_PROVIDER">-</span></div>
1209
1225
  <div class="config-row"><span class="key">模型</span><span class="val" id="cfg-CCC_MODEL">-</span></div>
1210
1226
  <div class="config-row"><span class="key">备选模型</span><span class="val" id="cfg-CCC_ALTERNATIVE_MODEL">-</span></div>
1211
1227
  <label class="agent-default-row" style="margin-top:10px"><input type="checkbox" id="dash-default-ccc" onchange="setDashboardDefaultAgent('ccc', this.checked)"> 设为默认 Agent</label>
@@ -1258,7 +1274,7 @@ const AGENT_FIELDS = {
1258
1274
  claude: ['CHATCCC_ANTHROPIC_MODEL','CHATCCC_ANTHROPIC_SUBAGENT_MODEL','CHATCCC_ANTHROPIC_EFFORT','CHATCCC_ANTHROPIC_API_KEY','CHATCCC_ANTHROPIC_BASE_URL','CHATCCC_ANTHROPIC_MAX_TURN'],
1259
1275
  cursor: ['CHATCCC_CURSOR_PATH','CHATCCC_CURSOR_MODEL','CHATCCC_CURSOR_ALTERNATIVE_MODEL','CHATCCC_CURSOR_AVATAR_BATTERY_MODE','CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET'],
1260
1276
  codex: ['CHATCCC_CODEX_PATH','CHATCCC_CODEX_MODEL','CHATCCC_CODEX_ALTERNATIVE_MODEL','CHATCCC_CODEX_EFFORT','CHATCCC_CODEX_FAST_MODE'],
1261
- ccc: ['CHATCCC_CCC_API_KEY','CHATCCC_CCC_BASE_URL','CHATCCC_CCC_MODEL','CHATCCC_CCC_ALTERNATIVE_MODEL','CHATCCC_CCC_EFFORT']
1277
+ ccc: ['CHATCCC_CCC_API_KEY','CHATCCC_CCC_BASE_URL','CHATCCC_CCC_MODEL','CHATCCC_CCC_ALTERNATIVE_MODEL','CHATCCC_CCC_EFFORT','CHATCCC_CCC_PROVIDER']
1262
1278
  };
1263
1279
  const FEISHU_FIELDS = ['CHATCCC_APP_ID','CHATCCC_APP_SECRET'];
1264
1280
  const WEB_UI_FIELDS = ['CHATCCC_WEB_UI_OPEN_ON_START'];
@@ -1591,6 +1607,7 @@ function renderStep2() {
1591
1607
  if (c.ccc) {
1592
1608
  prefillNested('field-CHATCCC_CCC_API_KEY', c.ccc.DEEPSEEK_API_KEY);
1593
1609
  prefillNested('field-CHATCCC_CCC_BASE_URL', c.ccc.DEEPSEEK_BASE_URL);
1610
+ prefillNested('field-CHATCCC_CCC_PROVIDER', c.ccc.provider);
1594
1611
  prefillNested('field-CHATCCC_CCC_MODEL', c.ccc.model);
1595
1612
  prefillNested('field-CHATCCC_CCC_ALTERNATIVE_MODEL', c.ccc.alternativeModel);
1596
1613
  prefillNested('field-CHATCCC_CCC_EFFORT', c.ccc.effort);
@@ -1990,6 +2007,7 @@ function updateDashboardUI() {
1990
2007
  document.getElementById('cfg-CODEX_FAST_MODE').textContent = c.codex && c.codex.fastMode === true ? '已启用' : '已禁用';
1991
2008
  document.getElementById('cfg-CCC_API_KEY').textContent = (c.ccc && c.ccc.DEEPSEEK_API_KEY) ? '***已设置***' : '(留空)';
1992
2009
  document.getElementById('cfg-CCC_BASE_URL').textContent = (c.ccc && c.ccc.DEEPSEEK_BASE_URL) || '(留空)';
2010
+ document.getElementById('cfg-CCC_PROVIDER').textContent = (c.ccc && c.ccc.provider) ? c.ccc.provider : '(跟随 DeepCCC 内核配置)';
1993
2011
  document.getElementById('cfg-CCC_MODEL').textContent = (c.ccc && c.ccc.model) || '(留空)';
1994
2012
  document.getElementById('cfg-CCC_ALTERNATIVE_MODEL').textContent = (c.ccc && c.ccc.alternativeModel) || '(留空)';
1995
2013
  }
@@ -2067,13 +2085,15 @@ function editSection(section) {
2067
2085
  'CHATCCC_CODEX_PATH': 'CLI 路径', 'CHATCCC_CODEX_MODEL': '模型', 'CHATCCC_CODEX_ALTERNATIVE_MODEL': '备选模型', 'CHATCCC_CODEX_EFFORT': 'Effort',
2068
2086
  'CHATCCC_CODEX_FAST_MODE': 'Fast 模式',
2069
2087
  'CHATCCC_CCC_API_KEY': 'API Key', 'CHATCCC_CCC_BASE_URL': 'Base URL',
2088
+ 'CHATCCC_CCC_PROVIDER': 'API 协议(选填)',
2070
2089
  'CHATCCC_CCC_MODEL': '模型', 'CHATCCC_CCC_ALTERNATIVE_MODEL': '备选模型', 'CHATCCC_CCC_EFFORT': 'Effort'
2071
2090
  };
2072
2091
  var hintMap = {
2073
2092
  'CHATCCC_WEB_UI_OPEN_ON_START': '关闭后可继续手动访问 http://localhost:<端口>/;/restart、/update 和 Web UI 重启无论此项为何值都不会自动打开。',
2074
2093
  'CHATCCC_CHROME_DEVTOOLS_ENABLED': '依赖:本机 Google Chrome;ChatGPT 订阅到期查询需要在该 CDP Chrome 中登录 ChatGPT。',
2075
2094
  'CHATCCC_CHROME_DEVTOOLS_PORT': '默认 15166,健康检查端点为 http://127.0.0.1:15166/json/version。',
2076
- 'CHATCCC_CHROME_DEVTOOLS_PATH': '选填。留空时自动探测 Google Chrome。'
2095
+ 'CHATCCC_CHROME_DEVTOOLS_PATH': '选填。留空时自动探测 Google Chrome。',
2096
+ 'CHATCCC_CCC_PROVIDER': '与 Base URL 强相关:OpenAI 兼容端点选 openai;Anthropic Messages 端点选 anthropic。留空 = 跟随 DeepCCC 内核配置(~/.deepccc/config.json 或 DEEPCCC_PROVIDER),改动需重启 ChatCCC 生效。'
2077
2097
  };
2078
2098
 
2079
2099
  if (section === 'chromeDevtools') {
@@ -2115,6 +2135,7 @@ function editSection(section) {
2115
2135
  } else if (section === 'ccc' && state.config.ccc) {
2116
2136
  if (key === 'CHATCCC_CCC_API_KEY') val = state.config.ccc.DEEPSEEK_API_KEY || '';
2117
2137
  else if (key === 'CHATCCC_CCC_BASE_URL') val = state.config.ccc.DEEPSEEK_BASE_URL || '';
2138
+ else if (key === 'CHATCCC_CCC_PROVIDER') val = state.config.ccc.provider || '';
2118
2139
  else if (key === 'CHATCCC_CCC_MODEL') val = state.config.ccc.model || '';
2119
2140
  else if (key === 'CHATCCC_CCC_ALTERNATIVE_MODEL') val = state.config.ccc.alternativeModel || '';
2120
2141
  else if (key === 'CHATCCC_CCC_EFFORT') val = state.config.ccc.effort || '';
@@ -2134,6 +2155,16 @@ function editSection(section) {
2134
2155
  html += '<option value="apiPercent"' + (modeVal === 'apiPercent' ? ' selected' : '') + '>API 使用比例</option>';
2135
2156
  html += '<option value="onDemandUse"' + (modeVal === 'onDemandUse' ? ' selected' : '') + '>On demand use 金额</option>';
2136
2157
  html += '</select></div>';
2158
+ } else if (key === 'CHATCCC_CCC_PROVIDER') {
2159
+ var providerVal = val || '';
2160
+ html += '<div class="form-group"><label>' + (labelMap[key] || key) + '</label>';
2161
+ html += '<select id="edit-' + key + '" style="width:100%;padding:8px 12px;border:1px solid #cbd5e1;border-radius:8px;font-size:14px;outline:none">';
2162
+ html += '<option value=""' + (providerVal === '' ? ' selected' : '') + '>跟随 DeepCCC 内核配置(默认)</option>';
2163
+ html += '<option value="openai"' + (providerVal === 'openai' ? ' selected' : '') + '>openai - OpenAI 兼容协议</option>';
2164
+ html += '<option value="anthropic"' + (providerVal === 'anthropic' ? ' selected' : '') + '>anthropic - Anthropic Messages 协议</option>';
2165
+ html += '</select>';
2166
+ if (hintMap[key]) html += '<div class="hint" style="margin-top:6px;line-height:1.5">' + hintMap[key] + '</div>';
2167
+ html += '</div>';
2137
2168
  } else {
2138
2169
  var rowId = key === 'CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET'
2139
2170
  ? ' id="edit-cursor-on-demand-budget-row"'