@kenkaiiii/gg-ai 0.0.1

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 (41) hide show
  1. package/dist/errors.d.ts +12 -0
  2. package/dist/errors.d.ts.map +1 -0
  3. package/dist/errors.js +17 -0
  4. package/dist/errors.js.map +1 -0
  5. package/dist/index.d.ts +5 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/providers/anthropic.d.ts +4 -0
  10. package/dist/providers/anthropic.d.ts.map +1 -0
  11. package/dist/providers/anthropic.js +128 -0
  12. package/dist/providers/anthropic.js.map +1 -0
  13. package/dist/providers/openai-codex.d.ts +4 -0
  14. package/dist/providers/openai-codex.d.ts.map +1 -0
  15. package/dist/providers/openai-codex.js +325 -0
  16. package/dist/providers/openai-codex.js.map +1 -0
  17. package/dist/providers/openai.d.ts +4 -0
  18. package/dist/providers/openai.d.ts.map +1 -0
  19. package/dist/providers/openai.js +138 -0
  20. package/dist/providers/openai.js.map +1 -0
  21. package/dist/providers/transform.d.ts +20 -0
  22. package/dist/providers/transform.d.ts.map +1 -0
  23. package/dist/providers/transform.js +206 -0
  24. package/dist/providers/transform.js.map +1 -0
  25. package/dist/stream.d.ts +19 -0
  26. package/dist/stream.d.ts.map +1 -0
  27. package/dist/stream.js +34 -0
  28. package/dist/stream.js.map +1 -0
  29. package/dist/types.d.ts +111 -0
  30. package/dist/types.d.ts.map +1 -0
  31. package/dist/types.js +2 -0
  32. package/dist/types.js.map +1 -0
  33. package/dist/utils/event-stream.d.ts +37 -0
  34. package/dist/utils/event-stream.d.ts.map +1 -0
  35. package/dist/utils/event-stream.js +86 -0
  36. package/dist/utils/event-stream.js.map +1 -0
  37. package/dist/utils/zod-to-json-schema.d.ts +7 -0
  38. package/dist/utils/zod-to-json-schema.d.ts.map +1 -0
  39. package/dist/utils/zod-to-json-schema.js +12 -0
  40. package/dist/utils/zod-to-json-schema.js.map +1 -0
  41. package/package.json +37 -0
