@yeshwanthyk/ai 0.1.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.
Files changed (94) hide show
  1. package/README.md +1142 -0
  2. package/dist/agent/agent-loop.d.ts +16 -0
  3. package/dist/agent/agent-loop.d.ts.map +1 -0
  4. package/dist/agent/agent-loop.js +307 -0
  5. package/dist/agent/agent-loop.js.map +1 -0
  6. package/dist/agent/index.d.ts +4 -0
  7. package/dist/agent/index.d.ts.map +1 -0
  8. package/dist/agent/index.js +3 -0
  9. package/dist/agent/index.js.map +1 -0
  10. package/dist/agent/tools/calculate.d.ts +15 -0
  11. package/dist/agent/tools/calculate.d.ts.map +1 -0
  12. package/dist/agent/tools/calculate.js +23 -0
  13. package/dist/agent/tools/calculate.js.map +1 -0
  14. package/dist/agent/tools/get-current-time.d.ts +15 -0
  15. package/dist/agent/tools/get-current-time.d.ts.map +1 -0
  16. package/dist/agent/tools/get-current-time.js +38 -0
  17. package/dist/agent/tools/get-current-time.js.map +1 -0
  18. package/dist/agent/tools/index.d.ts +3 -0
  19. package/dist/agent/tools/index.d.ts.map +1 -0
  20. package/dist/agent/tools/index.js +3 -0
  21. package/dist/agent/tools/index.js.map +1 -0
  22. package/dist/agent/types.d.ts +69 -0
  23. package/dist/agent/types.d.ts.map +1 -0
  24. package/dist/agent/types.js +2 -0
  25. package/dist/agent/types.js.map +1 -0
  26. package/dist/index.d.ts +15 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +15 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/models.d.ts +11 -0
  31. package/dist/models.d.ts.map +1 -0
  32. package/dist/models.generated.d.ts +7406 -0
  33. package/dist/models.generated.d.ts.map +1 -0
  34. package/dist/models.generated.js +7268 -0
  35. package/dist/models.generated.js.map +1 -0
  36. package/dist/models.js +35 -0
  37. package/dist/models.js.map +1 -0
  38. package/dist/providers/anthropic.d.ts +12 -0
  39. package/dist/providers/anthropic.d.ts.map +1 -0
  40. package/dist/providers/anthropic.js +538 -0
  41. package/dist/providers/anthropic.js.map +1 -0
  42. package/dist/providers/google.d.ts +12 -0
  43. package/dist/providers/google.d.ts.map +1 -0
  44. package/dist/providers/google.js +427 -0
  45. package/dist/providers/google.js.map +1 -0
  46. package/dist/providers/openai-completions.d.ts +12 -0
  47. package/dist/providers/openai-completions.d.ts.map +1 -0
  48. package/dist/providers/openai-completions.js +540 -0
  49. package/dist/providers/openai-completions.js.map +1 -0
  50. package/dist/providers/openai-responses.d.ts +14 -0
  51. package/dist/providers/openai-responses.d.ts.map +1 -0
  52. package/dist/providers/openai-responses.js +553 -0
  53. package/dist/providers/openai-responses.js.map +1 -0
  54. package/dist/providers/transform-messages.d.ts +3 -0
  55. package/dist/providers/transform-messages.d.ts.map +1 -0
  56. package/dist/providers/transform-messages.js +111 -0
  57. package/dist/providers/transform-messages.js.map +1 -0
  58. package/dist/stream.d.ts +11 -0
  59. package/dist/stream.d.ts.map +1 -0
  60. package/dist/stream.js +204 -0
  61. package/dist/stream.js.map +1 -0
  62. package/dist/types.d.ts +203 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +4 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/utils/event-stream.d.ts +19 -0
  67. package/dist/utils/event-stream.d.ts.map +1 -0
  68. package/dist/utils/event-stream.js +77 -0
  69. package/dist/utils/event-stream.js.map +1 -0
  70. package/dist/utils/json-parse.d.ts +9 -0
  71. package/dist/utils/json-parse.d.ts.map +1 -0
  72. package/dist/utils/json-parse.js +29 -0
  73. package/dist/utils/json-parse.js.map +1 -0
  74. package/dist/utils/oauth/anthropic.d.ts +20 -0
  75. package/dist/utils/oauth/anthropic.d.ts.map +1 -0
  76. package/dist/utils/oauth/anthropic.js +103 -0
  77. package/dist/utils/oauth/anthropic.js.map +1 -0
  78. package/dist/utils/overflow.d.ts +51 -0
  79. package/dist/utils/overflow.d.ts.map +1 -0
  80. package/dist/utils/overflow.js +106 -0
  81. package/dist/utils/overflow.js.map +1 -0
  82. package/dist/utils/sanitize-unicode.d.ts +22 -0
  83. package/dist/utils/sanitize-unicode.d.ts.map +1 -0
  84. package/dist/utils/sanitize-unicode.js +26 -0
  85. package/dist/utils/sanitize-unicode.js.map +1 -0
  86. package/dist/utils/typebox-helpers.d.ts +17 -0
  87. package/dist/utils/typebox-helpers.d.ts.map +1 -0
  88. package/dist/utils/typebox-helpers.js +21 -0
  89. package/dist/utils/typebox-helpers.js.map +1 -0
  90. package/dist/utils/validation.d.ts +18 -0
  91. package/dist/utils/validation.d.ts.map +1 -0
  92. package/dist/utils/validation.js +69 -0
  93. package/dist/utils/validation.js.map +1 -0
  94. package/package.json +60 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Normalize tool call ID for GitHub Copilot cross-API compatibility.
