@code-yeongyu/senpi-ai 2026.7.28 → 2026.7.29

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.
Files changed (70) hide show
  1. package/dist/api/openai-client-auth.d.ts +7 -0
  2. package/dist/api/openai-client-auth.d.ts.map +1 -0
  3. package/dist/api/openai-client-auth.js +15 -0
  4. package/dist/api/openai-client-auth.js.map +1 -0
  5. package/dist/api/openai-completions.d.ts.map +1 -1
  6. package/dist/api/openai-completions.js +4 -20
  7. package/dist/api/openai-completions.js.map +1 -1
  8. package/dist/api/openai-responses.d.ts.map +1 -1
  9. package/dist/api/openai-responses.js +9 -22
  10. package/dist/api/openai-responses.js.map +1 -1
  11. package/dist/auth/headers.d.ts +5 -0
  12. package/dist/auth/headers.d.ts.map +1 -0
  13. package/dist/auth/headers.js +41 -0
  14. package/dist/auth/headers.js.map +1 -0
  15. package/dist/index.d.ts +3 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +3 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/providers/data/.manifest.json +1 -1
  20. package/dist/providers/data/openrouter.json +1 -1
  21. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  22. package/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  23. package/dist/tool-call-middleware/context-transformer.js +9 -0
  24. package/dist/tool-call-middleware/context-transformer.js.map +1 -1
  25. package/dist/tool-call-middleware/index.d.ts +5 -0
  26. package/dist/tool-call-middleware/index.d.ts.map +1 -1
  27. package/dist/tool-call-middleware/index.js +12 -2
  28. package/dist/tool-call-middleware/index.js.map +1 -1
  29. package/dist/tool-call-middleware/protocols/kimi-xtml/format.d.ts +5 -0
  30. package/dist/tool-call-middleware/protocols/kimi-xtml/format.d.ts.map +1 -0
  31. package/dist/tool-call-middleware/protocols/kimi-xtml/format.js +54 -0
  32. package/dist/tool-call-middleware/protocols/kimi-xtml/format.js.map +1 -0
  33. package/dist/tool-call-middleware/protocols/kimi-xtml/index.d.ts +4 -0
  34. package/dist/tool-call-middleware/protocols/kimi-xtml/index.d.ts.map +1 -0
  35. package/dist/tool-call-middleware/protocols/kimi-xtml/index.js +4 -0
  36. package/dist/tool-call-middleware/protocols/kimi-xtml/index.js.map +1 -0
  37. package/dist/tool-call-middleware/protocols/kimi-xtml/markers.d.ts +10 -0
  38. package/dist/tool-call-middleware/protocols/kimi-xtml/markers.d.ts.map +1 -0
  39. package/dist/tool-call-middleware/protocols/kimi-xtml/markers.js +30 -0
  40. package/dist/tool-call-middleware/protocols/kimi-xtml/markers.js.map +1 -0
  41. package/dist/tool-call-middleware/protocols/kimi-xtml/parse.d.ts +12 -0
  42. package/dist/tool-call-middleware/protocols/kimi-xtml/parse.d.ts.map +1 -0
  43. package/dist/tool-call-middleware/protocols/kimi-xtml/parse.js +95 -0
  44. package/dist/tool-call-middleware/protocols/kimi-xtml/parse.js.map +1 -0
  45. package/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.d.ts +5 -0
  46. package/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.d.ts.map +1 -0
  47. package/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.js +207 -0
  48. package/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.js.map +1 -0
  49. package/dist/tool-call-middleware/protocols/kimi-xtml/stream.d.ts +4 -0
  50. package/dist/tool-call-middleware/protocols/kimi-xtml/stream.d.ts.map +1 -0
  51. package/dist/tool-call-middleware/protocols/kimi-xtml/stream.js +181 -0
  52. package/dist/tool-call-middleware/protocols/kimi-xtml/stream.js.map +1 -0
  53. package/dist/tool-call-middleware/recovery-stream-wrapper.d.ts +2 -1
  54. package/dist/tool-call-middleware/recovery-stream-wrapper.d.ts.map +1 -1
  55. package/dist/tool-call-middleware/recovery-stream-wrapper.js +3 -2
  56. package/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -1
  57. package/dist/tool-call-middleware/recovery-text-projection.d.ts +2 -1
  58. package/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -1
  59. package/dist/tool-call-middleware/recovery-text-projection.js +2 -2
  60. package/dist/tool-call-middleware/recovery-text-projection.js.map +1 -1
  61. package/dist/tool-call-middleware/types.d.ts +2 -1
  62. package/dist/tool-call-middleware/types.d.ts.map +1 -1
  63. package/dist/tool-call-middleware/types.js.map +1 -1
  64. package/dist/types.d.ts +1 -1
  65. package/dist/types.js.map +1 -1
  66. package/dist/utils/retry.d.ts +7 -0
  67. package/dist/utils/retry.d.ts.map +1 -1
  68. package/dist/utils/retry.js +29 -0
  69. package/dist/utils/retry.js.map +1 -1
  70. package/package.json +14 -14
