@code-yeongyu/senpi-ai 2026.8.18 → 2026.8.19
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 +5 -3
- package/dist/api/anthropic-messages.d.ts +7 -1
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +21 -4
- package/dist/api/anthropic-messages.js.map +1 -1
- package/dist/api/azure-openai-responses.d.ts +2 -0
- package/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/dist/api/azure-openai-responses.js +7 -1
- package/dist/api/azure-openai-responses.js.map +1 -1
- package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/dist/api/bedrock-converse-stream.js +39 -2
- package/dist/api/bedrock-converse-stream.js.map +1 -1
- package/dist/api/cursor-agent/gen/agent_pb.d.ts +22 -1
- package/dist/api/cursor-agent/gen/agent_pb.d.ts.map +1 -1
- package/dist/api/cursor-agent/gen/agent_pb.js +1 -1
- package/dist/api/cursor-agent/gen/agent_pb.js.map +1 -1
- package/dist/api/cursor-agent/reasoning-params.d.ts +20 -0
- package/dist/api/cursor-agent/reasoning-params.d.ts.map +1 -0
- package/dist/api/cursor-agent/reasoning-params.js +26 -0
- package/dist/api/cursor-agent/reasoning-params.js.map +1 -0
- package/dist/api/cursor-agent/types.d.ts +7 -1
- package/dist/api/cursor-agent/types.d.ts.map +1 -1
- package/dist/api/cursor-agent/types.js.map +1 -1
- package/dist/api/cursor-agent.d.ts +5 -3
- package/dist/api/cursor-agent.d.ts.map +1 -1
- package/dist/api/cursor-agent.js +82 -12
- package/dist/api/cursor-agent.js.map +1 -1
- package/dist/api/google-generative-ai.d.ts +2 -2
- package/dist/api/google-generative-ai.d.ts.map +1 -1
- package/dist/api/google-generative-ai.js +14 -11
- package/dist/api/google-generative-ai.js.map +1 -1
- package/dist/api/google-shared.d.ts +5 -2
- package/dist/api/google-shared.d.ts.map +1 -1
- package/dist/api/google-shared.js +16 -0
- package/dist/api/google-shared.js.map +1 -1
- package/dist/api/google-vertex.d.ts +2 -2
- package/dist/api/google-vertex.d.ts.map +1 -1
- package/dist/api/google-vertex.js +13 -10
- package/dist/api/google-vertex.js.map +1 -1
- package/dist/api/mistral-conversations.d.ts.map +1 -1
- package/dist/api/mistral-conversations.js +4 -1
- package/dist/api/mistral-conversations.js.map +1 -1
- package/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/dist/api/openai-codex-responses.js +4 -1
- package/dist/api/openai-codex-responses.js.map +1 -1
- package/dist/api/openai-completions.d.ts +1 -1
- package/dist/api/openai-completions.d.ts.map +1 -1
- package/dist/api/openai-completions.js +45 -29
- 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 +8 -1
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/pi-messages.js +1 -1
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/simple-options.d.ts +4 -0
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +18 -9
- package/dist/api/simple-options.js.map +1 -1
- package/dist/auth/oauth/device-code.d.ts +1 -0
- package/dist/auth/oauth/device-code.d.ts.map +1 -1
- package/dist/auth/oauth/device-code.js +1 -1
- package/dist/auth/oauth/device-code.js.map +1 -1
- package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
- package/dist/auth/oauth/github-copilot.js +22 -9
- package/dist/auth/oauth/github-copilot.js.map +1 -1
- package/dist/cursor/catalog-grouping.d.ts +25 -0
- package/dist/cursor/catalog-grouping.d.ts.map +1 -0
- package/dist/cursor/catalog-grouping.js +134 -0
- package/dist/cursor/catalog-grouping.js.map +1 -0
- package/dist/cursor/cursor-variant-aliases.json +1893 -0
- package/dist/cursor/model-capabilities.d.ts +47 -0
- package/dist/cursor/model-capabilities.d.ts.map +1 -0
- package/dist/cursor/model-capabilities.js +208 -0
- package/dist/cursor/model-capabilities.js.map +1 -0
- package/dist/cursor/selection-descriptor.d.ts +21 -0
- package/dist/cursor/selection-descriptor.d.ts.map +1 -0
- package/dist/cursor/selection-descriptor.js +83 -0
- package/dist/cursor/selection-descriptor.js.map +1 -0
- package/dist/cursor/store-migration.d.ts +8 -0
- package/dist/cursor/store-migration.d.ts.map +1 -0
- package/dist/cursor/store-migration.js +76 -0
- package/dist/cursor/store-migration.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +13 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js.map +1 -1
- package/dist/models.d.ts +6 -0
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +9 -1
- package/dist/models.js.map +1 -1
- package/dist/providers/cursor.d.ts.map +1 -1
- package/dist/providers/cursor.js +40 -11
- package/dist/providers/cursor.js.map +1 -1
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/anthropic.json +1 -1
- package/dist/providers/data/baseten.json +1 -1
- package/dist/providers/data/github-copilot.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/opencode.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/qwen-token-plan-individual.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/data/xai.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
- package/dist/providers/data/xiaomi.json +1 -1
- package/dist/providers/data/zai-coding-cn.json +1 -1
- package/dist/providers/data/zai.json +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers/xai.d.ts.map +1 -1
- package/dist/providers/xai.js +1 -5
- package/dist/providers/xai.js.map +1 -1
- package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts.map +1 -1
- package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js +21 -1
- package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js.map +1 -1
- package/dist/tool-call-middleware/recovery-message-snapshot.d.ts.map +1 -1
- package/dist/tool-call-middleware/recovery-message-snapshot.js +2 -1
- package/dist/tool-call-middleware/recovery-message-snapshot.js.map +1 -1
- package/dist/types.d.ts +45 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/overflow.d.ts.map +1 -1
- package/dist/utils/overflow.js +15 -0
- package/dist/utils/overflow.js.map +1 -1
- package/dist/utils/pi-user-agent.d.ts +2 -0
- package/dist/utils/pi-user-agent.d.ts.map +1 -1
- package/dist/utils/pi-user-agent.js +7 -0
- package/dist/utils/pi-user-agent.js.map +1 -1
- package/dist/utils/prompt-cache-ttl.d.ts +2 -1
- package/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
- package/dist/utils/prompt-cache-ttl.js +2 -0
- package/dist/utils/prompt-cache-ttl.js.map +1 -1
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -801,7 +801,7 @@ Many models support thinking/reasoning capabilities where they can show their in
|
|
|
801
801
|
const model = models.getModel('anthropic', 'claude-sonnet-4-5')!;
|
|
802
802
|
// or models.getModel('openai', 'gpt-5-mini');
|
|
803
803
|
// or models.getModel('google', 'gemini-2.5-flash');
|
|
804
|
-
// or models.getModel('xai', 'grok-4.
|
|
804
|
+
// or models.getModel('xai', 'grok-4.6');
|
|
805
805
|
|
|
806
806
|
// Check if model supports reasoning
|
|
807
807
|
if (model.reasoning) {
|
|
@@ -1191,8 +1191,10 @@ interface OpenAICompletionsCompat {
|
|
|
1191
1191
|
requiresThinkingAsText?: boolean; // Whether thinking blocks must be converted to text (default: false)
|
|
1192
1192
|
requiresReasoningContentOnAssistantMessages?: boolean; // Whether all replayed assistant messages must include empty reasoning_content when reasoning is enabled (default: auto-detected for DeepSeek)
|
|
1193
1193
|
thinkingFormat?: 'openai' | 'openrouter' | 'deepseek' | 'together' | 'baseten' | 'zai' | 'qwen' | 'chat-template' | 'qwen-chat-template' | 'string-thinking' | 'ant-ling'; // Format for reasoning param: 'openai' uses reasoning_effort, 'openrouter' uses reasoning: { effort }, 'deepseek' uses thinking: { type } plus reasoning_effort when supported, 'together' uses reasoning: { enabled } plus reasoning_effort when supported, 'baseten' uses configurable chat_template_args plus reasoning_effort when supported, 'zai' uses thinking: { type }, 'qwen' uses enable_thinking, 'chat-template' uses configurable chat_template_kwargs, 'qwen-chat-template' uses chat_template_kwargs.enable_thinking and preserve_thinking, 'string-thinking' uses top-level thinking, 'ant-ling' uses reasoning: { effort } only for mapped efforts (default: openai)
|
|
1194
|
-
chatTemplateKwargs?: Record<string, string | number | boolean | null | { '$var': 'thinking.enabled' | 'thinking.effort'; omitWhenOff?: boolean }>; // chat_template_kwargs values; use $var for pi-controlled thinking values
|
|
1195
|
-
chatTemplateArgs?: Record<string, string | number | boolean | null | { '$var': 'thinking.enabled' | 'thinking.effort'; omitWhenOff?: boolean }>; // chat_template_args values for thinkingFormat: 'baseten'; use $var for pi-controlled thinking values
|
|
1194
|
+
chatTemplateKwargs?: Record<string, string | number | boolean | null | { '$var': 'thinking.enabled' | 'thinking.effort' | 'thinking.budget'; omitWhenOff?: boolean }>; // chat_template_kwargs values; use $var for pi-controlled thinking values
|
|
1195
|
+
chatTemplateArgs?: Record<string, string | number | boolean | null | { '$var': 'thinking.enabled' | 'thinking.effort' | 'thinking.budget'; omitWhenOff?: boolean }>; // chat_template_args values for thinkingFormat: 'baseten'; use $var for pi-controlled thinking values
|
|
1196
|
+
thinkingTokenBudgetField?: 'thinking_token_budget' | 'thinking_budget' | 'thinking_budget_tokens'; // Top-level field that caps reasoning tokens from thinkingBudgets (vLLM / Qwen / llama.cpp). Off by default.
|
|
1197
|
+
supportsThinkingTokenBudget?: boolean; // Alias for thinkingTokenBudgetField: 'thinking_token_budget' (vLLM). Prefer thinkingTokenBudgetField. Default: false.
|
|
1196
1198
|
cacheControlFormat?: 'anthropic'; // Anthropic-style cache_control on system prompt, last tool, and last user/assistant text content
|
|
1197
1199
|
openRouterRouting?: OpenRouterRouting; // OpenRouter routing preferences (default: {})
|
|
1198
1200
|
vercelGatewayRouting?: VercelGatewayRouting; // Vercel AI Gateway routing preferences (default: {})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
2
|
import type { MessageCreateParamsNonStreaming } from "@anthropic-ai/sdk/resources/messages.js";
|
|
3
|
-
import type { Context, Model, SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.ts";
|
|
3
|
+
import type { AnthropicRefusalFallback, Context, Model, SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.ts";
|
|
4
4
|
export { getAnthropicCompat } from "../utils/prompt-cache-ttl.ts";
|
|
5
5
|
export type AnthropicEffort = "low" | "medium" | "high" | "xhigh" | "max";
|
|
6
6
|
export type AnthropicThinkingDisplay = "summarized" | "omitted";
|
|
@@ -52,6 +52,12 @@ export interface AnthropicOptions extends StreamOptions {
|
|
|
52
52
|
* Default: true.
|
|
53
53
|
*/
|
|
54
54
|
interleavedThinking?: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Anthropic refusal fallback. When set, the request includes the server-side
|
|
57
|
+
* fallback beta and Anthropic retries eligible refusals on the configured
|
|
58
|
+
* fallback target before returning a final response.
|
|
59
|
+
*/
|
|
60
|
+
refusalFallbacks?: AnthropicRefusalFallback;
|
|
55
61
|
/**
|
|
56
62
|
* Anthropic tool choice behavior. String values map to Anthropic's built-in
|
|
57
63
|
* choices; `{ type: "tool", name }` forces a specific tool.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../src/api/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAGX,+BAA+B,EAK/B,MAAM,yCAAyC,CAAC;AAEjD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../src/api/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAGX,+BAA+B,EAK/B,MAAM,yCAAyC,CAAC;AAEjD,OAAO,KAAK,EACX,wBAAwB,EAKxB,OAAO,EAGP,KAAK,EAGL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAOb,MAAM,aAAa,CAAC;AAmCrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA6JlE,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE1E,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,SAAS,CAAC;AAyEhE,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACtD;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;CACnB;AA+1BD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CA6ZzE,CAAC;AA0FF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CAkDlF,CAAC;AA6IF,wBAAgB,mCAAmC,CAClD,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACxB,+BAA+B,CAkBjC"}
|
|
@@ -175,6 +175,7 @@ const UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS = [
|
|
|
175
175
|
"opus-4-8",
|
|
176
176
|
"opus-4.8",
|
|
177
177
|
];
|
|
178
|
+
const SERVER_SIDE_FALLBACK_BETA = "server-side-fallback-2026-07-01";
|
|
178
179
|
// A provider can reject its own empty signatures. Learn that capability for one
|
|
179
180
|
// conversation without changing the shared model definition used by other sessions.
|
|
180
181
|
const unsignedThinkingTextReplayFallbacks = new Set();
|
|
@@ -941,7 +942,7 @@ export const stream = (model, context, options) => {
|
|
|
941
942
|
}
|
|
942
943
|
const cacheRetention = resolveCacheRetention(options?.cacheRetention ?? model.cacheRetention, options?.env, "short");
|
|
943
944
|
const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
|
|
944
|
-
const created = createClient(model, apiKey, options?.interleavedThinking ?? true, shouldUseFineGrainedToolStreamingBeta(model, context), optionsHeaders, options?.fetch, copilotDynamicHeaders, cacheSessionId, options?.env);
|
|
945
|
+
const created = createClient(model, apiKey, options?.interleavedThinking ?? true, shouldUseFineGrainedToolStreamingBeta(model, context), options?.refusalFallbacks !== undefined, optionsHeaders, options?.fetch, copilotDynamicHeaders, cacheSessionId, options?.env);
|
|
945
946
|
client = created.client;
|
|
946
947
|
isOAuth = created.isOAuthToken;
|
|
947
948
|
}
|
|
@@ -1005,6 +1006,7 @@ export const stream = (model, context, options) => {
|
|
|
1005
1006
|
for await (const event of iterateAnthropicEvents(response, requestSignal)) {
|
|
1006
1007
|
if (event.type === "message_start") {
|
|
1007
1008
|
output.responseId = event.message.id;
|
|
1009
|
+
output.model = event.message.model;
|
|
1008
1010
|
// Capture initial token usage from message_start event
|
|
1009
1011
|
// This ensures we have input token counts even if the stream is aborted early
|
|
1010
1012
|
output.usage.input = event.message.usage.input_tokens || 0;
|
|
@@ -1357,9 +1359,16 @@ function mapThinkingLevelToEffort(model, level) {
|
|
|
1357
1359
|
export const streamSimple = (model, context, options) => {
|
|
1358
1360
|
const apiKey = options?.apiKey;
|
|
1359
1361
|
assertRequestAuth(model.provider, apiKey, providerHeadersToRecord(options?.headers));
|
|
1360
|
-
const base =
|
|
1362
|
+
const base = {
|
|
1363
|
+
...buildBaseOptions(model, context, options, options?.apiKey),
|
|
1364
|
+
toolChoice: options?.toolChoice,
|
|
1365
|
+
};
|
|
1361
1366
|
if (!options?.reasoning) {
|
|
1362
|
-
return stream(model, context, {
|
|
1367
|
+
return stream(model, context, {
|
|
1368
|
+
...base,
|
|
1369
|
+
refusalFallbacks: options?.refusalFallbacks,
|
|
1370
|
+
thinkingEnabled: false,
|
|
1371
|
+
});
|
|
1363
1372
|
}
|
|
1364
1373
|
// For models with adaptive thinking: use an effort level.
|
|
1365
1374
|
// For older models: use budget-based thinking.
|
|
@@ -1367,6 +1376,7 @@ export const streamSimple = (model, context, options) => {
|
|
|
1367
1376
|
const effort = mapThinkingLevelToEffort(model, options.reasoning);
|
|
1368
1377
|
return stream(model, context, {
|
|
1369
1378
|
...base,
|
|
1379
|
+
refusalFallbacks: options?.refusalFallbacks,
|
|
1370
1380
|
thinkingEnabled: true,
|
|
1371
1381
|
effort,
|
|
1372
1382
|
});
|
|
@@ -1377,6 +1387,7 @@ export const streamSimple = (model, context, options) => {
|
|
|
1377
1387
|
const maxTokens = clampMaxTokensToContext(model, context, adjusted.maxTokens);
|
|
1378
1388
|
return stream(model, context, {
|
|
1379
1389
|
...base,
|
|
1390
|
+
refusalFallbacks: options?.refusalFallbacks,
|
|
1380
1391
|
maxTokens,
|
|
1381
1392
|
thinkingEnabled: true,
|
|
1382
1393
|
thinkingBudgetTokens: Math.min(adjusted.thinkingBudget, Math.max(0, maxTokens - 1024)),
|
|
@@ -1385,7 +1396,7 @@ export const streamSimple = (model, context, options) => {
|
|
|
1385
1396
|
function isOAuthToken(apiKey) {
|
|
1386
1397
|
return apiKey.includes("sk-ant-oat");
|
|
1387
1398
|
}
|
|
1388
|
-
function createClient(model, apiKey, interleavedThinking, useFineGrainedToolStreamingBeta, optionsHeaders, fetch, dynamicHeaders, sessionId, env) {
|
|
1399
|
+
function createClient(model, apiKey, interleavedThinking, useFineGrainedToolStreamingBeta, useServerSideFallbackBeta, optionsHeaders, fetch, dynamicHeaders, sessionId, env) {
|
|
1389
1400
|
// Adaptive thinking models have interleaved thinking built in, so skip the beta header.
|
|
1390
1401
|
const needsInterleavedBeta = interleavedThinking && !supportsAdaptiveThinking(model);
|
|
1391
1402
|
const betaFeatures = [];
|
|
@@ -1395,6 +1406,9 @@ function createClient(model, apiKey, interleavedThinking, useFineGrainedToolStre
|
|
|
1395
1406
|
if (needsInterleavedBeta) {
|
|
1396
1407
|
betaFeatures.push(INTERLEAVED_THINKING_BETA);
|
|
1397
1408
|
}
|
|
1409
|
+
if (useServerSideFallbackBeta) {
|
|
1410
|
+
betaFeatures.push(SERVER_SIDE_FALLBACK_BETA);
|
|
1411
|
+
}
|
|
1398
1412
|
if (model.provider === "cloudflare-ai-gateway") {
|
|
1399
1413
|
const client = new Anthropic({
|
|
1400
1414
|
apiKey: null,
|
|
@@ -1599,6 +1613,9 @@ function buildParams(model, context, isOAuthToken, options, unsignedThinkingRepl
|
|
|
1599
1613
|
}
|
|
1600
1614
|
}
|
|
1601
1615
|
applyExtraBodyToAnthropicParams(params, options?.extraBody);
|
|
1616
|
+
if (options?.refusalFallbacks !== undefined) {
|
|
1617
|
+
params.fallbacks = options.refusalFallbacks;
|
|
1618
|
+
}
|
|
1602
1619
|
return params;
|
|
1603
1620
|
}
|
|
1604
1621
|
function applyExtraBodyToAnthropicParams(params, extraBody) {
|