@code-yeongyu/senpi-ai 2026.9.3 → 2026.9.4-3
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/api/anthropic-messages.d.ts +1 -1
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +130 -15
- package/dist/api/anthropic-messages.js.map +1 -1
- package/dist/api/context-room.d.ts +20 -0
- package/dist/api/context-room.d.ts.map +1 -0
- package/dist/api/context-room.js +40 -0
- package/dist/api/context-room.js.map +1 -0
- package/dist/api/cursor-agent.js +4 -4
- package/dist/api/cursor-agent.js.map +1 -1
- package/dist/api/mistral-conversations.js +1 -1
- package/dist/api/mistral-conversations.js.map +1 -1
- package/dist/api/openai-completions.d.ts.map +1 -1
- package/dist/api/openai-completions.js +16 -1
- package/dist/api/openai-completions.js.map +1 -1
- package/dist/api/openai-responses.d.ts.map +1 -1
- package/dist/api/openai-responses.js +2 -1
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/pi-messages.d.ts +2 -0
- package/dist/api/pi-messages.d.ts.map +1 -1
- package/dist/api/pi-messages.js +6 -0
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/simple-options.d.ts +1 -3
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +2 -16
- package/dist/api/simple-options.js.map +1 -1
- package/dist/api/warm-prompt-cache.js +1 -1
- package/dist/api/warm-prompt-cache.js.map +1 -1
- package/dist/auth/pool/slots.d.ts +16 -3
- package/dist/auth/pool/slots.d.ts.map +1 -1
- package/dist/auth/pool/slots.js +40 -6
- package/dist/auth/pool/slots.js.map +1 -1
- package/dist/compat/extension-oauth-types.d.ts +8 -0
- package/dist/compat/extension-oauth-types.d.ts.map +1 -1
- package/dist/compat/extension-oauth-types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +3 -2
- package/dist/models.js.map +1 -1
- package/dist/openai-responses-compat.d.ts +2 -0
- package/dist/openai-responses-compat.d.ts.map +1 -1
- package/dist/openai-responses-compat.js.map +1 -1
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/anthropic.json +1 -1
- package/dist/providers/data/azure-openai-responses.json +1 -1
- package/dist/providers/data/baseten.json +1 -1
- package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/dist/providers/data/fireworks.json +1 -1
- package/dist/providers/data/github-copilot.json +1 -1
- package/dist/providers/data/huggingface.json +1 -1
- package/dist/providers/data/nvidia.json +1 -1
- package/dist/providers/data/openai-codex.json +1 -1
- package/dist/providers/data/openai.json +1 -1
- package/dist/providers/data/opencode-go.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.d.ts.map +1 -1
- package/dist/providers/openrouter.js +8 -1
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/types.d.ts +14 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/drop-failed-assistant-turns.d.ts +23 -0
- package/dist/utils/drop-failed-assistant-turns.d.ts.map +1 -0
- package/dist/utils/drop-failed-assistant-turns.js +58 -0
- package/dist/utils/drop-failed-assistant-turns.js.map +1 -0
- package/dist/utils/node-http-proxy.d.ts.map +1 -1
- package/dist/utils/node-http-proxy.js +53 -12
- package/dist/utils/node-http-proxy.js.map +1 -1
- package/dist/utils/overflow.d.ts.map +1 -1
- package/dist/utils/overflow.js +2 -0
- package/dist/utils/overflow.js.map +1 -1
- package/dist/utils/prompt-cache-ttl.d.ts +4 -2
- package/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
- package/dist/utils/prompt-cache-ttl.js +3 -0
- package/dist/utils/prompt-cache-ttl.js.map +1 -1
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +3 -0
- package/dist/utils/retry.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Api, Context, Model } from "../types.ts";
|
|
2
|
+
export declare const CONTEXT_SAFETY_TOKENS = 4096;
|
|
3
|
+
/** Tokens always left for the answer when a thinking budget shares the response ceiling. */
|
|
4
|
+
export declare const MIN_ANSWER_TOKENS = 1024;
|
|
5
|
+
/** Windows too small to hold the safety margin plus one answer keep the legacy one-token floor. */
|
|
6
|
+
export declare const CONTEXT_GUARD_MIN_WINDOW: number;
|
|
7
|
+
export declare class ContextWindowExhaustedError extends Error {
|
|
8
|
+
readonly estimatedTokens: number;
|
|
9
|
+
readonly contextWindow: number;
|
|
10
|
+
constructor(estimatedTokens: number, contextWindow: number);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Fit the requested output budget into the room the context leaves in the model window.
|
|
14
|
+
* For windows of at least {@link CONTEXT_GUARD_MIN_WINDOW} tokens this throws
|
|
15
|
+
* {@link ContextWindowExhaustedError} instead of shrinking the budget below
|
|
16
|
+
* {@link MIN_ANSWER_TOKENS}: such a request can only return a truncated tool call or an
|
|
17
|
+
* empty "length" stop while still billing the whole prompt.
|
|
18
|
+
*/
|
|
19
|
+
export declare function clampMaxTokensToContext(model: Model<Api>, context: Context, maxTokens: number): number;
|
|
20
|
+
//# sourceMappingURL=context-room.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-room.d.ts","sourceRoot":"","sources":["../../src/api/context-room.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGvD,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,mGAAmG;AACnG,eAAO,MAAM,wBAAwB,QAA4C,CAAC;AAElF,qBAAa,2BAA4B,SAAQ,KAAK;IACrD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAEnB,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;CAU1D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CActG"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { estimateContextTokens } from "../utils/estimate.js";
|
|
2
|
+
export const CONTEXT_SAFETY_TOKENS = 4096;
|
|
3
|
+
/** Tokens always left for the answer when a thinking budget shares the response ceiling. */
|
|
4
|
+
export const MIN_ANSWER_TOKENS = 1024;
|
|
5
|
+
const MIN_MAX_TOKENS = 1;
|
|
6
|
+
/** Windows too small to hold the safety margin plus one answer keep the legacy one-token floor. */
|
|
7
|
+
export const CONTEXT_GUARD_MIN_WINDOW = CONTEXT_SAFETY_TOKENS + MIN_ANSWER_TOKENS;
|
|
8
|
+
export class ContextWindowExhaustedError extends Error {
|
|
9
|
+
constructor(estimatedTokens, contextWindow) {
|
|
10
|
+
super(`Context window exhausted: the conversation is estimated at ${estimatedTokens} of ${contextWindow} tokens, ` +
|
|
11
|
+
`leaving fewer than ${MIN_ANSWER_TOKENS} tokens for a response. ` +
|
|
12
|
+
"Compact the conversation, enable auto-compaction, or start a new session before retrying.");
|
|
13
|
+
this.name = "ContextWindowExhaustedError";
|
|
14
|
+
this.estimatedTokens = estimatedTokens;
|
|
15
|
+
this.contextWindow = contextWindow;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Fit the requested output budget into the room the context leaves in the model window.
|
|
20
|
+
* For windows of at least {@link CONTEXT_GUARD_MIN_WINDOW} tokens this throws
|
|
21
|
+
* {@link ContextWindowExhaustedError} instead of shrinking the budget below
|
|
22
|
+
* {@link MIN_ANSWER_TOKENS}: such a request can only return a truncated tool call or an
|
|
23
|
+
* empty "length" stop while still billing the whole prompt.
|
|
24
|
+
*/
|
|
25
|
+
export function clampMaxTokensToContext(model, context, maxTokens) {
|
|
26
|
+
if (model.contextWindow <= 0) {
|
|
27
|
+
return Number.isFinite(maxTokens) && maxTokens > 0
|
|
28
|
+
? Math.max(MIN_MAX_TOKENS, Math.floor(maxTokens))
|
|
29
|
+
: MIN_MAX_TOKENS;
|
|
30
|
+
}
|
|
31
|
+
const estimatedTokens = estimateContextTokens(context).tokens;
|
|
32
|
+
const available = model.contextWindow - estimatedTokens - CONTEXT_SAFETY_TOKENS;
|
|
33
|
+
if (model.contextWindow >= CONTEXT_GUARD_MIN_WINDOW && available < MIN_ANSWER_TOKENS) {
|
|
34
|
+
throw new ContextWindowExhaustedError(estimatedTokens, model.contextWindow);
|
|
35
|
+
}
|
|
36
|
+
const safeAvailable = Math.max(MIN_MAX_TOKENS, available);
|
|
37
|
+
const requested = Number.isFinite(maxTokens) && maxTokens > 0 ? Math.floor(maxTokens) : safeAvailable;
|
|
38
|
+
return Math.min(requested, safeAvailable);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=context-room.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-room.js","sourceRoot":"","sources":["../../src/api/context-room.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,mGAAmG;AACnG,MAAM,CAAC,MAAM,wBAAwB,GAAG,qBAAqB,GAAG,iBAAiB,CAAC;AAElF,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAIrD,YAAY,eAAuB,EAAE,aAAqB;QACzD,KAAK,CACJ,8DAA8D,eAAe,OAAO,aAAa,WAAW;YAC3G,sBAAsB,iBAAiB,0BAA0B;YACjE,2FAA2F,CAC5F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACpC,CAAC;CACD;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAiB,EAAE,OAAgB,EAAE,SAAiB;IAC7F,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;YACjD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACjD,CAAC,CAAC,cAAc,CAAC;IACnB,CAAC;IACD,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,GAAG,eAAe,GAAG,qBAAqB,CAAC;IAChF,IAAI,KAAK,CAAC,aAAa,IAAI,wBAAwB,IAAI,SAAS,GAAG,iBAAiB,EAAE,CAAC;QACtF,MAAM,IAAI,2BAA2B,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACtG,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["import type { Api, Context, Model } from \"../types.ts\";\nimport { estimateContextTokens } from \"../utils/estimate.ts\";\n\nexport const CONTEXT_SAFETY_TOKENS = 4096;\n/** Tokens always left for the answer when a thinking budget shares the response ceiling. */\nexport const MIN_ANSWER_TOKENS = 1024;\nconst MIN_MAX_TOKENS = 1;\n/** Windows too small to hold the safety margin plus one answer keep the legacy one-token floor. */\nexport const CONTEXT_GUARD_MIN_WINDOW = CONTEXT_SAFETY_TOKENS + MIN_ANSWER_TOKENS;\n\nexport class ContextWindowExhaustedError extends Error {\n\treadonly estimatedTokens: number;\n\treadonly contextWindow: number;\n\n\tconstructor(estimatedTokens: number, contextWindow: number) {\n\t\tsuper(\n\t\t\t`Context window exhausted: the conversation is estimated at ${estimatedTokens} of ${contextWindow} tokens, ` +\n\t\t\t\t`leaving fewer than ${MIN_ANSWER_TOKENS} tokens for a response. ` +\n\t\t\t\t\"Compact the conversation, enable auto-compaction, or start a new session before retrying.\",\n\t\t);\n\t\tthis.name = \"ContextWindowExhaustedError\";\n\t\tthis.estimatedTokens = estimatedTokens;\n\t\tthis.contextWindow = contextWindow;\n\t}\n}\n\n/**\n * Fit the requested output budget into the room the context leaves in the model window.\n * For windows of at least {@link CONTEXT_GUARD_MIN_WINDOW} tokens this throws\n * {@link ContextWindowExhaustedError} instead of shrinking the budget below\n * {@link MIN_ANSWER_TOKENS}: such a request can only return a truncated tool call or an\n * empty \"length\" stop while still billing the whole prompt.\n */\nexport function clampMaxTokensToContext(model: Model<Api>, context: Context, maxTokens: number): number {\n\tif (model.contextWindow <= 0) {\n\t\treturn Number.isFinite(maxTokens) && maxTokens > 0\n\t\t\t? Math.max(MIN_MAX_TOKENS, Math.floor(maxTokens))\n\t\t\t: MIN_MAX_TOKENS;\n\t}\n\tconst estimatedTokens = estimateContextTokens(context).tokens;\n\tconst available = model.contextWindow - estimatedTokens - CONTEXT_SAFETY_TOKENS;\n\tif (model.contextWindow >= CONTEXT_GUARD_MIN_WINDOW && available < MIN_ANSWER_TOKENS) {\n\t\tthrow new ContextWindowExhaustedError(estimatedTokens, model.contextWindow);\n\t}\n\tconst safeAvailable = Math.max(MIN_MAX_TOKENS, available);\n\tconst requested = Number.isFinite(maxTokens) && maxTokens > 0 ? Math.floor(maxTokens) : safeAvailable;\n\treturn Math.min(requested, safeAvailable);\n}\n"]}
|
package/dist/api/cursor-agent.js
CHANGED
|
@@ -532,10 +532,6 @@ export const stream = (model, context, options) => {
|
|
|
532
532
|
if (h2Settled)
|
|
533
533
|
return;
|
|
534
534
|
h2Settled = true;
|
|
535
|
-
if (streamHealthTimer) {
|
|
536
|
-
clearTimeout(streamHealthTimer);
|
|
537
|
-
streamHealthTimer = null;
|
|
538
|
-
}
|
|
539
535
|
if (error !== undefined) {
|
|
540
536
|
rejectH2(error);
|
|
541
537
|
return;
|
|
@@ -958,6 +954,10 @@ export const stream = (model, context, options) => {
|
|
|
958
954
|
clearInterval(heartbeatTimer);
|
|
959
955
|
heartbeatTimer = null;
|
|
960
956
|
}
|
|
957
|
+
if (streamHealthTimer) {
|
|
958
|
+
clearTimeout(streamHealthTimer);
|
|
959
|
+
streamHealthTimer = null;
|
|
960
|
+
}
|
|
961
961
|
h2Request?.close();
|
|
962
962
|
h2Client?.close();
|
|
963
963
|
h2Request = null;
|