3
+ * OpenAI Responses API generates IDs that are 450+ chars with special characters like `|`.
4
+ * Other APIs (Claude, etc.) require max 40 chars and only alphanumeric + underscore + hyphen.
5
+ */
6
+ function normalizeCopilotToolCallId(id) {
7
+ return id.replace(/[^a-zA-Z0-9_-]/g, "").slice(0, 40);
8
+ }
9
+ export function transformMessages(messages, model) {
10
+ // Build a map of original tool call IDs to normalized IDs for github-copilot cross-API switches
11
+ const toolCallIdMap = new Map();
12
+ return messages
13
+ .map((msg) => {
14
+ // User messages pass through unchanged
15
+ if (msg.role === "user") {
16
+ return msg;
17
+ }
18
+ // Handle toolResult messages - normalize toolCallId if we have a mapping
19
+ if (msg.role === "toolResult") {
20
+ const normalizedId = toolCallIdMap.get(msg.toolCallId);
21
+ if (normalizedId && normalizedId !== msg.toolCallId) {
22
+ return { ...msg, toolCallId: normalizedId };
23
+ }
24
+ return msg;
25
+ }
26
+ // Assistant messages need transformation check
27
+ if (msg.role === "assistant") {
28
+ const assistantMsg = msg;
29
+ // If message is from the same provider and API, keep as is
30
+ if (assistantMsg.provider === model.provider && assistantMsg.api === model.api) {
31
+ return msg;
32
+ }
33
+ // Check if we need to normalize tool call IDs (github-copilot cross-API)
34
+ const needsToolCallIdNormalization = assistantMsg.provider === "github-copilot" &&
35
+ model.provider === "github-copilot" &&
36
+ assistantMsg.api !== model.api;
37
+ // Transform message from different provider/model
38
+ const transformedContent = assistantMsg.content.map((block) => {
39
+ if (block.type === "thinking") {
40
+ // Convert thinking block to text block with <thinking> tags
41
+ return {
42
+ type: "text",
43
+ text: `<thinking>\n${block.thinking}\n</thinking>`,
44
+ };
45
+ }
46
+ // Normalize tool call IDs for github-copilot cross-API switches
47
+ if (block.type === "toolCall" && needsToolCallIdNormalization) {
48
+ const toolCall = block;
49
+ const normalizedId = normalizeCopilotToolCallId(toolCall.id);
50
+ if (normalizedId !== toolCall.id) {
51
+ toolCallIdMap.set(toolCall.id, normalizedId);
52
+ return { ...toolCall, id: normalizedId };
53
+ }
54
+ }
55
+ // All other blocks pass through unchanged
56
+ return block;
57
+ });
58
+ // Return transformed assistant message
59
+ return {
60
+ ...assistantMsg,
61
+ content: transformedContent,
62
+ };
63
+ }
64
+ return msg;
65
+ })
66
+ .map((msg, index, allMessages) => {
67
+ // Second pass: filter out tool calls without corresponding tool results
68
+ if (msg.role !== "assistant") {
69
+ return msg;
70
+ }
71
+ const assistantMsg = msg;
72
+ const isLastMessage = index === allMessages.length - 1;
73
+ // If this is the last message, keep all tool calls (ongoing turn)
74
+ if (isLastMessage) {
75
+ return msg;
76
+ }
77
+ // Extract tool call IDs from this message
78
+ const toolCallIds = assistantMsg.content
79
+ .filter((block) => block.type === "toolCall")
80
+ .map((block) => (block.type === "toolCall" ? block.id : ""));
81
+ // If no tool calls, return as is
82
+ if (toolCallIds.length === 0) {
83
+ return msg;
84
+ }
85
+ // Scan forward through subsequent messages to find matching tool results
86
+ const matchedToolCallIds = new Set();
87
+ for (let i = index + 1; i < allMessages.length; i++) {
88
+ const nextMsg = allMessages[i];
89
+ // Stop scanning when we hit another assistant message
90
+ if (nextMsg.role === "assistant") {
91
+ break;
92
+ }
93
+ // Check tool result messages for matching IDs
94
+ if (nextMsg.role === "toolResult") {
95
+ matchedToolCallIds.add(nextMsg.toolCallId);
96
+ }
97
+ }
98
+ // Filter out tool calls that don't have corresponding results
99
+ const filteredContent = assistantMsg.content.filter((block) => {
100
+ if (block.type === "toolCall") {
101
+ return matchedToolCallIds.has(block.id);
102
+ }
103
+ return true; // Keep all non-toolCall blocks
104
+ });
105
+ return {
106
+ ...assistantMsg,
107
+ content: filteredContent,
108
+ };
109
+ });
110
+ }
111
+ //# sourceMappingURL=transform-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-messages.js","sourceRoot":"","sources":["../../src/providers/transform-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AssistantMessageEventStream } from "./utils/event-stream.js";
2
+ import type { Api, AssistantMessage, Context, KnownProvider, Model, OptionsForApi, SimpleStreamOptions } from "./types.js";
3
+ export declare function setApiKey(provider: KnownProvider, key: string): void;
4
+ export declare function setApiKey(provider: string, key: string): void;
5
+ export declare function getApiKey(provider: KnownProvider): string | undefined;
6
+ export declare function getApiKey(provider: string): string | undefined;
7
+ export declare function stream<TApi extends Api>(model: Model<TApi>, context: Context, options?: OptionsForApi<TApi>): AssistantMessageEventStream;
8
+ export declare function complete<TApi extends Api>(model: Model<TApi>, context: Context, options?: OptionsForApi<TApi>): Promise<AssistantMessage>;
9
+ export declare function streamSimple<TApi extends Api>(model: Model<TApi>, context: Context, options?: SimpleStreamOptions): AssistantMessageEventStream;
10
+ export declare function completeSimple<TApi extends Api>(model: Model<TApi>, context: Context, options?: SimpleStreamOptions): Promise<AssistantMessage>;
11
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EACX,GAAG,EACH,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,KAAK,EACL,aAAa,EAGb,mBAAmB,EACnB,MAAM,YAAY,CAAC;AAIpB,wBAAgB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;AACtE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;AAK/D,wBAAgB,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AACvE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAiChE,wBAAgB,MAAM,CAAC,IAAI,SAAS,GAAG,EACtC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,GAC3B,2BAA2B,CA2C7B;AAED,wBAAsB,QAAQ,CAAC,IAAI,SAAS,GAAG,EAC9C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAG3B;AAED,wBAAgB,YAAY,CAAC,IAAI,SAAS,GAAG,EAC5C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,2BAA2B,CAQ7B;AAED,wBAAsB,cAAc,CAAC,IAAI,SAAS,GAAG,EACpD,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAG3B"}
package/dist/stream.js ADDED
@@ -0,0 +1,204 @@
1
+ import { ThinkingLevel } from "@google/genai";
2
+ import { streamAnthropic, } from "./providers/anthropic.js";
3
+ import { streamGoogle } from "./providers/google.js";
4
+ import { streamOpenAICompletions, } from "./providers/openai-completions.js";
5
+ import { streamOpenAIResponses, } from "./providers/openai-responses.js";
6
+ const apiKeys = new Map();
7
+ export function setApiKey(provider, key) {
8
+ apiKeys.set(provider, key);
9
+ }
10
+ export function getApiKey(provider) {
11
+ // Check explicit keys first
12
+ const key = apiKeys.get(provider);
13
+ if (key)
14
+ return key;
15
+ // Fall back to environment variables
16
+ if (provider === "github-copilot") {
17
+ return (process.env.COPILOT_GITHUB_TOKEN ||
18
+ process.env.GH_TOKEN ||
19
+ process.env.GITHUB_TOKEN);
20
+ }
21
+ const envMap = {
22
+ openai: "OPENAI_API_KEY",
23
+ anthropic: "ANTHROPIC_API_KEY",
24
+ google: "GEMINI_API_KEY",
25
+ groq: "GROQ_API_KEY",
26
+ cerebras: "CEREBRAS_API_KEY",
27
+ xai: "XAI_API_KEY",
28
+ openrouter: "OPENROUTER_API_KEY",
29
+ zai: "ZAI_API_KEY",
30
+ mistral: "MISTRAL_API_KEY",
31
+ minimax: "MINIMAX_API_KEY",
32
+ opencode: "ZEN_API_KEY",
33
+ };
34
+ const envVar = envMap[provider];
35
+ return envVar ? process.env[envVar] : undefined;
36
+ }
37
+ export function stream(model, context, options) {
38
+ const apiKey = options?.apiKey || getApiKey(model.provider);
39
+ if (!apiKey) {
40
+ throw new Error(`No API key for provider: ${model.provider}`);
41
+ }
42
+ const providerOptions = { ...options, apiKey };
43
+ const api = model.api;
44
+ switch (api) {
45
+ case "anthropic-messages":
46
+ return streamAnthropic(model, context, providerOptions);
47
+ case "openai-completions":
48
+ return streamOpenAICompletions(model, context, providerOptions);
49
+ case "openai-responses":
50
+ return streamOpenAIResponses(model, context, providerOptions);
51
+ case "google-generative-ai":
52
+ return streamGoogle(model, context, providerOptions);
53
+ default: {
54
+ // This should never be reached if all Api cases are handled
55
+ const _exhaustive = api;
56
+ throw new Error(`Unhandled API: ${_exhaustive}`);
57
+ }
58
+ }
59
+ }
60
+ export async function complete(model, context, options) {
61
+ const s = stream(model, context, options);
62
+ return s.result();
63
+ }
64
+ export function streamSimple(model, context, options) {
65
+ const apiKey = options?.apiKey || getApiKey(model.provider);
66
+ if (!apiKey) {
67
+ throw new Error(`No API key for provider: ${model.provider}`);
68
+ }
69
+ const providerOptions = mapOptionsForApi(model, options, apiKey);
70
+ return stream(model, context, providerOptions);
71
+ }
72
+ export async function completeSimple(model, context, options) {
73
+ const s = streamSimple(model, context, options);
74
+ return s.result();
75
+ }
76
+ function mapOptionsForApi(model, options, apiKey) {
77
+ const resolvedApiKey = apiKey ?? options?.apiKey;
78
+ if (!resolvedApiKey) {
79
+ throw new Error(`No API key for provider: ${model.provider}`);
80
+ }
81
+ const baseMaxTokens = options?.maxTokens ?? Math.min(model.maxTokens, 32000);
82
+ const base = {
83
+ maxTokens: baseMaxTokens,
84
+ apiKey: resolvedApiKey,
85
+ };
86
+ if (options?.temperature !== undefined) {
87
+ base.temperature = options.temperature;
88
+ }
89
+ if (options?.signal) {
90
+ base.signal = options.signal;
91
+ }
92
+ // Helper to clamp xhigh to high for providers that don't support it
93
+ const clampReasoning = (effort) => effort === "xhigh" ? "high" : effort;
94
+ switch (model.api) {
95
+ case "anthropic-messages": {
96
+ // Explicitly disable thinking when reasoning is not specified
97
+ if (!options?.reasoning) {
98
+ return { ...base, thinkingEnabled: false };
99
+ }
100
+ const anthropicBudgets = {
101
+ minimal: 1024,
102
+ low: 2048,
103
+ medium: 8192,
104
+ high: 16384,
105
+ };
106
+ return {
107
+ ...base,
108
+ thinkingEnabled: true,
109
+ thinkingBudgetTokens: anthropicBudgets[clampReasoning(options.reasoning)],
110
+ };
111
+ }
112
+ case "openai-completions": {
113
+ const reasoningEffort = options?.reasoning;
114
+ return {
115
+ ...base,
116
+ ...(reasoningEffort !== undefined ? { reasoningEffort } : {}),
117
+ };
118
+ }
119
+ case "openai-responses": {
120
+ const reasoningEffort = options?.reasoning;
121
+ return {
122
+ ...base,
123
+ ...(reasoningEffort !== undefined ? { reasoningEffort } : {}),
124
+ ...(options?.fetch ? { fetch: options.fetch } : {}),
125
+ ...(options?.instructions !== undefined ? { instructions: options.instructions } : {}),
126
+ };
127
+ }
128
+ case "google-generative-ai": {
129
+ // Explicitly disable thinking when reasoning is not specified
130
+ // This is needed because Gemini has "dynamic thinking" enabled by default
131
+ if (!options?.reasoning) {
132
+ return {
133
+ ...base,
134
+ thinking: { enabled: false },
135
+ };
136
+ }
137
+ const googleModel = model;
138
+ const effort = clampReasoning(options.reasoning);
139
+ // Gemini 3 Pro models use thinkingLevel exclusively instead of thinkingBudget.
140
+ // https://ai.google.dev/gemini-api/docs/thinking#set-budget
141
+ if (isGemini3ProModel(googleModel)) {
142
+ return {
143
+ ...base,
144
+ thinking: {
145
+ enabled: true,
146
+ level: getGoogleThinkingLevel(effort),
147
+ },
148
+ };
149
+ }
150
+ return {
151
+ ...base,
152
+ thinking: {
153
+ enabled: true,
154
+ budgetTokens: getGoogleBudget(googleModel, effort),
155
+ },
156
+ };
157
+ }
158
+ default: {
159
+ // Exhaustiveness check
160
+ const _exhaustive = model.api;
161
+ throw new Error(`Unhandled API in mapOptionsForApi: ${_exhaustive}`);
162
+ }
163
+ }
164
+ }
165
+ function isGemini3ProModel(model) {
166
+ // Covers gemini-3-pro, gemini-3-pro-preview, and possible other prefixed ids in the future
167
+ return model.id.includes("3-pro");
168
+ }
169
+ function getGoogleThinkingLevel(effort) {
170
+ // Gemini 3 Pro only supports LOW/HIGH (for now)
171
+ switch (effort) {
172
+ case "minimal":
173
+ case "low":
174
+ return ThinkingLevel.LOW;
175
+ case "medium":
176
+ case "high":
177
+ return ThinkingLevel.HIGH;
178
+ }
179
+ }
180
+ function getGoogleBudget(model, effort) {
181
+ // See https://ai.google.dev/gemini-api/docs/thinking#set-budget
182
+ if (model.id.includes("2.5-pro")) {
183
+ const budgets = {
184
+ minimal: 128,
185
+ low: 2048,
186
+ medium: 8192,
187
+ high: 32768,
188
+ };
189
+ return budgets[effort];
190
+ }
191
+ if (model.id.includes("2.5-flash")) {
192
+ // Covers 2.5-flash-lite as well
193
+ const budgets = {
194
+ minimal: 128,
195
+ low: 2048,
196
+ medium: 8192,
197
+ high: 24576,
198
+ };
199
+ return budgets[effort];
200
+ }
201
+ // Unknown model - use dynamic
202
+ return -1;
203
+ }
204
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ import type { AnthropicOptions } from "./providers/anthropic.js";
2
+ import type { GoogleOptions } from "./providers/google.js";
3
+ import type { OpenAICompletionsOptions } from "./providers/openai-completions.js";
4
+ import type { OpenAIResponsesOptions } from "./providers/openai-responses.js";
5
+ import type { AssistantMessageEventStream } from "./utils/event-stream.js";
6
+ export type Api = "openai-completions" | "openai-responses" | "anthropic-messages" | "google-generative-ai";
7
+ export interface ApiOptionsMap {
8
+ "anthropic-messages": AnthropicOptions;
9
+ "openai-completions": OpenAICompletionsOptions;
10
+ "openai-responses": OpenAIResponsesOptions;
11
+ "google-generative-ai": GoogleOptions;
12
+ }
13
+ export type OptionsForApi<TApi extends Api> = ApiOptionsMap[TApi];
14
+ export type KnownProvider = "anthropic" | "google" | "openai" | "codex" | "github-copilot" | "xai" | "groq" | "cerebras" | "openrouter" | "zai" | "mistral" | "opencode";
15
+ export type Provider = KnownProvider | string;
16
+ export type ReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh";
17
+ export interface StreamOptions {
18
+ temperature?: number;
19
+ maxTokens?: number;
20
+ signal?: AbortSignal;
21
+ apiKey?: string;
22
+ }
23
+ /** Custom fetch function type (compatible with standard fetch signature) */
24
+ export type FetchFunction = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
25
+ export interface SimpleStreamOptions extends StreamOptions {
26
+ reasoning?: ReasoningEffort;
27
+ /** Custom fetch for OAuth/proxy scenarios */
28
+ fetch?: FetchFunction;
29
+ /** Instructions for Codex API (top-level, replaces system message) */
30
+ instructions?: string;
31
+ }
32
+ export type StreamFunction<TApi extends Api> = (model: Model<TApi>, context: Context, options: OptionsForApi<TApi>) => AssistantMessageEventStream;
33
+ export interface TextContent {
34
+ type: "text";
35
+ text: string;
36
+ textSignature?: string;
37
+ }
38
+ export interface ThinkingContent {
39
+ type: "thinking";
40
+ thinking: string;
41
+ thinkingSignature?: string;
42
+ }
43
+ export interface ImageContent {
44
+ type: "image";
45
+ data: string;
46
+ mimeType: string;
47
+ }
48
+ export interface ToolCall {
49
+ type: "toolCall";
50
+ id: string;
51
+ name: string;
52
+ arguments: Record<string, any>;
53
+ thoughtSignature?: string;
54
+ }
55
+ export interface Usage {
56
+ input: number;
57
+ output: number;
58
+ cacheRead: number;
59
+ cacheWrite: number;
60
+ totalTokens: number;
61
+ cost: {
62
+ input: number;
63
+ output: number;
64
+ cacheRead: number;
65
+ cacheWrite: number;
66
+ total: number;
67
+ };
68
+ }
69
+ export type StopReason = "stop" | "length" | "toolUse" | "error" | "aborted";
70
+ export interface UserMessage {
71
+ role: "user";
72
+ content: string | (TextContent | ImageContent)[];
73
+ timestamp: number;
74
+ }
75
+ export interface AssistantMessage {
76
+ role: "assistant";
77
+ content: (TextContent | ThinkingContent | ToolCall)[];
78
+ api: Api;
79
+ provider: Provider;
80
+ model: string;
81
+ usage: Usage;
82
+ stopReason: StopReason;
83
+ errorMessage?: string;
84
+ timestamp: number;
85
+ }
86
+ export interface ToolResultMessage<TDetails = any> {
87
+ role: "toolResult";
88
+ toolCallId: string;
89
+ toolName: string;
90
+ content: (TextContent | ImageContent)[];
91
+ details?: TDetails;
92
+ isError: boolean;
93
+ timestamp: number;
94
+ }
95
+ export type Message = UserMessage | AssistantMessage | ToolResultMessage;
96
+ import type { TSchema } from "@sinclair/typebox";
97
+ export interface Tool<TParameters extends TSchema = TSchema> {
98
+ name: string;
99
+ description: string;
100
+ parameters: TParameters;
101
+ }
102
+ export interface Context {
103
+ systemPrompt?: string;
104
+ messages: Message[];
105
+ tools?: Tool[];
106
+ }
107
+ export type AssistantMessageEvent = {
108
+ type: "start";
109
+ partial: AssistantMessage;
110
+ } | {
111
+ type: "text_start";
112
+ contentIndex: number;
113
+ partial: AssistantMessage;
114
+ } | {
115
+ type: "text_delta";
116
+ contentIndex: number;
117
+ delta: string;
118
+ partial: AssistantMessage;
119
+ } | {
120
+ type: "text_end";
121
+ contentIndex: number;
122
+ content: string;
123
+ partial: AssistantMessage;
124
+ } | {
125
+ type: "thinking_start";
126
+ contentIndex: number;
127
+ partial: AssistantMessage;
128
+ } | {
129
+ type: "thinking_delta";
130
+ contentIndex: number;
131
+ delta: string;
132
+ partial: AssistantMessage;
133
+ } | {
134
+ type: "thinking_end";
135
+ contentIndex: number;
136
+ content: string;
137
+ partial: AssistantMessage;
138
+ } | {
139
+ type: "toolcall_start";
140
+ contentIndex: number;
141
+ partial: AssistantMessage;
142
+ } | {
143
+ type: "toolcall_delta";
144
+ contentIndex: number;
145
+ delta: string;
146
+ partial: AssistantMessage;
147
+ } | {
148
+ type: "toolcall_end";
149
+ contentIndex: number;
150
+ toolCall: ToolCall;
151
+ partial: AssistantMessage;
152
+ } | {
153
+ type: "done";
154
+ reason: Extract<StopReason, "stop" | "length" | "toolUse">;
155
+ message: AssistantMessage;
156
+ } | {
157
+ type: "error";
158
+ reason: Extract<StopReason, "aborted" | "error">;
159
+ error: AssistantMessage;
160
+ };
161
+ /**
162
+ * Compatibility settings for openai-completions API.
163
+ * Use this to override URL-based auto-detection for custom providers.
164
+ */
165
+ export interface OpenAICompat {
166
+ /** Whether the provider supports the `store` field. Default: auto-detected from URL. */
167
+ supportsStore?: boolean;
168
+ /** Whether the provider supports the `developer` role (vs `system`). Default: auto-detected from URL. */
169
+ supportsDeveloperRole?: boolean;
170
+ /** Whether the provider supports `reasoning_effort`. Default: auto-detected from URL. */
171
+ supportsReasoningEffort?: boolean;
172
+ /** Which field to use for max tokens. Default: auto-detected from URL. */
173
+ maxTokensField?: "max_completion_tokens" | "max_tokens";
174
+ /** Whether tool results require the `name` field. Default: auto-detected from URL. */
175
+ requiresToolResultName?: boolean;
176
+ /** Whether a user message after tool results requires an assistant message in between. Default: auto-detected from URL. */
177
+ requiresAssistantAfterToolResult?: boolean;
178
+ /** Whether thinking blocks must be converted to text blocks with <thinking> delimiters. Default: auto-detected from URL. */
179
+ requiresThinkingAsText?: boolean;
180
+ /** Whether tool call IDs must be normalized to Mistral format (exactly 9 alphanumeric chars). Default: auto-detected from URL. */
181
+ requiresMistralToolIds?: boolean;
182
+ }
183
+ export interface Model<TApi extends Api> {
184
+ id: string;
185
+ name: string;
186
+ api: TApi;
187
+ provider: Provider;
188
+ baseUrl: string;
189
+ reasoning: boolean;
190
+ input: ("text" | "image")[];
191
+ cost: {
192
+ input: number;
193
+ output: number;
194
+ cacheRead: number;
195
+ cacheWrite: number;
196
+ };
197
+ contextWindow: number;
198
+ maxTokens: number;
199
+ headers?: Record<string, string>;
200
+ /** Compatibility overrides for openai-completions API. If not set, auto-detected from baseUrl. */
201
+ compat?: TApi extends "openai-completions" ? OpenAICompat : never;
202
+ }
203
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ const _exhaustive = true;
2
+ void _exhaustive;
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,GAAqB,IAAI,CAAC;AAC3C,KAAK,WAAW,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { AssistantMessage, AssistantMessageEvent } from "../types.js";
2
+ export declare class EventStream<T, R = T> implements AsyncIterable<T> {
3
+ private isComplete;
4
+ private extractResult;
5
+ private queue;
6
+ private waiting;
7
+ private done;
8
+ private finalResultPromise;
9
+ private resolveFinalResult;
10
+ constructor(isComplete: (event: T) => boolean, extractResult: (event: T) => R);
11
+ push(event: T): void;
12
+ end(result?: R): void;
13
+ [Symbol.asyncIterator](): AsyncIterator<T>;
14
+ result(): Promise<R>;
15
+ }
16
+ export declare class AssistantMessageEventStream extends EventStream<AssistantMessageEvent, AssistantMessage> {
17
+ constructor();
18
+ }
19
+ //# sourceMappingURL=event-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-stream.d.ts","sourceRoot":"","sources":["../../src/utils/event-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAG3E,qBAAa,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAQ5D,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa;IARtB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,kBAAkB,CAAuB;IAEjD,YACS,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,EACjC,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAKtC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAenB;IAED,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAUpB;IAEM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAYhD;IAED,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAEnB;CACD;AAED,qBAAa,2BAA4B,SAAQ,WAAW,CAAC,qBAAqB,EAAE,gBAAgB,CAAC;IACpG,cAYC;CACD"}