@jungtz/chat-kit 0.1.0 → 0.3.0
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/README.md +15 -0
- package/dist/cli/claude.d.ts +25 -0
- package/dist/cli/create-cli-model.d.ts +14 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/isolated-cwd.d.ts +10 -0
- package/dist/cli/opencode.d.ts +27 -0
- package/dist/cli/prompt.d.ts +15 -0
- package/dist/cli/spawn.d.ts +28 -0
- package/dist/cli/types.d.ts +29 -0
- package/dist/cli/util.d.ts +10 -0
- package/dist/engine/engine.d.ts +5 -0
- package/dist/engine/messages.d.ts +22 -0
- package/dist/engine/types.d.ts +7 -2
- package/dist/guards/input.d.ts +5 -1
- package/dist/guards/output.d.ts +45 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models/create-model.d.ts +1 -1
- package/dist/models/index.d.ts +1 -1
- package/dist/models/index.js +1 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/quirks.d.ts +3 -0
- package/dist/models/types.d.ts +7 -2
- package/dist/prompt/assemble.d.ts +2 -0
- package/dist/prompt/markers.d.ts +23 -3
- package/docs/API.md +55 -6
- package/package.json +10 -1
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
| `engine/` | `runTurn`(串流事件)/`completeTurn`(完整結果)、工具迴圈 | ✅ P2 |
|
|
9
9
|
| `prompt/` | 片段+上下文區塊組裝、固定順序、信任標記、佔位符檢查 | ✅ P2 |
|
|
10
10
|
| `guards/` | 輸入標記中和、輸出標記清洗、模型自我介紹過濾、自訂閘門介面 | ✅ P2 |
|
|
11
|
+
| `cli/` | 把本機 `claude`/`opencode` 包成 `LanguageModelV3`(子路徑 `@jungtz/chat-kit/cli`,不從根入口匯出) | ✅ |
|
|
11
12
|
| `knowledge/` | wiki-router 整合 | ⛔ 不建(P5 決定,見 PLAN §6.1) |
|
|
12
13
|
|
|
13
14
|
完整計畫見 `docs/CHAT_KIT_PLAN.md`,待執行事項見 `docs/NEXT_STEPS.md`,從發問到輸出的完整流程與接入範例見 `docs/FLOW.md`,介面簽名速查見 `docs/API.md`(隨 npm 包出貨)。
|
|
@@ -46,6 +47,20 @@ const result = streamText({
|
|
|
46
47
|
})
|
|
47
48
|
```
|
|
48
49
|
|
|
50
|
+
### 本地 CLI 當模型
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
import { createCliModel } from '@jungtz/chat-kit/cli'
|
|
54
|
+
|
|
55
|
+
const model = createCliModel({ command: 'claude', model: 'sonnet', effort: 'high' })
|
|
56
|
+
// 之後和任何 LanguageModel 一樣傳給引擎或 generateText/streamText
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
- 純文字補全:`claude` 以 `--tools ""` 關掉內建工具與 MCP,引擎的 `tools` 須為空(否則拋錯)。
|
|
60
|
+
- `cwd` 省略時在系統暫存下的空目錄執行,不繼承目前行程的工作目錄,避免 CLI 讀到該處的 CLAUDE.md/AGENTS.md;要讓 CLI 看到某個專案才明確傳 `cwd`。
|
|
61
|
+
- `model`、`effort` 只接受 `[A-Za-z0-9._:/#@+=-]`(Windows 會經 shell 啟動)。
|
|
62
|
+
- 只能從 `@jungtz/chat-kit/cli` 匯入:根入口不含它,只用引擎的使用端不會載入 `node:child_process`。
|
|
63
|
+
|
|
49
64
|
不用 `config.json` 的專案可以完全不碰 `models/`:引擎只認 AI SDK 的 `LanguageModel`,
|
|
50
65
|
直接傳 `google('gemini-…')` 之類的 model 即可。
|
|
51
66
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* claude-code 非互動呼叫:`claude -p --model <m> --output-format json [--effort X]`,
|
|
3
|
+
* prompt 經 stdin 餵入。stdout 是單一 JSON 物件。
|
|
4
|
+
*
|
|
5
|
+
* 引擎把它當純文字補全模型,所以要關掉 CLI 自帶的 agent 能力:終端使用者的聊天文字
|
|
6
|
+
* 會進到 prompt,若放著內建工具,prompt injection 就能讀伺服器上的檔案。
|
|
7
|
+
* - `--tools ""`:停用全部內建工具(Read、Bash、Edit…)
|
|
8
|
+
* - `--strict-mcp-config`:不載入使用者設定的 MCP 伺服器(沒給 `--mcp-config`,等於全不載入)
|
|
9
|
+
* - `--disable-slash-commands`:停用 skills
|
|
10
|
+
* - `--no-session-persistence`:聊天內容不寫進本機 session 歷史
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildClaudeArgs(model: string, effort?: string): string[];
|
|
13
|
+
export interface CliUsage {
|
|
14
|
+
/** 未命中快取的輸入 token */
|
|
15
|
+
inputTokens: number;
|
|
16
|
+
outputTokens: number;
|
|
17
|
+
/** 讀自快取的輸入 token;CLI 沒給時為 undefined */
|
|
18
|
+
cacheReadTokens?: number;
|
|
19
|
+
/** 寫入快取的輸入 token;CLI 沒給時為 undefined */
|
|
20
|
+
cacheWriteTokens?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function parseClaudeOutput(stdout: Buffer, stderr: string, code: number): {
|
|
23
|
+
text: string;
|
|
24
|
+
usage: CliUsage;
|
|
25
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本地 CLI 模型:把 `claude`/`opencode` 包成 AI SDK `LanguageModelV3`。
|
|
3
|
+
*
|
|
4
|
+
* 引擎看到的只是普通 model,用法與 API 模型無異:
|
|
5
|
+
* `engine.completeTurn({ model: createCliModel({ command: 'claude', model: 'sonnet' }), ... })`
|
|
6
|
+
*
|
|
7
|
+
* 兩條硬限制(失敗時直接拋錯,不靜默降級):
|
|
8
|
+
* 1. 不支援引擎工具迴圈——CLI 自帶工具執行環境,與引擎的 `tools` 迴圈衝突,
|
|
9
|
+
* `Domain.tools` 須為空。
|
|
10
|
+
* 2. temperature 等微調參數 CLI 不認得,只記一條 warning,不假裝生效。
|
|
11
|
+
*/
|
|
12
|
+
import type { LanguageModelV3 } from '@ai-sdk/provider';
|
|
13
|
+
import type { CliModelOptions } from './types.js';
|
|
14
|
+
export declare function createCliModel(options: CliModelOptions): LanguageModelV3;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { CliCommand, CliModelOptions } from './types.js';
|
|
2
|
+
export { ALLOWED_CLI_COMMANDS, DEFAULT_CLI_TIMEOUT_MS } from './types.js';
|
|
3
|
+
export { createCliModel } from './create-cli-model.js';
|
|
4
|
+
export type { SpawnProcessFn, SpawnProcessOptions, SpawnProcessResult } from './spawn.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{spawn as t}from"node:child_process";import{mkdir as e}from"node:fs/promises";import{tmpdir as n}from"node:os";import{join as o}from"node:path";const r=new Set(["claude","opencode"]),i=12e4,s=/^[A-Za-z0-9._:/#@+=-]+$/;function u(t){return s.test(t)}function c(t,e=500){const n=t.trim();return n?n.length>e?`${n.slice(0,e)} …(已截斷)`:n:"(空輸出)"}function a(t,e,n){const o=n.trim();return new Error(`[chat-kit/cli] ${t} 執行失敗(exit ${e})${o?`:${c(o)}`:""}`)}function p(t){return new Error(`[chat-kit/cli] ${t} 未回傳任何文字內容`)}function f(e){try{if("win32"===process.platform&&void 0!==e.pid){t("taskkill",["/F","/T","/PID",String(e.pid)],{stdio:"ignore"}).on("error",()=>{})}else e.kill("SIGKILL")}catch{}}const l=(e,n,o)=>{const r=o.timeoutMs??12e4,i="win32"===process.platform,s=t(e,i?function(t){return t.map(t=>{if(""===t)return'""';if(!u(t))throw new Error(`[chat-kit/cli] 引數含不允許的字元:${JSON.stringify(t)}`);return t})}(n):n,{cwd:o.cwd,shell:i,stdio:["pipe","pipe","pipe"]});s.stdin.on("error",()=>{}),null!=o.input&&s.stdin.write(o.input,"utf8"),s.stdin.end();const c=[];s.stderr.on("data",t=>{c.push(Buffer.isBuffer(t)?t:Buffer.from(t))});let a=!1;const p=setTimeout(()=>{a=!0,f(s)},r);p.unref?.();const l=()=>{f(s)};o.signal?.aborted?f(s):o.signal?.addEventListener("abort",l,{once:!0});const d=new Promise((t,n)=>{s.on("error",t=>{clearTimeout(p),o.signal?.removeEventListener("abort",l),n(new Error(`[chat-kit/cli] 無法啟動 ${e}:${t.message||t}`))}),s.on("close",e=>{clearTimeout(p),o.signal?.removeEventListener("abort",l),t({code:e??1,stderr:Buffer.concat(c).toString("utf8"),timedOut:a})})});return d.catch(()=>{}),{stdout:async function*(){try{for await(const t of s.stdout)yield Buffer.isBuffer(t)?t:Buffer.from(t)}catch{return}}(),kill:()=>f(s),wait:()=>d}};function d(t){if("object"!=typeof t||null===t)return"";const e=t;if("text"===e.type&&"string"==typeof e.text)return e.text;if("reasoning"===e.type)return"";if("file"===e.type)return`[附件:${"string"==typeof e.mediaType?e.mediaType:"未知類型"},本地 CLI 無法讀取]`;try{return JSON.stringify(t)}catch{return"[unserializable part]"}}function h(t){const e=[];for(const n of t){if("system"===n.role){n.content&&e.push(`System:\n${n.content}`);continue}const t=n.content,o=Array.isArray(t)?t.map(d).join(""):String(t??"");if(!o)continue;const r="user"===n.role?"User":"assistant"===n.role?"Assistant":"Tool";e.push(`${r}:\n${o}`)}return e.join("\n\n")}function m(t){try{const e=JSON.parse(t);return"object"==typeof e&&null!==e?e:void 0}catch{return}}function y(t){return"number"==typeof t?t:void 0}function w(t,e,n){const o=t.toString("utf8");if(0!==n)throw a("claude",n,function(t,e){const n=m(t);return[("string"==typeof n?.result?n.result:n?"":t).trim(),e.trim()].filter(Boolean).join("\n")}(o,e));const r=m(o);if(!r)throw new Error(`[chat-kit/cli] claude 輸出非預期的 JSON:${c(o)}`);if(r.is_error){const t="string"==typeof r.result?r.result:JSON.stringify(r.result??"");throw new Error(`[chat-kit/cli] claude 回報錯誤:${c(t)}`)}if("string"!=typeof r.result||!r.result.trim()){const t="string"==typeof r.subtype?`(subtype:${r.subtype})`:"";throw new Error(`${p("claude").message}${t}`)}return{text:r.result,usage:{inputTokens:y(r.usage?.input_tokens)??0,outputTokens:y(r.usage?.output_tokens)??0,cacheReadTokens:y(r.usage?.cache_read_input_tokens),cacheWriteTokens:y(r.usage?.cache_creation_input_tokens)}}}const g={isEvent:!1,delta:""};function k(t,e){const n=t.trim();if(!n)return g;let o;try{o=JSON.parse(n)}catch{return g}if("object"!=typeof o||null===o)return g;const r=o;if("text"===r.type&&"string"==typeof r.part?.text)return{isEvent:!0,delta:r.part.text};if("step_finish"===r.type){const t=r.part?.tokens;"number"==typeof t?.input&&(e.inputTokens+=t.input),"number"==typeof t?.output&&(e.outputTokens+=t.output)}return{isEvent:!0,delta:""}}const b="cli-text";function S(t){const{cacheReadTokens:e,cacheWriteTokens:n}=t;return{inputTokens:{total:t.inputTokens+(e??0)+(n??0),noCache:t.inputTokens,cacheRead:e,cacheWrite:n},outputTokens:{total:t.outputTokens,text:t.outputTokens,reasoning:void 0}}}function v(t){const e=[];return void 0!==t.temperature&&e.push({type:"unsupported",feature:"temperature"}),void 0!==t.maxOutputTokens&&e.push({type:"unsupported",feature:"maxOutputTokens"}),void 0!==t.topP&&e.push({type:"unsupported",feature:"topP"}),void 0!==t.topK&&e.push({type:"unsupported",feature:"topK"}),void 0!==t.presencePenalty&&e.push({type:"unsupported",feature:"presencePenalty"}),void 0!==t.frequencyPenalty&&e.push({type:"unsupported",feature:"frequencyPenalty"}),void 0!==t.stopSequences&&t.stopSequences.length>0&&e.push({type:"unsupported",feature:"stopSequences"}),void 0!==t.responseFormat&&"json"===t.responseFormat.type&&e.push({type:"unsupported",feature:"responseFormat"}),e}function $(t){if(void 0!==t.tools&&t.tools.length>0)throw new Error("[chat-kit/cli] 本地 CLI 模型不支援引擎工具迴圈:Domain.tools 須為空(CLI 自帶執行環境與引擎迴圈衝突)")}function T(){return new Error("[chat-kit/cli] 已中止")}function x(t){if(null===t||"object"!=typeof t)throw new Error("[chat-kit/cli] options 須為物件");const{command:s}=t;if(!r.has(s))throw new Error(`[chat-kit/cli] 不支援的 CLI:${String(s)}(僅支援 claude、opencode)`);const f=(t.model??"").trim();if("claude"===s&&!f)throw new Error("[chat-kit/cli] claude 需要指定 model(例如 sonnet)");const d=(t.effort??"").trim()||void 0;if(f&&!u(f))throw new Error(`[chat-kit/cli] model 含不允許的字元:${JSON.stringify(f)}`);if(d&&!u(d))throw new Error(`[chat-kit/cli] effort 含不允許的字元:${JSON.stringify(d)}`);const m=t.timeoutMs??i;if(!Number.isFinite(m)||m<=0)throw new Error("[chat-kit/cli] timeoutMs 須為正數");const y=t.cwd,g=t.spawnProcess??l,x="claude"===s?function(t,e){const n=["-p","--model",t,"--output-format","json","--tools","","--strict-mcp-config","--disable-slash-commands","--no-session-persistence"];return e&&n.push("--effort",e),n}(f,d):function(t,e){const n=["run","--format","json"],o=(t??"").trim(),r=(e??"").trim();return o&&n.push("--model",o.includes("#")?o:r?`${o}#${r}`:o),n}(f||void 0,d);async function E(t,r,i){const u=y??await async function(){const t=o(n(),"chat-kit-cli");return await e(t,{recursive:!0}),t}();if(r.abortSignal?.aborted)throw T();const c=g(s,x,{input:t,cwd:u,timeoutMs:m,signal:r.abortSignal}),a=(async()=>{for await(const t of c.stdout){if(r.abortSignal?.aborted)throw T();i(t)}})();let p;try{[p]=await Promise.all([c.wait(),a])}catch(t){throw c.kill(),await a.catch(()=>{}),t}if(r.abortSignal?.aborted)throw T();if(p.timedOut)throw new Error(`[chat-kit/cli] ${s} 逾時(${m}ms)`);return p}async function O(t,e){const n=[],o=await E(t,e,t=>n.push(t)),r=Buffer.concat(n);return"claude"===s?w(r,o.stderr,o.code):function(t,e,n){if(0!==n)throw a("opencode",n,e);const o={inputTokens:0,outputTokens:0};let r="",i=!1;for(const e of t.toString("utf8").split("\n")){const t=k(e,o);t.isEvent&&(i=!0),r+=t.delta}if(!i)throw new Error(`[chat-kit/cli] opencode 未輸出可解析的 JSON 事件:${c(t.toString("utf8"))}`);if(!r.trim())throw p("opencode");return{text:r,usage:o}}(r,o.stderr,o.code)}function q(t){return{type:"finish",usage:S(t),finishReason:{unified:"stop",raw:"stop"}}}async function _(t,e,n,o){n.enqueue({type:"stream-start",warnings:o});const{text:r,usage:i}=await O(t,e);for(const t of function(t){return t?[{type:"text-start",id:b},{type:"text-delta",id:b,delta:t},{type:"text-end",id:b}]:[]}(r))n.enqueue(t);n.enqueue(q(i))}return{specificationVersion:"v3",provider:`chat-kit.cli.${s}`,modelId:f||s,supportedUrls:{},doGenerate(t){$(t);const e=h(t.prompt),n=v(t);return O(e,t).then(({text:t,usage:e})=>({content:[{type:"text",text:t}],finishReason:{unified:"stop",raw:"stop"},usage:S(e),warnings:n}))},doStream(t){$(t);const e=h(t.prompt),n=v(t),o=new AbortController,r=t.abortSignal;r?.aborted?o.abort():r?.addEventListener("abort",()=>o.abort(),{once:!0});const i={...t,abortSignal:o.signal};let u=!1;const c=new ReadableStream({async start(t){try{"claude"===s?await _(e,i,t,n):await async function(t,e,n,o){n.enqueue({type:"stream-start",warnings:o});const r={inputTokens:0,outputTokens:0};let i=Buffer.alloc(0),s=!1,u="";const c=t=>{const{delta:e}=k(t,r);e&&(s||(n.enqueue({type:"text-start",id:b}),s=!0),u+=e,n.enqueue({type:"text-delta",id:b,delta:e}))},f=await E(t,e,t=>{i=Buffer.concat([i,t]);let e=i.indexOf(10);for(;e>=0;)c(i.subarray(0,e).toString("utf8")),i=i.subarray(e+1),e=i.indexOf(10)});if(0!==f.code)throw a("opencode",f.code,f.stderr);if(c(i.toString("utf8")),!u.trim())throw p("opencode");n.enqueue({type:"text-end",id:b}),n.enqueue(q(r))}(e,i,t,n),t.close()}catch(e){if(u)return;t.enqueue({type:"error",error:e}),t.close()}},cancel(){u=!0,o.abort()}});return Promise.resolve({stream:c})}}}export{r as ALLOWED_CLI_COMMANDS,i as DEFAULT_CLI_TIMEOUT_MS,x as createCliModel};//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../.build/cli/types.js","../../.build/cli/util.js","../../.build/cli/spawn.js","../../.build/cli/prompt.js","../../.build/cli/claude.js","../../.build/cli/opencode.js","../../.build/cli/create-cli-model.js","../../.build/cli/isolated-cwd.js"],"names":["ALLOWED_CLI_COMMANDS","Set","DEFAULT_CLI_TIMEOUT_MS","SAFE_ARG","isSafeCliArg","value","test","excerpt","text","max","t","trim","length","slice","exitError","label","code","detail","note","Error","emptyReplyError","killTree","child","process","platform","undefined","pid","spawn","String","stdio","on","kill","defaultSpawnProcess","command","args","opts","timeoutMs","useShell","map","arg","JSON","stringify","toShellArgs","cwd","shell","stdin","input","write","end","errChunks","stderr","d","push","Buffer","isBuffer","from","timedOut","timer","setTimeout","unref","onAbort","signal","aborted","addEventListener","once","exited","Promise","resolve","reject","err","clearTimeout","removeEventListener","message","concat","toString","catch","stdout","async","chunk","wait","partText","part","p","type","mediaType","promptToText","prompt","sections","role","content","Array","isArray","join","tryParseJson","parse","numberOrUndefined","parseClaudeOutput","raw","json","result","filter","Boolean","failureDetail","is_error","subtype","usage","inputTokens","input_tokens","outputTokens","output_tokens","cacheReadTokens","cache_read_input_tokens","cacheWriteTokens","cache_creation_input_tokens","NOT_AN_EVENT","isEvent","delta","parseOpencodeLine","line","trimmed","obj","event","tokens","output","TEXT_ID","toUsage","cacheRead","cacheWrite","total","noCache","reasoning","collectWarnings","options","warnings","temperature","feature","maxOutputTokens","topP","topK","presencePenalty","frequencyPenalty","stopSequences","responseFormat","assertNoTools","tools","abortError","createCliModel","has","model","effort","Number","isFinite","spawnProcess","buildClaudeArgs","variant","cleanModel","cleanVariant","includes","buildOpencodeArgs","runCli","callOptions","onChunk","workDir","dir","tmpdir","mkdir","recursive","isolatedCwd","abortSignal","proc","draining","all","runOnce","chunks","sawEvent","split","parsed","parseOpencodeOutput","finishPart","finishReason","unified","doClaudeStream","controller","enqueue","id","textParts","specificationVersion","provider","modelId","supportedUrls","doGenerate","then","doStream","aborter","AbortController","upstream","abort","streamOptions","cancelled","stream","ReadableStream","start","pending","alloc","textStarted","handleLine","idx","indexOf","subarray","doOpencodeStream","close","error","cancel"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 沒指定 `cwd` 時給子行程用的空目錄。
|
|
3
|
+
*
|
|
4
|
+
* claude/opencode 都會從工作目錄(及其上層)讀 CLAUDE.md、AGENTS.md 這類專案指示。
|
|
5
|
+
* 繼承伺服器行程的 cwd,等於把伺服器所在專案的內部說明塞進每一則終端使用者的對話。
|
|
6
|
+
* 用固定的空目錄隔離;要讓 CLI 看到某個專案,由呼叫端明確傳 `cwd`。
|
|
7
|
+
*
|
|
8
|
+
* 每次呼叫都 `mkdir -p`(冪等、很便宜),不留模組層狀態。
|
|
9
|
+
*/
|
|
10
|
+
export declare function isolatedCwd(): Promise<string>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* opencode 非互動呼叫(v2 語法):`opencode run --format json [--model provider/model#variant]`,
|
|
3
|
+
* prompt 經 stdin 餵入。stdout 是 NDJSON:`text` 事件累加正文,`step_finish` 事件累加用量。
|
|
4
|
+
*
|
|
5
|
+
* 實測 v2.0.22 簡單回覆只吐 `step_start`+`text`、沒有 `step_finish`,此時用量為 0
|
|
6
|
+
*(CLI 本來就沒給,不是解析漏掉)。
|
|
7
|
+
*
|
|
8
|
+
* v1 的 `--variant` 獨立旗標已在 v2 移除,不支援;variant 一律併進 `--model` 的 `#` 後綴。
|
|
9
|
+
* 有 variant 但無 model 時 v2 無處可掛,沿用 opencode 自身預設(與 ai-pr-review 相同取捨)。
|
|
10
|
+
*/
|
|
11
|
+
import type { CliUsage } from './claude.js';
|
|
12
|
+
export declare function buildOpencodeArgs(model?: string, variant?: string): string[];
|
|
13
|
+
export interface OpencodeLineResult {
|
|
14
|
+
/** 本行是否為可解析的 JSON 事件物件 */
|
|
15
|
+
isEvent: boolean;
|
|
16
|
+
/** 本行帶出的正文增量(非 text 事件為空字串) */
|
|
17
|
+
delta: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 解析單一 NDJSON 行。呼叫端負責累加回傳的用量。
|
|
21
|
+
* 無法解析的行(空行、非 JSON)不算事件並忽略——與 ai-pr-review 相同。
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseOpencodeLine(line: string, usage: CliUsage): OpencodeLineResult;
|
|
24
|
+
export declare function parseOpencodeOutput(stdout: Buffer, stderr: string, code: number): {
|
|
25
|
+
text: string;
|
|
26
|
+
usage: CliUsage;
|
|
27
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 把 AI SDK 的結構化 prompt 攤平成 CLI 吃的單一文字。
|
|
3
|
+
*
|
|
4
|
+
* CLI 沒有 roles/parts 的概念(ai-router 甚至只取最後一段 user),但引擎已把
|
|
5
|
+
* system、上下文區塊都排進 prompt,丟掉 system 會讓 server 組好的提示詞遺失,
|
|
6
|
+
* 故依序全拼並標註角色。
|
|
7
|
+
*
|
|
8
|
+
* 各 part 的處理:
|
|
9
|
+
* - text:原文
|
|
10
|
+
* - reasoning:略過(上一輪的隱藏推理不該回灌成 Assistant 的話)
|
|
11
|
+
* - file/圖片:二進位內容 CLI 吃不了,只留一行佔位說明;若序列化會是每個位元組一個 key 的巨型 JSON
|
|
12
|
+
* - 其餘(工具往返):以 JSON 保留資訊
|
|
13
|
+
*/
|
|
14
|
+
import type { LanguageModelV3Prompt } from '@ai-sdk/provider';
|
|
15
|
+
export declare function promptToText(prompt: LanguageModelV3Prompt): string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 子行程管理:spawn+逾時+中止,stdout 一律以 Buffer 累積。
|
|
3
|
+
*
|
|
4
|
+
* 中文是多位元組 UTF-8,逐 chunk 轉字串會在邊界切出 `�`(ai-pr-review 的教訓)。
|
|
5
|
+
* 一次性呼叫在結束後一次 decode;串流解析只在 `\n`(0x0A)位元組處切片——
|
|
6
|
+
* UTF-8 續位元組恆大於等於 0x80,不會誤切。
|
|
7
|
+
*/
|
|
8
|
+
export interface SpawnProcessOptions {
|
|
9
|
+
/** 經 stdin 餵入的完整 prompt(必經 stdin,不放 argv:命令列長度上限約 32KB) */
|
|
10
|
+
input?: string;
|
|
11
|
+
cwd?: string;
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
}
|
|
15
|
+
export interface SpawnProcessResult {
|
|
16
|
+
/** 行程結束碼;被訊號殺掉時為 null,呼叫端看到的會是正規化後的數字 */
|
|
17
|
+
code: number;
|
|
18
|
+
stderr: string;
|
|
19
|
+
timedOut: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** 可 `for await` 逐塊讀 stdout 的子行程 */
|
|
22
|
+
export interface CliProcess {
|
|
23
|
+
stdout: AsyncIterable<Buffer>;
|
|
24
|
+
wait(): Promise<SpawnProcessResult>;
|
|
25
|
+
kill(): void;
|
|
26
|
+
}
|
|
27
|
+
export type SpawnProcessFn = (command: string, args: string[], opts: SpawnProcessOptions) => CliProcess;
|
|
28
|
+
export declare const defaultSpawnProcess: SpawnProcessFn;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SpawnProcessFn } from './spawn.js';
|
|
2
|
+
/** 目前支援的本地 CLI。白名單制:避免設定注入帶起任意指令 */
|
|
3
|
+
export type CliCommand = 'claude' | 'opencode';
|
|
4
|
+
export declare const ALLOWED_CLI_COMMANDS: ReadonlySet<CliCommand>;
|
|
5
|
+
/** 預設逾時(與 ai-router 的 CLI 層一致) */
|
|
6
|
+
export declare const DEFAULT_CLI_TIMEOUT_MS = 120000;
|
|
7
|
+
export interface CliModelOptions {
|
|
8
|
+
/** 要呼叫哪個 CLI */
|
|
9
|
+
command: CliCommand;
|
|
10
|
+
/**
|
|
11
|
+
* claude:必填(例如 `sonnet` / `opus`)。
|
|
12
|
+
* opencode:選填(例如 `provider/model`;留空用 opencode 自身預設)。
|
|
13
|
+
*/
|
|
14
|
+
model?: string;
|
|
15
|
+
/**
|
|
16
|
+
* 推理強度,原樣轉交:claude 走 `--effort`,opencode 走 `--model` 的 `#variant` 後綴。
|
|
17
|
+
* 不在對方清單內的值不攔截,由該 CLI 自行報錯。
|
|
18
|
+
*/
|
|
19
|
+
effort?: string;
|
|
20
|
+
/** 逾時毫秒數,預設 120000 */
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
/**
|
|
23
|
+
* 子行程工作目錄。省略時用系統暫存下的空目錄(不繼承伺服器行程的 cwd),
|
|
24
|
+
* 避免 CLI 把該目錄的 CLAUDE.md/AGENTS.md 等專案指示帶進使用者的對話;要讓 CLI 看到某個專案才明確傳入。
|
|
25
|
+
*/
|
|
26
|
+
cwd?: string;
|
|
27
|
+
/** 測試用:替換子行程的建立方式 */
|
|
28
|
+
spawnProcess?: SpawnProcessFn;
|
|
29
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/ 內共用的小工具:argv 安全字元、錯誤訊息片段、統一的錯誤建構。
|
|
3
|
+
*/
|
|
4
|
+
export declare function isSafeCliArg(value: string): boolean;
|
|
5
|
+
/** 錯誤訊息只取片段,避免整份輸出灌爆終端 */
|
|
6
|
+
export declare function excerpt(text: string, max?: number): string;
|
|
7
|
+
/** CLI 非零退出;`detail` 為空則只報 exit code */
|
|
8
|
+
export declare function exitError(label: string, code: number, detail: string): Error;
|
|
9
|
+
/** CLI 正常結束卻沒有任何文字:視為失敗,不讓空回覆被當成成功送出 `done` */
|
|
10
|
+
export declare function emptyReplyError(label: string): Error;
|
package/dist/engine/engine.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ import type { ChatEvent, DomainAdapter, TurnInput, TurnResult } from './types.js
|
|
|
10
10
|
export declare const DEFAULT_MAX_TOOL_STEPS = 3;
|
|
11
11
|
export interface ChatEngineOptions {
|
|
12
12
|
domains: Readonly<Record<string, DomainAdapter>>;
|
|
13
|
+
/**
|
|
14
|
+
* 使用端自己手寫的信任標記名稱(例如以 `format: 'raw'` 自帶的區塊標題)。
|
|
15
|
+
* 登記後,輸入中和與輸出清洗都會涵蓋它們;內建的 AUTHORITATIVE/REFERENCE/REALTIME 不必列。
|
|
16
|
+
*/
|
|
17
|
+
markers?: readonly string[];
|
|
13
18
|
}
|
|
14
19
|
export interface ChatEngine {
|
|
15
20
|
runTurn(input: TurnInput): AsyncGenerator<ChatEvent, void, undefined>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 對話歷史整形。
|
|
3
|
+
*
|
|
4
|
+
* 部分 provider 不替呼叫端整理訊息:歷史以 assistant 開頭、或連續兩則同角色,輕則被拒絕,
|
|
5
|
+
* 重則(自架端點的 chat template)直接壞掉。對外開放 messages 欄位的通道(OpenAI 相容端點)
|
|
6
|
+
* 尤其會收到這種形狀。引擎不自動套用——合併訊息會改變送進模型的內容,是否要做由使用端決定。
|
|
7
|
+
*/
|
|
8
|
+
import type { ChatMessage } from './types.js';
|
|
9
|
+
/** 歷史以 assistant 開頭時補在最前面的 user 訊息 */
|
|
10
|
+
export declare const DEFAULT_LEADING_USER_TEXT = "(System note: empty user initiation)";
|
|
11
|
+
export interface NormalizeHistoryOptions {
|
|
12
|
+
/** 補位訊息的文字;沿用既有系統的字串可避免改變模型看到的語境 */
|
|
13
|
+
leadingUserText?: string;
|
|
14
|
+
/** 合併相鄰同角色訊息時的分隔,預設兩個換行 */
|
|
15
|
+
separator?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 整成「首則為 user(system 之外)、相鄰同角色已合併」的形狀。
|
|
19
|
+
* system 訊息原樣保留位置,不參與合併,也不影響「首則」的判斷。
|
|
20
|
+
* 不修改傳入的陣列與物件。
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeHistory(messages: readonly ChatMessage[], options?: NormalizeHistoryOptions): ChatMessage[];
|
package/dist/engine/types.d.ts
CHANGED
|
@@ -69,8 +69,13 @@ export interface DomainAdapter {
|
|
|
69
69
|
maxToolSteps?: number;
|
|
70
70
|
/** 每一步呼叫前的鉤子,例如偵測到未經查證的斷言時強制重查 */
|
|
71
71
|
prepareStep?: PrepareStepFunction<ToolSet>;
|
|
72
|
-
/**
|
|
73
|
-
|
|
72
|
+
/**
|
|
73
|
+
* 領域專屬輸出閘門,接在內建閘門之後(`beforeBuiltins` 者在前)。
|
|
74
|
+
* 需要逐輪狀態(本輪的上下文、工具是否真的查到資料)時給函式:它收到的 `turn` 與
|
|
75
|
+
* `buildContext`、`tools` 是同一個物件,可當 WeakMap 的 key 共享狀態;
|
|
76
|
+
* 閘門本身也能從 `GuardContext.blocks` 讀到本輪實際注入的區塊。
|
|
77
|
+
*/
|
|
78
|
+
outputGuards?: readonly OutputGuard[] | ((turn: TurnContext) => readonly OutputGuard[] | Promise<readonly OutputGuard[]>);
|
|
74
79
|
}
|
|
75
80
|
export interface TurnUsage {
|
|
76
81
|
inputTokens: number | undefined;
|
package/dist/guards/input.d.ts
CHANGED
|
@@ -5,12 +5,16 @@
|
|
|
5
5
|
* 使用者可能只是在句子裡剛好提到這些字,整段刪掉會讓語意殘缺;換成全形括號後保留可讀性,
|
|
6
6
|
* 同時讓它不再具備標記的語法效力——模型看到的是一段被引述的文字。
|
|
7
7
|
*
|
|
8
|
+
* 未閉合的標記只換左括號:右括號本來就不存在,補一個上去會把後面的內文一起圈進括號裡,
|
|
9
|
+
* 改動了使用者真正說的話。
|
|
10
|
+
*
|
|
8
11
|
* 只處理本系統實際使用的標記(見 prompt/markers.ts)。這**不是**通用的 prompt-injection
|
|
9
12
|
* 過濾器:那種東西擋不完,也會誤傷正常訊息;「這句話是不是在下指令」屬於語意判斷,歸提示詞。
|
|
10
13
|
*/
|
|
14
|
+
import type { MarkerSet } from '../prompt/markers.js';
|
|
11
15
|
export interface NeutralizeResult {
|
|
12
16
|
text: string;
|
|
13
17
|
/** 被中和的標記數;> 0 代表有人嘗試偽造(或剛好打到),值得記錄 */
|
|
14
18
|
neutralized: number;
|
|
15
19
|
}
|
|
16
|
-
export declare function neutralizeMarkers(text: string): NeutralizeResult;
|
|
20
|
+
export declare function neutralizeMarkers(text: string, markers?: MarkerSet): NeutralizeResult;
|
package/dist/guards/output.d.ts
CHANGED
|
@@ -9,10 +9,35 @@
|
|
|
9
9
|
*
|
|
10
10
|
* 閘門觸發一律回報(`guard` 事件):命中率長期是 0% 或 100%,都代表規則本身有問題。
|
|
11
11
|
*/
|
|
12
|
+
import type { LanguageModel, ModelMessage } from 'ai';
|
|
13
|
+
import type { MarkerSet } from '../prompt/markers.js';
|
|
14
|
+
import type { ContextBlock } from '../prompt/types.js';
|
|
15
|
+
import type { TurnContext, TurnInput } from '../engine/types.js';
|
|
16
|
+
/**
|
|
17
|
+
* 閘門看得到的這一輪資訊。全部由引擎填入。
|
|
18
|
+
*
|
|
19
|
+
* `model`、`system`、`conversation` 讓 `check` 可以做「事後補救」:看完整回覆發現問題後,自己再呼叫一次模型
|
|
20
|
+
* (例如強制工具查證後重答),而不必由引擎理解「重試」這個概念。補救產生的事件與用量引擎看不到,
|
|
21
|
+
* 由閘門自己記錄;最後把補救後的文字以 `rewrite` 回報即可。
|
|
22
|
+
*/
|
|
12
23
|
export interface GuardContext {
|
|
13
24
|
/** 本輪使用的模型 ID(主備援時為主模型) */
|
|
14
25
|
modelId: string;
|
|
15
26
|
channel: string;
|
|
27
|
+
/** 與 `tools`、`buildContext` 收到的是同一個物件,可當 WeakMap 的 key 在三者之間共享逐輪狀態 */
|
|
28
|
+
turn: TurnContext;
|
|
29
|
+
/** 本輪實際注入的區塊(空內容已略過,依拼接順序) */
|
|
30
|
+
blocks: readonly ContextBlock[];
|
|
31
|
+
/** 引擎使用的標記集(含使用端登記的自訂標記) */
|
|
32
|
+
markers: MarkerSet;
|
|
33
|
+
/** 本輪使用的模型(可能是主備援包裝過的) */
|
|
34
|
+
model: LanguageModel;
|
|
35
|
+
/** 實際送給模型的 system */
|
|
36
|
+
system: string;
|
|
37
|
+
/** 實際送給模型的對話(最後一則 user 已含 user 區塊)。不含本輪模型的回覆 */
|
|
38
|
+
conversation: readonly ModelMessage[];
|
|
39
|
+
modelOptions: NonNullable<TurnInput['modelOptions']>;
|
|
40
|
+
signal?: AbortSignal;
|
|
16
41
|
}
|
|
17
42
|
export interface GuardVerdict {
|
|
18
43
|
action: 'pass' | 'rewrite';
|
|
@@ -27,11 +52,31 @@ export interface GuardVerdict {
|
|
|
27
52
|
}
|
|
28
53
|
export interface OutputGuard {
|
|
29
54
|
name: string;
|
|
55
|
+
/**
|
|
56
|
+
* 排在內建閘門(`stripMarkersGuard`)**之前**執行。內建閘門會先把標記拆掉,
|
|
57
|
+
* 需要看到完整標記的閘門(例如 `stripEchoedContextGuard` 要比對成對區塊)必須設這個旗標。
|
|
58
|
+
*/
|
|
59
|
+
beforeBuiltins?: boolean;
|
|
30
60
|
transform?(buffer: string, ctx: GuardContext): string;
|
|
31
61
|
check?(finalText: string, ctx: GuardContext): GuardVerdict | Promise<GuardVerdict>;
|
|
32
62
|
}
|
|
33
63
|
/** 清掉模型吐出的內部信任標記(只去標記本身,保留其間文字) */
|
|
34
64
|
export declare const stripMarkersGuard: OutputGuard;
|
|
65
|
+
/** 逐字比對區塊內容時的最短長度;太短的內容(例如單一個字)會誤傷正常正文 */
|
|
66
|
+
export declare const ECHO_MIN_CHARS = 24;
|
|
67
|
+
/**
|
|
68
|
+
* 洩漏清洗(選用):模型照抄注入的區塊時,連內容一起剝除。
|
|
69
|
+
*
|
|
70
|
+
* - 成對的區塊(開頭標記 … `[END …]`)整段移除
|
|
71
|
+
* - 與本輪任一區塊內容逐字相同的段落移除(內容須達 `ECHO_MIN_CHARS` 字)
|
|
72
|
+
*
|
|
73
|
+
* 與 `stripMarkersGuard`(只去標記、保留其間文字)分開:後者適合模型只是順手帶出標記的情形;
|
|
74
|
+
* 當注入的內容本身不該被使用者看到(內部參考資料),才需要這道。
|
|
75
|
+
*
|
|
76
|
+
* ⚠️ 串流通道無法收回已送出的文字:區塊的結尾標記還沒出現前,內容已經先流出去了。
|
|
77
|
+
* 這道閘門的完整效果只在 `done.text` 與 `completeTurn` 的結果上,不適合單靠它保護串流通道。
|
|
78
|
+
*/
|
|
79
|
+
export declare const stripEchoedContextGuard: OutputGuard;
|
|
35
80
|
/**
|
|
36
81
|
* 模型自我介紹/名稱洩漏過濾。移植自 stock-viewer `server/utils/chat-sanitizer.js`,規則不變。
|
|
37
82
|
*
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
export type { ChatEvent, ChatMessage, DomainAdapter, TurnContext, TurnInput, TurnResult, TurnUsage, } from './engine/types.js';
|
|
2
2
|
export type { ChatEngine, ChatEngineOptions } from './engine/engine.js';
|
|
3
3
|
export { DEFAULT_MAX_TOOL_STEPS, createChatEngine } from './engine/engine.js';
|
|
4
|
+
export type { NormalizeHistoryOptions } from './engine/messages.js';
|
|
5
|
+
export { DEFAULT_LEADING_USER_TEXT, normalizeHistory } from './engine/messages.js';
|
|
4
6
|
export type { Channel, ContextBlock, PromptSpec, Trust } from './prompt/types.js';
|
|
5
7
|
export type { AssembleInput, AssembledPrompt } from './prompt/assemble.js';
|
|
6
8
|
export { assemblePrompt, expandPlaceholders, orderBlocks, renderBlock } from './prompt/assemble.js';
|
|
7
|
-
export {
|
|
9
|
+
export type { MarkerSet } from './prompt/markers.js';
|
|
10
|
+
export { DEFAULT_MARKER_SET, TRUST_LABELS, blockPattern, closeMarker, createMarkerSet, markerPattern, openMarker, } from './prompt/markers.js';
|
|
8
11
|
export type { NeutralizeResult } from './guards/input.js';
|
|
9
12
|
export { neutralizeMarkers } from './guards/input.js';
|
|
10
13
|
export type { GuardContext, GuardVerdict, OutputGuard } from './guards/output.js';
|
|
11
|
-
export { applyTransforms, selfIntroGuard, stripMarkersGuard } from './guards/output.js';
|
|
14
|
+
export { ECHO_MIN_CHARS, applyTransforms, selfIntroGuard, stripEchoedContextGuard, stripMarkersGuard } from './guards/output.js';
|
|
12
15
|
export * from './models/index.js';
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{streamText as e,stepCountIs as t}from"ai";export{CHAT_KIT_OPTIONS_KEY,DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS,DEFAULT_COOLDOWN_MS,DEFAULT_PROTOCOL,MAX_COOLDOWN_MS,PROTOCOL_ALIASES,consoleLogger,createFallbackModel,createKeyRing,createLanguageModel,createModelFromConfig,createRoutedModel,defaultKeyRing,isOpenCodeEndpoint,isQuotaError,listModels,maskApiKey,normalizeApiKeyList,normalizeBaseURL,normalizeModelConfig,normalizeProtocol,openCodeHeaders,parseModelSpec,reasoningOptions,reasoningProviderOptions,resolveModelChain,resolveModelTarget,resolveProtocol,resolveProviderApiKeys,retryAfterMsFromError}from"./models/index.js";const n={authoritative:"AUTHORITATIVE",reference:"REFERENCE",realtime:"REALTIME"};function o(e,t){return`[${n[e]}: ${t}]`}function r(e){return`[END ${n[e]}]`}function s(){const e=
|
|
1
|
+
import{streamText as e,stepCountIs as t}from"ai";export{CHAT_KIT_OPTIONS_KEY,DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS,DEFAULT_COOLDOWN_MS,DEFAULT_PROTOCOL,GOOGLE_DEFAULT_BASE_URL,MAX_COOLDOWN_MS,PROTOCOL_ALIASES,consoleLogger,createFallbackModel,createKeyRing,createLanguageModel,createModelFromConfig,createRoutedModel,defaultKeyRing,isOpenCodeEndpoint,isQuotaError,listModels,maskApiKey,normalizeApiKeyList,normalizeBaseURL,normalizeModelConfig,normalizeProtocol,openCodeHeaders,parseModelSpec,reasoningOptions,reasoningProviderOptions,resolveModelChain,resolveModelTarget,resolveProtocol,resolveProviderApiKeys,retryAfterMsFromError}from"./models/index.js";const n={authoritative:"AUTHORITATIVE",reference:"REFERENCE",realtime:"REALTIME"};function o(e,t){return`[${n[e]}: ${t}]`}function r(e){return`[END ${n[e]}]`}const s={names:Object.values(n)};function a(e=[]){const t=[...s.names];for(const n of e){const e="string"==typeof n?n.trim():"";if(!e)throw new Error("[chat-kit/prompt] 自訂標記名稱不得為空");if(/^END\s/i.test(e))throw new Error(`[chat-kit/prompt] 自訂標記名稱不要帶 END 前綴(結尾變體會自動涵蓋):${e}`);if(/[\][\n]/.test(e))throw new Error(`[chat-kit/prompt] 自訂標記名稱不得含方括號或換行:${e}`);t.some(t=>t.toLowerCase()===e.toLowerCase())||t.push(e)}return{names:t}}function i(e){return[...e.names].sort((e,t)=>t.length-e.length).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/\s+/g,String.raw`\s+`)).join("|")}const l=String.raw`(?![A-Za-z0-9_])`,c=String.raw`[^\][\n]*)(?:(\])|(?=\[)|(?=\n)|$)`;function u(e=s){return new RegExp(String.raw`\[\s*((?:END\s+)?(?:${i(e)})${l}${c}`,"gi")}function p(e=s){const t=i(e),n=String.raw`[^\][\n]*(?:\]|(?=\[)|(?=\n)|$)`;return new RegExp(String.raw`\[\s*(?!END\s)(?:${t})${l}${n}[\s\S]*?\[\s*END\s+(?:${t})${l}${n}`,"gi")}const m=/\{\{\s*([A-Za-z0-9_]+)\s*\}\}/g;function d(e,t={}){const n=new Set,o=e.replace(m,(e,o)=>Object.prototype.hasOwnProperty.call(t,o)?t[o]:(n.add(o),e));if(n.size>0)throw new Error(`[chat-kit/prompt] 提示詞有未展開的佔位符:${[...n].join(", ")}`);return o}function g(e){const t=new Set;for(const n of e){if(t.has(n.key))throw new Error(`[chat-kit/prompt] 上下文區塊 key 重複:${n.key}`);t.add(n.key)}return e.filter(e=>e.content.trim().length>0).slice().sort((e,t)=>e.order-t.order||(e.key<t.key?-1:e.key>t.key?1:0))}function f(e){return"raw"===e.format?e.content:`${o(e.trust,e.title)}\n${e.content}\n${r(e.trust)}`}const h=({blocks:e,message:t})=>e?`${e}\n\n${t}`:t;function y(e){const{spec:t,channel:n,userMessage:o}=e,r=g(e.blocks),s=r.filter(e=>"system"===e.placement),a=r.filter(e=>"user"===e.placement);return{system:[...[...t.parts,...t.channelParts?.[n]??[]].map(e=>d(e,t.placeholders)),...e.extraSystem??[],...s.map(f)].filter(e=>e.trim().length>0).join("\n\n"),userMessage:(t.composeUserMessage??h)({blocks:a.map(f).join("\n\n"),message:o}),injectedKeys:r.map(e=>e.key),blocks:r}}function k(e,t=s){let n=0;return{text:e.replace(u(t),(e,t,o)=>(n++,`[${t}${o?"]":""}`)),neutralized:n}}const w={name:"strip-markers",transform:(e,t)=>e.replace(u(t.markers),"")},E=24,x={name:"strip-echoed-context",beforeBuiltins:!0,transform(e,t){let n=e.replace(p(t.markers),"");for(const e of t.blocks){const t=e.content.trim();t.length>=24&&(n=n.split(t).join(""))}return n}};function b(e){const t=[];for(const n of e)n&&n.trim()&&t.push(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gi"));return t.push(/\b(?:gemma|qwen|llama|claude|gpt|gemini|mistral|deepseek|chatgpt|copilot)[\w\-_.:]*/gi),t.push(/(?:我[是叫]|本人是|身為|身為一個?)\s*[\w\-_.:]{2,40}\s*(?:AI|助手|模型|語言模型|LLM|機器人)/gi),t.push(/(?:由|基於|透過|使用)\s*[\w\-_.:]{2,40}\s*(?:訓練|開發|構建|創建|研發|支持|驅動|賦能)/gi),t.push(/(?:作為|身為|身为|作為一個?)\s*(?:一個?\s*)?(?:AI|人工智慧|人工智能|LLM)(?:\s*(?:大型)?(?:語言|對話|生成)?模型)?/gi),t.push(/(?:AI|人工智慧|人工智能)\s*(?:大型)?(?:語言|對話)?模型/gi),t.push(/\bas an?\s+(?:AI|artificial intelligence|language model|LLM|assistant)\b/gi),t.push(/(?:我的|本|此)\s*(?:版本|模型|名字|名稱|身份)\s*(?:是|為|:)\s*[\w\-_.:]{2,40}/gi),{name:"self-intro",transform(e){let n=e;for(const e of t)n=n.replace(e,"");return n.replace(/[ \t]{2,}/g," ").replace(/\n[ \t]+/g,"\n").replace(/\n{3,}/g,"\n\n").trim()}}}function O(e,t,n){let o=e;for(const e of t)e.transform&&(o=e.transform(o,n));return o}const T=3,$=[w];function v(e,t,n){let o=e;const r=[];for(const e of t){if(!e.transform)continue;const t=e.transform(o,n);t!==o&&r.push(e.name),o=t}return{text:o,changed:r}}function S(e,t){return t<=1?e:async n=>{const o=await(e?.(n))??void 0;return n.stepNumber<t-1||void 0!==o?.toolChoice?o:{...o,toolChoice:"none"}}}function A(n){const{domains:o}=n,r=a(n.markers);async function*s(n){const s=o[n.domain];if(!s)throw new Error(`[chat-kit/engine] 未註冊的 domain:${n.domain}`);!function(e){const t=e[e.length-1];if(!t||"user"!==t.role)throw new Error("[chat-kit/engine] messages 的最後一則必須是 user");if(!t.content.trim())throw new Error("[chat-kit/engine] 使用者訊息不得為空")}(n.messages);let a=0;const i=n.messages.map(e=>{if("user"!==e.role)return e;const t=k(e.content,r);return a+=t.neutralized,{...e,content:t.text}});a>0&&(yield{type:"guard",name:"neutralize-markers",action:"neutralized",detail:`${a} 個標記`});const l=i[i.length-1].content,c={domain:n.domain,channel:n.channel,messages:i,userMessage:l,...void 0!==n.tenantId?{tenantId:n.tenantId}:{},...void 0!==n.entity?{entity:n.entity}:{},...void 0!==n.signal?{signal:n.signal}:{}};let u,p,m,d=[];try{u="function"==typeof s.prompt?await s.prompt(c):s.prompt;const e=await(s.buildContext?.(c))??[];p=y({spec:u,channel:n.channel,blocks:e,extraSystem:i.filter(e=>"system"===e.role).map(e=>e.content),userMessage:l}),m=await(s.tools?.(c));const t=s.outputGuards;d="function"==typeof t?await t(c):t??[]}catch(e){return void(yield{type:"error",error:e})}yield{type:"context",injectedKeys:p.injectedKeys};const g=i.filter(e=>"system"!==e.role).map((e,t,n)=>t===n.length-1?{role:"user",content:p.userMessage}:{role:e.role,content:e.content}),f=!!m&&Object.keys(m).length>0,h=(s.maxToolSteps??3)+1,w=n.modelOptions??{},E=e({model:n.model,system:p.system,messages:g,maxRetries:0,...f?{tools:m,stopWhen:t(h)}:{},...f?{prepareStep:S(s.prepareStep,h)}:{},...void 0!==w.temperature?{temperature:w.temperature}:{},...void 0!==w.maxOutputTokens?{maxOutputTokens:w.maxOutputTokens}:{},...void 0!==w.providerOptions?{providerOptions:w.providerOptions}:{},...void 0!==w.timeout?{timeout:w.timeout}:{},...n.signal?{abortSignal:n.signal}:{},onError:()=>{}}),x=[...d.filter(e=>e.beforeBuiltins),...$,...d.filter(e=>!e.beforeBuiltins)],b={modelId:(O=n.model,"string"==typeof O?O:O.modelId),channel:n.channel,turn:c,blocks:p.blocks,markers:r,model:n.model,system:p.system,conversation:g,modelOptions:w,...n.signal?{signal:n.signal}:{}};var O;let T="",A=0,L="unknown",M=null,_=!1;for await(const e of E.fullStream){switch(e.type){case"text-delta":{T+=e.text;const{text:t}=v(T,x,b);t.length>A&&(yield{type:"content",text:t.slice(A)},A=t.length);break}case"reasoning-delta":e.text&&(yield{type:"thinking",text:e.text});break;case"tool-call":yield{type:"tool-call",toolName:e.toolName,input:e.input};break;case"tool-result":yield{type:"tool-result",toolName:e.toolName,output:e.output};break;case"error":_=!0,yield{type:"error",error:e.error};break;case"abort":_=!0,yield{type:"error",error:new Error("[chat-kit/engine] 串流已中止"+(e.reason?`:${e.reason}`:""))};break;case"finish":L=e.finishReason,M={inputTokens:e.totalUsage.inputTokens,outputTokens:e.totalUsage.outputTokens,reasoningTokens:e.totalUsage.outputTokenDetails?.reasoningTokens,totalTokens:e.totalUsage.totalTokens}}if(_)break}if(M&&(yield{type:"usage",usage:M}),_)return;const{text:N,changed:R}=v(T,x,b);for(const e of R)yield{type:"guard",name:e,action:"transformed"};let C=N,I=!1;for(const e of x){if(!e.check)continue;const t=await e.check(C,b);"rewrite"===t.action&&"string"==typeof t.text&&t.text!==C?(C=t.text,I=!0,yield{type:"guard",name:e.name,action:"rewrite",...t.reason?{detail:t.reason}:{}}):"pass"===t.action&&t.reason&&(yield{type:"guard",name:e.name,action:"observed",detail:t.reason})}yield{type:"done",text:C,rewritten:I,finishReason:L}}return{runTurn:s,completeTurn:async function(e){const t={text:"",thinking:"",rewritten:!1,finishReason:"unknown",usage:null,toolCalls:[],guards:[],injectedKeys:[]};for await(const n of s(e))switch(n.type){case"context":t.injectedKeys=n.injectedKeys;break;case"thinking":t.thinking+=n.text;break;case"tool-call":t.toolCalls.push({toolName:n.toolName,input:n.input});break;case"tool-result":{const e=[...t.toolCalls].reverse().find(e=>e.toolName===n.toolName&&!("output"in e));e&&(e.output=n.output);break}case"guard":t.guards.push({name:n.name,action:n.action,...n.detail?{detail:n.detail}:{}});break;case"usage":t.usage=n.usage;break;case"error":throw n.error;case"done":t.text=n.text,t.rewritten=n.rewritten,t.finishReason=n.finishReason}return t}}}const L="(System note: empty user initiation)";function M(e,t={}){const{leadingUserText:n=L,separator:o="\n\n"}=t,r=[];let s;for(const t of e){if("system"===t.role){r.push({...t});continue}if(s&&s.role===t.role){s.content+=`${o}${t.content}`;continue}if(!s&&"assistant"===t.role){const e={role:"user",content:n};r.push(e),s=e}const e={...t};r.push(e),s=e}return r}export{L as DEFAULT_LEADING_USER_TEXT,s as DEFAULT_MARKER_SET,T as DEFAULT_MAX_TOOL_STEPS,E as ECHO_MIN_CHARS,n as TRUST_LABELS,O as applyTransforms,y as assemblePrompt,p as blockPattern,r as closeMarker,A as createChatEngine,a as createMarkerSet,d as expandPlaceholders,u as markerPattern,k as neutralizeMarkers,M as normalizeHistory,o as openMarker,g as orderBlocks,f as renderBlock,b as selfIntroGuard,x as stripEchoedContextGuard,w as stripMarkersGuard};//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../.build/prompt/markers.js","../.build/prompt/assemble.js","../.build/guards/input.js","../.build/guards/output.js","../.build/engine/engine.js"],"names":["streamText","stepCountIs","CHAT_KIT_OPTIONS_KEY","DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS","DEFAULT_COOLDOWN_MS","DEFAULT_PROTOCOL","MAX_COOLDOWN_MS","PROTOCOL_ALIASES","consoleLogger","createFallbackModel","createKeyRing","createLanguageModel","createModelFromConfig","createRoutedModel","defaultKeyRing","isOpenCodeEndpoint","isQuotaError","listModels","maskApiKey","normalizeApiKeyList","normalizeBaseURL","normalizeModelConfig","normalizeProtocol","openCodeHeaders","parseModelSpec","reasoningOptions","reasoningProviderOptions","resolveModelChain","resolveModelTarget","resolveProtocol","resolveProviderApiKeys","retryAfterMsFromError","TRUST_LABELS","authoritative","reference","realtime","openMarker","trust","title","closeMarker","markerPattern","labels","Object","values","join","RegExp","PLACEHOLDER","expandPlaceholders","text","leftover","Set","expanded","replace","match","name","prototype","hasOwnProperty","call","add","size","Error","orderBlocks","blocks","seen","b","has","key","filter","content","trim","length","slice","sort","a","order","renderBlock","block","format","defaultCompose","message","assemblePrompt","input","spec","channel","userMessage","ordered","systemBlocks","placement","userBlocks","system","parts","channelParts","map","t","placeholders","extraSystem","s","composeUserMessage","injectedKeys","neutralizeMarkers","neutralized","_m","inner","stripMarkersGuard","transform","buffer","selfIntroGuard","modelNames","patterns","push","cleaned","re","applyTransforms","guards","ctx","out","g","DEFAULT_MAX_TOOL_STEPS","BUILTIN_OUTPUT_GUARDS","transformWithTrace","changed","next","createChatEngine","options","domains","async","runTurn","domain","messages","last","role","validateMessages","m","r","type","action","detail","turn","undefined","tenantId","entity","signal","assembled","tools","prompt","buildContext","error","conversation","i","arr","hasTools","keys","maxSteps","maxToolSteps","opts","modelOptions","result","model","maxRetries","stopWhen","prepareStep","temperature","maxOutputTokens","providerOptions","timeout","abortSignal","onError","outputGuards","guardCtx","modelId","raw","sent","finishReason","usage","failed","part","fullStream","toolName","output","reason","inputTokens","totalUsage","outputTokens","reasoningTokens","outputTokenDetails","totalTokens","transformed","finalText","rewritten","check","verdict","completeTurn","thinking","toolCalls","ev","pending","reverse","find","c"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../.build/prompt/markers.js","../.build/prompt/assemble.js","../.build/guards/input.js","../.build/guards/output.js","../.build/engine/engine.js","../.build/engine/messages.js"],"names":["streamText","stepCountIs","CHAT_KIT_OPTIONS_KEY","DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS","DEFAULT_COOLDOWN_MS","DEFAULT_PROTOCOL","GOOGLE_DEFAULT_BASE_URL","MAX_COOLDOWN_MS","PROTOCOL_ALIASES","consoleLogger","createFallbackModel","createKeyRing","createLanguageModel","createModelFromConfig","createRoutedModel","defaultKeyRing","isOpenCodeEndpoint","isQuotaError","listModels","maskApiKey","normalizeApiKeyList","normalizeBaseURL","normalizeModelConfig","normalizeProtocol","openCodeHeaders","parseModelSpec","reasoningOptions","reasoningProviderOptions","resolveModelChain","resolveModelTarget","resolveProtocol","resolveProviderApiKeys","retryAfterMsFromError","TRUST_LABELS","authoritative","reference","realtime","openMarker","trust","title","closeMarker","DEFAULT_MARKER_SET","names","Object","values","createMarkerSet","extraNames","raw","name","trim","Error","test","some","n","toLowerCase","push","namesAlternation","set","sort","a","b","length","map","replace","String","join","NAME_END","TAIL","markerPattern","RegExp","blockPattern","tail","PLACEHOLDER","expandPlaceholders","text","leftover","Set","expanded","match","prototype","hasOwnProperty","call","add","size","orderBlocks","blocks","seen","has","key","filter","content","slice","order","renderBlock","block","format","defaultCompose","message","assemblePrompt","input","spec","channel","userMessage","ordered","systemBlocks","placement","userBlocks","system","parts","channelParts","t","placeholders","extraSystem","s","composeUserMessage","injectedKeys","neutralizeMarkers","markers","neutralized","_m","inner","close","stripMarkersGuard","transform","buffer","ctx","ECHO_MIN_CHARS","stripEchoedContextGuard","beforeBuiltins","out","split","selfIntroGuard","modelNames","patterns","cleaned","re","applyTransforms","guards","g","DEFAULT_MAX_TOOL_STEPS","BUILTIN_OUTPUT_GUARDS","transformWithTrace","changed","next","withFinalStepAnswer","domainPrepare","maxSteps","async","args","custom","undefined","stepNumber","toolChoice","createChatEngine","options","domains","runTurn","domain","messages","last","role","validateMessages","m","r","type","action","detail","turn","tenantId","entity","signal","assembled","tools","domainGuards","prompt","buildContext","configured","outputGuards","error","conversation","i","arr","hasTools","keys","maxToolSteps","opts","modelOptions","result","model","maxRetries","stopWhen","prepareStep","temperature","maxOutputTokens","providerOptions","timeout","abortSignal","onError","guardCtx","modelId","sent","finishReason","usage","failed","part","fullStream","toolName","output","reason","inputTokens","totalUsage","outputTokens","reasoningTokens","outputTokenDetails","totalTokens","transformed","finalText","rewritten","check","verdict","completeTurn","thinking","toolCalls","ev","pending","reverse","find","c","DEFAULT_LEADING_USER_TEXT","normalizeHistory","leadingUserText","separator","lastConversational","filler","copy"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 依協定建立單一金鑰的 AI SDK LanguageModel。
|
|
3
3
|
*
|
|
4
|
-
* provider 套件以動態 import
|
|
4
|
+
* provider 套件以動態 import 載入:四個都是 optional peer dependency,只裝自己用得到的
|
|
5
5
|
* 那個即可;缺套件時在**第一次呼叫**才報錯,並直接說要裝什麼。
|
|
6
6
|
*/
|
|
7
7
|
import type { LanguageModelV3 } from '@ai-sdk/provider';
|
package/dist/models/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { normalizeModelConfig, parseModelSpec } from './model-spec.js';
|
|
|
6
6
|
export type { KeyRing, KeyRingOptions, KeyRingStatus, KeyStrategy } from './key-ring.js';
|
|
7
7
|
export { DEFAULT_COOLDOWN_MS, MAX_COOLDOWN_MS, createKeyRing, defaultKeyRing, isQuotaError, maskApiKey, normalizeApiKeyList, resolveProviderApiKeys, retryAfterMsFromError, } from './key-ring.js';
|
|
8
8
|
export type { ClientIdentity } from './quirks.js';
|
|
9
|
-
export { DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS, isOpenCodeEndpoint, normalizeBaseURL, openCodeHeaders, reasoningProviderOptions, } from './quirks.js';
|
|
9
|
+
export { DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS, GOOGLE_DEFAULT_BASE_URL, isOpenCodeEndpoint, normalizeBaseURL, openCodeHeaders, reasoningProviderOptions, } from './quirks.js';
|
|
10
10
|
export type { CreateModelSettings, FetchFunction, ModelFactory } from './create-model.js';
|
|
11
11
|
export { createLanguageModel } from './create-model.js';
|
|
12
12
|
export type { ChatKitCallOptions, RoutedModelOptions } from './routed-model.js';
|
package/dist/models/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e={warn:e=>console.warn(e),info:e=>console.info(e)},t="openai-compatible",r=["openai-compatible","openai","anthropic"],o={chat:"openai-compatible",responses:"openai",messages:"anthropic"};function n(e){return"string"!=typeof e?null:r.includes(e)?e:Object.prototype.hasOwnProperty.call(o,e)?o[e]:null}function a(o,a,i=e){const s=o?.sdk;let c;if("string"==typeof s)c=s;else if(s&&"object"==typeof s){const e=a?s[a]:void 0;c=void 0!==e?e:s["*"]}if(null==c)return t;let l=c;"object"==typeof c&&(l=c.flavor,"string"==typeof c.path&&c.path&&i.warn(`[chat-kit/protocol] 不支援自訂端點路徑 "${c.path}"(model=${a||"?"}),已忽略,改用協定預設路徑`));const u=n(l);return u||(i.warn(`[chat-kit/protocol] 未知的協定 "${String(l)}"(model=${a||"?"}),退回 "${t}"。合法值:${r.join(" / ")}`),t)}function i(e){if("string"!=typeof e||!e)return{providerKey:null,modelName:null};const t=e.indexOf("/");return t<0?{providerKey:e,modelName:null}:{providerKey:e.substring(0,t)||null,modelName:e.substring(t+1)||null}}function s(e){return e?"string"==typeof e?{...i(e),reasoningEffort:void 0,backup:void 0}:e.primary?{providerKey:e.primary,modelName:e.model||null,reasoningEffort:e.reasoningEffort,backup:e.backup}:{...i(e.model),reasoningEffort:e.reasoningEffort,backup:e.backup}:{providerKey:null,modelName:null,reasoningEffort:void 0,backup:void 0}}const c=9e5,l=864e5;function u(t={}){const r=t.strategy??"round-robin",o=Number.isFinite(t.defaultCooldownMs)&&t.defaultCooldownMs>0?t.defaultCooldownMs:c,n=t.logger??e,a=t.now??Date.now,i=t.random??Math.random,s=new Map;function u(e){const t=function(e){return(e||"").replace(/\/+$/,"").toLowerCase()}(e);let r=s.get(t);return r||(r={cursor:0,cooldowns:new Map,knownKeys:new Set},s.set(t,r)),r}return{pick(e,t){const o=t.filter(e=>"string"==typeof e&&e.length>0);if(0===o.length)return"";const s=u(e);for(const e of o)s.knownKeys.add(e);if(1===o.length)return o[0];const c=a(),l=o.filter(e=>!((s.cooldowns.get(e)??0)>c));if(0===l.length)return n.warn(`[chat-kit/key-ring] ${e} 的 ${o.length} 把金鑰全部處於冷卻中,改用最快解除的一把`),o.reduce((e,t)=>(s.cooldowns.get(t)??0)<(s.cooldowns.get(e)??0)?t:e);if("random"===r)return l[Math.floor(i()*l.length)];const f=l[s.cursor%l.length];return s.cursor=(s.cursor+1)%Number.MAX_SAFE_INTEGER,f},markExhausted(e,t,r=null){if(!t)return;const i="number"==typeof r&&Number.isFinite(r)&&r>0?Math.min(r,l):o,s=u(e);s.knownKeys.add(t),s.cooldowns.set(t,a()+i),n.warn(`[chat-kit/key-ring] ${e} 金鑰 ${g(t)} 配額耗盡,冷卻 ${Math.round(i/1e3)}s`)},status(){const e=a(),t=[];for(const[r,o]of s){const n=o.knownKeys.size,a=[...o.cooldowns.values()].filter(t=>t>e),i=n>1?a.length:0;t.push({baseURL:r,total:n,coolingDown:i,nextRecoveryMs:i>0?Math.min(...a)-e:null})}return t},reset(){s.clear()}}}const f=u();function d(e,t){return e.replace(/\$\{([^}]+)\}/g,(e,r)=>t[r]||"")}function p(e,t=process.env){const r=Array.isArray(e)?e:[e],o=[];for(const e of r){if("string"!=typeof e)continue;const r=d(e,t).trim();r&&!o.includes(r)&&o.push(r)}return o}function h(e,t=process.env){if(!e||"object"!=typeof e)return[];const r=e=>null==e?[]:Array.isArray(e)?e:[e];return p([...r(e.apiKey),...r(e.apiKeys)],t)}function g(e){return"string"!=typeof e||0===e.length?"(none)":e.length<=4?"****":`****${e.slice(-4)}`}function m(e){const t=[];let r=e;for(let e=0;r&&e<5;e++){t.push(r);const e=r;r=e.lastError??e.cause}return t}function y(e){for(const t of m(e)){const e=t,r=e.statusCode??e.status??e.response?.status;if(429===r||"429"===r)return!0;const o=`${e.message??""} ${e.error?.message??""}`.toLowerCase();if(o.trim()&&/\b429\b|rate.?limit|too many requests|quota|insufficient_quota|resource[_ ]exhausted/.test(o))return!0}return!1}function w(e,t=Date.now){for(const r of m(e)){const e=r,o=e.responseHeaders??e.headers;if(!o)continue;const n=e=>{const t=o;if("function"==typeof t.get)return t.get(e);const r=Object.keys(t).find(t=>t.toLowerCase()===e);return r?t[r]:void 0},a=parseFloat(n("retry-after-ms")??"");if(Number.isFinite(a)&&a>0)return a;const i=n("retry-after");if(null==i)continue;const s=parseFloat(i);if(Number.isFinite(s)&&s>0)return 1e3*s;const c=Date.parse(i);if(Number.isFinite(c)){const e=c-t();return e>0?e:null}}return null}function k(e){if(!e)return e;let t=e.replace(/\/+$/,"");return t.endsWith("/v1")||(t+="/v1"),t}const b="opencode.ai";function v(e){const t=function(e){try{return new URL(e).hostname.toLowerCase()}catch{return null}}(e);return t===b||(t?.endsWith(`.${b}`)??!1)}function E(e,t){return t&&v(e)?{"User-Agent":t.userAgent,"x-opencode-session":t.sessionId}:{}}function $(e,t,r){if(!r)return{};switch(e){case"openai-compatible":return(e=>e.toLowerCase().includes("groq.com"))(t)?{}:(e=>e.toLowerCase().includes("agnes-ai"))(t)?{chat_template_kwargs:{enable_thinking:"high"===r}}:{reasoningEffort:r};case"openai":return{reasoningEffort:r,forceReasoning:!0,systemMessageMode:"system"};case"anthropic":return{}}}const K=8192;function M(e){return e.replace(/[^A-Za-z0-9_-]/g,"-")||"provider"}async function R(e,t){try{return await t()}catch(t){const r=t.code;if("ERR_MODULE_NOT_FOUND"===r||"MODULE_NOT_FOUND"===r)throw new Error(`[chat-kit/models] 此協定需要安裝 ${e}:npm install ${e}`);throw t}}const A=async(e,t,r)=>{const o=k(e.baseURL),{headers:n,fetch:a}=r,i=t||("anthropic"===e.protocol?"":"ollama");switch(e.protocol){case"openai-compatible":{const{createOpenAICompatible:t}=await R("@ai-sdk/openai-compatible",()=>import("@ai-sdk/openai-compatible"));return t({name:M(e.providerKey),baseURL:o,apiKey:i,...n?{headers:n}:{},...a?{fetch:a}:{},includeUsage:!0}).chatModel(e.model)}case"openai":{const{createOpenAI:t}=await R("@ai-sdk/openai",()=>import("@ai-sdk/openai"));return t({baseURL:o,apiKey:i,...n?{headers:n}:{},...a?{fetch:a}:{}}).responses(e.model)}case"anthropic":{const{createAnthropic:t}=await R("@ai-sdk/anthropic",()=>import("@ai-sdk/anthropic"));return t({baseURL:o,apiKey:i,...n?{headers:n}:{},...a?{fetch:a}:{}}).languageModel(e.model)}}};async function L(e,t){const r=e.getReader(),o=[];let n=!1;for(;;){const e=await r.read();if(e.done){n=!0;break}const a=e.value;if("error"===a.type&&!o.some(t))return r.cancel().catch(()=>{}),{kind:"early-error",error:a.error};if(o.push(a),t(a)||"error"===a.type)break}return{kind:"ok",stream:new ReadableStream({start(e){for(const t of o)e.enqueue(t);n&&e.close()},async pull(e){const t=await r.read();t.done?e.close():e.enqueue(t.value)},cancel:e=>r.cancel(e)})}}const U=e=>"text-delta"===e.type,N=e=>"text-delta"===e.type||"reasoning-delta"===e.type,O="chatKit";function x(e){return{[O]:{reasoningEffort:e}}}function _(e,t){const{[O]:r,...o}=t.providerOptions??{},n=r??{},a="reasoningEffort"in n?n.reasoningEffort:e.reasoningEffort,i=$(e.protocol,e.baseURL,a),s="openai-compatible"===e.protocol?M(e.providerKey):"openai"===e.protocol?"openai":"anthropic",c={...o};Object.keys(i).length>0&&(c[s]={...c[s]??{},...i});const l={...t,providerOptions:c};return"anthropic"===e.protocol&&null==l.maxOutputTokens&&(l.maxOutputTokens=8192),l}function C(t,r={}){const o=r.keyRing??f,n=r.logger??e,a=r.createModel??A,i=E(t.baseURL,r.identity),s={...Object.keys(i).length>0?{headers:i}:{},...r.fetch?{fetch:r.fetch}:{}},c=new Map;function l(e){let r=c.get(e);return r||(r=a(t,e,s),r.catch(()=>c.delete(e)),c.set(e,r)),r}async function u(e){const r=t.apiKeys,a=new Set;let i=null;for(let s=0;s<Math.max(1,r.length);s++){const s=r.filter(e=>!a.has(e));if(r.length>0&&0===s.length)break;const c=o.pick(t.baseURL,s);a.add(c);try{return await e(await l(c))}catch(e){if(i=e,!y(e))throw e;if(o.markExhausted(t.baseURL,c,w(e)),!r.some(e=>!a.has(e)))throw e;n.warn(`[chat-kit/routed] ${t.providerKey} 換用下一把金鑰重試(已試 ${a.size}/${r.length})`)}}throw i??new Error(`[chat-kit/routed] ${t.providerKey} 沒有可用的 API key`)}return{specificationVersion:"v3",provider:`chat-kit.${t.providerKey}`,modelId:t.model,supportedUrls:{},doGenerate(e){const r=_(t,e);return u(e=>Promise.resolve(e.doGenerate(r)))},doStream(e){const r=_(t,e);return u(async e=>{const t=await e.doStream(r),o=await L(t.stream,N);if("early-error"===o.kind)throw o.error;return{...t,stream:o.stream}})}}}function F(e){return`${e.provider}/${e.modelId}`}function I(e){return e instanceof Error?e.message:String(e)}function S(t,r={}){if(0===t.length)throw new Error("[chat-kit/fallback] 至少需要一個候選 model");if(1===t.length)return t[0];const o=r.logger??e;async function n(e){let n=null;for(let a=0;a<t.length;a++){const i=t[a];try{return await e(i)}catch(e){n=e;const s=t[a+1];if(!s)break;o.warn(`[chat-kit/fallback] ${F(i)} 失敗(${I(e)}),換手至 ${F(s)}`),r.onFallback?.({from:i,to:s,error:e,index:a+1})}}throw n}const a=t[0];return{specificationVersion:"v3",provider:"chat-kit.fallback",modelId:a.modelId,supportedUrls:a.supportedUrls,doGenerate:e=>n(t=>Promise.resolve(t.doGenerate(e))),doStream:e=>n(async t=>{const r=await t.doStream(e),o=await L(r.stream,U);if("early-error"===o.kind)throw o.error;return{...r,stream:o.stream}})}}function j(e,t,r={}){const o=e[t];if(!o)throw new Error(`[chat-kit/config] provider "${t}" 未設定`);const n=(o.baseURL||"").replace(/\/+$/,"");if(!n)throw new Error(`[chat-kit/config] provider "${t}" 缺少 baseURL`);const i=r.modelName||o.defaultModel;if(!i)throw new Error(`[chat-kit/config] provider "${t}" 沒有可用的模型(未指定且無 defaultModel)`);const s=h(o,r.env);if(r.requireApiKey&&0===s.length)throw new Error(`[chat-kit/config] provider "${t}" 未設定 API key`);const c=r.reasoningEffort??o.reasoningEffort;return{providerKey:t,baseURL:n,apiKeys:s,model:i,protocol:a(o,i,r.logger),...c?{reasoningEffort:c}:{}}}function q(t,r,o={}){const n=o.logger??e,a=function(e){return!!e&&"object"==typeof e&&"providerKey"in e&&"modelName"in e}(r)?r:s(r),i=a.providerKey||o.defaultProviderKey;if(!i)throw new Error("[chat-kit/config] 未指定 provider,也沒有 defaultProviderKey");const c=e=>a.reasoningEffort??t[e]?.reasoningEffort??o.defaultReasoningEffort,l={...void 0!==o.requireApiKey?{requireApiKey:o.requireApiKey}:{},env:o.env,logger:n},u=c(i),f=[j(t,i,{...l,modelName:a.modelName,...u?{reasoningEffort:u}:{}})],d=a.backup;if(d&&d!==i)try{const e=c(d);f.push(j(t,d,{...l,...e?{reasoningEffort:e}:{}}))}catch(e){n.warn(`[chat-kit/config] 備援 provider "${d}" 無法使用,將僅使用主 provider:${e.message}`)}return f}function P(t,r,o={}){const n=o.logger??e,a=q(t,r,o);return{model:S(a.map(e=>C(e,{...o.routed,logger:n})),{...o.fallback,logger:n}),targets:a}}class T extends Error{status;responseHeaders;constructor(e,t,r){super(`listModels HTTP ${e}${t?`: ${t}`:""}`),this.name="ListModelsHttpError",this.status=e,this.responseHeaders={},r.forEach((e,t)=>{this.responseHeaders[t]=e})}}async function D(t,r,o={}){const n=o.keyRing??f,a=o.logger??e,i=o.fetch??globalThis.fetch,s=p(r),c=`${k(t)}/models`,l=E(t,o.identity),u=new Set;let d=null;for(let e=0;e<Math.max(1,s.length);e++){const e=s.filter(e=>!u.has(e));if(s.length>0&&0===e.length)break;const r=n.pick(t,e);u.add(r);try{const e=await i(c,{method:"GET",headers:{...r?{Authorization:`Bearer ${r}`}:{},...l},...o.signal?{signal:o.signal}:{}});if(!e.ok){const t=await e.text().catch(()=>"");throw new T(e.status,t.slice(0,200),e.headers)}const t=await e.json();if(!Array.isArray(t?.data))throw new Error("[chat-kit/models] listModels 回應格式不符:缺少 data 陣列");return t.data.filter(e=>"string"==typeof e?.id).map(e=>({id:e.id,name:e.id}))}catch(e){if(d=e,!y(e))throw e;if(n.markExhausted(t,r,w(e)),!s.some(e=>!u.has(e)))throw e;a.warn(`[chat-kit/list-models] ${t} 換用下一把金鑰重試(已試 ${u.size}/${s.length})`)}}throw d??new Error("[chat-kit/models] listModels:沒有可用的 API key")}export{O as CHAT_KIT_OPTIONS_KEY,K as DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS,c as DEFAULT_COOLDOWN_MS,t as DEFAULT_PROTOCOL,l as MAX_COOLDOWN_MS,o as PROTOCOL_ALIASES,e as consoleLogger,S as createFallbackModel,u as createKeyRing,A as createLanguageModel,P as createModelFromConfig,C as createRoutedModel,f as defaultKeyRing,v as isOpenCodeEndpoint,y as isQuotaError,D as listModels,g as maskApiKey,p as normalizeApiKeyList,k as normalizeBaseURL,s as normalizeModelConfig,n as normalizeProtocol,E as openCodeHeaders,i as parseModelSpec,x as reasoningOptions,$ as reasoningProviderOptions,q as resolveModelChain,j as resolveModelTarget,a as resolveProtocol,h as resolveProviderApiKeys,w as retryAfterMsFromError};//# sourceMappingURL=index.js.map
|
|
1
|
+
const e={warn:e=>console.warn(e),info:e=>console.info(e)},t="openai-compatible",o=["openai-compatible","openai","anthropic","google"],r={chat:"openai-compatible",responses:"openai",messages:"anthropic"};function n(e){return"string"!=typeof e?null:o.includes(e)?e:Object.prototype.hasOwnProperty.call(r,e)?r[e]:null}function a(r,a,s=e){const i=r?.sdk;let c;if("string"==typeof i)c=i;else if(i&&"object"==typeof i){const e=a?i[a]:void 0;c=void 0!==e?e:i["*"]}if(null==c)return t;let l=c;"object"==typeof c&&(l=c.flavor,"string"==typeof c.path&&c.path&&s.warn(`[chat-kit/protocol] 不支援自訂端點路徑 "${c.path}"(model=${a||"?"}),已忽略,改用協定預設路徑`));const u=n(l);return u||(s.warn(`[chat-kit/protocol] 未知的協定 "${String(l)}"(model=${a||"?"}),退回 "${t}"。合法值:${o.join(" / ")}`),t)}function s(e){if("string"!=typeof e||!e)return{providerKey:null,modelName:null};const t=e.indexOf("/");return t<0?{providerKey:e,modelName:null}:{providerKey:e.substring(0,t)||null,modelName:e.substring(t+1)||null}}function i(e){return e?"string"==typeof e?{...s(e),reasoningEffort:void 0,backup:void 0}:e.primary?{providerKey:e.primary,modelName:e.model||null,reasoningEffort:e.reasoningEffort,backup:e.backup}:{...s(e.model),reasoningEffort:e.reasoningEffort,backup:e.backup}:{providerKey:null,modelName:null,reasoningEffort:void 0,backup:void 0}}const c=9e5,l=864e5;function u(t={}){const o=t.strategy??"round-robin",r=Number.isFinite(t.defaultCooldownMs)&&t.defaultCooldownMs>0?t.defaultCooldownMs:c,n=t.logger??e,a=t.now??Date.now,s=t.random??Math.random,i=new Map;function u(e){const t=function(e){return(e||"").replace(/\/+$/,"").toLowerCase()}(e);let o=i.get(t);return o||(o={cursor:0,cooldowns:new Map,knownKeys:new Set},i.set(t,o)),o}return{pick(e,t){const r=t.filter(e=>"string"==typeof e&&e.length>0);if(0===r.length)return"";const i=u(e);for(const e of r)i.knownKeys.add(e);if(1===r.length)return r[0];const c=a(),l=r.filter(e=>!((i.cooldowns.get(e)??0)>c));if(0===l.length)return n.warn(`[chat-kit/key-ring] ${e} 的 ${r.length} 把金鑰全部處於冷卻中,改用最快解除的一把`),r.reduce((e,t)=>(i.cooldowns.get(t)??0)<(i.cooldowns.get(e)??0)?t:e);if("random"===o)return l[Math.floor(s()*l.length)];const f=l[i.cursor%l.length];return i.cursor=(i.cursor+1)%Number.MAX_SAFE_INTEGER,f},markExhausted(e,t,o=null){if(!t)return;const s="number"==typeof o&&Number.isFinite(o)&&o>0?Math.min(o,l):r,i=u(e);i.knownKeys.add(t),i.cooldowns.set(t,a()+s),n.warn(`[chat-kit/key-ring] ${e} 金鑰 ${h(t)} 配額耗盡,冷卻 ${Math.round(s/1e3)}s`)},status(){const e=a(),t=[];for(const[o,r]of i){const n=r.knownKeys.size,a=[...r.cooldowns.values()].filter(t=>t>e),s=n>1?a.length:0;t.push({baseURL:o,total:n,coolingDown:s,nextRecoveryMs:s>0?Math.min(...a)-e:null})}return t},reset(){i.clear()}}}const f=u();function d(e,t){return e.replace(/\$\{([^}]+)\}/g,(e,o)=>t[o]||"")}function p(e,t=process.env){const o=Array.isArray(e)?e:[e],r=[];for(const e of o){if("string"!=typeof e)continue;const o=d(e,t).trim();o&&!r.includes(o)&&r.push(o)}return r}function g(e,t=process.env){if(!e||"object"!=typeof e)return[];const o=e=>null==e?[]:Array.isArray(e)?e:[e];return p([...o(e.apiKey),...o(e.apiKeys)],t)}function h(e){return"string"!=typeof e||0===e.length?"(none)":e.length<=4?"****":`****${e.slice(-4)}`}function m(e){const t=[];let o=e;for(let e=0;o&&e<5;e++){t.push(o);const e=o;o=e.lastError??e.cause}return t}function y(e){for(const t of m(e)){const e=t,o=e.statusCode??e.status??e.response?.status;if(429===o||"429"===o)return!0;const r=`${e.message??""} ${e.error?.message??""}`.toLowerCase();if(r.trim()&&/\b429\b|rate.?limit|too many requests|quota|insufficient_quota|resource[_ ]exhausted/.test(r))return!0}return!1}function w(e,t=Date.now){for(const o of m(e)){const e=o,r=e.responseHeaders??e.headers;if(!r)continue;const n=e=>{const t=r;if("function"==typeof t.get)return t.get(e);const o=Object.keys(t).find(t=>t.toLowerCase()===e);return o?t[o]:void 0},a=parseFloat(n("retry-after-ms")??"");if(Number.isFinite(a)&&a>0)return a;const s=n("retry-after");if(null==s)continue;const i=parseFloat(s);if(Number.isFinite(i)&&i>0)return 1e3*i;const c=Date.parse(s);if(Number.isFinite(c)){const e=c-t();return e>0?e:null}}return null}const k="https://generativelanguage.googleapis.com/v1beta";function b(e){if(!e)return e;let t=e.replace(/\/+$/,"");return t.endsWith("/v1")||(t+="/v1"),t}const v="opencode.ai";function E(e){const t=function(e){try{return new URL(e).hostname.toLowerCase()}catch{return null}}(e);return t===v||(t?.endsWith(`.${v}`)??!1)}function $(e,t){return t&&E(e)?{"User-Agent":t.userAgent,"x-opencode-session":t.sessionId}:{}}function K(e,t,o){if(!o)return{};switch(e){case"openai-compatible":return(e=>e.toLowerCase().includes("groq.com"))(t)?{}:(e=>e.toLowerCase().includes("agnes-ai"))(t)?{chat_template_kwargs:{enable_thinking:"high"===o}}:{reasoningEffort:o};case"openai":return{reasoningEffort:o,forceReasoning:!0,systemMessageMode:"system"};case"anthropic":case"google":return{}}}const M=8192;function R(e){return e.replace(/[^A-Za-z0-9_-]/g,"-")||"provider"}async function L(e,t){try{return await t()}catch(t){const o=t.code;if("ERR_MODULE_NOT_FOUND"===o||"MODULE_NOT_FOUND"===o)throw new Error(`[chat-kit/models] 此協定需要安裝 ${e}:npm install ${e}`);throw t}}const U=async(e,t,o)=>{const r="google"===e.protocol?e.baseURL:b(e.baseURL),{headers:n,fetch:a}=o,s=t||("anthropic"===e.protocol||"google"===e.protocol?"":"ollama");switch(e.protocol){case"openai-compatible":{const{createOpenAICompatible:t}=await L("@ai-sdk/openai-compatible",()=>import("@ai-sdk/openai-compatible"));return t({name:R(e.providerKey),baseURL:r,apiKey:s,...n?{headers:n}:{},...a?{fetch:a}:{},includeUsage:!0}).chatModel(e.model)}case"openai":{const{createOpenAI:t}=await L("@ai-sdk/openai",()=>import("@ai-sdk/openai"));return t({baseURL:r,apiKey:s,...n?{headers:n}:{},...a?{fetch:a}:{}}).responses(e.model)}case"anthropic":{const{createAnthropic:t}=await L("@ai-sdk/anthropic",()=>import("@ai-sdk/anthropic"));return t({baseURL:r,apiKey:s,...n?{headers:n}:{},...a?{fetch:a}:{}}).languageModel(e.model)}case"google":{const{createGoogleGenerativeAI:t}=await L("@ai-sdk/google",()=>import("@ai-sdk/google"));return t({baseURL:r,apiKey:s,...n?{headers:n}:{},...a?{fetch:a}:{}}).languageModel(e.model)}}};async function A(e,t){const o=e.getReader(),r=[];let n=!1;for(;;){const e=await o.read();if(e.done){n=!0;break}const a=e.value;if("error"===a.type&&!r.some(t))return o.cancel().catch(()=>{}),{kind:"early-error",error:a.error};if(r.push(a),t(a)||"error"===a.type)break}return{kind:"ok",stream:new ReadableStream({start(e){for(const t of r)e.enqueue(t);n&&e.close()},async pull(e){const t=await o.read();t.done?e.close():e.enqueue(t.value)},cancel:e=>o.cancel(e)})}}const N=e=>"text-delta"===e.type,O=e=>"text-delta"===e.type||"reasoning-delta"===e.type,x="chatKit";function _(e){return{[x]:{reasoningEffort:e}}}function I(e,t){const{[x]:o,...r}=t.providerOptions??{},n=o??{},a="reasoningEffort"in n?n.reasoningEffort:e.reasoningEffort,s=K(e.protocol,e.baseURL,a),i="openai-compatible"===e.protocol?R(e.providerKey):"openai"===e.protocol?"openai":e.protocol,c={...r};Object.keys(s).length>0&&(c[i]={...c[i]??{},...s});const l={...t,providerOptions:c};return"anthropic"===e.protocol&&null==l.maxOutputTokens&&(l.maxOutputTokens=8192),l}function C(t,o={}){const r=o.keyRing??f,n=o.logger??e,a=o.createModel??U,s=$(t.baseURL,o.identity),i={...Object.keys(s).length>0?{headers:s}:{},...o.fetch?{fetch:o.fetch}:{}},c=new Map;function l(e){let o=c.get(e);return o||(o=a(t,e,i),o.catch(()=>c.delete(e)),c.set(e,o)),o}async function u(e){const o=t.apiKeys,a=new Set;let s=null;for(let i=0;i<Math.max(1,o.length);i++){const i=o.filter(e=>!a.has(e));if(o.length>0&&0===i.length)break;const c=r.pick(t.baseURL,i);a.add(c);try{return await e(await l(c))}catch(e){if(s=e,!y(e))throw e;if(r.markExhausted(t.baseURL,c,w(e)),!o.some(e=>!a.has(e)))throw e;n.warn(`[chat-kit/routed] ${t.providerKey} 換用下一把金鑰重試(已試 ${a.size}/${o.length})`)}}throw s??new Error(`[chat-kit/routed] ${t.providerKey} 沒有可用的 API key`)}return{specificationVersion:"v3",provider:`chat-kit.${t.providerKey}`,modelId:t.model,supportedUrls:{},doGenerate(e){const o=I(t,e);return u(e=>Promise.resolve(e.doGenerate(o)))},doStream(e){const o=I(t,e);return u(async e=>{const t=await e.doStream(o),r=await A(t.stream,O);if("early-error"===r.kind)throw r.error;return{...t,stream:r.stream}})}}}function F(e){return`${e.provider}/${e.modelId}`}function S(e){return e instanceof Error?e.message:String(e)}function j(t,o={}){if(0===t.length)throw new Error("[chat-kit/fallback] 至少需要一個候選 model");if(1===t.length)return t[0];const r=o.logger??e;async function n(e){let n=null;for(let a=0;a<t.length;a++){const s=t[a];try{return await e(s)}catch(e){n=e;const i=t[a+1];if(!i)break;r.warn(`[chat-kit/fallback] ${F(s)} 失敗(${S(e)}),換手至 ${F(i)}`),o.onFallback?.({from:s,to:i,error:e,index:a+1})}}throw n}const a=t[0];return{specificationVersion:"v3",provider:"chat-kit.fallback",modelId:a.modelId,supportedUrls:a.supportedUrls,doGenerate:e=>n(t=>Promise.resolve(t.doGenerate(e))),doStream:e=>n(async t=>{const o=await t.doStream(e),r=await A(o.stream,N);if("early-error"===r.kind)throw r.error;return{...o,stream:r.stream}})}}function q(e,t,o={}){const r=e[t];if(!r)throw new Error(`[chat-kit/config] provider "${t}" 未設定`);const n=a(r,o.modelName||r.defaultModel,o.logger),s=(r.baseURL||("google"===n?k:"")).replace(/\/+$/,"");if(!s)throw new Error(`[chat-kit/config] provider "${t}" 缺少 baseURL`);const i=o.modelName||r.defaultModel;if(!i)throw new Error(`[chat-kit/config] provider "${t}" 沒有可用的模型(未指定且無 defaultModel)`);const c=g(r,o.env);if(o.requireApiKey&&0===c.length)throw new Error(`[chat-kit/config] provider "${t}" 未設定 API key`);const l=o.reasoningEffort??r.reasoningEffort;return{providerKey:t,baseURL:s,apiKeys:c,model:i,protocol:n,...l?{reasoningEffort:l}:{}}}function P(t,o,r={}){const n=r.logger??e,a=function(e){return!!e&&"object"==typeof e&&"providerKey"in e&&"modelName"in e}(o)?o:i(o),s=a.providerKey||r.defaultProviderKey;if(!s)throw new Error("[chat-kit/config] 未指定 provider,也沒有 defaultProviderKey");const c=e=>a.reasoningEffort??t[e]?.reasoningEffort??r.defaultReasoningEffort,l={...void 0!==r.requireApiKey?{requireApiKey:r.requireApiKey}:{},env:r.env,logger:n},u=c(s),f=[q(t,s,{...l,modelName:a.modelName,...u?{reasoningEffort:u}:{}})],d=a.backup;if(d&&d!==s)try{const e=c(d);f.push(q(t,d,{...l,...e?{reasoningEffort:e}:{}}))}catch(e){n.warn(`[chat-kit/config] 備援 provider "${d}" 無法使用,將僅使用主 provider:${e.message}`)}return f}function T(t,o,r={}){const n=r.logger??e,a=P(t,o,r);return{model:j(a.map(e=>C(e,{...r.routed,logger:n})),{...r.fallback,logger:n}),targets:a}}class D extends Error{status;responseHeaders;constructor(e,t,o){super(`listModels HTTP ${e}${t?`: ${t}`:""}`),this.name="ListModelsHttpError",this.status=e,this.responseHeaders={},o.forEach((e,t)=>{this.responseHeaders[t]=e})}}async function G(t,o,r={}){const n=r.keyRing??f,a=r.logger??e,s=r.fetch??globalThis.fetch,i=p(o),c=`${b(t)}/models`,l=$(t,r.identity),u=new Set;let d=null;for(let e=0;e<Math.max(1,i.length);e++){const e=i.filter(e=>!u.has(e));if(i.length>0&&0===e.length)break;const o=n.pick(t,e);u.add(o);try{const e=await s(c,{method:"GET",headers:{...o?{Authorization:`Bearer ${o}`}:{},...l},...r.signal?{signal:r.signal}:{}});if(!e.ok){const t=await e.text().catch(()=>"");throw new D(e.status,t.slice(0,200),e.headers)}const t=await e.json();if(!Array.isArray(t?.data))throw new Error("[chat-kit/models] listModels 回應格式不符:缺少 data 陣列");return t.data.filter(e=>"string"==typeof e?.id).map(e=>({id:e.id,name:e.id}))}catch(e){if(d=e,!y(e))throw e;if(n.markExhausted(t,o,w(e)),!i.some(e=>!u.has(e)))throw e;a.warn(`[chat-kit/list-models] ${t} 換用下一把金鑰重試(已試 ${u.size}/${i.length})`)}}throw d??new Error("[chat-kit/models] listModels:沒有可用的 API key")}export{x as CHAT_KIT_OPTIONS_KEY,M as DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS,c as DEFAULT_COOLDOWN_MS,t as DEFAULT_PROTOCOL,k as GOOGLE_DEFAULT_BASE_URL,l as MAX_COOLDOWN_MS,r as PROTOCOL_ALIASES,e as consoleLogger,j as createFallbackModel,u as createKeyRing,U as createLanguageModel,T as createModelFromConfig,C as createRoutedModel,f as defaultKeyRing,E as isOpenCodeEndpoint,y as isQuotaError,G as listModels,h as maskApiKey,p as normalizeApiKeyList,b as normalizeBaseURL,i as normalizeModelConfig,n as normalizeProtocol,$ as openCodeHeaders,s as parseModelSpec,_ as reasoningOptions,K as reasoningProviderOptions,P as resolveModelChain,q as resolveModelTarget,a as resolveProtocol,g as resolveProviderApiKeys,w as retryAfterMsFromError};//# sourceMappingURL=index.js.map
|
package/dist/models/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../.build/models/types.js","../../.build/models/protocol.js","../../.build/models/model-spec.js","../../.build/models/key-ring.js","../../.build/models/quirks.js","../../.build/models/create-model.js","../../.build/models/stream-peek.js","../../.build/models/routed-model.js","../../.build/models/fallback-model.js","../../.build/models/from-config.js","../../.build/models/list-models.js"],"names":["consoleLogger","warn","m","console","info","DEFAULT_PROTOCOL","PROTOCOLS","PROTOCOL_ALIASES","chat","responses","messages","normalizeProtocol","name","includes","Object","prototype","hasOwnProperty","call","resolveProtocol","providerDef","modelName","logger","sdk","rule","perModel","undefined","flavorName","flavor","path","normalized","String","join","parseModelSpec","spec","providerKey","slashIdx","indexOf","substring","normalizeModelConfig","cfg","reasoningEffort","backup","primary","model","DEFAULT_COOLDOWN_MS","MAX_COOLDOWN_MS","createKeyRing","options","strategy","defaultCooldownMs","Number","isFinite","now","Date","random","Math","rings","Map","getRing","baseURL","id","replace","toLowerCase","ringKeyOf","ring","get","cursor","cooldowns","knownKeys","Set","set","pick","keys","list","filter","k","length","add","t","available","reduce","best","floor","picked","MAX_SAFE_INTEGER","markExhausted","key","cooldownMs","ms","min","maskApiKey","round","status","out","total","size","active","values","ts","coolingDown","push","nextRecoveryMs","reset","clear","defaultKeyRing","expandEnvRefs","value","env","_","normalizeApiKeyList","process","raw","Array","isArray","item","expanded","trim","resolveProviderApiKeys","toArray","v","apiKey","apiKeys","slice","unwrapErrors","err","current","depth","e","lastError","cause","isQuotaError","x","statusCode","response","message","error","test","retryAfterMsFromError","headers","responseHeaders","read","h","hit","find","retryAfterMs","parseFloat","retryAfter","seconds","dateMs","parse","delta","normalizeBaseURL","endsWith","OPENCODE_HOST","isOpenCodeEndpoint","host","URL","hostname","hostOf","openCodeHeaders","identity","userAgent","sessionId","reasoningProviderOptions","protocol","effort","isGroq","isAgnes","chat_template_kwargs","enable_thinking","forceReasoning","systemMessageMode","DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS","providerOptionsName","async","importOrExplain","specifier","loader","code","Error","createLanguageModel","target","rawApiKey","settings","fetch","createOpenAICompatible","includeUsage","chatModel","createOpenAI","createAnthropic","languageModel","peekStream","stream","isCommitPoint","reader","getReader","buffered","done","next","part","type","some","cancel","catch","kind","ReadableStream","start","controller","p","enqueue","close","pull","reason","isTextDelta","isTextOrReasoningDelta","CHAT_KIT_OPTIONS_KEY","reasoningOptions","translateCallOptions","chatKitRaw","otherProviderOptions","providerOptions","chatKit","fragment","namespace","translated","maxOutputTokens","createRoutedModel","keyRing","factory","createModel","modelsByKey","modelFor","delete","withKeyRotation","attempt","tried","i","max","candidates","has","specificationVersion","provider","modelId","supportedUrls","doGenerate","callOptions","Promise","resolve","doStream","result","peeked","describe","errorMessage","createFallbackModel","models","run","onFallback","from","to","index","resolveModelTarget","providers","def","defaultModel","requireApiKey","resolveModelChain","rawConfig","isNormalized","primaryKey","defaultProviderKey","effortFor","defaultReasoningEffort","base","primaryEffort","chain","backupKey","backupEffort","createModelFromConfig","targets","map","routed","fallback","ListModelsHttpError","constructor","detail","super","this","forEach","listModels","doFetch","globalThis","url","extraHeaders","res","method","Authorization","signal","ok","text","body","json","data"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../.build/models/types.js","../../.build/models/protocol.js","../../.build/models/model-spec.js","../../.build/models/key-ring.js","../../.build/models/quirks.js","../../.build/models/create-model.js","../../.build/models/stream-peek.js","../../.build/models/routed-model.js","../../.build/models/fallback-model.js","../../.build/models/from-config.js","../../.build/models/list-models.js"],"names":["consoleLogger","warn","m","console","info","DEFAULT_PROTOCOL","PROTOCOLS","PROTOCOL_ALIASES","chat","responses","messages","normalizeProtocol","name","includes","Object","prototype","hasOwnProperty","call","resolveProtocol","providerDef","modelName","logger","sdk","rule","perModel","undefined","flavorName","flavor","path","normalized","String","join","parseModelSpec","spec","providerKey","slashIdx","indexOf","substring","normalizeModelConfig","cfg","reasoningEffort","backup","primary","model","DEFAULT_COOLDOWN_MS","MAX_COOLDOWN_MS","createKeyRing","options","strategy","defaultCooldownMs","Number","isFinite","now","Date","random","Math","rings","Map","getRing","baseURL","id","replace","toLowerCase","ringKeyOf","ring","get","cursor","cooldowns","knownKeys","Set","set","pick","keys","list","filter","k","length","add","t","available","reduce","best","floor","picked","MAX_SAFE_INTEGER","markExhausted","key","cooldownMs","ms","min","maskApiKey","round","status","out","total","size","active","values","ts","coolingDown","push","nextRecoveryMs","reset","clear","defaultKeyRing","expandEnvRefs","value","env","_","normalizeApiKeyList","process","raw","Array","isArray","item","expanded","trim","resolveProviderApiKeys","toArray","v","apiKey","apiKeys","slice","unwrapErrors","err","current","depth","e","lastError","cause","isQuotaError","x","statusCode","response","message","error","test","retryAfterMsFromError","headers","responseHeaders","read","h","hit","find","retryAfterMs","parseFloat","retryAfter","seconds","dateMs","parse","delta","GOOGLE_DEFAULT_BASE_URL","normalizeBaseURL","endsWith","OPENCODE_HOST","isOpenCodeEndpoint","host","URL","hostname","hostOf","openCodeHeaders","identity","userAgent","sessionId","reasoningProviderOptions","protocol","effort","isGroq","isAgnes","chat_template_kwargs","enable_thinking","forceReasoning","systemMessageMode","DEFAULT_ANTHROPIC_MAX_OUTPUT_TOKENS","providerOptionsName","async","importOrExplain","specifier","loader","code","Error","createLanguageModel","target","rawApiKey","settings","fetch","createOpenAICompatible","includeUsage","chatModel","createOpenAI","createAnthropic","languageModel","createGoogleGenerativeAI","peekStream","stream","isCommitPoint","reader","getReader","buffered","done","next","part","type","some","cancel","catch","kind","ReadableStream","start","controller","p","enqueue","close","pull","reason","isTextDelta","isTextOrReasoningDelta","CHAT_KIT_OPTIONS_KEY","reasoningOptions","translateCallOptions","chatKitRaw","otherProviderOptions","providerOptions","chatKit","fragment","namespace","translated","maxOutputTokens","createRoutedModel","keyRing","factory","createModel","modelsByKey","modelFor","delete","withKeyRotation","attempt","tried","i","max","candidates","has","specificationVersion","provider","modelId","supportedUrls","doGenerate","callOptions","Promise","resolve","doStream","result","peeked","describe","errorMessage","createFallbackModel","models","run","onFallback","from","to","index","resolveModelTarget","providers","def","defaultModel","requireApiKey","resolveModelChain","rawConfig","isNormalized","primaryKey","defaultProviderKey","effortFor","defaultReasoningEffort","base","primaryEffort","chain","backupKey","backupEffort","createModelFromConfig","targets","map","routed","fallback","ListModelsHttpError","constructor","detail","super","this","forEach","listModels","doFetch","globalThis","url","extraHeaders","res","method","Authorization","signal","ok","text","body","json","data"],"mappings":"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"}
|
package/dist/models/quirks.d.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* 「哪個 provider 吃哪種參數」只有一份真相——散落到呼叫端的特例必然分歧。
|
|
6
6
|
*/
|
|
7
7
|
import type { Protocol, ReasoningEffort } from './types.js';
|
|
8
|
+
/** Gemini 原生協定的預設端點;provider 設定可以不填 baseURL */
|
|
9
|
+
export declare const GOOGLE_DEFAULT_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
|
|
8
10
|
/** 補上 `/v1`(ollama.com 等端點的 baseURL 慣例不帶) */
|
|
9
11
|
export declare function normalizeBaseURL(baseURL: string): string;
|
|
10
12
|
/** 以 host 判斷,不用字串包含:`?next=https://opencode.ai` 這類參數不該算命中 */
|
|
@@ -35,6 +37,7 @@ export declare function openCodeHeaders(baseURL: string, identity: ClientIdentit
|
|
|
35
37
|
* | openai-compatible × 其他 | `reasoning_effort`,`'none'` 照實送出 |
|
|
36
38
|
* | openai(/responses) | `reasoning.effort`;另帶 `forceReasoning` 與 `systemMessageMode: 'system'` |
|
|
37
39
|
* | anthropic | 不帶(`thinking` 是 token 預算語意,與強度沒有可靠對應) |
|
|
40
|
+
* | google | 不帶(Gemini 的思考設定是 `thinkingConfig`,各代模型語意不同,沒有可靠對應) |
|
|
38
41
|
*
|
|
39
42
|
* `/responses` 那列的兩個附加旗標:AI SDK 只對它認得的模型(o 系列、gpt-5+)送 reasoning,
|
|
40
43
|
* muse 這類不在名單內的模型會被**靜默丟掉** effort(只留一條 warning)。`forceReasoning`
|
package/dist/models/types.d.ts
CHANGED
|
@@ -5,8 +5,13 @@
|
|
|
5
5
|
* 唯一的設定來源。chat-kit 的引擎本身不認得這個形狀(只認 AI SDK 的 LanguageModel),
|
|
6
6
|
* 這一層只是「把這種設定轉成 model」的可選輔助。
|
|
7
7
|
*/
|
|
8
|
-
/**
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* API 協定家族,值域對齊 opencode 官方文件的 SDK 詞彙,另加 `google`(Gemini 原生)。
|
|
10
|
+
*
|
|
11
|
+
* Gemini 走原生而非 OpenAI 相容層的理由:thought_signature 的接力(Gemini 3 回放 functionCall
|
|
12
|
+
* 時必須附上,漏掉直接 400)與 reasoning token 的用量統計都由 `@ai-sdk/google` 處理,相容層兩者皆缺。
|
|
13
|
+
*/
|
|
14
|
+
export type Protocol = 'openai-compatible' | 'openai' | 'anthropic' | 'google';
|
|
10
15
|
/**
|
|
11
16
|
* 推理強度。`'none'` 是**明確關閉思考**並照實送出,與「不設定(不帶參數,模型自身預設)」
|
|
12
17
|
* 是兩回事——opencode-go/deepseek 不帶參數時預設是開思考。
|
package/dist/prompt/markers.d.ts
CHANGED
|
@@ -8,13 +8,33 @@
|
|
|
8
8
|
*
|
|
9
9
|
* 動機(owlnest Redmine #9285):使用者若在訊息裡打出 `[END REFERENCE]` 或整段偽造的
|
|
10
10
|
* 權威區塊,模型分不出哪段是系統注入的、哪段是使用者寫的,就會照著偽造的「最高優先指令」做。
|
|
11
|
+
*
|
|
12
|
+
* 使用端若有自己手寫的標記(例如以 `format: 'raw'` 自帶的區塊標題),把名稱登記進
|
|
13
|
+
* `MarkerSet`(`createChatEngine({ markers })`),中和與清洗才會一併涵蓋——標記與清單分處兩地,
|
|
14
|
+
* 漏登記一個就等於那個標記可被偽造。
|
|
11
15
|
*/
|
|
12
16
|
import type { Trust } from './types.js';
|
|
13
17
|
export declare const TRUST_LABELS: Readonly<Record<Trust, string>>;
|
|
14
18
|
export declare function openMarker(trust: Trust, title: string): string;
|
|
15
19
|
export declare function closeMarker(trust: Trust): string;
|
|
20
|
+
/** 需要被視為信任標記的名稱集合(不含括號,也不含 `END ` 前綴) */
|
|
21
|
+
export interface MarkerSet {
|
|
22
|
+
readonly names: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export declare const DEFAULT_MARKER_SET: MarkerSet;
|
|
25
|
+
/**
|
|
26
|
+
* 建立標記集:內建的信任標記加上使用端自訂的名稱。
|
|
27
|
+
* @param extraNames 例如 `['OFFICIAL Q&A']`;不分大小寫,名稱內的空白會放寬成任意空白(含換行)
|
|
28
|
+
*/
|
|
29
|
+
export declare function createMarkerSet(extraNames?: readonly string[]): MarkerSet;
|
|
30
|
+
/**
|
|
31
|
+
* 比對本系統使用的標記(開頭與結尾兩種),不分大小寫、容許空白變體,也涵蓋未閉合的寫法。
|
|
32
|
+
* 第 1 組擷取括號內的文字(供「換括號、保留內容」使用),第 2 組是右括號(未閉合時為 undefined)。
|
|
33
|
+
*/
|
|
34
|
+
export declare function markerPattern(set?: MarkerSet): RegExp;
|
|
16
35
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
36
|
+
* 比對「成對的區塊」:開頭標記、其間任何內容、結尾標記(`[END …]`)。
|
|
37
|
+
* 模型照抄注入區塊時,只去標記會把洩漏的內容留給使用者,需整段剝除。
|
|
38
|
+
* 沒有結尾標記的開頭標記不在此列(交給 `markerPattern` 處理),以免誤刪後面的正文。
|
|
19
39
|
*/
|
|
20
|
-
export declare function
|
|
40
|
+
export declare function blockPattern(set?: MarkerSet): RegExp;
|
package/docs/API.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
## 1. 引擎
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
|
-
createChatEngine(options: { domains: Record<string, DomainAdapter
|
|
11
|
+
createChatEngine(options: { domains: Record<string, DomainAdapter>; markers?: string[] }): ChatEngine
|
|
12
12
|
|
|
13
13
|
interface ChatEngine {
|
|
14
14
|
runTurn(input: TurnInput): AsyncGenerator<ChatEvent, void, undefined>; // 串流
|
|
@@ -16,6 +16,9 @@ interface ChatEngine {
|
|
|
16
16
|
}
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
`markers`:使用端自己手寫的信任標記名稱(例如以 `format: 'raw'` 自帶的 `OFFICIAL Q&A`)。登記後輸入中和、輸出清洗都涵蓋它們;
|
|
20
|
+
內建的 AUTHORITATIVE/REFERENCE/REALTIME 不必列。名稱不合法(空、帶 `END ` 前綴、含方括號)在建立引擎時就拋錯。
|
|
21
|
+
|
|
19
22
|
### TurnInput
|
|
20
23
|
|
|
21
24
|
| 欄位 | 型別 | 說明 |
|
|
@@ -56,10 +59,16 @@ interface DomainAdapter {
|
|
|
56
59
|
tools?(turn: TurnContext): ToolSet | Promise<ToolSet>; // AI SDK tool(),含 execute
|
|
57
60
|
maxToolSteps?: number; // 預設 3
|
|
58
61
|
prepareStep?: PrepareStepFunction<ToolSet>; // 每步呼叫前的鉤子(如強制重查)
|
|
59
|
-
outputGuards?: readonly OutputGuard[];
|
|
62
|
+
outputGuards?: readonly OutputGuard[] | ((turn: TurnContext) => readonly OutputGuard[] | Promise<readonly OutputGuard[]>);
|
|
60
63
|
}
|
|
61
64
|
```
|
|
62
65
|
|
|
66
|
+
**逐輪狀態**:`outputGuards` 給函式時,它收到的 `turn` 與 `buildContext`、`tools` 是**同一個物件**,可當 `WeakMap` 的 key 在三者之間共享狀態
|
|
67
|
+
(例如工具是否真的查到資料,閘門據此決定要不要攔截)。不需要為了狀態每輪建一個 Domain 或 engine。
|
|
68
|
+
|
|
69
|
+
**工具輪數用盡**:最後一步(第 `maxToolSteps + 1` 步)引擎預設加 `toolChoice: 'none'`,逼模型用已有的結果回答,避免整輪以空字串收尾。
|
|
70
|
+
Domain 的 `prepareStep` 已回傳 `toolChoice` 時尊重它;`maxToolSteps: 0` 不套用。
|
|
71
|
+
|
|
63
72
|
`TurnContext`:`{ domain, channel, tenantId?, entity?, messages(已過輸入閘門), userMessage(已中和標記), signal? }`——刻意**不含 model**,Domain 不該依模型改變資料。
|
|
64
73
|
|
|
65
74
|
## 3. 提示詞
|
|
@@ -96,13 +105,31 @@ interface OutputGuard {
|
|
|
96
105
|
}
|
|
97
106
|
|
|
98
107
|
interface GuardVerdict { action: 'pass' | 'rewrite'; text?: string; reason?: string }
|
|
99
|
-
interface GuardContext {
|
|
108
|
+
interface GuardContext {
|
|
109
|
+
modelId: string; channel: string;
|
|
110
|
+
turn: TurnContext; // 與 buildContext/tools 同一個物件,可當 WeakMap key
|
|
111
|
+
blocks: readonly ContextBlock[]; // 本輪實際注入的區塊(空內容已略過)
|
|
112
|
+
markers: MarkerSet; // 含使用端登記的自訂標記
|
|
113
|
+
model: LanguageModel; system: string; conversation: readonly ModelMessage[];
|
|
114
|
+
modelOptions: NonNullable<TurnInput['modelOptions']>; signal?: AbortSignal;
|
|
115
|
+
}
|
|
100
116
|
```
|
|
101
117
|
|
|
118
|
+
**事後補救**:`check` 看完整回覆後發現問題(例如沒查證就斷言),可以用 `ctx.model`/`ctx.system`/`ctx.conversation`
|
|
119
|
+
自己再呼叫一次模型(強制工具查證、重答),把結果以 `rewrite` 回報。補救呼叫的事件與用量引擎看不到,由閘門自己記錄;
|
|
120
|
+
`ctx.conversation` 不含本輪模型的回覆,要接續請自己加。
|
|
121
|
+
|
|
102
122
|
- `rewrite` 帶 `text`:改寫只反映在 `done.text`(已送出的串流收不回來)。
|
|
123
|
+
- `beforeBuiltins: true`:排在內建閘門**之前**。內建的 `stripMarkersGuard` 會先把標記拆掉,需要看到完整標記的閘門必須設這個旗標。
|
|
103
124
|
- **觀察模式**:`pass` 帶 `reason` = 放行但回報 `guard` 事件(`action: 'observed'`),供規則上線前量測命中率。
|
|
104
|
-
- 內建:`stripMarkersGuard
|
|
105
|
-
-
|
|
125
|
+
- 內建:`stripMarkersGuard`(清內部標記,引擎一律套用;涵蓋未閉合、換行斷開與自訂標記);`selfIntroGuard(modelNames: string[])`(模型自我介紹過濾,含備援模型名也要列)。
|
|
126
|
+
- 選用:`stripEchoedContextGuard`(模型照抄注入區塊時連內容一起剝除:成對區塊整段移除,與區塊內容逐字相同、且達 `ECHO_MIN_CHARS`=24 字的段落移除)。
|
|
127
|
+
串流通道收不回已送出的文字,區塊結尾標記出現前內容已流出,完整效果只在 `done.text` 與 `completeTurn`;不適合單靠它保護串流通道。
|
|
128
|
+
- 低階工具:`neutralizeMarkers(text, markers?)`(輸入中和,引擎已內建)、`applyTransforms(buffer, guards, ctx)`。
|
|
129
|
+
- 標記比對規則:不分大小寫;名稱內空白(含換行)放寬;**未閉合**的標記也算(只換左括號,不補右括號);未閉合時遇到下一個 `[`、換行或字串結尾就停手,不吞後面的內容。
|
|
130
|
+
`[REFERENCED]`、`[references]` 這類一般文字不算。
|
|
131
|
+
- `normalizeHistory(messages, { leadingUserText?, separator? })`:合併相鄰同角色、歷史以 assistant 開頭時補一則 user。**引擎不自動套用**(合併會改變送進模型的內容),
|
|
132
|
+
對外開放 `messages` 欄位的通道自己在呼叫引擎前套用。
|
|
106
133
|
|
|
107
134
|
## 5. models/(設定 → model)
|
|
108
135
|
|
|
@@ -123,14 +150,33 @@ listModels(baseURL, apiKeys, options?): Promise<ListedModel[]>
|
|
|
123
150
|
| :-- | :-- |
|
|
124
151
|
| `ProviderDef` | `{ baseURL?, apiKey? \| apiKeys?, defaultModel?, sdk?, reasoningEffort? }`;金鑰支援 `${ENV}` 展開 |
|
|
125
152
|
| `ModelTarget` | 整包 `{ providerKey, baseURL, apiKeys[], model, protocol, reasoningEffort? }`,不拆開傳 |
|
|
126
|
-
| `Protocol` | `'openai-compatible'`(`/chat/completions`)/`'openai'`(`/responses`)/`'anthropic'`(`/messages`) |
|
|
153
|
+
| `Protocol` | `'openai-compatible'`(`/chat/completions`)/`'openai'`(`/responses`)/`'anthropic'`(`/messages`)/`'google'`(Gemini 原生,`sdk: "google"`,`baseURL` 可省,預設 `GOOGLE_DEFAULT_BASE_URL`) |
|
|
127
154
|
| `ReasoningEffort` | `'none' \| 'minimal' \| 'low' \| 'medium' \| 'high' \| 'xhigh' \| 'max'` |
|
|
128
155
|
| `ModelFromConfigOptions` | `defaultProviderKey?`、`defaultReasoningEffort?`、`requireApiKey?`、`env?`、`logger?`、`routed?`、`fallback?` |
|
|
129
156
|
| `FallbackEvent` | `{ from, to, error, index }`——`onFallback` 用來記「實際回應者」,用量才不會記錯 provider |
|
|
130
157
|
| `KeyRing` | `pick`/`markExhausted`/`status()`/`reset()`;429 冷卻遵守 `Retry-After` |
|
|
131
158
|
|
|
159
|
+
**`google` 協定**:走 `@ai-sdk/google`(optional peer)。thought_signature 接力與 reasoning token 用量由該套件處理,這是不用 OpenAI 相容層的原因。
|
|
160
|
+
金鑰輪替、主備援與其他協定相同;`reasoningEffort` 對它**不轉譯**(Gemini 的思考設定各代語意不同,沒有可靠對應);`listModels` 不支援。
|
|
161
|
+
|
|
132
162
|
設定形狀(`rawConfig`):`{ model: 'provider' 或 'provider/model', reasoningEffort?, backup? }`;主設定無效直接拋錯,備援無效只警告並略過。備援只沿用推理強度、不沿用模型名(改用備援自己的 `defaultModel`)。
|
|
133
163
|
|
|
164
|
+
## 5.1 cli/(本地 CLI 當模型,子路徑 `@jungtz/chat-kit/cli`)
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
createCliModel(options: CliModelOptions): LanguageModelV3
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
| 欄位 | 說明 |
|
|
171
|
+
| :-- | :-- |
|
|
172
|
+
| `command` | `'claude'` | `'opencode'`(白名單) |
|
|
173
|
+
| `model` | claude 必填;opencode 選填。只接受 `[A-Za-z0-9._:/#@+=-]` |
|
|
174
|
+
| `effort` | 原樣轉交:claude 走 `--effort`,opencode 併進 `--model` 的 `#variant` |
|
|
175
|
+
| `timeoutMs` | 預設 120000 |
|
|
176
|
+
| `cwd` | 省略=系統暫存下的空目錄(不繼承目前行程,免得 CLI 讀到專案的 CLAUDE.md/AGENTS.md);要讓 CLI 看某專案才傳 |
|
|
177
|
+
|
|
178
|
+
限制:`tools` 須為空(否則拋錯);temperature 等微調參數只記 warning;claude 的內建工具與 MCP 一律關閉;失敗(非零退出、空回覆、逾時)拋錯,串流則以 error part 交給下游,不送 `done`。
|
|
179
|
+
|
|
134
180
|
## 6. 常見陷阱
|
|
135
181
|
|
|
136
182
|
| 陷阱 | 正確做法 |
|
|
@@ -141,6 +187,9 @@ listModels(baseURL, apiKeys, options?): Promise<ListedModel[]>
|
|
|
141
187
|
| usage 缺席填 `0` | 記 `null`——`0` 是「真的消耗 0」,會污染統計 |
|
|
142
188
|
| 手組 `providerOptions` 且命名空間含點 | 一律用 `reasoningOptions()`——含點的鍵會讓推理強度被 AI SDK 靜默丟掉 |
|
|
143
189
|
| `messages` 最後一則不是 user/空內容 | 第一個事件前拋錯,呼叫端要 try/catch |
|
|
190
|
+
| 手寫的區塊標記(`format: 'raw'`)沒登記 | 傳 `createChatEngine({ markers })`,否則使用者可偽造該標記 |
|
|
191
|
+
| 閘門需要逐輪狀態卻用模組層變數 | 用 `outputGuards: (turn) => …` 搭配 `WeakMap<TurnContext, State>`,併發的兩輪才不會互相覆蓋 |
|
|
192
|
+
| 想用串流又要整句改寫回覆 | 辦不到:已送出的文字收不回。要整句替換的閘門(如捏造攔截),該通道用 `completeTurn` 緩衝後再送 |
|
|
144
193
|
| 依賴 `file:` 或 `npm link` | 釘死版本(npm 版本號或 git tag) |
|
|
145
194
|
|
|
146
195
|
## 7. 對應檔案(深入時)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jungtz/chat-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "通用 Chat 引擎:AI SDK 模型層、金鑰輪替、主備援、提示詞組裝與閘門",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
"./models": {
|
|
12
12
|
"types": "./dist/models/index.d.ts",
|
|
13
13
|
"import": "./dist/models/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./cli": {
|
|
16
|
+
"types": "./dist/cli/index.d.ts",
|
|
17
|
+
"import": "./dist/cli/index.js"
|
|
14
18
|
}
|
|
15
19
|
},
|
|
16
20
|
"files": [
|
|
@@ -31,6 +35,7 @@
|
|
|
31
35
|
},
|
|
32
36
|
"peerDependencies": {
|
|
33
37
|
"@ai-sdk/anthropic": "^3.0.0",
|
|
38
|
+
"@ai-sdk/google": "^3.0.0",
|
|
34
39
|
"@ai-sdk/openai": "^3.0.0",
|
|
35
40
|
"@ai-sdk/openai-compatible": "^2.0.0",
|
|
36
41
|
"@ai-sdk/provider": "^3.0.0",
|
|
@@ -40,6 +45,9 @@
|
|
|
40
45
|
"@ai-sdk/anthropic": {
|
|
41
46
|
"optional": true
|
|
42
47
|
},
|
|
48
|
+
"@ai-sdk/google": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
43
51
|
"@ai-sdk/openai": {
|
|
44
52
|
"optional": true
|
|
45
53
|
},
|
|
@@ -50,6 +58,7 @@
|
|
|
50
58
|
"license": "MIT",
|
|
51
59
|
"devDependencies": {
|
|
52
60
|
"@ai-sdk/anthropic": "^3.0.127",
|
|
61
|
+
"@ai-sdk/google": "^3.0.130",
|
|
53
62
|
"@ai-sdk/openai": "^3.0.124",
|
|
54
63
|
"@ai-sdk/openai-compatible": "^2.0.81",
|
|
55
64
|
"@ai-sdk/provider": "^3.0.18",
|