@@ -0,0 +1,7 @@
1
+ import type { ProviderHeaders } from "../types.ts";
2
+ export interface OpenAIClientAuth {
3
+ apiKey: string;
4
+ headers?: ProviderHeaders;
5
+ }
6
+ export declare function resolveOpenAIClientAuth(provider: string, apiKey: string | undefined, headers: ProviderHeaders | undefined): OpenAIClientAuth;
7
+ //# sourceMappingURL=openai-client-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-client-auth.d.ts","sourceRoot":"","sources":["../../src/api/openai-client-auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,eAAe,GAAG,SAAS,GAClC,gBAAgB,CAUlB"}
@@ -0,0 +1,15 @@
1
+ import { hasCredentialHeaders, hasHeader } from "../auth/headers.js";
2
+ export function resolveOpenAIClientAuth(provider, apiKey, headers) {
3
+ if (apiKey)
4
+ return { apiKey, headers };
5
+ if (!hasCredentialHeaders(headers))
6
+ throw new Error(`No API key for provider: ${provider}`);
7
+ if (hasHeader(headers, "authorization") || hasHeader(headers, "cf-aig-authorization")) {
8
+ return { apiKey: "unused", headers };
9
+ }
10
+ return {
11
+ apiKey: "unused",
12
+ headers: { Authorization: null, ...headers },
13
+ };
14
+ }
15
+ //# sourceMappingURL=openai-client-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-client-auth.js","sourceRoot":"","sources":["../../src/api/openai-client-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQrE,MAAM,UAAU,uBAAuB,CACtC,QAAgB,EAChB,MAA0B,EAC1B,OAAoC;IAEpC,IAAI,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACvC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;IAC5F,IAAI,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,sBAAsB,CAAC,EAAE,CAAC;QACvF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACtC,CAAC;IACD,OAAO;QACN,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE;KAC5C,CAAC;AACH,CAAC","sourcesContent":["import { hasCredentialHeaders, hasHeader } from \"../auth/headers.ts\";\nimport type { ProviderHeaders } from \"../types.ts\";\n\nexport interface OpenAIClientAuth {\n\tapiKey: string;\n\theaders?: ProviderHeaders;\n}\n\nexport function resolveOpenAIClientAuth(\n\tprovider: string,\n\tapiKey: string | undefined,\n\theaders: ProviderHeaders | undefined,\n): OpenAIClientAuth {\n\tif (apiKey) return { apiKey, headers };\n\tif (!hasCredentialHeaders(headers)) throw new Error(`No API key for provider: ${provider}`);\n\tif (hasHeader(headers, \"authorization\") || hasHeader(headers, \"cf-aig-authorization\")) {\n\t\treturn { apiKey: \"unused\", headers };\n\t}\n\treturn {\n\t\tapiKey: \"unused\",\n\t\theaders: { Authorization: null, ...headers },\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"openai-completions.d.ts","sourceRoot":"","sources":["../../src/api/openai-completions.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAOX,0BAA0B,EAI1B,MAAM,sCAAsC,CAAC;AAG9C,OAAO,KAAK,EAIX,OAAO,EAGP,KAAK,EAIL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAMb,MAAM,aAAa,CAAC;AAMrB,OAAO,EAEN,KAAK,+BAA+B,EACpC,MAAM,8BAA8B,CAAC;AA2BtC,OAAO,EACN,0BAA0B,IAAI,SAAS,EACvC,KAAK,+BAA+B,GACpC,MAAM,8BAA8B,CAAC;AA2NtC,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,8BAA8B,CAAC;IACpE,eAAe,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;CAC1E;AAED,MAAM,WAAW,iCAAiC;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0BAA0B,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzD;AAwCD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,wBAAwB,CAgbjF,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CAyBlF,CAAC;AA8XF,wBAAgB,eAAe,CAC9B,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,+BAA+B,EACvC,OAAO,GAAE,iCAAsC,GAC7C,0BAA0B,EAAE,CAgS9B"}
1
+ {"version":3,"file":"openai-completions.d.ts","sourceRoot":"","sources":["../../src/api/openai-completions.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAOX,0BAA0B,EAI1B,MAAM,sCAAsC,CAAC;AAG9C,OAAO,KAAK,EAIX,OAAO,EAGP,KAAK,EAIL,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAMb,MAAM,aAAa,CAAC;AAMrB,OAAO,EAEN,KAAK,+BAA+B,EACpC,MAAM,8BAA8B,CAAC;AA4BtC,OAAO,EACN,0BAA0B,IAAI,SAAS,EACvC,KAAK,+BAA+B,GACpC,MAAM,8BAA8B,CAAC;AA4MtC,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,8BAA8B,CAAC;IACpE,eAAe,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;CAC1E;AAED,MAAM,WAAW,iCAAiC;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0BAA0B,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzD;AAwCD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,wBAAwB,CAgbjF,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CAyBlF,CAAC;AA8XF,wBAAgB,eAAe,CAC9B,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,+BAA+B,EACvC,OAAO,GAAE,iCAAsC,GAC7C,0BAA0B,EAAE,CAgS9B"}
@@ -13,6 +13,7 @@ import { isForcedToolChoiceUnsupportedError, omitToolChoiceParam } from "../util
13
13
  import { normalizeToolParametersForMoonshot, normalizeToolParametersForOpenAICompat, } from "../utils/tool-schema-compat.js";
14
14
  import { appendGrammarToolInputJsonDelta, createGrammarToolInputProperties, getGrammarToolInput, resolveGrammarConstrainedSampling, resolveJsonSchemaStrictSampling, } from "./constrained-sampling.js";
15
15
  import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
16
+ import { resolveOpenAIClientAuth } from "./openai-client-auth.js";
16
17
  import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
17
18
  import { applyExtraBody, buildBaseOptions, clampMaxForOpenAI, OPENAI_COMPLETIONS_RESERVED_BODY_KEYS, } from "./simple-options.js";
18
19
  import { transformMessages } from "./transform-messages.js";
@@ -103,23 +104,6 @@ function resolveReasoningEffort(thinkingLevelMap, effort) {
103
104
  * This is needed because Anthropic (via proxy) requires the tools param
104
105
  * to be present when messages include tool_calls or tool role messages.
105
106
  */
106
- function hasHeader(headers, name) {
107
- if (!headers)
108
- return false;
109
- const expected = name.toLowerCase();
110
- for (const [key, value] of Object.entries(headers)) {
111
- if (key.toLowerCase() === expected && value !== null && value.trim().length > 0)
112
- return true;
113
- }
114
- return false;
115
- }
116
- function getClientApiKey(provider, apiKey, headers) {
117
- if (apiKey)
118
- return apiKey;
119
- if (hasHeader(headers, "authorization") || hasHeader(headers, "cf-aig-authorization"))
120
- return "unused";
121
- throw new Error(`No API key for provider: ${provider}`);
122
- }
123
107
  function hasToolHistory(messages) {
124
108
  for (const msg of messages) {
125
109
  if (msg.role === "toolResult") {
@@ -217,12 +201,12 @@ export const stream = (model, context, options) => {
217
201
  timestamp: Date.now(),
218
202
  };
219
203
  try {
220
- const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);
204
+ const clientAuth = resolveOpenAIClientAuth(model.provider, options?.apiKey, options?.headers);
221
205
  const compat = getCompat(model);
222
206
  const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools);
223
207
  const cacheRetention = resolveCacheRetention(options?.cacheRetention ?? model.cacheRetention, options?.env);
224
208
  const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
225
- const client = createClient(model, context, apiKey, options?.headers, cacheSessionId, compat);
209
+ const client = createClient(model, context, clientAuth.apiKey, clientAuth.headers, cacheSessionId, compat);
226
210
  let params = buildParams(model, context, options, compat, cacheRetention, grammarToolInputProperties);
227
211
  const nextParams = await options?.onPayload?.(params, model);
228
212
  if (nextParams !== undefined) {
@@ -577,7 +561,7 @@ export const stream = (model, context, options) => {
577
561
  return stream;
578
562
  };
579
563
  export const streamSimple = (model, context, options) => {
580
- getClientApiKey(model.provider, options?.apiKey, options?.headers);
564
+ resolveOpenAIClientAuth(model.provider, options?.apiKey, options?.headers);
581
565
  const base = buildBaseOptions(model, context, options, options?.apiKey);
582
566
  const compat = getCompat(model);
583
567
  const thinkingLevelMap = getThinkingLevelMap(model, compat);