@chances-ai/engine 29.0.0 → 31.0.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/dist/agents/index.js +1 -1
- package/dist/ai/adapters/ai-sdk-stream.d.ts +13 -1
- package/dist/ai/adapters/ai-sdk-stream.d.ts.map +1 -1
- package/dist/ai/adapters/ai-sdk-stream.js +140 -39
- package/dist/ai/adapters/ai-sdk-stream.js.map +1 -1
- package/dist/ai/adapters/ai-sdk.d.ts +8 -0
- package/dist/ai/adapters/ai-sdk.d.ts.map +1 -1
- package/dist/ai/adapters/ai-sdk.js +40 -2
- package/dist/ai/adapters/ai-sdk.js.map +1 -1
- package/dist/ai/adapters/mock.d.ts.map +1 -1
- package/dist/ai/adapters/mock.js +6 -2
- package/dist/ai/adapters/mock.js.map +1 -1
- package/dist/ai/adapters/native-anthropic.d.ts +51 -0
- package/dist/ai/adapters/native-anthropic.d.ts.map +1 -0
- package/dist/ai/adapters/native-anthropic.js +179 -0
- package/dist/ai/adapters/native-anthropic.js.map +1 -0
- package/dist/ai/adapters/openai-compatible.d.ts +17 -1
- package/dist/ai/adapters/openai-compatible.d.ts.map +1 -1
- package/dist/ai/adapters/openai-compatible.js +105 -1
- package/dist/ai/adapters/openai-compatible.js.map +1 -1
- package/dist/ai/compat.d.ts +30 -0
- package/dist/ai/compat.d.ts.map +1 -0
- package/dist/ai/compat.js +93 -0
- package/dist/ai/compat.js.map +1 -0
- package/dist/ai/cost.d.ts +9 -0
- package/dist/ai/cost.d.ts.map +1 -1
- package/dist/ai/cost.js +15 -2
- package/dist/ai/cost.js.map +1 -1
- package/dist/ai/index.d.ts +6 -2
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +5 -1
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/known-models.d.ts +20 -6
- package/dist/ai/known-models.d.ts.map +1 -1
- package/dist/ai/known-models.generated.d.ts +3 -0
- package/dist/ai/known-models.generated.d.ts.map +1 -0
- package/dist/ai/known-models.generated.js +518 -0
- package/dist/ai/known-models.generated.js.map +1 -0
- package/dist/ai/known-models.js +29 -128
- package/dist/ai/known-models.js.map +1 -1
- package/dist/ai/provider-table.d.ts +36 -0
- package/dist/ai/provider-table.d.ts.map +1 -0
- package/dist/ai/provider-table.js +80 -0
- package/dist/ai/provider-table.js.map +1 -0
- package/dist/ai/retry.d.ts +74 -3
- package/dist/ai/retry.d.ts.map +1 -1
- package/dist/ai/retry.js +246 -6
- package/dist/ai/retry.js.map +1 -1
- package/dist/ai/router.d.ts +12 -0
- package/dist/ai/router.d.ts.map +1 -1
- package/dist/ai/router.js +19 -0
- package/dist/ai/router.js.map +1 -1
- package/dist/ai/sampling.d.ts +37 -0
- package/dist/ai/sampling.d.ts.map +1 -0
- package/dist/ai/sampling.js +34 -0
- package/dist/ai/sampling.js.map +1 -0
- package/dist/ai/setup.d.ts +1 -1
- package/dist/ai/setup.d.ts.map +1 -1
- package/dist/ai/setup.js +28 -4
- package/dist/ai/setup.js.map +1 -1
- package/dist/ai/summarizer.d.ts.map +1 -1
- package/dist/ai/summarizer.js +6 -1
- package/dist/ai/summarizer.js.map +1 -1
- package/dist/ai/think-filter.d.ts +30 -0
- package/dist/ai/think-filter.d.ts.map +1 -0
- package/dist/ai/think-filter.js +193 -0
- package/dist/ai/think-filter.js.map +1 -0
- package/dist/ai/thinking.d.ts +77 -0
- package/dist/ai/thinking.d.ts.map +1 -0
- package/dist/ai/thinking.js +174 -0
- package/dist/ai/thinking.js.map +1 -0
- package/dist/ai/types.d.ts +135 -8
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +44 -6
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/engine.d.ts +19 -4
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +123 -19
- package/dist/core/engine.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/task-tool.d.ts +1 -1
- package/dist/core/task-tool.js +1 -1
- package/dist/core/workspace-query.d.ts +1 -1
- package/dist/core/workspace-query.js +1 -1
- package/dist/local-vault/index.d.ts +1 -1
- package/dist/local-vault/index.js +1 -1
- package/dist/lsp/index.d.ts +1 -1
- package/dist/lsp/index.js +1 -1
- package/dist/lsp/types.d.ts +2 -2
- package/dist/mcp/host.d.ts +3 -3
- package/dist/mcp/load-mcp-host.d.ts +4 -4
- package/dist/mcp/load-mcp-host.js +4 -4
- package/dist/mcp/oauth/provider.d.ts.map +1 -1
- package/dist/mcp/oauth/provider.js +10 -1
- package/dist/mcp/oauth/provider.js.map +1 -1
- package/dist/plugin-api/index.d.ts +10 -2
- package/dist/plugin-api/index.d.ts.map +1 -1
- package/dist/plugin-api/index.js +15 -0
- package/dist/plugin-api/index.js.map +1 -1
- package/dist/tools/approval.d.ts +1 -1
- package/dist/tools/approval.js +1 -1
- package/dist/tools/builtins/lsp.js +1 -1
- package/dist/tools/builtins/pty.d.ts +1 -1
- package/dist/tools/types.d.ts +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/ai/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG1D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,mDAAmD;IACnD,qDAAqD;IACrD,oDAAoD;IACpD,qDAAqD;IACrD,yCAAyC;IACzC,oDAAoD;IACpD,8EAA8E;IAC9E,2EAA2E;CAC5E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAwB,EACxB,OAAe,EACf,QAAmB,EACnB,MAAmB;IAEnB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EACvE,MAAM,CACP,CAAC;IACF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,YAAY;gBACf,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;gBACnB,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACnF,qEAAqE;YACrE,gEAAgE;YAChE,qEAAqE;YACrE,
|
|
1
|
+
{"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/ai/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG1D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,mDAAmD;IACnD,qDAAqD;IACrD,oDAAoD;IACpD,qDAAqD;IACrD,yCAAyC;IACzC,oDAAoD;IACpD,8EAA8E;IAC9E,2EAA2E;CAC5E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAwB,EACxB,OAAe,EACf,QAAmB,EACnB,MAAmB;IAEnB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EACvE,MAAM,CACP,CAAC;IACF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,YAAY;gBACf,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;gBACnB,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACnF,qEAAqE;YACrE,gEAAgE;YAChE,qEAAqE;YACrE,2EAA2E;YAC3E,4EAA4E;YAC5E,8CAA8C;YAC9C,KAAK,OAAO,CAAC;YACb,KAAK,WAAW,CAAC;YACjB,KAAK,gBAAgB,CAAC;YACtB,KAAK,gBAAgB,CAAC;YACtB,KAAK,cAAc,CAAC;YACpB,KAAK,MAAM;gBACT,MAAM;QACV,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (7.10 §3.4) Streaming `<think>…</think>` splitter — a state machine ported
|
|
3
|
+
* from goose `base.rs:34-302`. Some openai-completions endpoints (certain
|
|
4
|
+
* deepseek-reasoner proxies) emit reasoning INLINE in the content as
|
|
5
|
+
* `<think>…</think>` instead of a separate field; this peels it back out into a
|
|
6
|
+
* thinking channel so the engine renders it as reasoning, not answer text.
|
|
7
|
+
*
|
|
8
|
+
* Handles chunk boundaries (a tag split across pushes is buffered until complete),
|
|
9
|
+
* nested/duplicate tags (depth-counted), self-closing `<think/>` (a no-op, so it
|
|
10
|
+
* never flips the stream into the thinking bucket forever), quoted `>` inside
|
|
11
|
+
* attributes, and an unclosed block at EOF (flushed as thinking).
|
|
12
|
+
*/
|
|
13
|
+
export interface FilterOut {
|
|
14
|
+
content: string;
|
|
15
|
+
thinking: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class ThinkFilter {
|
|
18
|
+
private buffer;
|
|
19
|
+
private insideThink;
|
|
20
|
+
private thinkDepth;
|
|
21
|
+
/** Feed a chunk; returns whatever could be classified so far. */
|
|
22
|
+
push(chunk: string): FilterOut;
|
|
23
|
+
/** Flush: classify the remainder. An unclosed `<think>` block at EOF is
|
|
24
|
+
* treated as thinking (the model never closed it). Consumes the filter. */
|
|
25
|
+
finish(): FilterOut;
|
|
26
|
+
private processBuffer;
|
|
27
|
+
}
|
|
28
|
+
/** Convenience for a complete (non-streamed) string. */
|
|
29
|
+
export declare function splitThinkBlocks(text: string): FilterOut;
|
|
30
|
+
//# sourceMappingURL=think-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"think-filter.d.ts","sourceRoot":"","sources":["../../src/ai/think-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAK;IAEvB,iEAAiE;IACjE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;IAK9B;gFAC4E;IAC5E,MAAM,IAAI,SAAS;IAUnB,OAAO,CAAC,aAAa;CAuCtB;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAKxD"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (7.10 §3.4) Streaming `<think>…</think>` splitter — a state machine ported
|
|
3
|
+
* from goose `base.rs:34-302`. Some openai-completions endpoints (certain
|
|
4
|
+
* deepseek-reasoner proxies) emit reasoning INLINE in the content as
|
|
5
|
+
* `<think>…</think>` instead of a separate field; this peels it back out into a
|
|
6
|
+
* thinking channel so the engine renders it as reasoning, not answer text.
|
|
7
|
+
*
|
|
8
|
+
* Handles chunk boundaries (a tag split across pushes is buffered until complete),
|
|
9
|
+
* nested/duplicate tags (depth-counted), self-closing `<think/>` (a no-op, so it
|
|
10
|
+
* never flips the stream into the thinking bucket forever), quoted `>` inside
|
|
11
|
+
* attributes, and an unclosed block at EOF (flushed as thinking).
|
|
12
|
+
*/
|
|
13
|
+
export class ThinkFilter {
|
|
14
|
+
buffer = "";
|
|
15
|
+
insideThink = false;
|
|
16
|
+
thinkDepth = 0;
|
|
17
|
+
/** Feed a chunk; returns whatever could be classified so far. */
|
|
18
|
+
push(chunk) {
|
|
19
|
+
this.buffer += chunk;
|
|
20
|
+
return this.processBuffer();
|
|
21
|
+
}
|
|
22
|
+
/** Flush: classify the remainder. An unclosed `<think>` block at EOF is
|
|
23
|
+
* treated as thinking (the model never closed it). Consumes the filter. */
|
|
24
|
+
finish() {
|
|
25
|
+
const out = this.processBuffer();
|
|
26
|
+
if (this.buffer.length > 0) {
|
|
27
|
+
if (this.insideThink)
|
|
28
|
+
out.thinking += this.buffer;
|
|
29
|
+
else
|
|
30
|
+
out.content += this.buffer;
|
|
31
|
+
this.buffer = "";
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
processBuffer() {
|
|
36
|
+
const out = { content: "", thinking: "" };
|
|
37
|
+
for (;;) {
|
|
38
|
+
const ev = nextBufferEvent(this.buffer, this.insideThink);
|
|
39
|
+
if (!ev) {
|
|
40
|
+
if (this.buffer.length > 0) {
|
|
41
|
+
if (this.insideThink)
|
|
42
|
+
out.thinking += this.buffer;
|
|
43
|
+
else
|
|
44
|
+
out.content += this.buffer;
|
|
45
|
+
this.buffer = "";
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
if (ev.kind === "partial") {
|
|
50
|
+
if (ev.pos > 0) {
|
|
51
|
+
const prefix = this.buffer.slice(0, ev.pos);
|
|
52
|
+
if (this.insideThink)
|
|
53
|
+
out.thinking += prefix;
|
|
54
|
+
else
|
|
55
|
+
out.content += prefix;
|
|
56
|
+
this.buffer = this.buffer.slice(ev.pos);
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
// A complete tag at ev.pos..ev.end.
|
|
61
|
+
if (ev.pos > 0) {
|
|
62
|
+
const prefix = this.buffer.slice(0, ev.pos);
|
|
63
|
+
if (this.insideThink)
|
|
64
|
+
out.thinking += prefix;
|
|
65
|
+
else
|
|
66
|
+
out.content += prefix;
|
|
67
|
+
}
|
|
68
|
+
this.buffer = this.buffer.slice(ev.end);
|
|
69
|
+
if (ev.tag === "open") {
|
|
70
|
+
this.thinkDepth += 1;
|
|
71
|
+
this.insideThink = true;
|
|
72
|
+
}
|
|
73
|
+
else if (ev.tag === "close") {
|
|
74
|
+
this.thinkDepth = Math.max(0, this.thinkDepth - 1);
|
|
75
|
+
this.insideThink = this.thinkDepth > 0;
|
|
76
|
+
}
|
|
77
|
+
// self-closing: no-op (still consumed above).
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Convenience for a complete (non-streamed) string. */
|
|
83
|
+
export function splitThinkBlocks(text) {
|
|
84
|
+
const f = new ThinkFilter();
|
|
85
|
+
const a = f.push(text);
|
|
86
|
+
const b = f.finish();
|
|
87
|
+
return { content: a.content + b.content, thinking: a.thinking + b.thinking };
|
|
88
|
+
}
|
|
89
|
+
function nextBufferEvent(buffer, insideThink) {
|
|
90
|
+
let from = 0;
|
|
91
|
+
for (;;) {
|
|
92
|
+
const rel = buffer.slice(from).indexOf("<");
|
|
93
|
+
if (rel === -1)
|
|
94
|
+
return null;
|
|
95
|
+
const pos = from + rel;
|
|
96
|
+
const parsed = parseThinkTag(buffer, pos);
|
|
97
|
+
if (parsed) {
|
|
98
|
+
const [tag, end] = parsed;
|
|
99
|
+
if (insideThink || tag === "open" || tag === "self-closing") {
|
|
100
|
+
return { kind: "tag", pos, end, tag };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const suffix = buffer.slice(pos);
|
|
105
|
+
if (!containsUnquotedGt(suffix) && isPossiblePartialThinkTag(suffix)) {
|
|
106
|
+
return { kind: "partial", pos };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
from = pos + 1;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const ALPHA = /[A-Za-z]/;
|
|
113
|
+
/** Parse a `<think>` / `</think>` (or `thinking`) tag at `start`. Returns the
|
|
114
|
+
* tag kind + end index (exclusive), or null if it's not a think tag. */
|
|
115
|
+
function parseThinkTag(buffer, start) {
|
|
116
|
+
if (buffer[start] !== "<")
|
|
117
|
+
return null;
|
|
118
|
+
let idx = start + 1;
|
|
119
|
+
let isClose = false;
|
|
120
|
+
if (buffer[idx] === "/") {
|
|
121
|
+
idx += 1;
|
|
122
|
+
isClose = true;
|
|
123
|
+
}
|
|
124
|
+
const nameStart = idx;
|
|
125
|
+
while (idx < buffer.length && ALPHA.test(buffer[idx]))
|
|
126
|
+
idx += 1;
|
|
127
|
+
if (idx === nameStart)
|
|
128
|
+
return null;
|
|
129
|
+
const name = buffer.slice(nameStart, idx).toLowerCase();
|
|
130
|
+
if (name !== "think" && name !== "thinking")
|
|
131
|
+
return null;
|
|
132
|
+
if (isClose) {
|
|
133
|
+
while (idx < buffer.length && /\s/.test(buffer[idx]))
|
|
134
|
+
idx += 1;
|
|
135
|
+
if (buffer[idx] === ">")
|
|
136
|
+
return ["close", idx + 1];
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
// Require a real boundary after the name (>, /, or whitespace) so
|
|
140
|
+
// `<thinking-mode>` / `<thinking123>` are NOT treated as think tags.
|
|
141
|
+
const after = buffer[idx];
|
|
142
|
+
const validBoundary = after === ">" || after === "/" || (after !== undefined && /\s/.test(after));
|
|
143
|
+
if (!validBoundary)
|
|
144
|
+
return null;
|
|
145
|
+
let quote = null;
|
|
146
|
+
let lastNonWs = null;
|
|
147
|
+
while (idx < buffer.length) {
|
|
148
|
+
const ch = buffer[idx];
|
|
149
|
+
if (quote !== null) {
|
|
150
|
+
if (ch === quote)
|
|
151
|
+
quote = null;
|
|
152
|
+
}
|
|
153
|
+
else if (ch === '"' || ch === "'") {
|
|
154
|
+
quote = ch;
|
|
155
|
+
lastNonWs = ch;
|
|
156
|
+
}
|
|
157
|
+
else if (ch === ">") {
|
|
158
|
+
return [lastNonWs === "/" ? "self-closing" : "open", idx + 1];
|
|
159
|
+
}
|
|
160
|
+
else if (!/\s/.test(ch)) {
|
|
161
|
+
lastNonWs = ch;
|
|
162
|
+
}
|
|
163
|
+
idx += 1;
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
// A trailing fragment that could be the START of a think tag split across a
|
|
168
|
+
// chunk boundary — buffer it until the `>` arrives. Mirrors goose's two regexes
|
|
169
|
+
// (open allows a trailing `\s.*` or `/`; close allows trailing whitespace).
|
|
170
|
+
const PARTIAL_OPEN = /^<(?:t(?:h(?:i(?:n(?:k(?:i(?:n(?:g)?)?)?)?)?)?)?)(?:\s[\s\S]*|\/)?$/i;
|
|
171
|
+
const PARTIAL_CLOSE = /^<\/(?:t(?:h(?:i(?:n(?:k(?:i(?:n(?:g)?)?)?)?)?)?)?)\s*$/i;
|
|
172
|
+
function isPossiblePartialThinkTag(suffix) {
|
|
173
|
+
if (containsUnquotedGt(suffix))
|
|
174
|
+
return false;
|
|
175
|
+
return PARTIAL_OPEN.test(suffix) || PARTIAL_CLOSE.test(suffix);
|
|
176
|
+
}
|
|
177
|
+
function containsUnquotedGt(text) {
|
|
178
|
+
let quote = null;
|
|
179
|
+
for (const ch of text) {
|
|
180
|
+
if (quote !== null) {
|
|
181
|
+
if (ch === quote)
|
|
182
|
+
quote = null;
|
|
183
|
+
}
|
|
184
|
+
else if (ch === '"' || ch === "'") {
|
|
185
|
+
quote = ch;
|
|
186
|
+
}
|
|
187
|
+
else if (ch === ">") {
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=think-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"think-filter.js","sourceRoot":"","sources":["../../src/ai/think-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Effort, ModelDescriptor, ModelThinkingLevel } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* (7.10 §3.4) Reasoning/thinking effort — the unified Effort ladder mapped
|
|
4
|
+
* per-model to each provider's native encoding, plus the thinking-block replay
|
|
5
|
+
* helper for multi-turn signature continuity. Pure functions ported from pi
|
|
6
|
+
* (`models.ts` clamp) and oh-my-pi (`model-thinking.ts` adaptive effort).
|
|
7
|
+
*/
|
|
8
|
+
/** The ordered ladder, lowest→highest. `off` = no thinking. */
|
|
9
|
+
export declare const THINKING_LEVELS: ModelThinkingLevel[];
|
|
10
|
+
/**
|
|
11
|
+
* The levels a model actually supports (pi `models.ts:50`). A non-reasoning model
|
|
12
|
+
* supports only `off`. `xhigh` is only offered when the catalog explicitly maps
|
|
13
|
+
* it (it's the rare top tier); a `null` in `thinkingLevelMap` marks a level as
|
|
14
|
+
* explicitly unsupported.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getSupportedThinkingLevels(model: ModelDescriptor): ModelThinkingLevel[];
|
|
17
|
+
/**
|
|
18
|
+
* Clamp a requested level to the nearest supported one (pi `models.ts:61`):
|
|
19
|
+
* walk UP from the request first (prefer giving MORE thinking than asked when the
|
|
20
|
+
* exact level is unavailable), then DOWN, then fall back to the lowest supported.
|
|
21
|
+
*/
|
|
22
|
+
export declare function clampThinkingLevel(model: ModelDescriptor, level: ModelThinkingLevel): ModelThinkingLevel;
|
|
23
|
+
/**
|
|
24
|
+
* True for Anthropic models that expose the real 5-tier adaptive thinking scale
|
|
25
|
+
* (Opus 4.7+ on the Messages API). Parses the model id `claude-opus-4-7` →
|
|
26
|
+
* family `opus`, version `4.7`. oh-my-pi `model-thinking.ts:360`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function anthropicHasRealXHighEffort(modelId: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Map our Effort to Anthropic's adaptive-effort enum (oh-my-pi
|
|
31
|
+
* `model-thinking.ts:321`). On Opus 4.7+ the user-facing efforts shift UP one
|
|
32
|
+
* notch so the top reaches the genuine `max` and `high` lands on Anthropic's
|
|
33
|
+
* recommended `xhigh` coding default; older adaptive models (Opus 4.6 / Bedrock)
|
|
34
|
+
* expose only four tiers (no real `xhigh`, where `XHigh` aliases `max`).
|
|
35
|
+
* Used by the W6 native anthropic client (the adaptive API).
|
|
36
|
+
*/
|
|
37
|
+
export declare function mapEffortToAnthropicAdaptiveEffort(modelId: string, effort: Effort): "low" | "medium" | "high" | "xhigh" | "max";
|
|
38
|
+
/**
|
|
39
|
+
* Effort → Anthropic extended-thinking `budget_tokens` (the older budget API the
|
|
40
|
+
* AI-SDK v4 anthropic provider takes via `providerOptions.anthropic.thinking`).
|
|
41
|
+
* The W6 native client prefers {@link mapEffortToAnthropicAdaptiveEffort}; this
|
|
42
|
+
* is the AI-SDK fallback path. Anthropic's floor is 1024.
|
|
43
|
+
*/
|
|
44
|
+
export declare function effortToThinkingBudget(effort: Effort): number;
|
|
45
|
+
/** Effort → OpenAI `reasoning_effort` (Responses + many openai-completions
|
|
46
|
+
* endpoints). OpenAI has no `xhigh`; it collapses to `high`. */
|
|
47
|
+
export declare function mapEffortToOpenAIReasoningEffort(effort: Effort): "minimal" | "low" | "medium" | "high";
|
|
48
|
+
/** Effort → Google Gemini `thinkingConfig.thinkingBudget` tokens. */
|
|
49
|
+
export declare function effortToGoogleThinkingBudget(effort: Effort): number;
|
|
50
|
+
/** A stored assistant thinking block (mirror of `ContentPart` `thinking`). */
|
|
51
|
+
export interface ThinkingBlock {
|
|
52
|
+
text: string;
|
|
53
|
+
signature?: string;
|
|
54
|
+
redacted?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The Anthropic message content block to replay a stored thinking block on the
|
|
58
|
+
* NEXT turn, for reasoning continuity (pi `anthropic.ts:1066`):
|
|
59
|
+
* - redacted → `redacted_thinking{data: signature}`;
|
|
60
|
+
* - real signature → `thinking{thinking, signature}`;
|
|
61
|
+
* - empty/missing signature (aborted stream) → `thinking{…, signature:""}` only
|
|
62
|
+
* when the model allows it ({@link allowEmptySignature}); otherwise the block
|
|
63
|
+
* is replayed as plain `text` so the API doesn't reject the unsigned block.
|
|
64
|
+
* Returns `null` to mean "drop this block" (never happens today; reserved).
|
|
65
|
+
*/
|
|
66
|
+
export declare function thinkingBlockToProvider(block: ThinkingBlock, allowEmptySignature: boolean): {
|
|
67
|
+
type: "redacted_thinking";
|
|
68
|
+
data: string;
|
|
69
|
+
} | {
|
|
70
|
+
type: "thinking";
|
|
71
|
+
thinking: string;
|
|
72
|
+
signature: string;
|
|
73
|
+
} | {
|
|
74
|
+
type: "text";
|
|
75
|
+
text: string;
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=thinking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking.d.ts","sourceRoot":"","sources":["../../src/ai/thinking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9E;;;;;GAKG;AAEH,+DAA+D;AAC/D,eAAO,MAAM,eAAe,EAAE,kBAAkB,EAAyD,CAAC;AAE1G;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,GAAG,kBAAkB,EAAE,CAQvF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,kBAAkB,GAAG,kBAAkB,CAYxG;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQpE;AAED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CA0B7C;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAa7D;AAED;iEACiE;AACjE,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAYtG;AAED,qEAAqE;AACrE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAanE;AAED,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,EACpB,mBAAmB,EAAE,OAAO,GAE1B;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAcjC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (7.10 §3.4) Reasoning/thinking effort — the unified Effort ladder mapped
|
|
3
|
+
* per-model to each provider's native encoding, plus the thinking-block replay
|
|
4
|
+
* helper for multi-turn signature continuity. Pure functions ported from pi
|
|
5
|
+
* (`models.ts` clamp) and oh-my-pi (`model-thinking.ts` adaptive effort).
|
|
6
|
+
*/
|
|
7
|
+
/** The ordered ladder, lowest→highest. `off` = no thinking. */
|
|
8
|
+
export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
9
|
+
/**
|
|
10
|
+
* The levels a model actually supports (pi `models.ts:50`). A non-reasoning model
|
|
11
|
+
* supports only `off`. `xhigh` is only offered when the catalog explicitly maps
|
|
12
|
+
* it (it's the rare top tier); a `null` in `thinkingLevelMap` marks a level as
|
|
13
|
+
* explicitly unsupported.
|
|
14
|
+
*/
|
|
15
|
+
export function getSupportedThinkingLevels(model) {
|
|
16
|
+
if (!model.reasoning)
|
|
17
|
+
return ["off"];
|
|
18
|
+
return THINKING_LEVELS.filter((level) => {
|
|
19
|
+
const mapped = model.thinkingLevelMap?.[level];
|
|
20
|
+
if (mapped === null)
|
|
21
|
+
return false;
|
|
22
|
+
if (level === "xhigh")
|
|
23
|
+
return mapped !== undefined;
|
|
24
|
+
return true;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clamp a requested level to the nearest supported one (pi `models.ts:61`):
|
|
29
|
+
* walk UP from the request first (prefer giving MORE thinking than asked when the
|
|
30
|
+
* exact level is unavailable), then DOWN, then fall back to the lowest supported.
|
|
31
|
+
*/
|
|
32
|
+
export function clampThinkingLevel(model, level) {
|
|
33
|
+
const available = getSupportedThinkingLevels(model);
|
|
34
|
+
if (available.includes(level))
|
|
35
|
+
return level;
|
|
36
|
+
const requested = THINKING_LEVELS.indexOf(level);
|
|
37
|
+
if (requested === -1)
|
|
38
|
+
return available[0] ?? "off";
|
|
39
|
+
for (let i = requested; i < THINKING_LEVELS.length; i++) {
|
|
40
|
+
if (available.includes(THINKING_LEVELS[i]))
|
|
41
|
+
return THINKING_LEVELS[i];
|
|
42
|
+
}
|
|
43
|
+
for (let i = requested - 1; i >= 0; i--) {
|
|
44
|
+
if (available.includes(THINKING_LEVELS[i]))
|
|
45
|
+
return THINKING_LEVELS[i];
|
|
46
|
+
}
|
|
47
|
+
return available[0] ?? "off";
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* True for Anthropic models that expose the real 5-tier adaptive thinking scale
|
|
51
|
+
* (Opus 4.7+ on the Messages API). Parses the model id `claude-opus-4-7` →
|
|
52
|
+
* family `opus`, version `4.7`. oh-my-pi `model-thinking.ts:360`.
|
|
53
|
+
*/
|
|
54
|
+
export function anthropicHasRealXHighEffort(modelId) {
|
|
55
|
+
const m = /claude-(opus|sonnet|haiku)-(\d+)-(\d+)/.exec(modelId);
|
|
56
|
+
if (!m)
|
|
57
|
+
return false;
|
|
58
|
+
const family = m[1];
|
|
59
|
+
const major = Number(m[2]);
|
|
60
|
+
const minor = Number(m[3]);
|
|
61
|
+
// Only Opus 4.7+ has the genuine five-tier (low/medium/high/xhigh/max) scale.
|
|
62
|
+
return family === "opus" && (major > 4 || (major === 4 && minor >= 7));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Map our Effort to Anthropic's adaptive-effort enum (oh-my-pi
|
|
66
|
+
* `model-thinking.ts:321`). On Opus 4.7+ the user-facing efforts shift UP one
|
|
67
|
+
* notch so the top reaches the genuine `max` and `high` lands on Anthropic's
|
|
68
|
+
* recommended `xhigh` coding default; older adaptive models (Opus 4.6 / Bedrock)
|
|
69
|
+
* expose only four tiers (no real `xhigh`, where `XHigh` aliases `max`).
|
|
70
|
+
* Used by the W6 native anthropic client (the adaptive API).
|
|
71
|
+
*/
|
|
72
|
+
export function mapEffortToAnthropicAdaptiveEffort(modelId, effort) {
|
|
73
|
+
if (anthropicHasRealXHighEffort(modelId)) {
|
|
74
|
+
switch (effort) {
|
|
75
|
+
case "minimal":
|
|
76
|
+
return "low";
|
|
77
|
+
case "low":
|
|
78
|
+
return "medium";
|
|
79
|
+
case "medium":
|
|
80
|
+
return "high";
|
|
81
|
+
case "high":
|
|
82
|
+
return "xhigh";
|
|
83
|
+
case "xhigh":
|
|
84
|
+
return "max";
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
switch (effort) {
|
|
88
|
+
case "minimal":
|
|
89
|
+
case "low":
|
|
90
|
+
return "low";
|
|
91
|
+
case "medium":
|
|
92
|
+
return "medium";
|
|
93
|
+
case "high":
|
|
94
|
+
return "high";
|
|
95
|
+
case "xhigh":
|
|
96
|
+
return "max";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Effort → Anthropic extended-thinking `budget_tokens` (the older budget API the
|
|
101
|
+
* AI-SDK v4 anthropic provider takes via `providerOptions.anthropic.thinking`).
|
|
102
|
+
* The W6 native client prefers {@link mapEffortToAnthropicAdaptiveEffort}; this
|
|
103
|
+
* is the AI-SDK fallback path. Anthropic's floor is 1024.
|
|
104
|
+
*/
|
|
105
|
+
export function effortToThinkingBudget(effort) {
|
|
106
|
+
switch (effort) {
|
|
107
|
+
case "minimal":
|
|
108
|
+
return 1024;
|
|
109
|
+
case "low":
|
|
110
|
+
return 4096;
|
|
111
|
+
case "medium":
|
|
112
|
+
return 8192;
|
|
113
|
+
case "high":
|
|
114
|
+
return 16384;
|
|
115
|
+
case "xhigh":
|
|
116
|
+
return 32768;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Effort → OpenAI `reasoning_effort` (Responses + many openai-completions
|
|
120
|
+
* endpoints). OpenAI has no `xhigh`; it collapses to `high`. */
|
|
121
|
+
export function mapEffortToOpenAIReasoningEffort(effort) {
|
|
122
|
+
switch (effort) {
|
|
123
|
+
case "minimal":
|
|
124
|
+
return "minimal";
|
|
125
|
+
case "low":
|
|
126
|
+
return "low";
|
|
127
|
+
case "medium":
|
|
128
|
+
return "medium";
|
|
129
|
+
case "high":
|
|
130
|
+
case "xhigh":
|
|
131
|
+
return "high";
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Effort → Google Gemini `thinkingConfig.thinkingBudget` tokens. */
|
|
135
|
+
export function effortToGoogleThinkingBudget(effort) {
|
|
136
|
+
switch (effort) {
|
|
137
|
+
case "minimal":
|
|
138
|
+
return 512;
|
|
139
|
+
case "low":
|
|
140
|
+
return 2048;
|
|
141
|
+
case "medium":
|
|
142
|
+
return 8192;
|
|
143
|
+
case "high":
|
|
144
|
+
return 16384;
|
|
145
|
+
case "xhigh":
|
|
146
|
+
return 24576;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The Anthropic message content block to replay a stored thinking block on the
|
|
151
|
+
* NEXT turn, for reasoning continuity (pi `anthropic.ts:1066`):
|
|
152
|
+
* - redacted → `redacted_thinking{data: signature}`;
|
|
153
|
+
* - real signature → `thinking{thinking, signature}`;
|
|
154
|
+
* - empty/missing signature (aborted stream) → `thinking{…, signature:""}` only
|
|
155
|
+
* when the model allows it ({@link allowEmptySignature}); otherwise the block
|
|
156
|
+
* is replayed as plain `text` so the API doesn't reject the unsigned block.
|
|
157
|
+
* Returns `null` to mean "drop this block" (never happens today; reserved).
|
|
158
|
+
*/
|
|
159
|
+
export function thinkingBlockToProvider(block, allowEmptySignature) {
|
|
160
|
+
if (block.redacted) {
|
|
161
|
+
return { type: "redacted_thinking", data: block.signature ?? "" };
|
|
162
|
+
}
|
|
163
|
+
const hasSig = !!block.signature && block.signature.trim().length > 0;
|
|
164
|
+
if (hasSig) {
|
|
165
|
+
return { type: "thinking", thinking: block.text, signature: block.signature };
|
|
166
|
+
}
|
|
167
|
+
// No usable signature: keep the block only if the model accepts empty
|
|
168
|
+
// signatures; otherwise downgrade to text so the request stays valid.
|
|
169
|
+
if (allowEmptySignature) {
|
|
170
|
+
return { type: "thinking", thinking: block.text, signature: "" };
|
|
171
|
+
}
|
|
172
|
+
return { type: "text", text: block.text };
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=thinking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../src/ai/thinking.ts"],"names":[],"mappings":"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"}
|