@@ -0,0 +1,138 @@
1
+ import OpenAI from "openai";
2
+ import { ProviderError } from "../errors.js";
3
+ import { StreamResult } from "../utils/event-stream.js";
4
+ import { normalizeOpenAIStopReason, toOpenAIMessages, toOpenAIReasoningEffort, toOpenAIToolChoice, toOpenAITools, } from "./transform.js";
5
+ export function streamOpenAI(options) {
6
+ const result = new StreamResult();
7
+ runStream(options, result).catch((err) => result.abort(toError(err)));
8
+ return result;
9
+ }
10
+ async function runStream(options, result) {
11
+ const client = new OpenAI({
12
+ apiKey: options.apiKey,
13
+ ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),
14
+ });
15
+ const messages = toOpenAIMessages(options.messages);
16
+ const params = {
17
+ model: options.model,
18
+ messages,
19
+ stream: true,
20
+ ...(options.maxTokens ? { max_tokens: options.maxTokens } : {}),
21
+ ...(options.temperature != null && !options.thinking
22
+ ? { temperature: options.temperature }
23
+ : {}),
24
+ ...(options.topP != null ? { top_p: options.topP } : {}),
25
+ ...(options.stop ? { stop: options.stop } : {}),
26
+ ...(options.thinking ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking) } : {}),
27
+ ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),
28
+ ...(options.toolChoice && options.tools?.length
29
+ ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }
30
+ : {}),
31
+ stream_options: { include_usage: true },
32
+ };
33
+ const stream = await client.chat.completions.create(params, {
34
+ signal: options.signal ?? undefined,
35
+ });
36
+ const contentParts = [];
37
+ const toolCallAccum = new Map();
38
+ let textAccum = "";
39
+ let inputTokens = 0;
40
+ let outputTokens = 0;
41
+ let finishReason = null;
42
+ for await (const chunk of stream) {
43
+ const choice = chunk.choices?.[0];
44
+ if (chunk.usage) {
45
+ inputTokens = chunk.usage.prompt_tokens;
46
+ outputTokens = chunk.usage.completion_tokens;
47
+ }
48
+ if (!choice)
49
+ continue;
50
+ if (choice.finish_reason) {
51
+ finishReason = choice.finish_reason;
52
+ }
53
+ const delta = choice.delta;
54
+ // Text delta
55
+ if (delta.content) {
56
+ textAccum += delta.content;
57
+ result.push({ type: "text_delta", text: delta.content });
58
+ }
59
+ // Tool call deltas
60
+ if (delta.tool_calls) {
61
+ for (const tc of delta.tool_calls) {
62
+ let accum = toolCallAccum.get(tc.index);
63
+ if (!accum) {
64
+ accum = {
65
+ id: tc.id ?? "",
66
+ name: tc.function?.name ?? "",
67
+ argsJson: "",
68
+ };
69
+ toolCallAccum.set(tc.index, accum);
70
+ }
71
+ if (tc.id)
72
+ accum.id = tc.id;
73
+ if (tc.function?.name)
74
+ accum.name = tc.function.name;
75
+ if (tc.function?.arguments) {
76
+ accum.argsJson += tc.function.arguments;
77
+ result.push({
78
+ type: "toolcall_delta",
79
+ id: accum.id,
80
+ name: accum.name,
81
+ argsJson: tc.function.arguments,
82
+ });
83
+ }
84
+ }
85
+ }
86
+ }
87
+ // Finalize text content
88
+ if (textAccum) {
89
+ contentParts.push({ type: "text", text: textAccum });
90
+ }
91
+ // Finalize tool calls
92
+ for (const [, tc] of toolCallAccum) {
93
+ let args = {};
94
+ try {
95
+ args = JSON.parse(tc.argsJson);
96
+ }
97
+ catch {
98
+ // malformed JSON — keep empty
99
+ }
100
+ const toolCall = {
101
+ type: "tool_call",
102
+ id: tc.id,
103
+ name: tc.name,
104
+ args,
105
+ };
106
+ contentParts.push(toolCall);
107
+ result.push({
108
+ type: "toolcall_done",
109
+ id: tc.id,
110
+ name: tc.name,
111
+ args,
112
+ });
113
+ }
114
+ const stopReason = normalizeOpenAIStopReason(finishReason);
115
+ const response = {
116
+ message: {
117
+ role: "assistant",
118
+ content: contentParts.length > 0 ? contentParts : textAccum || "",
119
+ },
120
+ stopReason,
121
+ usage: { inputTokens, outputTokens },
122
+ };
123
+ result.push({ type: "done", stopReason });
124
+ result.complete(response);
125
+ }
126
+ function toError(err) {
127
+ if (err instanceof OpenAI.APIError) {
128
+ return new ProviderError("openai", err.message, {
129
+ statusCode: err.status,
130
+ cause: err,
131
+ });
132
+ }
133
+ if (err instanceof Error) {
134
+ return new ProviderError("openai", err.message, { cause: err });
135
+ }
136
+ return new ProviderError("openai", String(err));
137
+ }
138
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type Anthropic from "@anthropic-ai/sdk";
2
+ import type OpenAI from "openai";
3
+ import type { Message, ThinkingLevel, Tool, ToolChoice } from "../types.js";
4
+ export declare function toAnthropicMessages(messages: Message[]): {
5
+ system: string | undefined;
6
+ messages: Anthropic.MessageParam[];
7
+ };
8
+ export declare function toAnthropicTools(tools: Tool[]): Anthropic.Tool[];
9
+ export declare function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice;
10
+ export declare function toAnthropicThinking(level: ThinkingLevel, maxTokens: number): {
11
+ thinking: Anthropic.ThinkingConfigParam;
12
+ maxTokens: number;
13
+ };
14
+ export declare function toOpenAIMessages(messages: Message[]): OpenAI.ChatCompletionMessageParam[];
15
+ export declare function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[];
16
+ export declare function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption;
17
+ export declare function toOpenAIReasoningEffort(level: ThinkingLevel): "low" | "medium" | "high";
18
+ export declare function normalizeAnthropicStopReason(reason: string | null): "end_turn" | "tool_use" | "max_tokens";
19
+ export declare function normalizeOpenAIStopReason(reason: string | null): "end_turn" | "tool_use" | "max_tokens";
20
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/providers/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAEV,OAAO,EAEP,aAAa,EACb,IAAI,EACJ,UAAU,EACX,MAAM,aAAa,CAAC;AAKrB,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG;IACxD,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;CACpC,CAwEA;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,CAMhE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,UAAU,CAK9E;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,GAChB;IAAE,QAAQ,EAAE,SAAS,CAAC,mBAAmB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAWhE;AAID,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,0BAA0B,EAAE,CA0EzF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,kBAAkB,EAAE,CASxE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,8BAA8B,CAK5F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAEvF;AAID,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,UAAU,GAAG,UAAU,GAAG,YAAY,CASxC;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,UAAU,GAAG,UAAU,GAAG,YAAY,CASxC"}
@@ -0,0 +1,206 @@
1
+ import { zodToJsonSchema } from "../utils/zod-to-json-schema.js";
2
+ // ── Anthropic Transforms ───────────────────────────────────
3
+ export function toAnthropicMessages(messages) {
4
+ let system;
5
+ const out = [];
6
+ for (const msg of messages) {
7
+ if (msg.role === "system") {
8
+ system = msg.content;
9
+ continue;
10
+ }
11
+ if (msg.role === "user") {
12
+ out.push({
13
+ role: "user",
14
+ content: typeof msg.content === "string"
15
+ ? msg.content
16
+ : msg.content.map((part) => {
17
+ if (part.type === "text")
18
+ return { type: "text", text: part.text };
19
+ return {
20
+ type: "image",
21
+ source: {
22
+ type: "base64",
23
+ media_type: part.mediaType,
24
+ data: part.data,
25
+ },
26
+ };
27
+ }),
28
+ });
29
+ continue;
30
+ }
31
+ if (msg.role === "assistant") {
32
+ const content = typeof msg.content === "string"
33
+ ? msg.content
34
+ : msg.content.map((part) => {
35
+ if (part.type === "text")
36
+ return { type: "text", text: part.text };
37
+ if (part.type === "thinking")
38
+ return { type: "thinking", thinking: part.text, signature: "" };
39
+ if (part.type === "tool_call")
40
+ return {
41
+ type: "tool_use",
42
+ id: part.id,
43
+ name: part.name,
44
+ input: part.args,
45
+ };
46
+ // image content shouldn't appear in assistant messages
47
+ return { type: "text", text: "" };
48
+ });
49
+ out.push({ role: "assistant", content });
50
+ continue;
51
+ }
52
+ if (msg.role === "tool") {
53
+ for (const result of msg.content) {
54
+ out.push({
55
+ role: "user",
56
+ content: [
57
+ {
58
+ type: "tool_result",
59
+ tool_use_id: result.toolCallId,
60
+ content: result.content,
61
+ is_error: result.isError,
62
+ },
63
+ ],
64
+ });
65
+ }
66
+ }
67
+ }
68
+ return { system, messages: out };
69
+ }
70
+ export function toAnthropicTools(tools) {
71
+ return tools.map((tool) => ({
72
+ name: tool.name,
73
+ description: tool.description,
74
+ input_schema: zodToJsonSchema(tool.parameters),
75
+ }));
76
+ }
77
+ export function toAnthropicToolChoice(choice) {
78
+ if (choice === "auto")
79
+ return { type: "auto" };
80
+ if (choice === "none")
81
+ return { type: "auto" }; // Anthropic has no "none" — omit tools instead
82
+ if (choice === "required")
83
+ return { type: "any" };
84
+ return { type: "tool", name: choice.name };
85
+ }
86
+ export function toAnthropicThinking(level, maxTokens) {
87
+ const budgetMap = {
88
+ low: Math.max(1024, Math.floor(maxTokens * 0.25)),
89
+ medium: Math.max(2048, Math.floor(maxTokens * 0.5)),
90
+ high: Math.max(4096, maxTokens),
91
+ };
92
+ const budget = budgetMap[level];
93
+ return {
94
+ thinking: { type: "enabled", budget_tokens: budget },
95
+ maxTokens: maxTokens + budget,
96
+ };
97
+ }
98
+ // ── OpenAI Transforms ──────────────────────────────────────
99
+ export function toOpenAIMessages(messages) {
100
+ const out = [];
101
+ for (const msg of messages) {
102
+ if (msg.role === "system") {
103
+ out.push({ role: "system", content: msg.content });
104
+ continue;
105
+ }
106
+ if (msg.role === "user") {
107
+ if (typeof msg.content === "string") {
108
+ out.push({ role: "user", content: msg.content });
109
+ }
110
+ else {
111
+ out.push({
112
+ role: "user",
113
+ content: msg.content.map((part) => {
114
+ if (part.type === "text")
115
+ return { type: "text", text: part.text };
116
+ return {
117
+ type: "image_url",
118
+ image_url: {
119
+ url: `data:${part.mediaType};base64,${part.data}`,
120
+ },
121
+ };
122
+ }),
123
+ });
124
+ }
125
+ continue;
126
+ }
127
+ if (msg.role === "assistant") {
128
+ const parts = typeof msg.content === "string" ? msg.content : undefined;
129
+ const toolCalls = typeof msg.content !== "string"
130
+ ? msg.content
131
+ .filter((p) => p.type === "tool_call")
132
+ .map((tc) => ({
133
+ id: tc.id,
134
+ type: "function",
135
+ function: { name: tc.name, arguments: JSON.stringify(tc.args) },
136
+ }))
137
+ : undefined;
138
+ const textParts = typeof msg.content !== "string"
139
+ ? msg.content
140
+ .filter((p) => p.type === "text")
141
+ .map((p) => p.text)
142
+ .join("")
143
+ : undefined;
144
+ out.push({
145
+ role: "assistant",
146
+ content: parts ?? textParts ?? null,
147
+ ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),
148
+ });
149
+ continue;
150
+ }
151
+ if (msg.role === "tool") {
152
+ for (const result of msg.content) {
153
+ out.push({
154
+ role: "tool",
155
+ tool_call_id: result.toolCallId,
156
+ content: result.content,
157
+ });
158
+ }
159
+ }
160
+ }
161
+ return out;
162
+ }
163
+ export function toOpenAITools(tools) {
164
+ return tools.map((tool) => ({
165
+ type: "function",
166
+ function: {
167
+ name: tool.name,
168
+ description: tool.description,
169
+ parameters: zodToJsonSchema(tool.parameters),
170
+ },
171
+ }));
172
+ }
173
+ export function toOpenAIToolChoice(choice) {
174
+ if (choice === "auto")
175
+ return "auto";
176
+ if (choice === "none")
177
+ return "none";
178
+ if (choice === "required")
179
+ return "required";
180
+ return { type: "function", function: { name: choice.name } };
181
+ }
182
+ export function toOpenAIReasoningEffort(level) {
183
+ return level;
184
+ }
185
+ // ── Response Normalization ─────────────────────────────────
186
+ export function normalizeAnthropicStopReason(reason) {
187
+ switch (reason) {
188
+ case "tool_use":
189
+ return "tool_use";
190
+ case "max_tokens":
191
+ return "max_tokens";
192
+ default:
193
+ return "end_turn";
194
+ }
195
+ }
196
+ export function normalizeOpenAIStopReason(reason) {
197
+ switch (reason) {
198
+ case "tool_calls":
199
+ return "tool_use";
200
+ case "length":
201
+ return "max_tokens";
202
+ default:
203
+ return "end_turn";
204
+ }
205
+ }
206
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/providers/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { StreamOptions } from "./types.js";
2
+ import type { StreamResult } from "./utils/event-stream.js";
3
+ /**
4
+ * Unified streaming entry point. Returns a StreamResult that is both
5
+ * an async iterable (for streaming events) and thenable (await for
6
+ * the final response).
7
+ *
8
+ * ```ts
9
+ * // Stream events
10
+ * for await (const event of stream({ provider: "anthropic", model: "claude-sonnet-4-6", messages })) {
11
+ * if (event.type === "text_delta") process.stdout.write(event.text);
12
+ * }
13
+ *
14
+ * // Or just await the final message
15
+ * const response = await stream({ provider: "openai", model: "gpt-4.1", messages });
16
+ * ```
17
+ */
18
+ export declare function stream(options: StreamOptions): StreamResult;
19
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAK5D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAe3D"}
package/dist/stream.js ADDED
@@ -0,0 +1,34 @@
1
+ import { GGAIError } from "./errors.js";
2
+ import { streamAnthropic } from "./providers/anthropic.js";
3
+ import { streamOpenAI } from "./providers/openai.js";
4
+ import { streamOpenAICodex } from "./providers/openai-codex.js";
5
+ /**
6
+ * Unified streaming entry point. Returns a StreamResult that is both
7
+ * an async iterable (for streaming events) and thenable (await for
8
+ * the final response).
9
+ *
10
+ * ```ts
11
+ * // Stream events
12
+ * for await (const event of stream({ provider: "anthropic", model: "claude-sonnet-4-6", messages })) {
13
+ * if (event.type === "text_delta") process.stdout.write(event.text);
14
+ * }
15
+ *
16
+ * // Or just await the final message
17
+ * const response = await stream({ provider: "openai", model: "gpt-4.1", messages });
18
+ * ```
19
+ */
20
+ export function stream(options) {
21
+ switch (options.provider) {
22
+ case "anthropic":
23
+ return streamAnthropic(options);
24
+ case "openai":
25
+ // Use codex endpoint for OAuth tokens (have accountId)
26
+ if (options.accountId) {
27
+ return streamOpenAICodex(options);
28
+ }
29
+ return streamOpenAI(options);
30
+ default:
31
+ throw new GGAIError(`Unknown provider: ${options.provider}. Supported: "anthropic", "openai"`);
32
+ }
33
+ }
34
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,MAAM,CAAC,OAAsB;IAC3C,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,WAAW;YACd,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;QAClC,KAAK,QAAQ;YACX,uDAAuD;YACvD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/B;YACE,MAAM,IAAI,SAAS,CACjB,qBAAqB,OAAO,CAAC,QAAkB,oCAAoC,CACpF,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,111 @@
1
+ import type { z } from "zod";
2
+ export type Provider = "anthropic" | "openai";
3
+ export type ThinkingLevel = "low" | "medium" | "high";
4
+ export interface TextContent {
5
+ type: "text";
6
+ text: string;
7
+ }
8
+ export interface ThinkingContent {
9
+ type: "thinking";
10
+ text: string;
11
+ }
12
+ export interface ImageContent {
13
+ type: "image";
14
+ mediaType: string;
15
+ data: string;
16
+ }
17
+ export interface ToolCall {
18
+ type: "tool_call";
19
+ id: string;
20
+ name: string;
21
+ args: Record<string, unknown>;
22
+ }
23
+ export interface ToolResult {
24
+ type: "tool_result";
25
+ toolCallId: string;
26
+ content: string;
27
+ isError?: boolean;
28
+ }
29
+ export type ContentPart = TextContent | ThinkingContent | ImageContent | ToolCall;
30
+ export interface SystemMessage {
31
+ role: "system";
32
+ content: string;
33
+ }
34
+ export interface UserMessage {
35
+ role: "user";
36
+ content: string | (TextContent | ImageContent)[];
37
+ }
38
+ export interface AssistantMessage {
39
+ role: "assistant";
40
+ content: string | ContentPart[];
41
+ }
42
+ export interface ToolResultMessage {
43
+ role: "tool";
44
+ content: ToolResult[];
45
+ }
46
+ export type Message = SystemMessage | UserMessage | AssistantMessage | ToolResultMessage;
47
+ export interface Tool {
48
+ name: string;
49
+ description: string;
50
+ parameters: z.ZodType;
51
+ }
52
+ export type ToolChoice = "auto" | "none" | "required" | {
53
+ name: string;
54
+ };
55
+ export interface TextDeltaEvent {
56
+ type: "text_delta";
57
+ text: string;
58
+ }
59
+ export interface ThinkingDeltaEvent {
60
+ type: "thinking_delta";
61
+ text: string;
62
+ }
63
+ export interface ToolCallDeltaEvent {
64
+ type: "toolcall_delta";
65
+ id: string;
66
+ name: string;
67
+ argsJson: string;
68
+ }
69
+ export interface ToolCallDoneEvent {
70
+ type: "toolcall_done";
71
+ id: string;
72
+ name: string;
73
+ args: Record<string, unknown>;
74
+ }
75
+ export interface DoneEvent {
76
+ type: "done";
77
+ stopReason: StopReason;
78
+ }
79
+ export interface ErrorEvent {
80
+ type: "error";
81
+ error: Error;
82
+ }
83
+ export type StreamEvent = TextDeltaEvent | ThinkingDeltaEvent | ToolCallDeltaEvent | ToolCallDoneEvent | DoneEvent | ErrorEvent;
84
+ export type StopReason = "end_turn" | "tool_use" | "max_tokens" | "error";
85
+ export interface StreamResponse {
86
+ message: AssistantMessage;
87
+ stopReason: StopReason;
88
+ usage: Usage;
89
+ }
90
+ export interface Usage {
91
+ inputTokens: number;
92
+ outputTokens: number;
93
+ }
94
+ export interface StreamOptions {
95
+ provider: Provider;
96
+ model: string;
97
+ messages: Message[];
98
+ tools?: Tool[];
99
+ toolChoice?: ToolChoice;
100
+ maxTokens?: number;
101
+ temperature?: number;
102
+ topP?: number;
103
+ stop?: string[];
104
+ thinking?: ThinkingLevel;
105
+ apiKey?: string;
106
+ baseUrl?: string;
107
+ signal?: AbortSignal;
108
+ /** OpenAI ChatGPT account ID (from OAuth JWT) for codex endpoint */
109
+ accountId?: string;
110
+ }
111
+ //# 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import type { StreamEvent, StreamResponse } from "../types.js";
2
+ /**
3
+ * Push-based async iterable. Producers push events, consumers
4
+ * iterate with `for await`. Also supports thenable so you can
5
+ * `await stream(...)` directly to get the final response.
6
+ */
7
+ export declare class EventStream<T = StreamEvent> implements AsyncIterable<T> {
8
+ private queue;
9
+ private resolve;
10
+ private done;
11
+ private error;
12
+ push(event: T): void;
13
+ close(): void;
14
+ abort(error: Error): void;
15
+ [Symbol.asyncIterator](): AsyncIterator<T>;
16
+ }
17
+ /**
18
+ * Wraps EventStream and adds a `.response` promise that resolves
19
+ * to the final StreamResponse. Also implements thenable so:
20
+ *
21
+ * const msg = await stream({...}) // awaits response
22
+ * for await (const e of stream({...})) {} // iterates events
23
+ */
24
+ export declare class StreamResult implements AsyncIterable<StreamEvent> {
25
+ readonly events: EventStream<StreamEvent>;
26
+ readonly response: Promise<StreamResponse>;
27
+ private resolveResponse;
28
+ private rejectResponse;
29
+ constructor();
30
+ push(event: StreamEvent): void;
31
+ complete(response: StreamResponse): void;
32
+ abort(error: Error): void;
33
+ [Symbol.asyncIterator](): AsyncIterator<StreamEvent>;
34
+ then<TResult1 = StreamResponse, TResult2 = never>(onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
35
+ private drainEvents;
36
+ }
37
+ //# 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,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D;;;;GAIG;AACH,qBAAa,WAAW,CAAC,CAAC,GAAG,WAAW,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAsB;IAEnC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAMpB,KAAK,IAAI,IAAI;IAMb,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAOlB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;CAYlD;AAED;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,aAAa,CAAC,WAAW,CAAC;IAC7D,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3C,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,cAAc,CAAsB;;IAU5C,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAI9B,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAKxC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKzB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC;IAIpD,IAAI,CAAC,QAAQ,GAAG,cAAc,EAAE,QAAQ,GAAG,KAAK,EAC9C,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAClF,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GAC1E,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAMjB,WAAW;CAK1B"}