ai-sdk-provider-goose 0.1.0 → 0.1.2
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.cjs +29 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +29 -16
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -83,13 +83,14 @@ var GooseLanguageModel = class {
|
|
|
83
83
|
timeout: options.settings?.timeout || 12e4,
|
|
84
84
|
sessionName: options.settings?.sessionName,
|
|
85
85
|
resume: options.settings?.resume || false,
|
|
86
|
-
logger: options.settings?.logger
|
|
86
|
+
logger: options.settings?.logger,
|
|
87
|
+
env: options.settings?.env
|
|
87
88
|
};
|
|
88
89
|
this.logger = this.settings.logger;
|
|
89
90
|
}
|
|
90
91
|
async doGenerate(options) {
|
|
91
|
-
const prompt = this.
|
|
92
|
-
const args = this.buildCLIArgs(prompt);
|
|
92
|
+
const { system, prompt } = this.extractPromptParts(options.prompt);
|
|
93
|
+
const args = this.buildCLIArgs(system, prompt);
|
|
93
94
|
this.logger?.debug("Starting Goose CLI generation", {
|
|
94
95
|
binPath: this.settings.binPath,
|
|
95
96
|
args
|
|
@@ -98,8 +99,8 @@ var GooseLanguageModel = class {
|
|
|
98
99
|
return this.eventsToGenerateResult(events);
|
|
99
100
|
}
|
|
100
101
|
async doStream(options) {
|
|
101
|
-
const prompt = this.
|
|
102
|
-
const args = this.buildCLIArgs(prompt);
|
|
102
|
+
const { system, prompt } = this.extractPromptParts(options.prompt);
|
|
103
|
+
const args = this.buildCLIArgs(system, prompt);
|
|
103
104
|
this.logger?.debug("Starting Goose CLI streaming", {
|
|
104
105
|
binPath: this.settings.binPath,
|
|
105
106
|
args
|
|
@@ -121,8 +122,12 @@ var GooseLanguageModel = class {
|
|
|
121
122
|
stream
|
|
122
123
|
};
|
|
123
124
|
}
|
|
124
|
-
buildCLIArgs(prompt) {
|
|
125
|
-
const args = ["run", "--output-format", "stream-json"
|
|
125
|
+
buildCLIArgs(system, prompt) {
|
|
126
|
+
const args = ["run", "--output-format", "stream-json"];
|
|
127
|
+
if (system) {
|
|
128
|
+
args.push("--system", system);
|
|
129
|
+
}
|
|
130
|
+
args.push("-t", prompt);
|
|
126
131
|
if (this.settings.sessionName) {
|
|
127
132
|
args.push("--name", this.settings.sessionName);
|
|
128
133
|
}
|
|
@@ -140,7 +145,9 @@ var GooseLanguageModel = class {
|
|
|
140
145
|
binPath: this.settings.binPath,
|
|
141
146
|
args
|
|
142
147
|
});
|
|
143
|
-
const child = (0, import_child_process.spawn)(this.settings.binPath, args
|
|
148
|
+
const child = (0, import_child_process.spawn)(this.settings.binPath, args, {
|
|
149
|
+
env: this.settings.env ? { ...process.env, ...this.settings.env } : process.env
|
|
150
|
+
});
|
|
144
151
|
const timeout = setTimeout(() => {
|
|
145
152
|
child.kill();
|
|
146
153
|
reject(
|
|
@@ -213,7 +220,9 @@ var GooseLanguageModel = class {
|
|
|
213
220
|
});
|
|
214
221
|
}
|
|
215
222
|
async *createStreamFromProcess(args, abortSignal) {
|
|
216
|
-
const child = (0, import_child_process.spawn)(this.settings.binPath, args
|
|
223
|
+
const child = (0, import_child_process.spawn)(this.settings.binPath, args, {
|
|
224
|
+
env: this.settings.env ? { ...process.env, ...this.settings.env } : process.env
|
|
225
|
+
});
|
|
217
226
|
const rl = (0, import_readline.createInterface)({ input: child.stdout });
|
|
218
227
|
let stderr = "";
|
|
219
228
|
child.stderr.on("data", (data) => {
|
|
@@ -338,33 +347,37 @@ var GooseLanguageModel = class {
|
|
|
338
347
|
);
|
|
339
348
|
}
|
|
340
349
|
}
|
|
341
|
-
|
|
350
|
+
extractPromptParts(prompt) {
|
|
342
351
|
if (Array.isArray(prompt)) {
|
|
343
|
-
|
|
352
|
+
let system;
|
|
353
|
+
const userMessages = [];
|
|
344
354
|
for (const message of prompt) {
|
|
345
355
|
if (!message || typeof message !== "object") continue;
|
|
346
356
|
switch (message.role) {
|
|
347
357
|
case "system":
|
|
348
358
|
if (typeof message.content === "string") {
|
|
349
|
-
|
|
359
|
+
system = message.content;
|
|
350
360
|
}
|
|
351
361
|
break;
|
|
352
362
|
case "user":
|
|
353
363
|
if (typeof message.content === "string") {
|
|
354
|
-
|
|
364
|
+
userMessages.push(message.content);
|
|
355
365
|
} else if (Array.isArray(message.content)) {
|
|
356
366
|
for (const part of message.content) {
|
|
357
367
|
if (part.type === "text") {
|
|
358
|
-
|
|
368
|
+
userMessages.push(part.text);
|
|
359
369
|
}
|
|
360
370
|
}
|
|
361
371
|
}
|
|
362
372
|
break;
|
|
363
373
|
}
|
|
364
374
|
}
|
|
365
|
-
return
|
|
375
|
+
return {
|
|
376
|
+
system,
|
|
377
|
+
prompt: userMessages.join("\n\n")
|
|
378
|
+
};
|
|
366
379
|
}
|
|
367
|
-
return String(prompt);
|
|
380
|
+
return { prompt: String(prompt) };
|
|
368
381
|
}
|
|
369
382
|
eventsToGenerateResult(events) {
|
|
370
383
|
let text = "";
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/goose-provider.ts","../src/goose-language-model.ts","../src/errors.ts"],"sourcesContent":["/**\n * AI SDK provider for Goose CLI.\n *\n * @module ai-sdk-provider-goose\n *\n * @example\n * ```typescript\n * import { goose } from 'ai-sdk-provider-goose';\n * import { generateText } from 'ai';\n *\n * // Basic usage\n * const result = await generateText({\n * model: goose('goose'),\n * prompt: 'What is 2+2?',\n * });\n *\n * console.log(result.text);\n *\n * // Session management\n * const model1 = goose('goose', { sessionName: 'my-session' });\n * await generateText({ model: model1, prompt: 'My name is Alice' });\n *\n * const model2 = goose('goose', { sessionName: 'my-session', resume: true });\n * await generateText({ model: model2, prompt: 'What is my name?' });\n * ```\n */\n\n// Provider exports\nexport { createGoose, goose } from './goose-provider.js';\nexport type {\n GooseProvider,\n GooseProviderSettings,\n} from './goose-provider.js';\n\n// Language model exports\nexport { GooseLanguageModel } from './goose-language-model.js';\nexport type {\n GooseModelId,\n GooseLanguageModelOptions,\n} from './goose-language-model.js';\n\n// Type exports\nexport type { GooseSettings, Logger } from './types.js';\n\n// Error utilities\nexport {\n createAPICallError,\n createTimeoutError,\n createProcessError,\n} from './errors.js';\nexport type { GooseErrorMetadata } from './errors.js';\n","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":["import_provider"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/goose-provider.ts","../src/goose-language-model.ts","../src/errors.ts"],"sourcesContent":["/**\n * AI SDK provider for Goose CLI.\n *\n * @module ai-sdk-provider-goose\n *\n * @example\n * ```typescript\n * import { goose } from 'ai-sdk-provider-goose';\n * import { generateText } from 'ai';\n *\n * // Basic usage\n * const result = await generateText({\n * model: goose('goose'),\n * prompt: 'What is 2+2?',\n * });\n *\n * console.log(result.text);\n *\n * // Session management\n * const model1 = goose('goose', { sessionName: 'my-session' });\n * await generateText({ model: model1, prompt: 'My name is Alice' });\n *\n * const model2 = goose('goose', { sessionName: 'my-session', resume: true });\n * await generateText({ model: model2, prompt: 'What is my name?' });\n * ```\n */\n\n// Provider exports\nexport { createGoose, goose } from './goose-provider.js';\nexport type {\n GooseProvider,\n GooseProviderSettings,\n} from './goose-provider.js';\n\n// Language model exports\nexport { GooseLanguageModel } from './goose-language-model.js';\nexport type {\n GooseModelId,\n GooseLanguageModelOptions,\n} from './goose-language-model.js';\n\n// Type exports\nexport type { GooseSettings, Logger } from './types.js';\n\n// Error utilities\nexport {\n createAPICallError,\n createTimeoutError,\n createProcessError,\n} from './errors.js';\nexport type { GooseErrorMetadata } from './errors.js';\n","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' | 'env'>> & {\n sessionName?: string;\n resume?: boolean;\n logger?: Logger;\n env?: Record<string, string>;\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 env: options.settings?.env,\n };\n this.logger = this.settings.logger;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3GenerateResult> {\n const { system, prompt } = this.extractPromptParts(options.prompt);\n const args = this.buildCLIArgs(system, 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 { system, prompt } = this.extractPromptParts(options.prompt);\n const args = this.buildCLIArgs(system, 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(system: string | undefined, prompt: string): string[] {\n const args = ['run', '--output-format', 'stream-json'];\n\n if (system) {\n args.push('--system', system);\n }\n\n args.push('-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 env: this.settings.env\n ? { ...process.env, ...this.settings.env }\n : process.env,\n });\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 env: this.settings.env\n ? { ...process.env, ...this.settings.env }\n : process.env,\n });\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 extractPromptParts(\n prompt: LanguageModelV3CallOptions['prompt']\n ): { system?: string; prompt: string } {\n if (Array.isArray(prompt)) {\n let system: string | undefined;\n const userMessages: 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 system = message.content;\n }\n break;\n case 'user':\n if (typeof message.content === 'string') {\n userMessages.push(message.content);\n } else if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === 'text') {\n userMessages.push(part.text);\n }\n }\n }\n break;\n }\n }\n\n return {\n system,\n prompt: userMessages.join('\\n\\n'),\n };\n }\n\n return { prompt: 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":["import_provider"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -36,6 +36,12 @@ interface GooseSettings {
|
|
|
36
36
|
* @default false
|
|
37
37
|
*/
|
|
38
38
|
resume?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Environment variables to pass to the Goose CLI process.
|
|
41
|
+
* These will be merged with the current process environment.
|
|
42
|
+
* @example { GOOSE_PROVIDER: 'anthropic' }
|
|
43
|
+
*/
|
|
44
|
+
env?: Record<string, string>;
|
|
39
45
|
}
|
|
40
46
|
/**
|
|
41
47
|
* Logger interface for debugging.
|
|
@@ -68,7 +74,7 @@ declare class GooseLanguageModel implements LanguageModelV3 {
|
|
|
68
74
|
private buildCLIArgs;
|
|
69
75
|
private spawnGooseProcess;
|
|
70
76
|
private createStreamFromProcess;
|
|
71
|
-
private
|
|
77
|
+
private extractPromptParts;
|
|
72
78
|
private eventsToGenerateResult;
|
|
73
79
|
}
|
|
74
80
|
|
package/dist/index.d.ts
CHANGED
|
@@ -36,6 +36,12 @@ interface GooseSettings {
|
|
|
36
36
|
* @default false
|
|
37
37
|
*/
|
|
38
38
|
resume?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Environment variables to pass to the Goose CLI process.
|
|
41
|
+
* These will be merged with the current process environment.
|
|
42
|
+
* @example { GOOSE_PROVIDER: 'anthropic' }
|
|
43
|
+
*/
|
|
44
|
+
env?: Record<string, string>;
|
|
39
45
|
}
|
|
40
46
|
/**
|
|
41
47
|
* Logger interface for debugging.
|
|
@@ -68,7 +74,7 @@ declare class GooseLanguageModel implements LanguageModelV3 {
|
|
|
68
74
|
private buildCLIArgs;
|
|
69
75
|
private spawnGooseProcess;
|
|
70
76
|
private createStreamFromProcess;
|
|
71
|
-
private
|
|
77
|
+
private extractPromptParts;
|
|
72
78
|
private eventsToGenerateResult;
|
|
73
79
|
}
|
|
74
80
|
|
package/dist/index.js
CHANGED
|
@@ -52,13 +52,14 @@ var GooseLanguageModel = class {
|
|
|
52
52
|
timeout: options.settings?.timeout || 12e4,
|
|
53
53
|
sessionName: options.settings?.sessionName,
|
|
54
54
|
resume: options.settings?.resume || false,
|
|
55
|
-
logger: options.settings?.logger
|
|
55
|
+
logger: options.settings?.logger,
|
|
56
|
+
env: options.settings?.env
|
|
56
57
|
};
|
|
57
58
|
this.logger = this.settings.logger;
|
|
58
59
|
}
|
|
59
60
|
async doGenerate(options) {
|
|
60
|
-
const prompt = this.
|
|
61
|
-
const args = this.buildCLIArgs(prompt);
|
|
61
|
+
const { system, prompt } = this.extractPromptParts(options.prompt);
|
|
62
|
+
const args = this.buildCLIArgs(system, prompt);
|
|
62
63
|
this.logger?.debug("Starting Goose CLI generation", {
|
|
63
64
|
binPath: this.settings.binPath,
|
|
64
65
|
args
|
|
@@ -67,8 +68,8 @@ var GooseLanguageModel = class {
|
|
|
67
68
|
return this.eventsToGenerateResult(events);
|
|
68
69
|
}
|
|
69
70
|
async doStream(options) {
|
|
70
|
-
const prompt = this.
|
|
71
|
-
const args = this.buildCLIArgs(prompt);
|
|
71
|
+
const { system, prompt } = this.extractPromptParts(options.prompt);
|
|
72
|
+
const args = this.buildCLIArgs(system, prompt);
|
|
72
73
|
this.logger?.debug("Starting Goose CLI streaming", {
|
|
73
74
|
binPath: this.settings.binPath,
|
|
74
75
|
args
|
|
@@ -90,8 +91,12 @@ var GooseLanguageModel = class {
|
|
|
90
91
|
stream
|
|
91
92
|
};
|
|
92
93
|
}
|
|
93
|
-
buildCLIArgs(prompt) {
|
|
94
|
-
const args = ["run", "--output-format", "stream-json"
|
|
94
|
+
buildCLIArgs(system, prompt) {
|
|
95
|
+
const args = ["run", "--output-format", "stream-json"];
|
|
96
|
+
if (system) {
|
|
97
|
+
args.push("--system", system);
|
|
98
|
+
}
|
|
99
|
+
args.push("-t", prompt);
|
|
95
100
|
if (this.settings.sessionName) {
|
|
96
101
|
args.push("--name", this.settings.sessionName);
|
|
97
102
|
}
|
|
@@ -109,7 +114,9 @@ var GooseLanguageModel = class {
|
|
|
109
114
|
binPath: this.settings.binPath,
|
|
110
115
|
args
|
|
111
116
|
});
|
|
112
|
-
const child = spawn(this.settings.binPath, args
|
|
117
|
+
const child = spawn(this.settings.binPath, args, {
|
|
118
|
+
env: this.settings.env ? { ...process.env, ...this.settings.env } : process.env
|
|
119
|
+
});
|
|
113
120
|
const timeout = setTimeout(() => {
|
|
114
121
|
child.kill();
|
|
115
122
|
reject(
|
|
@@ -182,7 +189,9 @@ var GooseLanguageModel = class {
|
|
|
182
189
|
});
|
|
183
190
|
}
|
|
184
191
|
async *createStreamFromProcess(args, abortSignal) {
|
|
185
|
-
const child = spawn(this.settings.binPath, args
|
|
192
|
+
const child = spawn(this.settings.binPath, args, {
|
|
193
|
+
env: this.settings.env ? { ...process.env, ...this.settings.env } : process.env
|
|
194
|
+
});
|
|
186
195
|
const rl = createInterface({ input: child.stdout });
|
|
187
196
|
let stderr = "";
|
|
188
197
|
child.stderr.on("data", (data) => {
|
|
@@ -307,33 +316,37 @@ var GooseLanguageModel = class {
|
|
|
307
316
|
);
|
|
308
317
|
}
|
|
309
318
|
}
|
|
310
|
-
|
|
319
|
+
extractPromptParts(prompt) {
|
|
311
320
|
if (Array.isArray(prompt)) {
|
|
312
|
-
|
|
321
|
+
let system;
|
|
322
|
+
const userMessages = [];
|
|
313
323
|
for (const message of prompt) {
|
|
314
324
|
if (!message || typeof message !== "object") continue;
|
|
315
325
|
switch (message.role) {
|
|
316
326
|
case "system":
|
|
317
327
|
if (typeof message.content === "string") {
|
|
318
|
-
|
|
328
|
+
system = message.content;
|
|
319
329
|
}
|
|
320
330
|
break;
|
|
321
331
|
case "user":
|
|
322
332
|
if (typeof message.content === "string") {
|
|
323
|
-
|
|
333
|
+
userMessages.push(message.content);
|
|
324
334
|
} else if (Array.isArray(message.content)) {
|
|
325
335
|
for (const part of message.content) {
|
|
326
336
|
if (part.type === "text") {
|
|
327
|
-
|
|
337
|
+
userMessages.push(part.text);
|
|
328
338
|
}
|
|
329
339
|
}
|
|
330
340
|
}
|
|
331
341
|
break;
|
|
332
342
|
}
|
|
333
343
|
}
|
|
334
|
-
return
|
|
344
|
+
return {
|
|
345
|
+
system,
|
|
346
|
+
prompt: userMessages.join("\n\n")
|
|
347
|
+
};
|
|
335
348
|
}
|
|
336
|
-
return String(prompt);
|
|
349
|
+
return { prompt: String(prompt) };
|
|
337
350
|
}
|
|
338
351
|
eventsToGenerateResult(events) {
|
|
339
352
|
let text = "";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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":[]}
|
|
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' | 'env'>> & {\n sessionName?: string;\n resume?: boolean;\n logger?: Logger;\n env?: Record<string, string>;\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 env: options.settings?.env,\n };\n this.logger = this.settings.logger;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3GenerateResult> {\n const { system, prompt } = this.extractPromptParts(options.prompt);\n const args = this.buildCLIArgs(system, 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 { system, prompt } = this.extractPromptParts(options.prompt);\n const args = this.buildCLIArgs(system, 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(system: string | undefined, prompt: string): string[] {\n const args = ['run', '--output-format', 'stream-json'];\n\n if (system) {\n args.push('--system', system);\n }\n\n args.push('-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 env: this.settings.env\n ? { ...process.env, ...this.settings.env }\n : process.env,\n });\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 env: this.settings.env\n ? { ...process.env, ...this.settings.env }\n : process.env,\n });\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 extractPromptParts(\n prompt: LanguageModelV3CallOptions['prompt']\n ): { system?: string; prompt: string } {\n if (Array.isArray(prompt)) {\n let system: string | undefined;\n const userMessages: 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 system = message.content;\n }\n break;\n case 'user':\n if (typeof message.content === 'string') {\n userMessages.push(message.content);\n } else if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === 'text') {\n userMessages.push(part.text);\n }\n }\n }\n break;\n }\n }\n\n return {\n system,\n prompt: userMessages.join('\\n\\n'),\n };\n }\n\n return { prompt: 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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-sdk-provider-goose",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "AI SDK v5 provider for Goose CLI",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-sdk",
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"test:watch": "vitest"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@ai-sdk/provider": "^3.0.
|
|
45
|
-
"@ai-sdk/provider-utils": "^
|
|
44
|
+
"@ai-sdk/provider": "^3.0.2",
|
|
45
|
+
"@ai-sdk/provider-utils": "^4.0.4"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "20.17.24",
|