diff --git a/.changeset/yummy-papayas-shake.md b/.changeset/yummy-papayas-shake.md new file mode 100644 index 000000000..71eedc2c8 --- /dev/null +++ b/.changeset/yummy-papayas-shake.md @@ -0,0 +1,5 @@ +--- +"@workflow/ai": patch +--- + +Add support for "providerOptions" in `DurableAgent` diff --git a/packages/ai/src/agent/do-stream-step.ts b/packages/ai/src/agent/do-stream-step.ts index 944d43eb1..797401629 100644 --- a/packages/ai/src/agent/do-stream-step.ts +++ b/packages/ai/src/agent/do-stream-step.ts @@ -5,6 +5,7 @@ import type { LanguageModelV2StreamPart, LanguageModelV2ToolCall, LanguageModelV2ToolResultPart, + SharedV2ProviderOptions, } from '@ai-sdk/provider'; import { gateway, @@ -24,6 +25,7 @@ export async function doStreamStep( writable: WritableStream, tools?: LanguageModelV2CallOptions['tools'], options?: { + providerOptions?: SharedV2ProviderOptions; sendStart?: boolean; } ) { @@ -44,6 +46,7 @@ export async function doStreamStep( const result = await model.doStream({ prompt: conversationPrompt, tools, + providerOptions: options?.providerOptions, }); let finish: FinishPart | undefined; diff --git a/packages/ai/src/agent/durable-agent.ts b/packages/ai/src/agent/durable-agent.ts index bd37ce1f3..67bef9484 100644 --- a/packages/ai/src/agent/durable-agent.ts +++ b/packages/ai/src/agent/durable-agent.ts @@ -2,6 +2,7 @@ import type { LanguageModelV2, LanguageModelV2ToolCall, LanguageModelV2ToolResultPart, + SharedV2ProviderOptions, } from '@ai-sdk/provider'; import { asSchema, @@ -39,6 +40,13 @@ export interface DurableAgentOptions { */ model: string | (() => Promise); + /** + * Additional provider-specific options. They are passed through + * to the provider from the AI SDK and enable provider-specific + * functionality that can be fully encapsulated in the provider. + */ + providerOptions?: SharedV2ProviderOptions; + /** * A set of tools available to the agent. * Tools can be implemented as workflow steps for automatic retries and persistence, @@ -137,11 +145,13 @@ export interface DurableAgentStreamOptions { */ export class DurableAgent { private model: string | (() => Promise); + private providerOptions?: SharedV2ProviderOptions; private tools: DurableAgentToolSet; private system?: string; constructor(options: DurableAgentOptions) { this.model = options.model; + this.providerOptions = options.providerOptions; this.tools = options.tools ?? {}; this.system = options.system; } @@ -164,6 +174,7 @@ export class DurableAgent { const iterator = streamTextIterator({ model: this.model, + providerOptions: this.providerOptions, tools: this.tools, writable: options.writable, prompt: modelPrompt, diff --git a/packages/ai/src/agent/stream-text-iterator.ts b/packages/ai/src/agent/stream-text-iterator.ts index d9157a83b..675df3f3c 100644 --- a/packages/ai/src/agent/stream-text-iterator.ts +++ b/packages/ai/src/agent/stream-text-iterator.ts @@ -3,14 +3,15 @@ import type { LanguageModelV2Prompt, LanguageModelV2ToolCall, LanguageModelV2ToolResultPart, + SharedV2ProviderOptions, } from '@ai-sdk/provider'; import type { StepResult, StreamTextOnStepFinishCallback, UIMessageChunk, } from 'ai'; -import type { DurableAgentToolSet } from './durable-agent.js'; import { doStreamStep, type ModelStopCondition } from './do-stream-step.js'; +import type { DurableAgentToolSet } from './durable-agent.js'; import { toolsToModelTools } from './tools-to-model-tools.js'; // This runs in the workflow context @@ -19,6 +20,7 @@ export async function* streamTextIterator({ tools = {}, writable, model, + providerOptions, stopConditions, sendStart = true, onStepFinish, @@ -27,6 +29,7 @@ export async function* streamTextIterator({ tools: DurableAgentToolSet; writable: WritableStream; model: string | (() => Promise); + providerOptions?: SharedV2ProviderOptions; stopConditions?: ModelStopCondition[] | ModelStopCondition; sendStart?: boolean; onStepFinish?: StreamTextOnStepFinishCallback; @@ -48,6 +51,7 @@ export async function* streamTextIterator({ writable, toolsToModelTools(tools), { + providerOptions, sendStart: sendStart && isFirstIteration, } );