ai-sdk-provider-goose 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.
package/dist/index.js ADDED
@@ -0,0 +1,430 @@
1
+ // src/goose-provider.ts
2
+ import { NoSuchModelError } from "@ai-sdk/provider";
3
+
4
+ // src/goose-language-model.ts
5
+ import { spawn } from "child_process";
6
+ import { createInterface } from "readline";
7
+ import { generateId } from "@ai-sdk/provider-utils";
8
+
9
+ // src/errors.ts
10
+ import { APICallError } from "@ai-sdk/provider";
11
+ function createAPICallError(message, metadata) {
12
+ return new APICallError({
13
+ message,
14
+ url: `goose://${metadata?.binPath || "goose"}`,
15
+ requestBodyValues: metadata?.args || [],
16
+ data: metadata,
17
+ isRetryable: false
18
+ });
19
+ }
20
+ function createTimeoutError(timeoutMs, metadata) {
21
+ return new APICallError({
22
+ message: `Goose CLI timed out after ${timeoutMs}ms`,
23
+ url: `goose://${metadata?.binPath || "goose"}`,
24
+ requestBodyValues: metadata?.args || [],
25
+ data: metadata,
26
+ isRetryable: true
27
+ });
28
+ }
29
+ function createProcessError(message, exitCode, stderr, metadata) {
30
+ return new APICallError({
31
+ message: `Goose CLI error: ${message}`,
32
+ url: `goose://${metadata?.binPath || "goose"}`,
33
+ requestBodyValues: metadata?.args || [],
34
+ data: { ...metadata, exitCode, stderr },
35
+ isRetryable: false
36
+ });
37
+ }
38
+
39
+ // src/goose-language-model.ts
40
+ var GooseLanguageModel = class {
41
+ specificationVersion = "v3";
42
+ provider = "goose";
43
+ modelId;
44
+ supportedUrls = {};
45
+ settings;
46
+ logger;
47
+ constructor(options) {
48
+ this.modelId = options.id;
49
+ this.settings = {
50
+ binPath: options.settings?.binPath || "goose",
51
+ args: options.settings?.args || [],
52
+ timeout: options.settings?.timeout || 12e4,
53
+ sessionName: options.settings?.sessionName,
54
+ resume: options.settings?.resume || false,
55
+ logger: options.settings?.logger
56
+ };
57
+ this.logger = this.settings.logger;
58
+ }
59
+ async doGenerate(options) {
60
+ const prompt = this.convertPromptToText(options.prompt);
61
+ const args = this.buildCLIArgs(prompt);
62
+ this.logger?.debug("Starting Goose CLI generation", {
63
+ binPath: this.settings.binPath,
64
+ args
65
+ });
66
+ const events = await this.spawnGooseProcess(args, options.abortSignal);
67
+ return this.eventsToGenerateResult(events);
68
+ }
69
+ async doStream(options) {
70
+ const prompt = this.convertPromptToText(options.prompt);
71
+ const args = this.buildCLIArgs(prompt);
72
+ this.logger?.debug("Starting Goose CLI streaming", {
73
+ binPath: this.settings.binPath,
74
+ args
75
+ });
76
+ const generator = this.createStreamFromProcess(args, options.abortSignal);
77
+ const stream = new ReadableStream({
78
+ async start(controller) {
79
+ try {
80
+ for await (const part of generator) {
81
+ controller.enqueue(part);
82
+ }
83
+ controller.close();
84
+ } catch (error) {
85
+ controller.error(error);
86
+ }
87
+ }
88
+ });
89
+ return {
90
+ stream
91
+ };
92
+ }
93
+ buildCLIArgs(prompt) {
94
+ const args = ["run", "--output-format", "stream-json", "-t", prompt];
95
+ if (this.settings.sessionName) {
96
+ args.push("--name", this.settings.sessionName);
97
+ }
98
+ if (this.settings.resume) {
99
+ args.push("--resume");
100
+ }
101
+ args.push(...this.settings.args);
102
+ return args;
103
+ }
104
+ async spawnGooseProcess(args, abortSignal) {
105
+ return new Promise((resolve, reject) => {
106
+ const events = [];
107
+ let stderr = "";
108
+ this.logger?.debug("Spawning Goose CLI", {
109
+ binPath: this.settings.binPath,
110
+ args
111
+ });
112
+ const child = spawn(this.settings.binPath, args);
113
+ const timeout = setTimeout(() => {
114
+ child.kill();
115
+ reject(
116
+ createTimeoutError(this.settings.timeout, {
117
+ binPath: this.settings.binPath,
118
+ args
119
+ })
120
+ );
121
+ }, this.settings.timeout);
122
+ const onAbort = () => {
123
+ clearTimeout(timeout);
124
+ child.kill("SIGTERM");
125
+ reject(
126
+ createAPICallError("Request aborted", {
127
+ binPath: this.settings.binPath,
128
+ args
129
+ })
130
+ );
131
+ };
132
+ if (abortSignal) {
133
+ if (abortSignal.aborted) {
134
+ onAbort();
135
+ return;
136
+ }
137
+ abortSignal.addEventListener("abort", onAbort, { once: true });
138
+ }
139
+ const cleanup = () => {
140
+ clearTimeout(timeout);
141
+ if (abortSignal) {
142
+ abortSignal.removeEventListener("abort", onAbort);
143
+ }
144
+ };
145
+ const rl = createInterface({ input: child.stdout });
146
+ rl.on("line", (line) => {
147
+ try {
148
+ const event = JSON.parse(line);
149
+ events.push(event);
150
+ this.logger?.debug("Received event", event);
151
+ } catch (err) {
152
+ this.logger?.warn("Failed to parse line", { line, err });
153
+ }
154
+ });
155
+ child.stderr.on("data", (data) => {
156
+ stderr += data.toString();
157
+ });
158
+ child.on("error", (error) => {
159
+ cleanup();
160
+ reject(
161
+ createAPICallError(`Failed to spawn Goose CLI: ${error.message}`, {
162
+ binPath: this.settings.binPath,
163
+ args
164
+ })
165
+ );
166
+ });
167
+ child.on("close", (code) => {
168
+ cleanup();
169
+ if (code !== 0 && code !== null) {
170
+ reject(
171
+ createProcessError(
172
+ `Goose CLI exited with code ${code}`,
173
+ code,
174
+ stderr,
175
+ { binPath: this.settings.binPath, args }
176
+ )
177
+ );
178
+ } else {
179
+ resolve(events);
180
+ }
181
+ });
182
+ });
183
+ }
184
+ async *createStreamFromProcess(args, abortSignal) {
185
+ const child = spawn(this.settings.binPath, args);
186
+ const rl = createInterface({ input: child.stdout });
187
+ let stderr = "";
188
+ child.stderr.on("data", (data) => {
189
+ stderr += data.toString();
190
+ });
191
+ const onAbort = () => {
192
+ child.kill("SIGTERM");
193
+ };
194
+ if (abortSignal) {
195
+ if (abortSignal.aborted) {
196
+ child.kill("SIGTERM");
197
+ throw createAPICallError("Request aborted", {
198
+ binPath: this.settings.binPath,
199
+ args
200
+ });
201
+ }
202
+ abortSignal.addEventListener("abort", onAbort, { once: true });
203
+ }
204
+ let currentTextPartId = null;
205
+ let textStartEmitted = false;
206
+ try {
207
+ for await (const line of rl) {
208
+ try {
209
+ const event = JSON.parse(line);
210
+ this.logger?.debug("Stream event", event);
211
+ if (event.type === "message" && event.message) {
212
+ const msg = event.message;
213
+ if (msg.role === "assistant") {
214
+ for (const content of msg.content) {
215
+ if (content.type === "text" && content.text) {
216
+ if (!textStartEmitted) {
217
+ currentTextPartId = generateId();
218
+ textStartEmitted = true;
219
+ }
220
+ if (currentTextPartId) {
221
+ yield {
222
+ type: "text-delta",
223
+ id: currentTextPartId,
224
+ delta: content.text
225
+ };
226
+ }
227
+ } else if (content.type === "toolRequest") {
228
+ textStartEmitted = false;
229
+ currentTextPartId = null;
230
+ if (content.toolCall?.value) {
231
+ yield {
232
+ type: "tool-call",
233
+ toolCallId: content.id || generateId(),
234
+ toolName: content.toolCall.value.name,
235
+ input: JSON.stringify(content.toolCall.value.arguments)
236
+ };
237
+ }
238
+ }
239
+ }
240
+ } else if (msg.role === "user") {
241
+ for (const content of msg.content) {
242
+ if (content.type === "toolResponse" && content.toolResult) {
243
+ const result = content.toolResult.value;
244
+ const resultText = Array.isArray(result.content) ? result.content.map((c) => c.text || JSON.stringify(c)).join("\n") : JSON.stringify(result.content);
245
+ yield {
246
+ type: "tool-result",
247
+ toolCallId: content.id || generateId(),
248
+ toolName: "unknown",
249
+ result: resultText
250
+ };
251
+ }
252
+ }
253
+ }
254
+ } else if (event.type === "complete") {
255
+ yield {
256
+ type: "finish",
257
+ finishReason: {
258
+ unified: "stop",
259
+ raw: "stop"
260
+ },
261
+ usage: {
262
+ inputTokens: {
263
+ total: 0,
264
+ noCache: void 0,
265
+ cacheRead: void 0,
266
+ cacheWrite: void 0
267
+ },
268
+ outputTokens: {
269
+ total: event.total_tokens || 0,
270
+ text: event.total_tokens || 0,
271
+ reasoning: void 0
272
+ }
273
+ }
274
+ };
275
+ } else if (event.type === "error") {
276
+ throw createAPICallError(event.error || "Unknown error", {
277
+ binPath: this.settings.binPath,
278
+ args
279
+ });
280
+ }
281
+ } catch (err) {
282
+ if (err instanceof Error && "isRetryable" in err) {
283
+ throw err;
284
+ }
285
+ this.logger?.warn("Failed to parse stream line", { line, err });
286
+ }
287
+ }
288
+ } catch (err) {
289
+ child.kill();
290
+ if (abortSignal) {
291
+ abortSignal.removeEventListener("abort", onAbort);
292
+ }
293
+ throw err;
294
+ }
295
+ const exitCode = await new Promise((resolve) => {
296
+ child.on("close", (code) => resolve(code || 0));
297
+ });
298
+ if (abortSignal) {
299
+ abortSignal.removeEventListener("abort", onAbort);
300
+ }
301
+ if (exitCode !== 0) {
302
+ throw createProcessError(
303
+ `Goose CLI exited with code ${exitCode}`,
304
+ exitCode,
305
+ stderr,
306
+ { binPath: this.settings.binPath, args }
307
+ );
308
+ }
309
+ }
310
+ convertPromptToText(prompt) {
311
+ if (Array.isArray(prompt)) {
312
+ const messages = [];
313
+ for (const message of prompt) {
314
+ if (!message || typeof message !== "object") continue;
315
+ switch (message.role) {
316
+ case "system":
317
+ if (typeof message.content === "string") {
318
+ messages.unshift(`System: ${message.content}`);
319
+ }
320
+ break;
321
+ case "user":
322
+ if (typeof message.content === "string") {
323
+ messages.push(message.content);
324
+ } else if (Array.isArray(message.content)) {
325
+ for (const part of message.content) {
326
+ if (part.type === "text") {
327
+ messages.push(part.text);
328
+ }
329
+ }
330
+ }
331
+ break;
332
+ }
333
+ }
334
+ return messages.join("\n\n");
335
+ }
336
+ return String(prompt);
337
+ }
338
+ eventsToGenerateResult(events) {
339
+ let text = "";
340
+ let totalTokens = 0;
341
+ const warnings = [];
342
+ for (const event of events) {
343
+ if (event.type === "message" && event.message) {
344
+ const msg = event.message;
345
+ if (msg.role === "assistant") {
346
+ for (const content of msg.content) {
347
+ if (content.type === "text" && content.text) {
348
+ text += content.text;
349
+ }
350
+ }
351
+ }
352
+ } else if (event.type === "complete") {
353
+ totalTokens = event.total_tokens || 0;
354
+ } else if (event.type === "error") {
355
+ throw createAPICallError(event.error || "Unknown error", {
356
+ binPath: this.settings.binPath
357
+ });
358
+ }
359
+ }
360
+ return {
361
+ content: [{ type: "text", text }],
362
+ finishReason: {
363
+ unified: "stop",
364
+ raw: "stop"
365
+ },
366
+ usage: {
367
+ inputTokens: {
368
+ total: 0,
369
+ noCache: void 0,
370
+ cacheRead: void 0,
371
+ cacheWrite: void 0
372
+ },
373
+ outputTokens: {
374
+ total: totalTokens,
375
+ text: totalTokens,
376
+ reasoning: void 0
377
+ }
378
+ },
379
+ warnings
380
+ };
381
+ }
382
+ };
383
+
384
+ // src/goose-provider.ts
385
+ function createGoose(settings = {}) {
386
+ const createModel = (modelId, modelSettings) => {
387
+ if (modelId !== "goose" && typeof modelId !== "string") {
388
+ throw new NoSuchModelError({
389
+ modelId: String(modelId),
390
+ modelType: "languageModel"
391
+ });
392
+ }
393
+ const mergedSettings = {
394
+ ...settings,
395
+ ...modelSettings
396
+ };
397
+ return new GooseLanguageModel({
398
+ id: modelId,
399
+ settings: mergedSettings
400
+ });
401
+ };
402
+ const provider = Object.assign(createModel, {
403
+ specificationVersion: "v3",
404
+ languageModel: createModel,
405
+ chat: createModel,
406
+ embeddingModel: (modelId) => {
407
+ throw new NoSuchModelError({
408
+ modelId,
409
+ modelType: "embeddingModel"
410
+ });
411
+ },
412
+ imageModel: (modelId) => {
413
+ throw new NoSuchModelError({
414
+ modelId,
415
+ modelType: "imageModel"
416
+ });
417
+ }
418
+ });
419
+ return provider;
420
+ }
421
+ var goose = createGoose();
422
+ export {
423
+ GooseLanguageModel,
424
+ createAPICallError,
425
+ createGoose,
426
+ createProcessError,
427
+ createTimeoutError,
428
+ goose
429
+ };
430
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/goose-provider.ts","../src/goose-language-model.ts","../src/errors.ts"],"sourcesContent":["import type { LanguageModelV3, ProviderV3 } from '@ai-sdk/provider';\nimport { NoSuchModelError } from '@ai-sdk/provider';\nimport {\n GooseLanguageModel,\n type GooseModelId,\n} from './goose-language-model.js';\nimport type { GooseSettings } from './types.js';\n\n/**\n * Goose provider interface extending AI SDK ProviderV3.\n */\nexport interface GooseProvider extends ProviderV3 {\n /**\n * Create a language model (callable shorthand).\n */\n (modelId: GooseModelId, settings?: GooseSettings): LanguageModelV3;\n\n /**\n * Create a language model.\n */\n languageModel(modelId: GooseModelId, settings?: GooseSettings): LanguageModelV3;\n\n /**\n * Alias for languageModel (follows AI SDK pattern).\n */\n chat(modelId: GooseModelId, settings?: GooseSettings): LanguageModelV3;\n\n /**\n * Embedding models are not supported.\n */\n embeddingModel(modelId: string): never;\n\n /**\n * Image models are not supported.\n */\n imageModel(modelId: string): never;\n}\n\n/**\n * Provider-level settings for Goose.\n */\nexport interface GooseProviderSettings extends GooseSettings {}\n\n/**\n * Creates a Goose provider with the specified settings.\n *\n * @param settings Provider-level settings\n * @returns Goose provider instance\n *\n * @example\n * ```typescript\n * import { createGoose } from 'ai-sdk-provider-goose';\n *\n * const provider = createGoose({\n * binPath: '/path/to/goose',\n * timeout: 60000,\n * });\n *\n * const model = provider('goose');\n * ```\n */\nexport function createGoose(\n settings: GooseProviderSettings = {}\n): GooseProvider {\n const createModel = (\n modelId: GooseModelId,\n modelSettings?: GooseSettings\n ): LanguageModelV3 => {\n if (modelId !== 'goose' && typeof modelId !== 'string') {\n throw new NoSuchModelError({\n modelId: String(modelId),\n modelType: 'languageModel',\n });\n }\n\n const mergedSettings: GooseSettings = {\n ...settings,\n ...modelSettings,\n };\n\n return new GooseLanguageModel({\n id: modelId,\n settings: mergedSettings,\n });\n };\n\n const provider = Object.assign(createModel, {\n specificationVersion: 'v3' as const,\n languageModel: createModel,\n chat: createModel,\n embeddingModel: (modelId: string): never => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n },\n imageModel: (modelId: string): never => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'imageModel',\n });\n },\n });\n\n return provider;\n}\n\n/**\n * Default Goose provider instance.\n *\n * @example\n * ```typescript\n * import { goose } from 'ai-sdk-provider-goose';\n * import { generateText } from 'ai';\n *\n * const result = await generateText({\n * model: goose('goose'),\n * prompt: 'Hello!',\n * });\n * ```\n */\nexport const goose: GooseProvider = createGoose();\n","import type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n LanguageModelV3StreamPart,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport { generateId } from '@ai-sdk/provider-utils';\nimport type { GooseSettings, GooseStreamEvent, Logger } from './types.js';\nimport {\n createAPICallError,\n createTimeoutError,\n createProcessError,\n} from './errors.js';\n\nexport type GooseModelId = 'goose' | (string & {});\n\nexport interface GooseLanguageModelOptions {\n id: GooseModelId;\n settings?: GooseSettings;\n}\n\n/**\n * Goose CLI language model implementation for AI SDK.\n */\nexport class GooseLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3' as const;\n readonly provider = 'goose';\n readonly modelId: string;\n readonly supportedUrls = {};\n\n private settings: Required<Omit<GooseSettings, 'sessionName' | 'resume' | 'logger'>> & {\n sessionName?: string;\n resume?: boolean;\n logger?: Logger;\n };\n private logger?: Logger;\n\n constructor(options: GooseLanguageModelOptions) {\n this.modelId = options.id;\n this.settings = {\n binPath: options.settings?.binPath || 'goose',\n args: options.settings?.args || [],\n timeout: options.settings?.timeout || 120000,\n sessionName: options.settings?.sessionName,\n resume: options.settings?.resume || false,\n logger: options.settings?.logger,\n };\n this.logger = this.settings.logger;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3GenerateResult> {\n const prompt = this.convertPromptToText(options.prompt);\n const args = this.buildCLIArgs(prompt);\n\n this.logger?.debug('Starting Goose CLI generation', {\n binPath: this.settings.binPath,\n args,\n });\n\n const events = await this.spawnGooseProcess(args, options.abortSignal);\n return this.eventsToGenerateResult(events);\n }\n\n async doStream(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3StreamResult> {\n const prompt = this.convertPromptToText(options.prompt);\n const args = this.buildCLIArgs(prompt);\n\n this.logger?.debug('Starting Goose CLI streaming', {\n binPath: this.settings.binPath,\n args,\n });\n\n const generator = this.createStreamFromProcess(args, options.abortSignal);\n\n // Convert async generator to ReadableStream\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n try {\n for await (const part of generator) {\n controller.enqueue(part);\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return {\n stream,\n };\n }\n\n private buildCLIArgs(prompt: string): string[] {\n const args = ['run', '--output-format', 'stream-json', '-t', prompt];\n\n if (this.settings.sessionName) {\n args.push('--name', this.settings.sessionName);\n }\n\n if (this.settings.resume) {\n args.push('--resume');\n }\n\n args.push(...this.settings.args);\n return args;\n }\n\n private async spawnGooseProcess(\n args: string[],\n abortSignal?: AbortSignal\n ): Promise<GooseStreamEvent[]> {\n return new Promise((resolve, reject) => {\n const events: GooseStreamEvent[] = [];\n let stderr = '';\n\n this.logger?.debug('Spawning Goose CLI', {\n binPath: this.settings.binPath,\n args,\n });\n\n const child = spawn(this.settings.binPath, args);\n\n const timeout = setTimeout(() => {\n child.kill();\n reject(\n createTimeoutError(this.settings.timeout, {\n binPath: this.settings.binPath,\n args,\n })\n );\n }, this.settings.timeout);\n\n // Handle abort signal\n const onAbort = () => {\n clearTimeout(timeout);\n child.kill('SIGTERM');\n reject(\n createAPICallError('Request aborted', {\n binPath: this.settings.binPath,\n args,\n })\n );\n };\n\n if (abortSignal) {\n if (abortSignal.aborted) {\n onAbort();\n return;\n }\n abortSignal.addEventListener('abort', onAbort, { once: true });\n }\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (abortSignal) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n };\n\n const rl = createInterface({ input: child.stdout });\n\n rl.on('line', (line) => {\n try {\n const event = JSON.parse(line) as GooseStreamEvent;\n events.push(event);\n this.logger?.debug('Received event', event);\n } catch (err) {\n this.logger?.warn('Failed to parse line', { line, err });\n }\n });\n\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('error', (error) => {\n cleanup();\n reject(\n createAPICallError(`Failed to spawn Goose CLI: ${error.message}`, {\n binPath: this.settings.binPath,\n args,\n })\n );\n });\n\n child.on('close', (code) => {\n cleanup();\n\n if (code !== 0 && code !== null) {\n reject(\n createProcessError(\n `Goose CLI exited with code ${code}`,\n code,\n stderr,\n { binPath: this.settings.binPath, args }\n )\n );\n } else {\n resolve(events);\n }\n });\n });\n }\n\n private async *createStreamFromProcess(\n args: string[],\n abortSignal?: AbortSignal\n ): AsyncGenerator<LanguageModelV3StreamPart> {\n const child = spawn(this.settings.binPath, args);\n const rl = createInterface({ input: child.stdout });\n\n let stderr = '';\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n // Handle abort signal\n const onAbort = () => {\n child.kill('SIGTERM');\n };\n\n if (abortSignal) {\n if (abortSignal.aborted) {\n child.kill('SIGTERM');\n throw createAPICallError('Request aborted', {\n binPath: this.settings.binPath,\n args,\n });\n }\n abortSignal.addEventListener('abort', onAbort, { once: true });\n }\n\n let currentTextPartId: string | null = null;\n let textStartEmitted = false;\n\n try {\n for await (const line of rl) {\n try {\n const event = JSON.parse(line) as GooseStreamEvent;\n this.logger?.debug('Stream event', event);\n\n if (event.type === 'message' && event.message) {\n const msg = event.message;\n\n if (msg.role === 'assistant') {\n for (const content of msg.content) {\n if (content.type === 'text' && content.text) {\n if (!textStartEmitted) {\n currentTextPartId = generateId();\n textStartEmitted = true;\n }\n if (currentTextPartId) {\n yield {\n type: 'text-delta',\n id: currentTextPartId,\n delta: content.text,\n };\n }\n } else if (content.type === 'toolRequest') {\n textStartEmitted = false;\n currentTextPartId = null;\n\n if (content.toolCall?.value) {\n yield {\n type: 'tool-call',\n toolCallId: content.id || generateId(),\n toolName: content.toolCall.value.name,\n input: JSON.stringify(content.toolCall.value.arguments),\n };\n }\n }\n }\n } else if (msg.role === 'user') {\n for (const content of msg.content) {\n if (content.type === 'toolResponse' && content.toolResult) {\n const result = content.toolResult.value;\n const resultText = Array.isArray(result.content)\n ? result.content\n .map((c: any) => c.text || JSON.stringify(c))\n .join('\\n')\n : JSON.stringify(result.content);\n\n yield {\n type: 'tool-result',\n toolCallId: content.id || generateId(),\n toolName: 'unknown',\n result: resultText,\n };\n }\n }\n }\n } else if (event.type === 'complete') {\n yield {\n type: 'finish',\n finishReason: {\n unified: 'stop',\n raw: 'stop',\n },\n usage: {\n inputTokens: {\n total: 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: event.total_tokens || 0,\n text: event.total_tokens || 0,\n reasoning: undefined,\n },\n },\n };\n } else if (event.type === 'error') {\n throw createAPICallError(event.error || 'Unknown error', {\n binPath: this.settings.binPath,\n args,\n });\n }\n } catch (err) {\n if (err instanceof Error && 'isRetryable' in err) {\n throw err;\n }\n this.logger?.warn('Failed to parse stream line', { line, err });\n }\n }\n } catch (err) {\n child.kill();\n if (abortSignal) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n throw err;\n }\n\n const exitCode = await new Promise<number>((resolve) => {\n child.on('close', (code) => resolve(code || 0));\n });\n\n if (abortSignal) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n\n if (exitCode !== 0) {\n throw createProcessError(\n `Goose CLI exited with code ${exitCode}`,\n exitCode,\n stderr,\n { binPath: this.settings.binPath, args }\n );\n }\n }\n\n private convertPromptToText(\n prompt: LanguageModelV3CallOptions['prompt']\n ): string {\n if (Array.isArray(prompt)) {\n const messages: string[] = [];\n\n for (const message of prompt) {\n if (!message || typeof message !== 'object') continue;\n\n switch (message.role) {\n case 'system':\n if (typeof message.content === 'string') {\n messages.unshift(`System: ${message.content}`);\n }\n break;\n case 'user':\n if (typeof message.content === 'string') {\n messages.push(message.content);\n } else if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === 'text') {\n messages.push(part.text);\n }\n }\n }\n break;\n }\n }\n\n return messages.join('\\n\\n');\n }\n\n return String(prompt);\n }\n\n private eventsToGenerateResult(\n events: GooseStreamEvent[]\n ): LanguageModelV3GenerateResult {\n let text = '';\n let totalTokens = 0;\n const warnings: SharedV3Warning[] = [];\n\n for (const event of events) {\n if (event.type === 'message' && event.message) {\n const msg = event.message;\n\n if (msg.role === 'assistant') {\n for (const content of msg.content) {\n if (content.type === 'text' && content.text) {\n text += content.text;\n }\n }\n }\n } else if (event.type === 'complete') {\n totalTokens = event.total_tokens || 0;\n } else if (event.type === 'error') {\n throw createAPICallError(event.error || 'Unknown error', {\n binPath: this.settings.binPath,\n });\n }\n }\n\n return {\n content: [{ type: 'text' as const, text }],\n finishReason: {\n unified: 'stop',\n raw: 'stop',\n },\n usage: {\n inputTokens: {\n total: 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: totalTokens,\n text: totalTokens,\n reasoning: undefined,\n },\n },\n warnings,\n };\n }\n}\n","import { APICallError } from '@ai-sdk/provider';\n\n/**\n * Metadata attached to errors from the Goose CLI provider.\n */\nexport interface GooseErrorMetadata {\n binPath?: string;\n args?: string[];\n exitCode?: number;\n stderr?: string;\n}\n\n/**\n * Creates a general API call error.\n */\nexport function createAPICallError(\n message: string,\n metadata?: GooseErrorMetadata\n): APICallError {\n return new APICallError({\n message,\n url: `goose://${metadata?.binPath || 'goose'}`,\n requestBodyValues: metadata?.args || [],\n data: metadata,\n isRetryable: false,\n });\n}\n\n/**\n * Creates a timeout error (retryable).\n */\nexport function createTimeoutError(\n timeoutMs: number,\n metadata?: GooseErrorMetadata\n): APICallError {\n return new APICallError({\n message: `Goose CLI timed out after ${timeoutMs}ms`,\n url: `goose://${metadata?.binPath || 'goose'}`,\n requestBodyValues: metadata?.args || [],\n data: metadata,\n isRetryable: true,\n });\n}\n\n/**\n * Creates a process error for non-zero exit codes.\n */\nexport function createProcessError(\n message: string,\n exitCode: number,\n stderr: string,\n metadata?: GooseErrorMetadata\n): APICallError {\n return new APICallError({\n message: `Goose CLI error: ${message}`,\n url: `goose://${metadata?.binPath || 'goose'}`,\n requestBodyValues: metadata?.args || [],\n data: { ...metadata, exitCode, stderr },\n isRetryable: false,\n });\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "ai-sdk-provider-goose",
3
+ "version": "0.1.0",
4
+ "description": "AI SDK v5 provider for Goose CLI",
5
+ "keywords": [
6
+ "ai-sdk",
7
+ "goose",
8
+ "cli",
9
+ "language-model",
10
+ "llm"
11
+ ],
12
+ "license": "MIT",
13
+ "author": "Evan Feenstra",
14
+ "type": "module",
15
+ "sideEffects": false,
16
+ "main": "./dist/index.cjs",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ "./package.json": "./package.json",
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "require": "./dist/index.cjs"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist/**/*",
29
+ "README.md",
30
+ "LICENSE"
31
+ ],
32
+ "scripts": {
33
+ "build": "tsup",
34
+ "clean": "rm -rf dist",
35
+ "dev": "tsup --watch",
36
+ "prepare": "npm run build",
37
+ "prepublishOnly": "npm run clean && npm run build",
38
+ "typecheck": "tsc --noEmit",
39
+ "example": "npm run build && npx tsx examples/runner.ts",
40
+ "test": "vitest run",
41
+ "test:watch": "vitest"
42
+ },
43
+ "dependencies": {
44
+ "@ai-sdk/provider": "^3.0.1",
45
+ "@ai-sdk/provider-utils": "^3.0.3"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "20.17.24",
49
+ "ai": "^6.0.11",
50
+ "tsup": "8.5.0",
51
+ "tsx": "^4.19.2",
52
+ "typescript": "5.6.3",
53
+ "vitest": "^2.1.8"
54
+ },
55
+ "engines": {
56
+ "node": ">=18"
57
+ }
58
+ }