ai-sdk-provider-goose 0.1.1 → 0.1.3
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 +10 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -255,6 +255,10 @@ var GooseLanguageModel = class {
|
|
|
255
255
|
if (content.type === "text" && content.text) {
|
|
256
256
|
if (!textStartEmitted) {
|
|
257
257
|
currentTextPartId = (0, import_provider_utils.generateId)();
|
|
258
|
+
yield {
|
|
259
|
+
type: "text-start",
|
|
260
|
+
id: currentTextPartId
|
|
261
|
+
};
|
|
258
262
|
textStartEmitted = true;
|
|
259
263
|
}
|
|
260
264
|
if (currentTextPartId) {
|
|
@@ -292,6 +296,12 @@ var GooseLanguageModel = class {
|
|
|
292
296
|
}
|
|
293
297
|
}
|
|
294
298
|
} else if (event.type === "complete") {
|
|
299
|
+
if (currentTextPartId && textStartEmitted) {
|
|
300
|
+
yield {
|
|
301
|
+
type: "text-end",
|
|
302
|
+
id: currentTextPartId
|
|
303
|
+
};
|
|
304
|
+
}
|
|
295
305
|
yield {
|
|
296
306
|
type: "finish",
|
|
297
307
|
finishReason: {
|
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' | '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"]}
|
|
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 yield {\n type: 'text-start',\n id: currentTextPartId,\n };\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 // Close text part if it was opened\n if (currentTextPartId && textStartEmitted) {\n yield {\n type: 'text-end',\n id: currentTextPartId,\n };\n }\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.js
CHANGED
|
@@ -224,6 +224,10 @@ var GooseLanguageModel = class {
|
|
|
224
224
|
if (content.type === "text" && content.text) {
|
|
225
225
|
if (!textStartEmitted) {
|
|
226
226
|
currentTextPartId = generateId();
|
|
227
|
+
yield {
|
|
228
|
+
type: "text-start",
|
|
229
|
+
id: currentTextPartId
|
|
230
|
+
};
|
|
227
231
|
textStartEmitted = true;
|
|
228
232
|
}
|
|
229
233
|
if (currentTextPartId) {
|
|
@@ -261,6 +265,12 @@ var GooseLanguageModel = class {
|
|
|
261
265
|
}
|
|
262
266
|
}
|
|
263
267
|
} else if (event.type === "complete") {
|
|
268
|
+
if (currentTextPartId && textStartEmitted) {
|
|
269
|
+
yield {
|
|
270
|
+
type: "text-end",
|
|
271
|
+
id: currentTextPartId
|
|
272
|
+
};
|
|
273
|
+
}
|
|
264
274
|
yield {
|
|
265
275
|
type: "finish",
|
|
266
276
|
finishReason: {
|
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' | '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":[]}
|
|
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 yield {\n type: 'text-start',\n id: currentTextPartId,\n };\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 // Close text part if it was opened\n if (currentTextPartId && textStartEmitted) {\n yield {\n type: 'text-end',\n id: currentTextPartId,\n };\n }\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.3",
|
|
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",
|