@yolk-sdk/agent 0.1.0-canary.68 → 0.1.0-canary.70
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/README.md +3 -1
- package/dist/client/transport.d.mts.map +1 -1
- package/dist/client/transport.mjs +5 -5
- package/dist/client/transport.mjs.map +1 -1
- package/dist/providers/openai/provider.d.mts +8 -2
- package/dist/providers/openai/provider.d.mts.map +1 -1
- package/dist/providers/openai/provider.mjs +4 -1
- package/dist/providers/openai/provider.mjs.map +1 -1
- package/dist/providers/vercel/ai-gateway-provider.d.mts.map +1 -1
- package/dist/providers/vercel/ai-gateway-provider.mjs +1 -0
- package/dist/providers/vercel/ai-gateway-provider.mjs.map +1 -1
- package/dist/skillset/command.d.mts +1 -1
- package/dist/skillset/merge.d.mts +5 -5
- package/dist/skillset/name.d.mts +2 -2
- package/dist/skillset/name.d.mts.map +1 -1
- package/package.json +2 -2
- package/src/client/transport.ts +24 -19
- package/src/providers/openai/provider.ts +17 -2
- package/src/providers/vercel/ai-gateway-provider.ts +1 -0
package/README.md
CHANGED
|
@@ -172,7 +172,9 @@ Gateway API key or Vercel OIDC token as `apiKey`; `maxCompletionTokens` is sent
|
|
|
172
172
|
`VERCEL_OIDC_TOKEN`, and requires integer
|
|
173
173
|
`AI_GATEWAY_MAX_COMPLETION_TOKENS`. Model ids are opaque `provider/model` strings. Hosts may set
|
|
174
174
|
`fallbackModels`, provider `routing`, and optional `http-referer` / `x-title` attribution headers.
|
|
175
|
-
|
|
175
|
+
A request `reasoningEffort` is sent as Gateway `{ reasoning: { effort } }` for any opaque model id;
|
|
176
|
+
hosts remain responsible for offering only efforts supported by the selected model. Required
|
|
177
|
+
authorization and JSON headers cannot be replaced through `extraHeaders`. Only override
|
|
176
178
|
`chatCompletionsUrl` with a trusted proxy because it receives the bearer credential.
|
|
177
179
|
|
|
178
180
|
Grok subscription access uses `https://cli-chat-proxy.grok.com/v1/responses`, not the xAI developer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.mts","names":[],"sources":["../../src/client/transport.ts"],"mappings":";;;;;;;cAuCiD,wBAAA;;;;cAEpC,mBAAA,SAA4B,wBAMxC;AAAA,KAEW,wBAAA;EAAA,SACD,QAAA;EAAA,SACA,SAAA;EAAA,SACA,QAAA,EAAU,eAAA;EAAA,SACV,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,oBAAA;EAAA,SAClB,MAAA,GAAS,WAAA;EAAA,SACT,eAAA,GAAkB,KAAA,CAAM,KAAA,CAAM,UAAA,CAAW,UAAA;EAAA,SACzC,UAAA,IAAc,QAAA,EAAU,qBAAA;AAAA;AAAA,KAGvB,2BAAA;EAAA,SACD,QAAA;EAAA,SACA,UAAA;EAAA,SACA,MAAA,GAAS,WAAA;EAAA,SACT,eAAA,GAAkB,KAAA,CAAM,KAAA,CAAM,UAAA,CAAW,UAAA;EAAA,SACzC,UAAA,IAAc,QAAA,EAAU,qBAAA;AAAA;AAAA,KAGvB,uCAAA;EAAA,SACD,QAAA;EAAA,SACA,aAAA,EAAe,aAAA,CAAc,YAAA;EAAA,SAC7B,MAAA,GAAS,WAAA;EAAA,SACT,eAAA,GAAkB,KAAA,CAAM,KAAA,CAAM,UAAA,CAAW,UAAA;EAAA,SACzC,UAAA,IAAc,QAAA,EAAU,qBAAA;AAAA;AAAA,KAGvB,uBAAA,IAA2B,KAAA,EAAO,UAAc,EAAE,KAAA;AAAA,KAElD,4BAAA;EAAA,SACD,aAAA;EAAA,SACA,WAAW;AAAA;AAAA,KAGV,2BAAA;EAAA,SACD,iBAAA;EAAA,SACA,aAAA,GAAgB,4BAAA;EAAA,SAChB,OAAA,GAAU,uBAAuB;AAAA;AAAA,KAGhC,qCAAA,GAAwC,wBAAA,GAClD,2BAA2B;EAAA,SAChB,WAAA,IAAe,KAAA;EAAA,SACf,OAAA,IAAW,KAAA;AAAA;AAAA,KAGZ,wCAAA,GAA2C,2BAAA,GACrD,2BAA2B;AAAA,KAEjB,oDAAA,GACV,uCAAA,GAA0C,2BAA2B;AAAA,KAE3D,qBAAA;EAAA,SACD,QAAA;EAAA,SACA,eAAA,GAAkB,KAAA,CAAM,KAAK,CAAC,UAAA,CAAW,UAAA;AAAA;AAAA,KAGxC,iCAAA,GAAoC,wBAAA;EAAA,SACrC,QAAA,EAAU,oBAAoB;AAAA;AAAA,KAG7B,6BAAA,GAAgC,wBAAA;EAAA,SACjC,QAAA,EAAU,gBAAgB;AAAA;AAAA,KAGzB,qBAAA;EAAA,SACD,MAAA;EAAA,SACA,OAAA,EAAS,QAAQ,CAAC,MAAA;AAAA;AAAA,KAGjB,kCAAA;EAAA,SACD,YAAA;EAAA,SACA,QAAA,EAAU,eAAA;EAAA,SACV,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,oBAAA;EAAA,SAClB,MAAA,GAAS,WAAA;AAAA;AAAA,cAiDP,qBAAA,GAAyB,OAAA,EAAS,QAAQ,CAAC,MAAA;AAAA,cAG3C,kCAAA,GACX,OAAA,EAAS,QAAQ,CAAC,MAAA;AAAA,cAUP,mCAAA,GACX,OAAA,EAAS,QAAQ,CAAC,MAAA;AAAA,cAOP,8BAAA,GAAkC,QAAA,UAAkB,UAAmB;AAAA,
|
|
1
|
+
{"version":3,"file":"transport.d.mts","names":[],"sources":["../../src/client/transport.ts"],"mappings":"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"}
|
|
@@ -304,8 +304,8 @@ const responseToEventStream = (response) => Stream.callback((queue) => Effect.ge
|
|
|
304
304
|
yield* Scope.addFinalizer(callbackScope, Effect.gen(function* () {
|
|
305
305
|
if (!(yield* Ref.get(terminalReached))) yield* closeResponseScope;
|
|
306
306
|
}));
|
|
307
|
-
yield* run()
|
|
308
|
-
}));
|
|
307
|
+
yield* run();
|
|
308
|
+
}).pipe(Effect.onExit((exit) => Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void)));
|
|
309
309
|
const abortSignalError = (signal) => new AgentTransportError({
|
|
310
310
|
message: "Agent request aborted",
|
|
311
311
|
cause: signal.reason
|
|
@@ -512,7 +512,7 @@ const streamAgentEventStreamUntilTerminal = (request) => {
|
|
|
512
512
|
onEvent: request.onEvent
|
|
513
513
|
}, queue);
|
|
514
514
|
yield* Queue.end(queue).pipe(Effect.asVoid);
|
|
515
|
-
}).pipe(Effect.
|
|
515
|
+
}).pipe(Effect.onExit((exit) => Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void)));
|
|
516
516
|
};
|
|
517
517
|
const streamAgentRunEventStreamUntilTerminal = (request) => {
|
|
518
518
|
return Stream.callback((queue) => Effect.gen(function* () {
|
|
@@ -543,7 +543,7 @@ const streamAgentRunEventStreamUntilTerminal = (request) => {
|
|
|
543
543
|
onEvent: request.onEvent
|
|
544
544
|
}, queue);
|
|
545
545
|
yield* Queue.end(queue).pipe(Effect.asVoid);
|
|
546
|
-
}).pipe(Effect.
|
|
546
|
+
}).pipe(Effect.onExit((exit) => Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void)));
|
|
547
547
|
};
|
|
548
548
|
const streamAgentRunHitlResponseInitialChunk = (request, queue, setStartIndex) => drainAgentEventStream({
|
|
549
549
|
queue,
|
|
@@ -580,7 +580,7 @@ const streamAgentRunHitlResponseEventStreamUntilTerminal = (request) => {
|
|
|
580
580
|
onEvent: request.onEvent
|
|
581
581
|
}, queue);
|
|
582
582
|
yield* Queue.end(queue).pipe(Effect.asVoid);
|
|
583
|
-
}).pipe(Effect.
|
|
583
|
+
}).pipe(Effect.onExit((exit) => Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void)));
|
|
584
584
|
};
|
|
585
585
|
const isAgentEvent = (message) => message._tag !== "SessionSnapshot";
|
|
586
586
|
const streamCloudflareAgentEventStream = (request) => applyAbortSignal(Stream.callback((queue) => Effect.gen(function* () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.mjs","names":[],"sources":["../../src/client/transport.ts"],"sourcesContent":["import {\n Cause,\n Channel,\n Effect,\n Exit,\n Pull,\n Queue,\n Ref,\n Result,\n Scope,\n Stream,\n type Layer\n} from 'effect'\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n type HttpClientError,\n type HttpClientResponse\n} from 'effect/unstable/http'\nimport * as Schema from 'effect/Schema'\nimport {\n AgentEvent,\n AgentWebSocketServerMessage,\n QuestionResponseInput,\n ToolApprovalResponseInput,\n UserInput,\n isTerminalAgentEvent\n} from '@yolk-sdk/agent/protocol'\nimport type {\n AgentEvent as AgentEventType,\n AgentMessage,\n AgentReasoningEffort,\n AgentWebSocketServerMessage as AgentWebSocketServerMessageType,\n HitlResponse,\n QuestionResponse,\n ToolApprovalResponse,\n UserMessage\n} from '@yolk-sdk/agent/protocol'\nimport type { AgentTranscript } from './state.ts'\n\nexport class AgentTransportError extends Schema.TaggedErrorClass<AgentTransportError>()(\n 'AgentTransportError',\n {\n message: Schema.String,\n cause: Schema.Unknown\n }\n) {}\n\nexport type StreamAgentEventsRequest = {\n readonly endpoint?: string\n readonly sessionId: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentRunEventsRequest = {\n readonly endpoint: string\n readonly startIndex?: number\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentRunHitlResponseEventsRequest = {\n readonly endpoint: string\n readonly hitlResponses: ReadonlyArray<HitlResponse>\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentEventHandler = (event: AgentEventType, count: number) => void\n\nexport type AgentRunIdleReconnectOptions = {\n readonly idleTimeoutMs: number\n readonly maxAttempts?: number\n}\n\nexport type AgentRunContinuationOptions = {\n readonly continuationLimit?: number\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n readonly onEvent?: StreamAgentEventHandler\n}\n\nexport type StreamAgentEventsUntilTerminalRequest = StreamAgentEventsRequest &\n AgentRunContinuationOptions & {\n readonly runEndpoint?: (runId: string) => string\n readonly onRunId?: (runId: string) => void\n }\n\nexport type StreamAgentRunEventsUntilTerminalRequest = StreamAgentRunEventsRequest &\n AgentRunContinuationOptions\n\nexport type StreamAgentRunHitlResponseEventsUntilTerminalRequest =\n StreamAgentRunHitlResponseEventsRequest & AgentRunContinuationOptions\n\nexport type CancelAgentRunRequest = {\n readonly endpoint: string\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n}\n\nexport type SubmitToolApprovalResponseRequest = StreamAgentEventsRequest & {\n readonly response: ToolApprovalResponse\n}\n\nexport type SubmitQuestionResponseRequest = StreamAgentEventsRequest & {\n readonly response: QuestionResponse\n}\n\nexport type AgentHttpResponseInfo = {\n readonly status: number\n readonly headers: Readonly<Record<string, string | undefined>>\n}\n\nexport type StreamCloudflareAgentEventsRequest = {\n readonly webSocketUrl: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n}\n\nconst defaultEndpoint = '/api/agent'\nconst defaultRunContinuationLimit = 120\nconst defaultIdleReconnectMaxAttempts = 12\nconst relativeEndpointBase = 'http://yolk.local'\n\nconst headerValue = (headers: Readonly<Record<string, string | undefined>>, name: string) => {\n const direct = headers[name]\n\n if (direct !== undefined) {\n return direct\n }\n\n const normalizedName = name.toLowerCase()\n\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === normalizedName) {\n return value\n }\n }\n\n return undefined\n}\n\nconst nonEmptyHeaderValue = (\n headers: Readonly<Record<string, string | undefined>>,\n name: string\n) => {\n const value = headerValue(headers, name)?.trim()\n\n return value === undefined || value.length === 0 ? undefined : value\n}\n\nconst safeIntegerPattern = /^-?(0|[1-9]\\d*)$/\n\nconst parseSafeInteger = (raw: string) => {\n const value = raw.trim()\n\n if (!safeIntegerPattern.test(value)) {\n return undefined\n }\n\n const parsed = Number.parseInt(value, 10)\n\n return Number.isSafeInteger(parsed) ? parsed : undefined\n}\n\nexport const agentRunIdFromHeaders = (headers: Readonly<Record<string, string | undefined>>) =>\n nonEmptyHeaderValue(headers, 'x-workflow-run-id')\n\nexport const agentRunStreamTailIndexFromHeaders = (\n headers: Readonly<Record<string, string | undefined>>\n) => {\n const raw = nonEmptyHeaderValue(headers, 'x-workflow-stream-tail-index')\n if (raw === undefined) return undefined\n\n const parsed = parseSafeInteger(raw)\n\n return parsed !== undefined && parsed >= -1 ? parsed : undefined\n}\n\nexport const agentRunStreamStartIndexFromHeaders = (\n headers: Readonly<Record<string, string | undefined>>\n) => {\n const tailIndex = agentRunStreamTailIndexFromHeaders(headers)\n\n return tailIndex === undefined ? undefined : tailIndex + 1\n}\n\nexport const agentRunEndpointWithStartIndex = (endpoint: string, startIndex?: number) => {\n if (startIndex === undefined) return endpoint\n\n validateAgentRunStartIndex(startIndex)\n\n const parsed = parseEndpointOrThrow(endpoint)\n parsed.url.searchParams.set('startIndex', String(startIndex))\n\n return serializeEndpoint(parsed)\n}\n\ntype ParsedEndpoint = {\n readonly url: URL\n readonly absolute: boolean\n readonly leadingSlash: boolean\n}\n\nconst absoluteUrlPattern = /^[A-Za-z][A-Za-z\\d+.-]*:/\n\nconst invalidAgentRunEndpointError = (endpoint: string) =>\n new AgentTransportError({\n message: 'Invalid agent run endpoint',\n cause: endpoint\n })\n\nconst parseEndpoint = (endpoint: string): ParsedEndpoint | undefined =>\n Result.try(() => ({\n url: new URL(endpoint, relativeEndpointBase),\n absolute: absoluteUrlPattern.test(endpoint),\n leadingSlash: endpoint.startsWith('/')\n })).pipe(\n Result.match({\n onFailure: () => undefined,\n onSuccess: parsed => parsed\n })\n )\n\nconst parseEndpointOrThrow = (endpoint: string) => {\n const parsed = parseEndpoint(endpoint)\n\n if (parsed !== undefined) {\n return parsed\n }\n\n throw invalidAgentRunEndpointError(endpoint)\n}\n\nconst parseEndpointEffect = (endpoint: string) => {\n const parsed = parseEndpoint(endpoint)\n\n return parsed === undefined\n ? Effect.fail(invalidAgentRunEndpointError(endpoint))\n : Effect.succeed(parsed)\n}\n\nconst serializeEndpoint = (endpoint: ParsedEndpoint) => {\n if (endpoint.absolute) {\n return endpoint.url.toString()\n }\n\n const serialized = `${endpoint.url.pathname}${endpoint.url.search}${endpoint.url.hash}`\n\n return endpoint.leadingSlash ? serialized : serialized.slice(1)\n}\n\nconst appendEncodedPathSegment = (endpoint: string, segment: string) => {\n const parsed = parseEndpointOrThrow(endpoint)\n\n const basePath = parsed.url.pathname.endsWith('/')\n ? parsed.url.pathname.slice(0, -1)\n : parsed.url.pathname\n\n parsed.url.pathname = `${basePath}/${encodeURIComponent(segment)}`\n\n return serializeEndpoint(parsed)\n}\n\nconst defaultAgentRunEndpoint = (endpoint: string | undefined, runId: string) =>\n appendEncodedPathSegment(endpoint ?? defaultEndpoint, runId)\n\nconst invalidAgentRunContinuationLimitError = (limit: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run continuation limit',\n cause: limit\n })\n\nconst agentRunContinuationLimitEffect = (limit: number | undefined) => {\n if (limit === undefined) return Effect.succeed(defaultRunContinuationLimit)\n\n return Number.isSafeInteger(limit) && limit >= 0\n ? Effect.succeed(limit)\n : Effect.fail(invalidAgentRunContinuationLimitError(limit))\n}\n\nconst invalidIdleReconnectMaxAttemptsError = (limit: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run idle reconnect max attempts',\n cause: limit\n })\n\nconst idleReconnectMaxAttemptsEffect = (limit: number | undefined) => {\n if (limit === undefined) return Effect.succeed(defaultIdleReconnectMaxAttempts)\n\n return Number.isSafeInteger(limit) && limit >= 0\n ? Effect.succeed(limit)\n : Effect.fail(invalidIdleReconnectMaxAttemptsError(limit))\n}\n\nconst validateAgentRunIdleReconnectEffect = (\n options: AgentRunIdleReconnectOptions | undefined\n) => {\n if (options === undefined) return Effect.void\n\n if (!Number.isSafeInteger(options.idleTimeoutMs) || options.idleTimeoutMs <= 0) {\n return Effect.fail(\n new AgentTransportError({\n message: 'Invalid agent run idle reconnect timeout',\n cause: options.idleTimeoutMs\n })\n )\n }\n\n return idleReconnectMaxAttemptsEffect(options.maxAttempts).pipe(Effect.asVoid)\n}\n\nconst validateAgentRunStartIndex = (startIndex: number | undefined) => {\n if (startIndex === undefined || (Number.isSafeInteger(startIndex) && startIndex >= 0)) {\n return\n }\n\n throw invalidAgentRunStartIndexError(startIndex)\n}\n\nconst invalidAgentRunStartIndexError = (startIndex: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run stream start index',\n cause: startIndex\n })\n\nconst validateAgentRunStartIndexEffect = (startIndex: number | undefined) =>\n startIndex === undefined || (Number.isSafeInteger(startIndex) && startIndex >= 0)\n ? Effect.void\n : Effect.fail(invalidAgentRunStartIndexError(startIndex))\n\nconst agentRunEndpointWithStartIndexEffect = (endpoint: string, startIndex: number | undefined) =>\n Effect.gen(function* () {\n if (startIndex === undefined) return endpoint\n\n yield* validateAgentRunStartIndexEffect(startIndex)\n\n const parsed = yield* parseEndpointEffect(endpoint)\n parsed.url.searchParams.set('startIndex', String(startIndex))\n\n return serializeEndpoint(parsed)\n })\n\nconst nextAgentRunStartIndex = (startIndex: number | undefined, count: number) =>\n (startIndex ?? 0) + count\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst toTransportError = (message: string, cause: unknown) =>\n new AgentTransportError({\n message,\n cause\n })\n\nconst toHttpClientTransportError = (message: string) => (error: HttpClientError.HttpClientError) =>\n toTransportError(`${message}: ${error.message}`, error)\n\nconst decodeAgentEvent = (value: unknown) =>\n Schema.decodeUnknownEffect(AgentEvent)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent event: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst decodeWebSocketServerMessage = (value: unknown) =>\n Schema.decodeUnknownEffect(AgentWebSocketServerMessage)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent WebSocket message: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `${message}: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `${message}: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst parseAgentEventLine = (line: string) =>\n Effect.gen(function* () {\n const parsed = yield* decodeJsonString(line, 'Invalid NDJSON line')\n\n return yield* decodeAgentEvent(parsed)\n })\n\nconst parseWebSocketServerMessage = (\n raw: string\n): Effect.Effect<AgentWebSocketServerMessageType, AgentTransportError> =>\n Effect.gen(function* () {\n const parsed = yield* decodeJsonString(raw, 'Invalid WebSocket message')\n\n return yield* decodeWebSocketServerMessage(parsed)\n })\n\nconst isUserMessage = (message: AgentMessage): message is UserMessage => message._tag === 'User'\n\nconst lastUserMessage = (\n messages: AgentTranscript\n): Effect.Effect<UserMessage, AgentTransportError> => {\n const reversed = messages.slice().reverse()\n const message = reversed.find(isUserMessage)\n\n if (message === undefined) {\n return Effect.fail(\n new AgentTransportError({\n message: 'Cloudflare WebSocket transport requires a user message',\n cause: messages\n })\n )\n }\n\n return Effect.succeed(message)\n}\n\nconst makeClientInputJson = (\n request: StreamCloudflareAgentEventsRequest,\n expectedRevision: number\n): Effect.Effect<string, AgentTransportError> =>\n Effect.gen(function* () {\n const hitlResponse = request.hitlResponses?.[0]\n\n if (request.hitlResponses !== undefined && request.hitlResponses.length > 1) {\n return yield* Effect.fail(\n new AgentTransportError({\n message: 'Cloudflare WebSocket transport supports one HITL response at a time',\n cause: request.hitlResponses\n })\n )\n }\n\n if (hitlResponse === undefined) {\n const message = yield* lastUserMessage(request.messages)\n\n return yield* encodeJsonString(\n UserInput.make({\n message,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n }),\n 'Could not serialize WebSocket user input'\n )\n }\n\n return yield* encodeJsonString(\n hitlResponse._tag === 'ToolApprovalResponse'\n ? ToolApprovalResponseInput.make({\n response: hitlResponse,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n : QuestionResponseInput.make({\n response: hitlResponse,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n }),\n 'Could not serialize WebSocket HITL response'\n )\n })\n\nconst responseErrorMessage = (response: HttpClientResponse.HttpClientResponse) =>\n response.text.pipe(\n Effect.mapError(toHttpClientTransportError('Could not read agent error body')),\n Effect.map(text => (text.length > 0 ? text : `Request failed with ${response.status}`))\n )\n\nconst makeHttpRequest = (request: StreamAgentEventsRequest) =>\n encodeJsonString(\n {\n sessionId: request.sessionId,\n messages: request.messages,\n hitlResponses: request.hitlResponses,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n },\n 'Could not serialize agent request'\n ).pipe(\n Effect.map(body =>\n HttpClientRequest.post(request.endpoint ?? defaultEndpoint).pipe(\n HttpClientRequest.setHeaders({\n accept: 'application/x-ndjson',\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(body, 'application/json')\n )\n )\n )\n\nconst makeHttpRunHitlResponseRequest = (request: StreamAgentRunHitlResponseEventsRequest) =>\n encodeJsonString(\n { hitlResponses: request.hitlResponses },\n 'Could not serialize agent run HITL response'\n ).pipe(\n Effect.map(body =>\n HttpClientRequest.post(request.endpoint).pipe(\n HttpClientRequest.setHeaders({\n accept: 'application/x-ndjson',\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(body, 'application/json')\n )\n )\n )\n\nconst requestAgentResponse = (request: StreamAgentEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const httpRequest = yield* makeHttpRequest(request)\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientTransportError('Agent request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nconst requestAgentRunResponse = (request: StreamAgentRunEventsRequest) =>\n Effect.gen(function* () {\n const endpoint = yield* agentRunEndpointWithStartIndexEffect(request.endpoint, request.startIndex)\n\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(\n HttpClientRequest.get(endpoint).pipe(\n HttpClientRequest.setHeaders({ accept: 'application/x-ndjson' })\n )\n )\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nconst requestAgentRunHitlResponse = (request: StreamAgentRunHitlResponseEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const httpRequest = yield* makeHttpRunHitlResponseRequest(request)\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run HITL request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run HITL request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nexport const cancelAgentRun = (request: CancelAgentRunRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(HttpClientRequest.delete(request.endpoint))\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run cancel failed')))\n\n if (response.status >= 200 && response.status < 300) {\n return\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run cancel failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n }).pipe(Effect.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nconst responseToLineStream = (response: HttpClientResponse.HttpClientResponse) =>\n response.stream.pipe(\n Stream.mapError(toHttpClientTransportError('Could not read agent response body')),\n Stream.decodeText,\n Stream.splitLines,\n Stream.map(line => line.trim()),\n Stream.filter(line => line.length > 0)\n )\n\nconst closeScope = (scope: Scope.Scope) => Scope.close(scope, Exit.succeed(undefined))\n\n// Protocol-terminal events finish the consumer stream, but HTTP bodies must still\n// drain to EOF so server runtimes do not observe client-side response aborts.\nconst responseToEventStream = (response: HttpClientResponse.HttpClientResponse) =>\n Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n const callbackScope = yield* Scope.Scope\n // Own the response stream in a scope that can outlive the consumer after a\n // terminal event; before terminal, consumer cancellation closes it.\n const responseScope = yield* Scope.make()\n const responseScopeClosed = yield* Ref.make(false)\n const terminalReached = yield* Ref.make(false)\n const pull = yield* Channel.toPullScoped(\n Stream.toChannel(responseToLineStream(response)),\n responseScope\n )\n const closeResponseScope = Effect.gen(function* () {\n const closed = yield* Ref.get(responseScopeClosed)\n\n if (!closed) {\n yield* Ref.set(responseScopeClosed, true)\n yield* closeScope(responseScope)\n }\n })\n const endQueue = Queue.end(queue).pipe(Effect.asVoid)\n const failQueue = (cause: Cause.Cause<AgentTransportError>) =>\n Queue.failCause(queue, cause).pipe(Effect.andThen(closeResponseScope), Effect.asVoid)\n const drainResponse = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: () => drainResponse(),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.void\n })\n const startTerminalDrain = Effect.gen(function* () {\n yield* Ref.set(terminalReached, true)\n yield* endQueue\n yield* drainResponse().pipe(\n Effect.catch(() => Effect.void),\n Effect.ensuring(closeResponseScope),\n Effect.forkDetach({ startImmediately: true }),\n Effect.asVoid\n )\n })\n const emitLines = (lines: ReadonlyArray<string>): Effect.Effect<void, AgentTransportError> =>\n Effect.gen(function* () {\n for (const line of lines) {\n const event = yield* parseAgentEventLine(line)\n\n yield* Queue.offer(queue, event)\n\n if (isTerminalAgentEvent(event)) {\n yield* startTerminalDrain\n return\n }\n }\n\n yield* run()\n })\n const run = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: emitLines,\n onFailure: failQueue,\n onDone: () => endQueue.pipe(Effect.andThen(closeResponseScope))\n })\n\n yield* Scope.addFinalizer(\n callbackScope,\n Effect.gen(function* () {\n const terminal = yield* Ref.get(terminalReached)\n\n if (!terminal) {\n yield* closeResponseScope\n }\n })\n )\n\n yield* run().pipe(\n Effect.catch(error => Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))\n )\n })\n )\n\nconst abortSignalError = (signal: AbortSignal) =>\n new AgentTransportError({\n message: 'Agent request aborted',\n cause: signal.reason\n })\n\nconst abortSignalEffect = (signal: AbortSignal) =>\n Effect.callback<never, AgentTransportError>(resume => {\n if (signal.aborted) {\n resume(Effect.fail(abortSignalError(signal)))\n return Effect.void\n }\n\n const listener = () => resume(Effect.fail(abortSignalError(signal)))\n signal.addEventListener('abort', listener, { once: true })\n\n return Effect.sync(() => signal.removeEventListener('abort', listener))\n })\n\nconst applyAbortSignal = <A, E, R>(\n stream: Stream.Stream<A, E, R>,\n signal: AbortSignal | undefined\n) => (signal === undefined ? stream : stream.pipe(Stream.interruptWhen(abortSignalEffect(signal))))\n\nexport const streamAgentEventStream = (request: StreamAgentEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunEventStream = (request: StreamAgentRunEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunHitlResponseEventStream = (\n request: StreamAgentRunHitlResponseEventsRequest\n) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunHitlResponse(request)).pipe(\n Stream.flatMap(responseToEventStream)\n ),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamToolApprovalResponseEventStream = (request: SubmitToolApprovalResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nexport const streamQuestionResponseEventStream = (request: SubmitQuestionResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\ntype AgentEventChunkResult = {\n readonly count: number\n readonly terminal: boolean\n readonly idle: boolean\n}\n\ntype AgentEventPullResult =\n | { readonly _tag: 'Events'; readonly events: Iterable<AgentEventType> }\n | { readonly _tag: 'Done' }\n | { readonly _tag: 'Idle' }\n\ntype AgentRunContinuationInput = AgentRunContinuationOptions & {\n readonly endpoint: string | undefined\n readonly startIndex: number | undefined\n readonly countOffset: number\n readonly terminal: boolean\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nconst missingAgentRunContinuationEndpointError = () =>\n new AgentTransportError({\n message: 'Agent run continuation failed: missing x-workflow-run-id',\n cause: 'missing_run_id'\n })\n\nconst exhaustedAgentRunContinuationLimitError = (limit: number) =>\n new AgentTransportError({\n message: 'Agent run continuation limit reached before a terminal event',\n cause: { limit }\n })\n\nconst noProgressAgentRunContinuationError = (endpoint: string, startIndex: number | undefined) =>\n new AgentTransportError({\n message: 'Agent run continuation made no progress before a terminal event',\n cause: { endpoint, startIndex }\n })\n\nconst noProgressAgentRunContinuationDelayMs = 250\n\nconst idleReconnectLimitReachedError = (limit: number) =>\n new AgentTransportError({\n message: 'Agent run idle reconnect limit reached before a terminal event',\n cause: { limit }\n })\n\nconst missingIdleReconnectRunEndpointError = () =>\n new AgentTransportError({\n message: 'Agent run idle reconnect failed: missing x-workflow-run-id',\n cause: 'missing_run_id'\n })\n\nconst waitForAgentRunContinuationProgress = (signal: AbortSignal | undefined) => {\n const sleep = Effect.sleep(`${noProgressAgentRunContinuationDelayMs} millis`)\n\n return signal === undefined ? sleep : sleep.pipe(Effect.raceFirst(abortSignalEffect(signal)))\n}\n\nconst missingAgentRunTailIndexError = () =>\n new AgentTransportError({\n message: 'Agent run HITL response missing x-workflow-stream-tail-index',\n cause: 'missing_tail_index'\n })\n\nconst pullAgentEventChunk = <A extends Iterable<AgentEventType>>(\n pull: Pull.Pull<A, AgentTransportError, void, never>,\n idleReconnect: AgentRunIdleReconnectOptions | undefined\n) => {\n const pullEvents: Effect.Effect<AgentEventPullResult, AgentTransportError, never> =\n Pull.matchEffect(pull, {\n onSuccess: events => Effect.succeed({ _tag: 'Events', events }),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.succeed({ _tag: 'Done' })\n })\n\n if (idleReconnect === undefined) return pullEvents\n\n return pullEvents.pipe(\n Effect.raceFirst(\n Effect.sleep(`${idleReconnect.idleTimeoutMs} millis`).pipe(\n Effect.map((): AgentEventPullResult => ({ _tag: 'Idle' }))\n )\n )\n )\n}\n\nconst drainAgentEventStream = (input: {\n readonly queue: Queue.Enqueue<AgentEventType>\n readonly stream: Stream.Stream<AgentEventType, AgentTransportError, never>\n readonly countOffset: number\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n readonly onEvent?: StreamAgentEventHandler\n}): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n Effect.gen(function* () {\n const scope = yield* Scope.make()\n const pull = yield* Channel.toPullScoped(Stream.toChannel(input.stream), scope)\n const run = (state: {\n readonly count: number\n readonly terminal: boolean\n }): Effect.Effect<AgentEventChunkResult, AgentTransportError, never> =>\n Effect.gen(function* () {\n const pulled = yield* pullAgentEventChunk(pull, input.idleReconnect)\n\n switch (pulled._tag) {\n case 'Idle':\n return { count: state.count, terminal: state.terminal, idle: true }\n case 'Done':\n return { count: state.count, terminal: state.terminal, idle: false }\n case 'Events': {\n let count = state.count\n let terminal = state.terminal\n\n for (const event of pulled.events) {\n count += 1\n terminal = terminal || isTerminalAgentEvent(event)\n yield* Effect.sync(() => input.onEvent?.(event, input.countOffset + count))\n yield* Queue.offer(input.queue, event)\n\n if (terminal) return { count, terminal, idle: false }\n }\n\n return yield* run({ count, terminal })\n }\n }\n })\n\n return yield* run({ count: 0, terminal: false }).pipe(Effect.ensuring(closeScope(scope)))\n })\n\nconst streamAgentRunContinuationChunk = (input: {\n readonly queue: Queue.Enqueue<AgentEventType>\n readonly endpoint: string\n readonly startIndex: number | undefined\n readonly countOffset: number\n readonly signal: AbortSignal | undefined\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n readonly onEvent?: StreamAgentEventHandler\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n}): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n drainAgentEventStream({\n queue: input.queue,\n stream: streamAgentRunEventStream({\n endpoint: input.endpoint,\n startIndex: input.startIndex,\n signal: input.signal,\n httpClientLayer: input.httpClientLayer,\n onResponse: input.onResponse\n }),\n countOffset: input.countOffset,\n idleReconnect: input.idleReconnect,\n onEvent: input.onEvent\n })\n\nconst streamAgentRunContinuations = (\n input: AgentRunContinuationInput,\n queue: Queue.Enqueue<AgentEventType>\n): Effect.Effect<void, AgentTransportError, Scope.Scope> =>\n Effect.gen(function* () {\n let totalCount = input.countOffset\n let terminal = input.terminal\n let startIndex = input.startIndex\n const limit = yield* agentRunContinuationLimitEffect(input.continuationLimit)\n const idleReconnectLimit =\n input.idleReconnect === undefined\n ? undefined\n : yield* idleReconnectMaxAttemptsEffect(input.idleReconnect.maxAttempts)\n let idleReconnects = 0\n\n if (terminal) {\n return\n }\n\n if (input.endpoint === undefined) {\n return yield* Effect.fail(missingAgentRunContinuationEndpointError())\n }\n\n let continuation = 0\n while (continuation < limit) {\n const endpoint = input.endpoint\n const chunkStartIndex = startIndex\n\n const chunk = yield* streamAgentRunContinuationChunk({\n queue,\n endpoint,\n startIndex: chunkStartIndex,\n countOffset: totalCount,\n signal: input.signal,\n httpClientLayer: input.httpClientLayer,\n onResponse: input.onResponse,\n idleReconnect: input.idleReconnect,\n onEvent: input.onEvent\n })\n\n if (chunk.idle) {\n if (idleReconnectLimit !== undefined && idleReconnects >= idleReconnectLimit) {\n return yield* Effect.fail(idleReconnectLimitReachedError(idleReconnectLimit))\n }\n\n startIndex = nextAgentRunStartIndex(chunkStartIndex, chunk.count)\n totalCount += chunk.count\n idleReconnects += 1\n continue\n }\n\n continuation += 1\n\n if (chunk.count === 0 && !chunk.terminal) {\n if (continuation >= limit) {\n return yield* Effect.fail(noProgressAgentRunContinuationError(endpoint, startIndex))\n }\n\n yield* waitForAgentRunContinuationProgress(input.signal)\n continue\n }\n\n terminal = chunk.terminal\n startIndex = nextAgentRunStartIndex(chunkStartIndex, chunk.count)\n totalCount += chunk.count\n\n if (terminal) {\n return\n }\n }\n\n return yield* Effect.fail(exhaustedAgentRunContinuationLimitError(limit))\n })\n\nexport const streamAgentEventStreamUntilTerminal = (\n request: StreamAgentEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n let runEndpoint: string | undefined\n let startIndex: number | undefined\n const firstChunk = yield* drainAgentEventStream({\n queue,\n stream: streamAgentEventStream({\n ...request,\n onResponse: response => {\n startIndex = agentRunStreamStartIndexFromHeaders(response.headers)\n const runId = agentRunIdFromHeaders(response.headers)\n if (runId !== undefined) {\n runEndpoint =\n request.runEndpoint?.(runId) ?? defaultAgentRunEndpoint(request.endpoint, runId)\n request.onRunId?.(runId)\n }\n\n request.onResponse?.(response)\n }\n }),\n countOffset: 0,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\n if (firstChunk.idle && runEndpoint === undefined) {\n return yield* Effect.fail(missingIdleReconnectRunEndpointError())\n }\n\n yield* streamAgentRunContinuations(\n {\n endpoint: runEndpoint,\n startIndex: nextAgentRunStartIndex(startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.catch((error: AgentTransportError) =>\n Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)\n )\n )\n )\n}\n\nexport const streamAgentRunEventStreamUntilTerminal = (\n request: StreamAgentRunEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n yield* validateAgentRunStartIndexEffect(request.startIndex)\n const firstChunk = yield* streamAgentRunContinuationChunk({\n queue,\n endpoint: request.endpoint,\n startIndex: request.startIndex,\n countOffset: 0,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\n yield* streamAgentRunContinuations(\n {\n endpoint: request.endpoint,\n startIndex: nextAgentRunStartIndex(request.startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.catch((error: AgentTransportError) =>\n Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)\n )\n )\n )\n}\n\nconst streamAgentRunHitlResponseInitialChunk = (\n request: StreamAgentRunHitlResponseEventsUntilTerminalRequest,\n queue: Queue.Enqueue<AgentEventType>,\n setStartIndex: (startIndex: number | undefined) => void\n): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n drainAgentEventStream({\n queue,\n stream: streamAgentRunHitlResponseEventStream({\n ...request,\n onResponse: response => {\n setStartIndex(agentRunStreamStartIndexFromHeaders(response.headers))\n request.onResponse?.(response)\n }\n }),\n countOffset: 0,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\nexport const streamAgentRunHitlResponseEventStreamUntilTerminal = (\n request: StreamAgentRunHitlResponseEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n let startIndex: number | undefined\n const firstChunk = yield* streamAgentRunHitlResponseInitialChunk(\n request,\n queue,\n nextStartIndex => {\n startIndex = nextStartIndex\n }\n )\n\n if (!firstChunk.terminal && startIndex === undefined) {\n return yield* Effect.fail(missingAgentRunTailIndexError())\n }\n\n yield* streamAgentRunContinuations(\n {\n endpoint: request.endpoint,\n startIndex: nextAgentRunStartIndex(startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.catch((error: AgentTransportError) =>\n Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid)\n )\n )\n )\n}\n\nconst isAgentEvent = (message: AgentWebSocketServerMessageType): message is AgentEventType =>\n message._tag !== 'SessionSnapshot'\n\nexport const streamCloudflareAgentEventStream = (request: StreamCloudflareAgentEventsRequest) =>\n applyAbortSignal(\n Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n const socket = new WebSocket(request.webSocketUrl)\n let sentInput = false\n let settled = false\n const closeSocket = Effect.sync(() => {\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, 'done')\n }\n })\n const failQueue = (error: AgentTransportError) =>\n Effect.runFork(Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))\n const handleMessage = (event: MessageEvent) => {\n if (typeof event.data !== 'string') {\n failQueue(toTransportError('Agent WebSocket returned binary data', event.data))\n return\n }\n\n Effect.runFork(\n parseWebSocketServerMessage(event.data).pipe(\n Effect.flatMap(message => {\n if (message._tag === 'SessionSnapshot') {\n return sentInput\n ? Effect.void\n : makeClientInputJson(request, message.revision).pipe(\n Effect.flatMap(body => Effect.sync(() => socket.send(body))),\n Effect.tap(() =>\n Effect.sync(() => {\n sentInput = true\n })\n )\n )\n }\n\n if (!isAgentEvent(message)) {\n return Effect.void\n }\n\n return Effect.gen(function* () {\n yield* Queue.offer(queue, message)\n\n if (isTerminalAgentEvent(message)) {\n yield* Effect.sync(() => {\n settled = true\n socket.close(1000, 'done')\n })\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }\n })\n }),\n Effect.catch(error => Effect.sync(() => failQueue(error)))\n )\n )\n }\n const handleError = () => {\n failQueue(toTransportError('Agent WebSocket failed', request.webSocketUrl))\n }\n const handleClose = () => {\n if (!settled) {\n failQueue(toTransportError('Agent WebSocket closed', request.webSocketUrl))\n }\n }\n\n yield* Effect.acquireRelease(\n Effect.sync(() => {\n socket.addEventListener('message', handleMessage)\n socket.addEventListener('error', handleError)\n socket.addEventListener('close', handleClose)\n }),\n () =>\n Effect.sync(() => {\n socket.removeEventListener('message', handleMessage)\n socket.removeEventListener('error', handleError)\n socket.removeEventListener('close', handleClose)\n }).pipe(Effect.andThen(closeSocket))\n )\n })\n ),\n request.signal\n )\n\nexport const collectAgentEvents = (request: StreamAgentEventsRequest) =>\n streamAgentEventStream(request).pipe(Stream.runCollect)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transport.mjs","names":[],"sources":["../../src/client/transport.ts"],"sourcesContent":["import {\n Cause,\n Channel,\n Effect,\n Exit,\n Pull,\n Queue,\n Ref,\n Result,\n Scope,\n Stream,\n type Layer\n} from 'effect'\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n type HttpClientError,\n type HttpClientResponse\n} from 'effect/unstable/http'\nimport * as Schema from 'effect/Schema'\nimport {\n AgentEvent,\n AgentWebSocketServerMessage,\n QuestionResponseInput,\n ToolApprovalResponseInput,\n UserInput,\n isTerminalAgentEvent\n} from '@yolk-sdk/agent/protocol'\nimport type {\n AgentEvent as AgentEventType,\n AgentMessage,\n AgentReasoningEffort,\n AgentWebSocketServerMessage as AgentWebSocketServerMessageType,\n HitlResponse,\n QuestionResponse,\n ToolApprovalResponse,\n UserMessage\n} from '@yolk-sdk/agent/protocol'\nimport type { AgentTranscript } from './state.ts'\n\nexport class AgentTransportError extends Schema.TaggedErrorClass<AgentTransportError>()(\n 'AgentTransportError',\n {\n message: Schema.String,\n cause: Schema.Unknown\n }\n) {}\n\nexport type StreamAgentEventsRequest = {\n readonly endpoint?: string\n readonly sessionId: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentRunEventsRequest = {\n readonly endpoint: string\n readonly startIndex?: number\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentRunHitlResponseEventsRequest = {\n readonly endpoint: string\n readonly hitlResponses: ReadonlyArray<HitlResponse>\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nexport type StreamAgentEventHandler = (event: AgentEventType, count: number) => void\n\nexport type AgentRunIdleReconnectOptions = {\n readonly idleTimeoutMs: number\n readonly maxAttempts?: number\n}\n\nexport type AgentRunContinuationOptions = {\n readonly continuationLimit?: number\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n readonly onEvent?: StreamAgentEventHandler\n}\n\nexport type StreamAgentEventsUntilTerminalRequest = StreamAgentEventsRequest &\n AgentRunContinuationOptions & {\n readonly runEndpoint?: (runId: string) => string\n readonly onRunId?: (runId: string) => void\n }\n\nexport type StreamAgentRunEventsUntilTerminalRequest = StreamAgentRunEventsRequest &\n AgentRunContinuationOptions\n\nexport type StreamAgentRunHitlResponseEventsUntilTerminalRequest =\n StreamAgentRunHitlResponseEventsRequest & AgentRunContinuationOptions\n\nexport type CancelAgentRunRequest = {\n readonly endpoint: string\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n}\n\nexport type SubmitToolApprovalResponseRequest = StreamAgentEventsRequest & {\n readonly response: ToolApprovalResponse\n}\n\nexport type SubmitQuestionResponseRequest = StreamAgentEventsRequest & {\n readonly response: QuestionResponse\n}\n\nexport type AgentHttpResponseInfo = {\n readonly status: number\n readonly headers: Readonly<Record<string, string | undefined>>\n}\n\nexport type StreamCloudflareAgentEventsRequest = {\n readonly webSocketUrl: string\n readonly messages: AgentTranscript\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly signal?: AbortSignal\n}\n\nconst defaultEndpoint = '/api/agent'\nconst defaultRunContinuationLimit = 120\nconst defaultIdleReconnectMaxAttempts = 12\nconst relativeEndpointBase = 'http://yolk.local'\n\nconst headerValue = (headers: Readonly<Record<string, string | undefined>>, name: string) => {\n const direct = headers[name]\n\n if (direct !== undefined) {\n return direct\n }\n\n const normalizedName = name.toLowerCase()\n\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === normalizedName) {\n return value\n }\n }\n\n return undefined\n}\n\nconst nonEmptyHeaderValue = (\n headers: Readonly<Record<string, string | undefined>>,\n name: string\n) => {\n const value = headerValue(headers, name)?.trim()\n\n return value === undefined || value.length === 0 ? undefined : value\n}\n\nconst safeIntegerPattern = /^-?(0|[1-9]\\d*)$/\n\nconst parseSafeInteger = (raw: string) => {\n const value = raw.trim()\n\n if (!safeIntegerPattern.test(value)) {\n return undefined\n }\n\n const parsed = Number.parseInt(value, 10)\n\n return Number.isSafeInteger(parsed) ? parsed : undefined\n}\n\nexport const agentRunIdFromHeaders = (headers: Readonly<Record<string, string | undefined>>) =>\n nonEmptyHeaderValue(headers, 'x-workflow-run-id')\n\nexport const agentRunStreamTailIndexFromHeaders = (\n headers: Readonly<Record<string, string | undefined>>\n) => {\n const raw = nonEmptyHeaderValue(headers, 'x-workflow-stream-tail-index')\n if (raw === undefined) return undefined\n\n const parsed = parseSafeInteger(raw)\n\n return parsed !== undefined && parsed >= -1 ? parsed : undefined\n}\n\nexport const agentRunStreamStartIndexFromHeaders = (\n headers: Readonly<Record<string, string | undefined>>\n) => {\n const tailIndex = agentRunStreamTailIndexFromHeaders(headers)\n\n return tailIndex === undefined ? undefined : tailIndex + 1\n}\n\nexport const agentRunEndpointWithStartIndex = (endpoint: string, startIndex?: number) => {\n if (startIndex === undefined) return endpoint\n\n validateAgentRunStartIndex(startIndex)\n\n const parsed = parseEndpointOrThrow(endpoint)\n parsed.url.searchParams.set('startIndex', String(startIndex))\n\n return serializeEndpoint(parsed)\n}\n\ntype ParsedEndpoint = {\n readonly url: URL\n readonly absolute: boolean\n readonly leadingSlash: boolean\n}\n\nconst absoluteUrlPattern = /^[A-Za-z][A-Za-z\\d+.-]*:/\n\nconst invalidAgentRunEndpointError = (endpoint: string) =>\n new AgentTransportError({\n message: 'Invalid agent run endpoint',\n cause: endpoint\n })\n\nconst parseEndpoint = (endpoint: string): ParsedEndpoint | undefined =>\n Result.try(() => ({\n url: new URL(endpoint, relativeEndpointBase),\n absolute: absoluteUrlPattern.test(endpoint),\n leadingSlash: endpoint.startsWith('/')\n })).pipe(\n Result.match({\n onFailure: () => undefined,\n onSuccess: parsed => parsed\n })\n )\n\nconst parseEndpointOrThrow = (endpoint: string) => {\n const parsed = parseEndpoint(endpoint)\n\n if (parsed !== undefined) {\n return parsed\n }\n\n throw invalidAgentRunEndpointError(endpoint)\n}\n\nconst parseEndpointEffect = (endpoint: string) => {\n const parsed = parseEndpoint(endpoint)\n\n return parsed === undefined\n ? Effect.fail(invalidAgentRunEndpointError(endpoint))\n : Effect.succeed(parsed)\n}\n\nconst serializeEndpoint = (endpoint: ParsedEndpoint) => {\n if (endpoint.absolute) {\n return endpoint.url.toString()\n }\n\n const serialized = `${endpoint.url.pathname}${endpoint.url.search}${endpoint.url.hash}`\n\n return endpoint.leadingSlash ? serialized : serialized.slice(1)\n}\n\nconst appendEncodedPathSegment = (endpoint: string, segment: string) => {\n const parsed = parseEndpointOrThrow(endpoint)\n\n const basePath = parsed.url.pathname.endsWith('/')\n ? parsed.url.pathname.slice(0, -1)\n : parsed.url.pathname\n\n parsed.url.pathname = `${basePath}/${encodeURIComponent(segment)}`\n\n return serializeEndpoint(parsed)\n}\n\nconst defaultAgentRunEndpoint = (endpoint: string | undefined, runId: string) =>\n appendEncodedPathSegment(endpoint ?? defaultEndpoint, runId)\n\nconst invalidAgentRunContinuationLimitError = (limit: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run continuation limit',\n cause: limit\n })\n\nconst agentRunContinuationLimitEffect = (limit: number | undefined) => {\n if (limit === undefined) return Effect.succeed(defaultRunContinuationLimit)\n\n return Number.isSafeInteger(limit) && limit >= 0\n ? Effect.succeed(limit)\n : Effect.fail(invalidAgentRunContinuationLimitError(limit))\n}\n\nconst invalidIdleReconnectMaxAttemptsError = (limit: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run idle reconnect max attempts',\n cause: limit\n })\n\nconst idleReconnectMaxAttemptsEffect = (limit: number | undefined) => {\n if (limit === undefined) return Effect.succeed(defaultIdleReconnectMaxAttempts)\n\n return Number.isSafeInteger(limit) && limit >= 0\n ? Effect.succeed(limit)\n : Effect.fail(invalidIdleReconnectMaxAttemptsError(limit))\n}\n\nconst validateAgentRunIdleReconnectEffect = (options: AgentRunIdleReconnectOptions | undefined) => {\n if (options === undefined) return Effect.void\n\n if (!Number.isSafeInteger(options.idleTimeoutMs) || options.idleTimeoutMs <= 0) {\n return Effect.fail(\n new AgentTransportError({\n message: 'Invalid agent run idle reconnect timeout',\n cause: options.idleTimeoutMs\n })\n )\n }\n\n return idleReconnectMaxAttemptsEffect(options.maxAttempts).pipe(Effect.asVoid)\n}\n\nconst validateAgentRunStartIndex = (startIndex: number | undefined) => {\n if (startIndex === undefined || (Number.isSafeInteger(startIndex) && startIndex >= 0)) {\n return\n }\n\n throw invalidAgentRunStartIndexError(startIndex)\n}\n\nconst invalidAgentRunStartIndexError = (startIndex: number | undefined) =>\n new AgentTransportError({\n message: 'Invalid agent run stream start index',\n cause: startIndex\n })\n\nconst validateAgentRunStartIndexEffect = (startIndex: number | undefined) =>\n startIndex === undefined || (Number.isSafeInteger(startIndex) && startIndex >= 0)\n ? Effect.void\n : Effect.fail(invalidAgentRunStartIndexError(startIndex))\n\nconst agentRunEndpointWithStartIndexEffect = (endpoint: string, startIndex: number | undefined) =>\n Effect.gen(function* () {\n if (startIndex === undefined) return endpoint\n\n yield* validateAgentRunStartIndexEffect(startIndex)\n\n const parsed = yield* parseEndpointEffect(endpoint)\n parsed.url.searchParams.set('startIndex', String(startIndex))\n\n return serializeEndpoint(parsed)\n })\n\nconst nextAgentRunStartIndex = (startIndex: number | undefined, count: number) =>\n (startIndex ?? 0) + count\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst toTransportError = (message: string, cause: unknown) =>\n new AgentTransportError({\n message,\n cause\n })\n\nconst toHttpClientTransportError = (message: string) => (error: HttpClientError.HttpClientError) =>\n toTransportError(`${message}: ${error.message}`, error)\n\nconst decodeAgentEvent = (value: unknown) =>\n Schema.decodeUnknownEffect(AgentEvent)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent event: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst decodeWebSocketServerMessage = (value: unknown) =>\n Schema.decodeUnknownEffect(AgentWebSocketServerMessage)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `Invalid agent WebSocket message: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `${message}: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new AgentTransportError({\n message: `${message}: ${unknownToMessage(error)}`,\n cause: error\n })\n )\n )\n\nconst parseAgentEventLine = (line: string) =>\n Effect.gen(function* () {\n const parsed = yield* decodeJsonString(line, 'Invalid NDJSON line')\n\n return yield* decodeAgentEvent(parsed)\n })\n\nconst parseWebSocketServerMessage = (\n raw: string\n): Effect.Effect<AgentWebSocketServerMessageType, AgentTransportError> =>\n Effect.gen(function* () {\n const parsed = yield* decodeJsonString(raw, 'Invalid WebSocket message')\n\n return yield* decodeWebSocketServerMessage(parsed)\n })\n\nconst isUserMessage = (message: AgentMessage): message is UserMessage => message._tag === 'User'\n\nconst lastUserMessage = (\n messages: AgentTranscript\n): Effect.Effect<UserMessage, AgentTransportError> => {\n const reversed = messages.slice().reverse()\n const message = reversed.find(isUserMessage)\n\n if (message === undefined) {\n return Effect.fail(\n new AgentTransportError({\n message: 'Cloudflare WebSocket transport requires a user message',\n cause: messages\n })\n )\n }\n\n return Effect.succeed(message)\n}\n\nconst makeClientInputJson = (\n request: StreamCloudflareAgentEventsRequest,\n expectedRevision: number\n): Effect.Effect<string, AgentTransportError> =>\n Effect.gen(function* () {\n const hitlResponse = request.hitlResponses?.[0]\n\n if (request.hitlResponses !== undefined && request.hitlResponses.length > 1) {\n return yield* Effect.fail(\n new AgentTransportError({\n message: 'Cloudflare WebSocket transport supports one HITL response at a time',\n cause: request.hitlResponses\n })\n )\n }\n\n if (hitlResponse === undefined) {\n const message = yield* lastUserMessage(request.messages)\n\n return yield* encodeJsonString(\n UserInput.make({\n message,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n }),\n 'Could not serialize WebSocket user input'\n )\n }\n\n return yield* encodeJsonString(\n hitlResponse._tag === 'ToolApprovalResponse'\n ? ToolApprovalResponseInput.make({\n response: hitlResponse,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n })\n : QuestionResponseInput.make({\n response: hitlResponse,\n expectedRevision,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n }),\n 'Could not serialize WebSocket HITL response'\n )\n })\n\nconst responseErrorMessage = (response: HttpClientResponse.HttpClientResponse) =>\n response.text.pipe(\n Effect.mapError(toHttpClientTransportError('Could not read agent error body')),\n Effect.map(text => (text.length > 0 ? text : `Request failed with ${response.status}`))\n )\n\nconst makeHttpRequest = (request: StreamAgentEventsRequest) =>\n encodeJsonString(\n {\n sessionId: request.sessionId,\n messages: request.messages,\n hitlResponses: request.hitlResponses,\n model: request.model,\n reasoningEffort: request.reasoningEffort\n },\n 'Could not serialize agent request'\n ).pipe(\n Effect.map(body =>\n HttpClientRequest.post(request.endpoint ?? defaultEndpoint).pipe(\n HttpClientRequest.setHeaders({\n accept: 'application/x-ndjson',\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(body, 'application/json')\n )\n )\n )\n\nconst makeHttpRunHitlResponseRequest = (request: StreamAgentRunHitlResponseEventsRequest) =>\n encodeJsonString(\n { hitlResponses: request.hitlResponses },\n 'Could not serialize agent run HITL response'\n ).pipe(\n Effect.map(body =>\n HttpClientRequest.post(request.endpoint).pipe(\n HttpClientRequest.setHeaders({\n accept: 'application/x-ndjson',\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(body, 'application/json')\n )\n )\n )\n\nconst requestAgentResponse = (request: StreamAgentEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const httpRequest = yield* makeHttpRequest(request)\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientTransportError('Agent request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nconst requestAgentRunResponse = (request: StreamAgentRunEventsRequest) =>\n Effect.gen(function* () {\n const endpoint = yield* agentRunEndpointWithStartIndexEffect(\n request.endpoint,\n request.startIndex\n )\n\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(\n HttpClientRequest.get(endpoint).pipe(\n HttpClientRequest.setHeaders({ accept: 'application/x-ndjson' })\n )\n )\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nconst requestAgentRunHitlResponse = (request: StreamAgentRunHitlResponseEventsRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const httpRequest = yield* makeHttpRunHitlResponseRequest(request)\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run HITL request failed')))\n\n if (response.status >= 200 && response.status < 300) {\n yield* Effect.sync(() =>\n request.onResponse?.({ status: response.status, headers: response.headers })\n )\n return response\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run HITL request failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n })\n\nexport const cancelAgentRun = (request: CancelAgentRunRequest) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const response = yield* client\n .execute(HttpClientRequest.delete(request.endpoint))\n .pipe(Effect.mapError(toHttpClientTransportError('Agent run cancel failed')))\n\n if (response.status >= 200 && response.status < 300) {\n return\n }\n\n const message = yield* responseErrorMessage(response)\n\n return yield* Effect.fail(\n new AgentTransportError({\n message: `Agent run cancel failed (${response.status}): ${message}`,\n cause: response.status\n })\n )\n }).pipe(Effect.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nconst responseToLineStream = (response: HttpClientResponse.HttpClientResponse) =>\n response.stream.pipe(\n Stream.mapError(toHttpClientTransportError('Could not read agent response body')),\n Stream.decodeText,\n Stream.splitLines,\n Stream.map(line => line.trim()),\n Stream.filter(line => line.length > 0)\n )\n\nconst closeScope = (scope: Scope.Scope) => Scope.close(scope, Exit.succeed(undefined))\n\n// Protocol-terminal events finish the consumer stream, but HTTP bodies must still\n// drain to EOF so server runtimes do not observe client-side response aborts.\nconst responseToEventStream = (response: HttpClientResponse.HttpClientResponse) =>\n Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n const callbackScope = yield* Scope.Scope\n // Own the response stream in a scope that can outlive the consumer after a\n // terminal event; before terminal, consumer cancellation closes it.\n const responseScope = yield* Scope.make()\n const responseScopeClosed = yield* Ref.make(false)\n const terminalReached = yield* Ref.make(false)\n const pull = yield* Channel.toPullScoped(\n Stream.toChannel(responseToLineStream(response)),\n responseScope\n )\n const closeResponseScope = Effect.gen(function* () {\n const closed = yield* Ref.get(responseScopeClosed)\n\n if (!closed) {\n yield* Ref.set(responseScopeClosed, true)\n yield* closeScope(responseScope)\n }\n })\n const endQueue = Queue.end(queue).pipe(Effect.asVoid)\n const failQueue = (cause: Cause.Cause<AgentTransportError>) =>\n Queue.failCause(queue, cause).pipe(Effect.andThen(closeResponseScope), Effect.asVoid)\n const drainResponse = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: () => drainResponse(),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.void\n })\n const startTerminalDrain = Effect.gen(function* () {\n yield* Ref.set(terminalReached, true)\n yield* endQueue\n yield* drainResponse().pipe(\n Effect.catch(() => Effect.void),\n Effect.ensuring(closeResponseScope),\n Effect.forkDetach({ startImmediately: true }),\n Effect.asVoid\n )\n })\n const emitLines = (lines: ReadonlyArray<string>): Effect.Effect<void, AgentTransportError> =>\n Effect.gen(function* () {\n for (const line of lines) {\n const event = yield* parseAgentEventLine(line)\n\n yield* Queue.offer(queue, event)\n\n if (isTerminalAgentEvent(event)) {\n yield* startTerminalDrain\n return\n }\n }\n\n yield* run()\n })\n const run = (): Effect.Effect<void, AgentTransportError> =>\n Pull.matchEffect(pull, {\n onSuccess: emitLines,\n onFailure: failQueue,\n onDone: () => endQueue.pipe(Effect.andThen(closeResponseScope))\n })\n\n yield* Scope.addFinalizer(\n callbackScope,\n Effect.gen(function* () {\n const terminal = yield* Ref.get(terminalReached)\n\n if (!terminal) {\n yield* closeResponseScope\n }\n })\n )\n\n yield* run()\n }).pipe(\n // Callback producers must settle their queue on defects too, without turning\n // programmer failures into recoverable AgentTransportErrors.\n Effect.onExit(exit =>\n Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void\n )\n )\n )\n\nconst abortSignalError = (signal: AbortSignal) =>\n new AgentTransportError({\n message: 'Agent request aborted',\n cause: signal.reason\n })\n\nconst abortSignalEffect = (signal: AbortSignal) =>\n Effect.callback<never, AgentTransportError>(resume => {\n if (signal.aborted) {\n resume(Effect.fail(abortSignalError(signal)))\n return Effect.void\n }\n\n const listener = () => resume(Effect.fail(abortSignalError(signal)))\n signal.addEventListener('abort', listener, { once: true })\n\n return Effect.sync(() => signal.removeEventListener('abort', listener))\n })\n\nconst applyAbortSignal = <A, E, R>(\n stream: Stream.Stream<A, E, R>,\n signal: AbortSignal | undefined\n) => (signal === undefined ? stream : stream.pipe(Stream.interruptWhen(abortSignalEffect(signal))))\n\nexport const streamAgentEventStream = (request: StreamAgentEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunEventStream = (request: StreamAgentRunEventsRequest) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunResponse(request)).pipe(Stream.flatMap(responseToEventStream)),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamAgentRunHitlResponseEventStream = (\n request: StreamAgentRunHitlResponseEventsRequest\n) =>\n applyAbortSignal(\n Stream.fromEffect(requestAgentRunHitlResponse(request)).pipe(\n Stream.flatMap(responseToEventStream)\n ),\n request.signal\n ).pipe(Stream.provide(request.httpClientLayer ?? FetchHttpClient.layer))\n\nexport const streamToolApprovalResponseEventStream = (request: SubmitToolApprovalResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\nexport const streamQuestionResponseEventStream = (request: SubmitQuestionResponseRequest) =>\n streamAgentEventStream({ ...request, hitlResponses: [request.response] })\n\ntype AgentEventChunkResult = {\n readonly count: number\n readonly terminal: boolean\n readonly idle: boolean\n}\n\ntype AgentEventPullResult =\n | { readonly _tag: 'Events'; readonly events: Iterable<AgentEventType> }\n | { readonly _tag: 'Done' }\n | { readonly _tag: 'Idle' }\n\ntype AgentRunContinuationInput = AgentRunContinuationOptions & {\n readonly endpoint: string | undefined\n readonly startIndex: number | undefined\n readonly countOffset: number\n readonly terminal: boolean\n readonly signal?: AbortSignal\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n}\n\nconst missingAgentRunContinuationEndpointError = () =>\n new AgentTransportError({\n message: 'Agent run continuation failed: missing x-workflow-run-id',\n cause: 'missing_run_id'\n })\n\nconst exhaustedAgentRunContinuationLimitError = (limit: number) =>\n new AgentTransportError({\n message: 'Agent run continuation limit reached before a terminal event',\n cause: { limit }\n })\n\nconst noProgressAgentRunContinuationError = (endpoint: string, startIndex: number | undefined) =>\n new AgentTransportError({\n message: 'Agent run continuation made no progress before a terminal event',\n cause: { endpoint, startIndex }\n })\n\nconst noProgressAgentRunContinuationDelayMs = 250\n\nconst idleReconnectLimitReachedError = (limit: number) =>\n new AgentTransportError({\n message: 'Agent run idle reconnect limit reached before a terminal event',\n cause: { limit }\n })\n\nconst missingIdleReconnectRunEndpointError = () =>\n new AgentTransportError({\n message: 'Agent run idle reconnect failed: missing x-workflow-run-id',\n cause: 'missing_run_id'\n })\n\nconst waitForAgentRunContinuationProgress = (signal: AbortSignal | undefined) => {\n const sleep = Effect.sleep(`${noProgressAgentRunContinuationDelayMs} millis`)\n\n return signal === undefined ? sleep : sleep.pipe(Effect.raceFirst(abortSignalEffect(signal)))\n}\n\nconst missingAgentRunTailIndexError = () =>\n new AgentTransportError({\n message: 'Agent run HITL response missing x-workflow-stream-tail-index',\n cause: 'missing_tail_index'\n })\n\nconst pullAgentEventChunk = <A extends Iterable<AgentEventType>>(\n pull: Pull.Pull<A, AgentTransportError, void, never>,\n idleReconnect: AgentRunIdleReconnectOptions | undefined\n) => {\n const pullEvents: Effect.Effect<AgentEventPullResult, AgentTransportError, never> =\n Pull.matchEffect(pull, {\n onSuccess: events => Effect.succeed({ _tag: 'Events', events }),\n onFailure: cause => Effect.failCause(cause),\n onDone: () => Effect.succeed({ _tag: 'Done' })\n })\n\n if (idleReconnect === undefined) return pullEvents\n\n return pullEvents.pipe(\n Effect.raceFirst(\n Effect.sleep(`${idleReconnect.idleTimeoutMs} millis`).pipe(\n Effect.map((): AgentEventPullResult => ({ _tag: 'Idle' }))\n )\n )\n )\n}\n\nconst drainAgentEventStream = (input: {\n readonly queue: Queue.Enqueue<AgentEventType>\n readonly stream: Stream.Stream<AgentEventType, AgentTransportError, never>\n readonly countOffset: number\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n readonly onEvent?: StreamAgentEventHandler\n}): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n Effect.gen(function* () {\n const scope = yield* Scope.make()\n const pull = yield* Channel.toPullScoped(Stream.toChannel(input.stream), scope)\n const run = (state: {\n readonly count: number\n readonly terminal: boolean\n }): Effect.Effect<AgentEventChunkResult, AgentTransportError, never> =>\n Effect.gen(function* () {\n const pulled = yield* pullAgentEventChunk(pull, input.idleReconnect)\n\n switch (pulled._tag) {\n case 'Idle':\n return { count: state.count, terminal: state.terminal, idle: true }\n case 'Done':\n return { count: state.count, terminal: state.terminal, idle: false }\n case 'Events': {\n let count = state.count\n let terminal = state.terminal\n\n for (const event of pulled.events) {\n count += 1\n terminal = terminal || isTerminalAgentEvent(event)\n yield* Effect.sync(() => input.onEvent?.(event, input.countOffset + count))\n yield* Queue.offer(input.queue, event)\n\n if (terminal) return { count, terminal, idle: false }\n }\n\n return yield* run({ count, terminal })\n }\n }\n })\n\n return yield* run({ count: 0, terminal: false }).pipe(Effect.ensuring(closeScope(scope)))\n })\n\nconst streamAgentRunContinuationChunk = (input: {\n readonly queue: Queue.Enqueue<AgentEventType>\n readonly endpoint: string\n readonly startIndex: number | undefined\n readonly countOffset: number\n readonly signal: AbortSignal | undefined\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>\n readonly onResponse?: (response: AgentHttpResponseInfo) => void\n readonly onEvent?: StreamAgentEventHandler\n readonly idleReconnect?: AgentRunIdleReconnectOptions\n}): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n drainAgentEventStream({\n queue: input.queue,\n stream: streamAgentRunEventStream({\n endpoint: input.endpoint,\n startIndex: input.startIndex,\n signal: input.signal,\n httpClientLayer: input.httpClientLayer,\n onResponse: input.onResponse\n }),\n countOffset: input.countOffset,\n idleReconnect: input.idleReconnect,\n onEvent: input.onEvent\n })\n\nconst streamAgentRunContinuations = (\n input: AgentRunContinuationInput,\n queue: Queue.Enqueue<AgentEventType>\n): Effect.Effect<void, AgentTransportError, Scope.Scope> =>\n Effect.gen(function* () {\n let totalCount = input.countOffset\n let terminal = input.terminal\n let startIndex = input.startIndex\n const limit = yield* agentRunContinuationLimitEffect(input.continuationLimit)\n const idleReconnectLimit =\n input.idleReconnect === undefined\n ? undefined\n : yield* idleReconnectMaxAttemptsEffect(input.idleReconnect.maxAttempts)\n let idleReconnects = 0\n\n if (terminal) {\n return\n }\n\n if (input.endpoint === undefined) {\n return yield* Effect.fail(missingAgentRunContinuationEndpointError())\n }\n\n let continuation = 0\n while (continuation < limit) {\n const endpoint = input.endpoint\n const chunkStartIndex = startIndex\n\n const chunk = yield* streamAgentRunContinuationChunk({\n queue,\n endpoint,\n startIndex: chunkStartIndex,\n countOffset: totalCount,\n signal: input.signal,\n httpClientLayer: input.httpClientLayer,\n onResponse: input.onResponse,\n idleReconnect: input.idleReconnect,\n onEvent: input.onEvent\n })\n\n if (chunk.idle) {\n if (idleReconnectLimit !== undefined && idleReconnects >= idleReconnectLimit) {\n return yield* Effect.fail(idleReconnectLimitReachedError(idleReconnectLimit))\n }\n\n startIndex = nextAgentRunStartIndex(chunkStartIndex, chunk.count)\n totalCount += chunk.count\n idleReconnects += 1\n continue\n }\n\n continuation += 1\n\n if (chunk.count === 0 && !chunk.terminal) {\n if (continuation >= limit) {\n return yield* Effect.fail(noProgressAgentRunContinuationError(endpoint, startIndex))\n }\n\n yield* waitForAgentRunContinuationProgress(input.signal)\n continue\n }\n\n terminal = chunk.terminal\n startIndex = nextAgentRunStartIndex(chunkStartIndex, chunk.count)\n totalCount += chunk.count\n\n if (terminal) {\n return\n }\n }\n\n return yield* Effect.fail(exhaustedAgentRunContinuationLimitError(limit))\n })\n\nexport const streamAgentEventStreamUntilTerminal = (\n request: StreamAgentEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n let runEndpoint: string | undefined\n let startIndex: number | undefined\n const firstChunk = yield* drainAgentEventStream({\n queue,\n stream: streamAgentEventStream({\n ...request,\n onResponse: response => {\n startIndex = agentRunStreamStartIndexFromHeaders(response.headers)\n const runId = agentRunIdFromHeaders(response.headers)\n if (runId !== undefined) {\n runEndpoint =\n request.runEndpoint?.(runId) ?? defaultAgentRunEndpoint(request.endpoint, runId)\n request.onRunId?.(runId)\n }\n\n request.onResponse?.(response)\n }\n }),\n countOffset: 0,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\n if (firstChunk.idle && runEndpoint === undefined) {\n return yield* Effect.fail(missingIdleReconnectRunEndpointError())\n }\n\n yield* streamAgentRunContinuations(\n {\n endpoint: runEndpoint,\n startIndex: nextAgentRunStartIndex(startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.onExit(exit =>\n Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void\n )\n )\n )\n}\n\nexport const streamAgentRunEventStreamUntilTerminal = (\n request: StreamAgentRunEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n yield* validateAgentRunStartIndexEffect(request.startIndex)\n const firstChunk = yield* streamAgentRunContinuationChunk({\n queue,\n endpoint: request.endpoint,\n startIndex: request.startIndex,\n countOffset: 0,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\n yield* streamAgentRunContinuations(\n {\n endpoint: request.endpoint,\n startIndex: nextAgentRunStartIndex(request.startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.onExit(exit =>\n Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void\n )\n )\n )\n}\n\nconst streamAgentRunHitlResponseInitialChunk = (\n request: StreamAgentRunHitlResponseEventsUntilTerminalRequest,\n queue: Queue.Enqueue<AgentEventType>,\n setStartIndex: (startIndex: number | undefined) => void\n): Effect.Effect<AgentEventChunkResult, AgentTransportError, Scope.Scope> =>\n drainAgentEventStream({\n queue,\n stream: streamAgentRunHitlResponseEventStream({\n ...request,\n onResponse: response => {\n setStartIndex(agentRunStreamStartIndexFromHeaders(response.headers))\n request.onResponse?.(response)\n }\n }),\n countOffset: 0,\n idleReconnect: request.idleReconnect,\n onEvent: request.onEvent\n })\n\nexport const streamAgentRunHitlResponseEventStreamUntilTerminal = (\n request: StreamAgentRunHitlResponseEventsUntilTerminalRequest\n) => {\n return Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n yield* agentRunContinuationLimitEffect(request.continuationLimit).pipe(Effect.asVoid)\n yield* validateAgentRunIdleReconnectEffect(request.idleReconnect)\n let startIndex: number | undefined\n const firstChunk = yield* streamAgentRunHitlResponseInitialChunk(\n request,\n queue,\n nextStartIndex => {\n startIndex = nextStartIndex\n }\n )\n\n if (!firstChunk.terminal && startIndex === undefined) {\n return yield* Effect.fail(missingAgentRunTailIndexError())\n }\n\n yield* streamAgentRunContinuations(\n {\n endpoint: request.endpoint,\n startIndex: nextAgentRunStartIndex(startIndex, firstChunk.count),\n countOffset: firstChunk.count,\n terminal: firstChunk.terminal,\n continuationLimit: request.continuationLimit,\n idleReconnect: request.idleReconnect,\n signal: request.signal,\n httpClientLayer: request.httpClientLayer,\n onResponse: request.onResponse,\n onEvent: request.onEvent\n },\n queue\n )\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }).pipe(\n Effect.onExit(exit =>\n Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void\n )\n )\n )\n}\n\nconst isAgentEvent = (message: AgentWebSocketServerMessageType): message is AgentEventType =>\n message._tag !== 'SessionSnapshot'\n\nexport const streamCloudflareAgentEventStream = (request: StreamCloudflareAgentEventsRequest) =>\n applyAbortSignal(\n Stream.callback<AgentEventType, AgentTransportError>(queue =>\n Effect.gen(function* () {\n const socket = new WebSocket(request.webSocketUrl)\n let sentInput = false\n let settled = false\n const closeSocket = Effect.sync(() => {\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, 'done')\n }\n })\n const failQueue = (error: AgentTransportError) =>\n Effect.runFork(Queue.failCause(queue, Cause.fail(error)).pipe(Effect.asVoid))\n const handleMessage = (event: MessageEvent) => {\n if (typeof event.data !== 'string') {\n failQueue(toTransportError('Agent WebSocket returned binary data', event.data))\n return\n }\n\n Effect.runFork(\n parseWebSocketServerMessage(event.data).pipe(\n Effect.flatMap(message => {\n if (message._tag === 'SessionSnapshot') {\n return sentInput\n ? Effect.void\n : makeClientInputJson(request, message.revision).pipe(\n Effect.flatMap(body => Effect.sync(() => socket.send(body))),\n Effect.tap(() =>\n Effect.sync(() => {\n sentInput = true\n })\n )\n )\n }\n\n if (!isAgentEvent(message)) {\n return Effect.void\n }\n\n return Effect.gen(function* () {\n yield* Queue.offer(queue, message)\n\n if (isTerminalAgentEvent(message)) {\n yield* Effect.sync(() => {\n settled = true\n socket.close(1000, 'done')\n })\n yield* Queue.end(queue).pipe(Effect.asVoid)\n }\n })\n }),\n Effect.catch(error => Effect.sync(() => failQueue(error)))\n )\n )\n }\n const handleError = () => {\n failQueue(toTransportError('Agent WebSocket failed', request.webSocketUrl))\n }\n const handleClose = () => {\n if (!settled) {\n failQueue(toTransportError('Agent WebSocket closed', request.webSocketUrl))\n }\n }\n\n yield* Effect.acquireRelease(\n Effect.sync(() => {\n socket.addEventListener('message', handleMessage)\n socket.addEventListener('error', handleError)\n socket.addEventListener('close', handleClose)\n }),\n () =>\n Effect.sync(() => {\n socket.removeEventListener('message', handleMessage)\n socket.removeEventListener('error', handleError)\n socket.removeEventListener('close', handleClose)\n }).pipe(Effect.andThen(closeSocket))\n )\n })\n ),\n request.signal\n )\n\nexport const collectAgentEvents = (request: StreamAgentEventsRequest) =>\n streamAgentEventStream(request).pipe(Stream.runCollect)\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Effect, Layer, Redacted } from "effect";
|
|
2
|
+
import { AgentReasoningEffort } from "@yolk-sdk/agent/protocol";
|
|
2
3
|
import { HttpClient } from "effect/unstable/http";
|
|
3
4
|
import { LLMError, LLMProvider, LLMRequest } from "@yolk-sdk/agent/loop";
|
|
4
5
|
|
|
@@ -11,8 +12,9 @@ type OpenAiProviderConfig = {
|
|
|
11
12
|
readonly chatCompletionsUrl?: string;
|
|
12
13
|
readonly maxCompletionTokens: number; /** Selects the compatible endpoint's output-limit parameter. Defaults to `max_completion_tokens`. */
|
|
13
14
|
readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens';
|
|
14
|
-
readonly extraHeaders?: Readonly<Record<string, string>>; /** Adds
|
|
15
|
-
readonly extraBody?: Readonly<Record<string, unknown>>; /**
|
|
15
|
+
readonly extraHeaders?: Readonly<Record<string, string>>; /** Adds endpoint extensions; enabled reasoning and canonical model/messages/limit/stream fields win. */
|
|
16
|
+
readonly extraBody?: Readonly<Record<string, unknown>>; /** Opts into a compatible endpoint's `{ reasoning: { effort } }` request extension. */
|
|
17
|
+
readonly reasoningEffortFormat?: 'reasoning-object'; /** Customizes safe error metadata for a branded OpenAI-compatible endpoint. */
|
|
16
18
|
readonly providerIdentity?: OpenAiProviderIdentity;
|
|
17
19
|
readonly apiKey: Redacted.Redacted<string>;
|
|
18
20
|
};
|
|
@@ -64,6 +66,9 @@ type OpenAiRequestBody = {
|
|
|
64
66
|
readonly max_completion_tokens?: number;
|
|
65
67
|
readonly max_tokens?: number;
|
|
66
68
|
readonly stream: false;
|
|
69
|
+
readonly reasoning?: {
|
|
70
|
+
readonly effort: AgentReasoningEffort;
|
|
71
|
+
};
|
|
67
72
|
readonly tools?: ReadonlyArray<OpenAiTool>;
|
|
68
73
|
readonly parallel_tool_calls?: true;
|
|
69
74
|
};
|
|
@@ -71,6 +76,7 @@ type OpenAiRequestBodyConfig = {
|
|
|
71
76
|
readonly maxCompletionTokens: number;
|
|
72
77
|
readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens';
|
|
73
78
|
readonly extraBody?: Readonly<Record<string, unknown>>;
|
|
79
|
+
readonly reasoningEffortFormat?: 'reasoning-object';
|
|
74
80
|
readonly providerName?: string;
|
|
75
81
|
};
|
|
76
82
|
declare const toOpenAiRequestBody: (request: LLMRequest, config: OpenAiRequestBodyConfig) => Effect.Effect<OpenAiRequestBody, LLMError>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.mts","names":[],"sources":["../../../src/providers/openai/provider.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider.d.mts","names":[],"sources":["../../../src/providers/openai/provider.ts"],"mappings":";;;;;;KA8CK,sBAAA;EAAA,SACM,EAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGH,oBAAA;EAAA,SACD,kBAAA;EAAA,SACA,mBAAA,UAFC;EAAA,SAID,oBAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA,mBAAA;EAAA,SAExB,SAAA,GAAY,QAAA,CAAS,MAAA,oBAAA;EAAA,SAErB,qBAAA,uBAEmB;EAAA,SAAnB,gBAAA,GAAmB,sBAAA;EAAA,SACnB,MAAA,EAAQ,QAAA,CAAS,QAAA;AAAA;AAAA,KAGvB,qBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,SAAA;IAAA,SACE,GAAA;EAAA;AAAA;AAAA,KAIR,iBAAA,YAA6B,aAAA,CAAc,qBAAA,GAAwB,sBAAA;AAAA,KAEnE,cAAA;EAAA,SACM,EAAA;EAAA,SACA,IAAA;EAAA,SACA,QAAA;IAAA,SACE,IAAA;IAAA,SACA,SAAA;EAAA;AAAA;AAAA,KAIR,aAAA;EAAA,SACU,IAAA;EAAA,SAAyB,OAAA;AAAA;EAAA,SACzB,IAAA;EAAA,SAAuB,OAAA,EAAS,iBAAA;AAAA;EAAA,SAEhC,IAAA;EAAA,SACA,OAAA;EAAA,SACA,UAAA,GAAa,aAAA,CAAc,cAAA;AAAA;EAAA,SAE3B,IAAA;EAAA,SAAuB,YAAA;EAAA,SAA+B,OAAA;AAAA;AAAA,KAEhE,UAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA;IAAA,SACE,IAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA;AAAA;AAAA,KAIR,iBAAA;EAAA,SACM,KAAA;EAAA,SACA,QAAA,EAAU,aAAA,CAAc,aAAA;EAAA,SACxB,qBAAA;EAAA,SACA,UAAA;EAAA,SACA,MAAA;EAAA,SACA,SAAA;IAAA,SACE,MAAA,EAAQ,oBAAA;EAAA;EAAA,SAEV,KAAA,GAAQ,aAAA,CAAc,UAAA;EAAA,SACtB,mBAAA;AAAA;AAAA,KAGN,uBAAA;EAAA,SACM,mBAAA;EAAA,SACA,oBAAA;EAAA,SACA,SAAA,GAAY,QAAQ,CAAC,MAAA;EAAA,SACrB,qBAAA;EAAA,SACA,YAAA;AAAA;AAAA,cA8QE,mBAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA,EAAQ,uBAAA,KACP,MAAA,CAAO,MAAA,CAAO,iBAAA,EAAmB,QAAA;AAAA,cAgPvB,uBAAA,GAA2B,MAAA,EAAQ,oBAAA,KAAoB,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA;AAAA,cAevD,mBAAA,EAAmB,KAAA,CAAA,KAAA,CAAA,WAAA,EAAA,QAAA"}
|
|
@@ -161,8 +161,10 @@ const toOpenAiRequestBody = (request, config) => Effect.gen(function* () {
|
|
|
161
161
|
content: request.systemPrompt
|
|
162
162
|
}, ...yield* Effect.forEach(request.messages, (message) => toOpenAiMessage(message, providerName))];
|
|
163
163
|
const completionTokenLimit = config.completionTokenField === "max_tokens" ? { max_tokens: config.maxCompletionTokens } : { max_completion_tokens: config.maxCompletionTokens };
|
|
164
|
+
const reasoning = config.reasoningEffortFormat === "reasoning-object" && request.reasoningEffort !== void 0 ? { reasoning: { effort: request.reasoningEffort } } : {};
|
|
164
165
|
const body = {
|
|
165
166
|
...config.extraBody,
|
|
167
|
+
...reasoning,
|
|
166
168
|
model: request.model,
|
|
167
169
|
messages,
|
|
168
170
|
...completionTokenLimit,
|
|
@@ -233,7 +235,8 @@ const sendOpenAiRequest = (config, request, client) => Effect.gen(function* () {
|
|
|
233
235
|
maxCompletionTokens: config.maxCompletionTokens,
|
|
234
236
|
providerName: providerIdentity.name,
|
|
235
237
|
...config.completionTokenField === void 0 ? {} : { completionTokenField: config.completionTokenField },
|
|
236
|
-
...config.extraBody === void 0 ? {} : { extraBody: config.extraBody }
|
|
238
|
+
...config.extraBody === void 0 ? {} : { extraBody: config.extraBody },
|
|
239
|
+
...config.reasoningEffortFormat === void 0 ? {} : { reasoningEffortFormat: config.reasoningEffortFormat }
|
|
237
240
|
})), `Could not serialize ${providerIdentity.name} request`);
|
|
238
241
|
const httpRequest = HttpClientRequest.post(config.chatCompletionsUrl ?? "https://api.openai.com/v1/chat/completions").pipe(HttpClientRequest.setHeaders({
|
|
239
242
|
...config.extraHeaders,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.mjs","names":["LLMTextDelta"],"sources":["../../../src/providers/openai/provider.ts"],"sourcesContent":["import { Config, Context, Effect, Layer, Option, Redacted, Stream } from 'effect'\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n type HttpClientError,\n type HttpClientResponse\n} from 'effect/unstable/http'\nimport * as Schema from 'effect/Schema'\nimport {\n ToolCall,\n AgentInputUsage,\n AgentOutputUsage,\n AgentUsage,\n attachmentSourceText,\n attachmentSourceUrl,\n assistantContent,\n assistantHostToolCalls,\n isTextDocumentMimeType,\n messageContextText,\n replaceLoneSurrogatesDeep,\n prependMessageContextToContent,\n type AgentMessage,\n type Content,\n type ContentPart,\n type ToolDef\n} from '@yolk-sdk/agent/protocol'\nimport {\n LLMError,\n LLMDone,\n LLMProvider,\n LLMTextDelta,\n LLMToolCall,\n LLMUsage,\n type LLMEvent,\n type LLMRequest\n} from '@yolk-sdk/agent/loop'\nimport {\n classifyProviderFailure,\n providerErrorInfo,\n providerFailureCause,\n providerFailureRetryable\n} from '../provider-error.ts'\nimport { validateProviderTranscript } from '../transcript.ts'\n\ntype OpenAiProviderIdentity = {\n readonly id: string\n readonly name: string\n}\n\nexport type OpenAiProviderConfig = {\n readonly chatCompletionsUrl?: string\n readonly maxCompletionTokens: number\n /** Selects the compatible endpoint's output-limit parameter. Defaults to `max_completion_tokens`. */\n readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'\n readonly extraHeaders?: Readonly<Record<string, string>>\n /** Adds compatible endpoint extensions; canonical model/messages/limit/stream fields win. */\n readonly extraBody?: Readonly<Record<string, unknown>>\n /** Customizes safe error metadata for a branded OpenAI-compatible endpoint. */\n readonly providerIdentity?: OpenAiProviderIdentity\n readonly apiKey: Redacted.Redacted<string>\n}\n\ntype OpenAiTextContentPart = {\n readonly type: 'text'\n readonly text: string\n}\n\ntype OpenAiImageContentPart = {\n readonly type: 'image_url'\n readonly image_url: {\n readonly url: string\n }\n}\n\ntype OpenAiUserContent = string | ReadonlyArray<OpenAiTextContentPart | OpenAiImageContentPart>\n\ntype OpenAiToolCall = {\n readonly id: string\n readonly type: 'function'\n readonly function: {\n readonly name: string\n readonly arguments: string\n }\n}\n\ntype OpenAiMessage =\n | { readonly role: 'system'; readonly content: string }\n | { readonly role: 'user'; readonly content: OpenAiUserContent }\n | {\n readonly role: 'assistant'\n readonly content: string | null\n readonly tool_calls?: ReadonlyArray<OpenAiToolCall>\n }\n | { readonly role: 'tool'; readonly tool_call_id: string; readonly content: string }\n\ntype OpenAiTool = {\n readonly type: 'function'\n readonly function: {\n readonly name: string\n readonly description: string\n readonly parameters: unknown\n }\n}\n\ntype OpenAiRequestBody = {\n readonly model: string\n readonly messages: ReadonlyArray<OpenAiMessage>\n readonly max_completion_tokens?: number\n readonly max_tokens?: number\n readonly stream: false\n readonly tools?: ReadonlyArray<OpenAiTool>\n readonly parallel_tool_calls?: true\n}\n\ntype OpenAiRequestBodyConfig = {\n readonly maxCompletionTokens: number\n readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'\n readonly extraBody?: Readonly<Record<string, unknown>>\n readonly providerName?: string\n}\n\nconst defaultOpenAiProviderIdentity: OpenAiProviderIdentity = {\n id: 'openai',\n name: 'OpenAI'\n}\n\nclass OpenAiFunctionResponse extends Schema.Class<OpenAiFunctionResponse>('OpenAiFunctionResponse')(\n {\n name: Schema.String,\n arguments: Schema.String\n }\n) {}\n\nclass OpenAiToolCallResponse extends Schema.Class<OpenAiToolCallResponse>('OpenAiToolCallResponse')(\n {\n id: Schema.String,\n type: Schema.Literals(['function']),\n function: OpenAiFunctionResponse\n }\n) {}\n\nclass OpenAiMessageResponse extends Schema.Class<OpenAiMessageResponse>('OpenAiMessageResponse')({\n content: Schema.NullOr(Schema.String),\n tool_calls: Schema.optional(Schema.Array(OpenAiToolCallResponse))\n}) {}\n\nclass OpenAiChoiceResponse extends Schema.Class<OpenAiChoiceResponse>('OpenAiChoiceResponse')({\n message: OpenAiMessageResponse,\n finish_reason: Schema.optional(Schema.NullOr(Schema.String))\n}) {}\n\nclass OpenAiPromptTokensDetails extends Schema.Class<OpenAiPromptTokensDetails>(\n 'OpenAiPromptTokensDetails'\n)({\n cached_tokens: Schema.optional(Schema.Number)\n}) {}\n\nclass OpenAiCompletionTokensDetails extends Schema.Class<OpenAiCompletionTokensDetails>(\n 'OpenAiCompletionTokensDetails'\n)({\n reasoning_tokens: Schema.optional(Schema.Number)\n}) {}\n\nclass OpenAiUsageResponse extends Schema.Class<OpenAiUsageResponse>('OpenAiUsageResponse')({\n prompt_tokens: Schema.Number,\n completion_tokens: Schema.Number,\n prompt_tokens_details: Schema.optional(OpenAiPromptTokensDetails),\n completion_tokens_details: Schema.optional(OpenAiCompletionTokensDetails)\n}) {}\n\nclass OpenAiChatCompletionResponse extends Schema.Class<OpenAiChatCompletionResponse>(\n 'OpenAiChatCompletionResponse'\n)({\n choices: Schema.Array(OpenAiChoiceResponse),\n usage: Schema.optional(OpenAiUsageResponse)\n}) {}\n\nclass OpenAiConfig extends Context.Service<OpenAiConfig, OpenAiProviderConfig>()(\n '@app/OpenAiConfig'\n) {}\n\nconst OpenAiConfigLayer = Layer.effect(\n OpenAiConfig,\n Effect.gen(function* () {\n const apiKey = yield* Config.redacted('OPENAI_API_KEY')\n const maxCompletionTokens = yield* Config.int('OPENAI_MAX_COMPLETION_TOKENS')\n return { apiKey, maxCompletionTokens }\n }).pipe(\n Effect.mapError(\n () =>\n new LLMError({\n cause: 'provider_error',\n message: 'OpenAI provider environment configuration missing',\n retryable: false\n })\n )\n )\n)\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst unsupportedContentError = (contentType: string, providerName: string) =>\n new LLMError({\n cause: 'provider_error',\n message: `${contentType} content is not supported by the ${providerName} provider yet`,\n retryable: false\n })\n\nconst textDocumentToOpenAiPart = (\n part: Extract<ContentPart, { readonly _tag: 'Document' }>,\n providerName: string\n) =>\n attachmentSourceText(part.source).pipe(\n Effect.mapError(() => unsupportedContentError('Invalid document text', providerName)),\n Effect.flatMap(\n Option.match({\n onNone: () =>\n Effect.fail(unsupportedContentError('Unresolved document source', providerName)),\n onSome: text => {\n const block: OpenAiTextContentPart = {\n type: 'text',\n text: `Document: ${part.title ?? part.filename}\\n\\n${text}`\n }\n\n return Effect.succeed(block)\n }\n })\n )\n )\n\nconst contentPartToUserPart = (\n part: ContentPart,\n providerName: string\n): Effect.Effect<OpenAiTextContentPart | OpenAiImageContentPart, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed({ type: 'text', text: part.text })\n case 'Image':\n return Option.match(attachmentSourceUrl(part.source, part.mimeType), {\n onNone: () => Effect.fail(unsupportedContentError('Unresolved image source', providerName)),\n onSome: url => Effect.succeed({ type: 'image_url', image_url: { url } })\n })\n case 'Document':\n return isTextDocumentMimeType(part.mimeType)\n ? textDocumentToOpenAiPart(part, providerName)\n : Effect.fail(unsupportedContentError('Document', providerName))\n case 'Audio':\n return Effect.fail(unsupportedContentError('Audio', providerName))\n }\n}\n\nconst contentToUserContent = (\n content: Content,\n providerName: string\n): Effect.Effect<OpenAiUserContent, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToUserPart(part, providerName))\n\nconst contentPartToText = (\n part: ContentPart,\n owner: string,\n providerName: string\n): Effect.Effect<string, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed(part.text)\n case 'Image':\n return Effect.fail(unsupportedContentError(`${owner} image`, providerName))\n case 'Document':\n return Effect.fail(unsupportedContentError(`${owner} document`, providerName))\n case 'Audio':\n return Effect.fail(unsupportedContentError(`${owner} audio`, providerName))\n }\n}\n\nconst contentToText = (\n content: Content,\n owner: string,\n providerName: string\n): Effect.Effect<string, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToText(part, owner, providerName)).pipe(\n Effect.map(textParts => textParts.join('\\n'))\n )\n\nconst serializeToolArguments = (params: unknown, providerName: string) =>\n encodeJsonString(params, `Could not serialize ${providerName} tool arguments`)\n\nconst toolCallToOpenAiToolCall = (\n call: ToolCall,\n providerName: string\n): Effect.Effect<OpenAiToolCall, LLMError> =>\n Effect.gen(function* () {\n return {\n id: call.id,\n type: 'function',\n function: {\n name: call.name,\n arguments: yield* serializeToolArguments(call.params, providerName)\n }\n }\n })\n\nconst toOpenAiMessage = (\n message: AgentMessage,\n providerName: string\n): Effect.Effect<OpenAiMessage, LLMError> =>\n Effect.gen(function* () {\n switch (message._tag) {\n case 'User':\n return {\n role: 'user',\n content: yield* contentToUserContent(\n prependMessageContextToContent(message.content, messageContextText(message)),\n providerName\n )\n }\n case 'Assistant': {\n const content = prependMessageContextToContent(\n assistantContent(message),\n messageContextText(message)\n )\n const toolCalls = yield* Effect.forEach(assistantHostToolCalls(message), call =>\n toolCallToOpenAiToolCall(call, providerName)\n )\n\n if (toolCalls.length > 0) {\n return {\n role: 'assistant',\n content: yield* contentToText(content, 'Assistant', providerName),\n tool_calls: toolCalls\n }\n }\n\n return {\n role: 'assistant',\n content: yield* contentToText(content, 'Assistant', providerName)\n }\n }\n case 'ToolResult':\n return {\n role: 'tool',\n tool_call_id: message.toolCallId,\n content: yield* contentToText(\n prependMessageContextToContent(message.content, messageContextText(message)),\n 'Tool result',\n providerName\n )\n }\n }\n })\n\nconst toOpenAiTool = (tool: ToolDef): OpenAiTool => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters\n }\n})\n\nexport const toOpenAiRequestBody = (\n request: LLMRequest,\n config: OpenAiRequestBodyConfig\n): Effect.Effect<OpenAiRequestBody, LLMError> =>\n Effect.gen(function* () {\n const providerName = config.providerName ?? defaultOpenAiProviderIdentity.name\n\n if (!Number.isSafeInteger(config.maxCompletionTokens) || config.maxCompletionTokens <= 0) {\n return yield* Effect.fail(\n new LLMError({\n cause: 'validation_error',\n message: `${providerName} maxCompletionTokens must be a positive safe integer`,\n retryable: false\n })\n )\n }\n\n yield* validateProviderTranscript(request.messages)\n const systemMessage: OpenAiMessage = { role: 'system', content: request.systemPrompt }\n const requestMessages = yield* Effect.forEach(request.messages, message =>\n toOpenAiMessage(message, providerName)\n )\n const messages = [systemMessage, ...requestMessages]\n\n const completionTokenLimit =\n config.completionTokenField === 'max_tokens'\n ? { max_tokens: config.maxCompletionTokens }\n : { max_completion_tokens: config.maxCompletionTokens }\n const body: OpenAiRequestBody = {\n ...config.extraBody,\n model: request.model,\n messages,\n ...completionTokenLimit,\n stream: false\n }\n\n if (request.tools.length === 0) {\n return body\n }\n\n return {\n ...body,\n tools: request.tools.map(toOpenAiTool),\n parallel_tool_calls: true\n }\n })\n\nconst parseToolArguments = (raw: string, providerName: string) =>\n decodeJsonString(raw, `Invalid ${providerName} tool arguments JSON`)\n\nconst toLlmEvents = (\n choice: OpenAiChoiceResponse,\n providerIdentity: OpenAiProviderIdentity\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n if (choice.finish_reason === 'length' || choice.finish_reason === 'content_filter') {\n return yield* Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `${providerIdentity.name} response stopped with ${choice.finish_reason}`,\n retryable: false,\n provider: providerErrorInfo({\n provider: providerIdentity.id,\n kind: 'invalid_response',\n providerCode: choice.finish_reason\n })\n })\n )\n }\n\n const content = choice.message.content ?? ''\n const textEvents = content.length > 0 ? [LLMTextDelta.make({ text: content })] : []\n const toolCallEvents = yield* Effect.forEach(choice.message.tool_calls ?? [], call =>\n parseToolArguments(call.function.arguments, providerIdentity.name).pipe(\n Effect.map(params =>\n LLMToolCall.make({\n call: ToolCall.make({\n id: call.id,\n name: call.function.name,\n params\n })\n })\n )\n )\n )\n\n if (toolCallEvents.length > 0) {\n return [...textEvents, ...toolCallEvents, LLMDone.make({ stopReason: 'tool_use' })]\n }\n\n return [...textEvents, LLMDone.make({ stopReason: 'stop' })]\n })\n\nconst toAgentUsage = (usage: OpenAiUsageResponse) =>\n AgentUsage.make({\n input: AgentInputUsage.make({\n total: usage.prompt_tokens,\n uncached: usage.prompt_tokens - (usage.prompt_tokens_details?.cached_tokens ?? 0),\n cacheRead: usage.prompt_tokens_details?.cached_tokens\n }),\n output: AgentOutputUsage.make({\n total: usage.completion_tokens,\n reasoning: usage.completion_tokens_details?.reasoning_tokens,\n text: usage.completion_tokens - (usage.completion_tokens_details?.reasoning_tokens ?? 0)\n })\n })\n\nconst toHttpClientLlmError =\n (providerIdentity: OpenAiProviderIdentity, retryable: boolean) =>\n (error: HttpClientError.HttpClientError) =>\n new LLMError({\n cause: 'provider_error',\n message: `${providerIdentity.name} request failed: ${error.message}`,\n retryable,\n provider: providerErrorInfo({\n provider: providerIdentity.id,\n kind: retryable ? 'network' : 'unknown'\n })\n })\n\nconst parseOpenAiResponseJson = (\n response: HttpClientResponse.HttpClientResponse,\n providerName: string\n): Effect.Effect<unknown, LLMError> =>\n response.json.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Could not parse ${providerName} response JSON: ${error.message}`,\n retryable: false\n })\n )\n )\n\nconst sendOpenAiRequest = (\n config: OpenAiProviderConfig,\n request: LLMRequest,\n client: HttpClient.HttpClient\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n const providerIdentity = config.providerIdentity ?? defaultOpenAiProviderIdentity\n const body = yield* toOpenAiRequestBody(request, {\n maxCompletionTokens: config.maxCompletionTokens,\n providerName: providerIdentity.name,\n ...(config.completionTokenField === undefined\n ? {}\n : { completionTokenField: config.completionTokenField }),\n ...(config.extraBody === undefined ? {} : { extraBody: config.extraBody })\n })\n // Replayed transcripts can carry lone surrogates; harden the lowered\n // body so one bad historical string cannot poison every model call.\n const serializedBody = yield* encodeJsonString(\n replaceLoneSurrogatesDeep(body),\n `Could not serialize ${providerIdentity.name} request`\n )\n\n const httpRequest = HttpClientRequest.post(\n config.chatCompletionsUrl ?? 'https://api.openai.com/v1/chat/completions'\n ).pipe(\n HttpClientRequest.setHeaders({\n ...config.extraHeaders,\n accept: 'application/json',\n authorization: `Bearer ${Redacted.value(config.apiKey)}`,\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(serializedBody, 'application/json')\n )\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientLlmError(providerIdentity, true)))\n\n if (response.status < 200 || response.status >= 300) {\n const errorText = yield* response.text.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `Could not read ${providerIdentity.name} error body: ${error.message}`,\n retryable: false\n })\n )\n )\n\n const provider = classifyProviderFailure({\n provider: providerIdentity.id,\n status: response.status,\n headers: response.headers,\n body: errorText\n })\n\n return yield* Effect.fail(\n new LLMError({\n cause: providerFailureCause(provider.kind),\n message: `${providerIdentity.name} returned ${response.status}`,\n retryable: providerFailureRetryable(provider.kind),\n provider\n })\n )\n }\n\n const json = yield* parseOpenAiResponseJson(response, providerIdentity.name)\n const parsed = yield* Schema.decodeUnknownEffect(OpenAiChatCompletionResponse)(json).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Invalid ${providerIdentity.name} response: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n const choice = parsed.choices[0]\n\n if (choice === undefined) {\n return yield* Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `${providerIdentity.name} response contained no choices`,\n retryable: false\n })\n )\n }\n\n const events = yield* toLlmEvents(choice, providerIdentity)\n\n if (parsed.usage === undefined) {\n return events\n }\n\n return [...events, LLMUsage.make({ usage: toAgentUsage(parsed.usage) })]\n }).pipe(\n Effect.withSpan(`${config.providerIdentity?.id ?? defaultOpenAiProviderIdentity.id}.stream`)\n )\n\nexport const makeOpenAiProviderLayer = (config: OpenAiProviderConfig) =>\n Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendOpenAiRequest(config, request, client)).pipe(\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n })\n })\n )\n\nexport const OpenAiProviderLayer = Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const config = yield* OpenAiConfig\n const client = yield* HttpClient.HttpClient\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendOpenAiRequest(config, request, client)).pipe(\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n })\n })\n).pipe(Layer.provide(Layer.mergeAll(OpenAiConfigLayer, FetchHttpClient.layer)))\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"provider.mjs","names":["LLMTextDelta"],"sources":["../../../src/providers/openai/provider.ts"],"sourcesContent":["import { Config, Context, Effect, Layer, Option, Redacted, Stream } from 'effect'\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n type HttpClientError,\n type HttpClientResponse\n} from 'effect/unstable/http'\nimport * as Schema from 'effect/Schema'\nimport {\n ToolCall,\n AgentInputUsage,\n AgentOutputUsage,\n AgentUsage,\n attachmentSourceText,\n attachmentSourceUrl,\n assistantContent,\n assistantHostToolCalls,\n isTextDocumentMimeType,\n messageContextText,\n replaceLoneSurrogatesDeep,\n prependMessageContextToContent,\n type AgentMessage,\n type AgentReasoningEffort,\n type Content,\n type ContentPart,\n type ToolDef\n} from '@yolk-sdk/agent/protocol'\nimport {\n LLMError,\n LLMDone,\n LLMProvider,\n LLMTextDelta,\n LLMToolCall,\n LLMUsage,\n type LLMEvent,\n type LLMRequest\n} from '@yolk-sdk/agent/loop'\nimport {\n classifyProviderFailure,\n providerErrorInfo,\n providerFailureCause,\n providerFailureRetryable\n} from '../provider-error.ts'\nimport { validateProviderTranscript } from '../transcript.ts'\n\ntype OpenAiProviderIdentity = {\n readonly id: string\n readonly name: string\n}\n\nexport type OpenAiProviderConfig = {\n readonly chatCompletionsUrl?: string\n readonly maxCompletionTokens: number\n /** Selects the compatible endpoint's output-limit parameter. Defaults to `max_completion_tokens`. */\n readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'\n readonly extraHeaders?: Readonly<Record<string, string>>\n /** Adds endpoint extensions; enabled reasoning and canonical model/messages/limit/stream fields win. */\n readonly extraBody?: Readonly<Record<string, unknown>>\n /** Opts into a compatible endpoint's `{ reasoning: { effort } }` request extension. */\n readonly reasoningEffortFormat?: 'reasoning-object'\n /** Customizes safe error metadata for a branded OpenAI-compatible endpoint. */\n readonly providerIdentity?: OpenAiProviderIdentity\n readonly apiKey: Redacted.Redacted<string>\n}\n\ntype OpenAiTextContentPart = {\n readonly type: 'text'\n readonly text: string\n}\n\ntype OpenAiImageContentPart = {\n readonly type: 'image_url'\n readonly image_url: {\n readonly url: string\n }\n}\n\ntype OpenAiUserContent = string | ReadonlyArray<OpenAiTextContentPart | OpenAiImageContentPart>\n\ntype OpenAiToolCall = {\n readonly id: string\n readonly type: 'function'\n readonly function: {\n readonly name: string\n readonly arguments: string\n }\n}\n\ntype OpenAiMessage =\n | { readonly role: 'system'; readonly content: string }\n | { readonly role: 'user'; readonly content: OpenAiUserContent }\n | {\n readonly role: 'assistant'\n readonly content: string | null\n readonly tool_calls?: ReadonlyArray<OpenAiToolCall>\n }\n | { readonly role: 'tool'; readonly tool_call_id: string; readonly content: string }\n\ntype OpenAiTool = {\n readonly type: 'function'\n readonly function: {\n readonly name: string\n readonly description: string\n readonly parameters: unknown\n }\n}\n\ntype OpenAiRequestBody = {\n readonly model: string\n readonly messages: ReadonlyArray<OpenAiMessage>\n readonly max_completion_tokens?: number\n readonly max_tokens?: number\n readonly stream: false\n readonly reasoning?: {\n readonly effort: AgentReasoningEffort\n }\n readonly tools?: ReadonlyArray<OpenAiTool>\n readonly parallel_tool_calls?: true\n}\n\ntype OpenAiRequestBodyConfig = {\n readonly maxCompletionTokens: number\n readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'\n readonly extraBody?: Readonly<Record<string, unknown>>\n readonly reasoningEffortFormat?: 'reasoning-object'\n readonly providerName?: string\n}\n\nconst defaultOpenAiProviderIdentity: OpenAiProviderIdentity = {\n id: 'openai',\n name: 'OpenAI'\n}\n\nclass OpenAiFunctionResponse extends Schema.Class<OpenAiFunctionResponse>('OpenAiFunctionResponse')(\n {\n name: Schema.String,\n arguments: Schema.String\n }\n) {}\n\nclass OpenAiToolCallResponse extends Schema.Class<OpenAiToolCallResponse>('OpenAiToolCallResponse')(\n {\n id: Schema.String,\n type: Schema.Literals(['function']),\n function: OpenAiFunctionResponse\n }\n) {}\n\nclass OpenAiMessageResponse extends Schema.Class<OpenAiMessageResponse>('OpenAiMessageResponse')({\n content: Schema.NullOr(Schema.String),\n tool_calls: Schema.optional(Schema.Array(OpenAiToolCallResponse))\n}) {}\n\nclass OpenAiChoiceResponse extends Schema.Class<OpenAiChoiceResponse>('OpenAiChoiceResponse')({\n message: OpenAiMessageResponse,\n finish_reason: Schema.optional(Schema.NullOr(Schema.String))\n}) {}\n\nclass OpenAiPromptTokensDetails extends Schema.Class<OpenAiPromptTokensDetails>(\n 'OpenAiPromptTokensDetails'\n)({\n cached_tokens: Schema.optional(Schema.Number)\n}) {}\n\nclass OpenAiCompletionTokensDetails extends Schema.Class<OpenAiCompletionTokensDetails>(\n 'OpenAiCompletionTokensDetails'\n)({\n reasoning_tokens: Schema.optional(Schema.Number)\n}) {}\n\nclass OpenAiUsageResponse extends Schema.Class<OpenAiUsageResponse>('OpenAiUsageResponse')({\n prompt_tokens: Schema.Number,\n completion_tokens: Schema.Number,\n prompt_tokens_details: Schema.optional(OpenAiPromptTokensDetails),\n completion_tokens_details: Schema.optional(OpenAiCompletionTokensDetails)\n}) {}\n\nclass OpenAiChatCompletionResponse extends Schema.Class<OpenAiChatCompletionResponse>(\n 'OpenAiChatCompletionResponse'\n)({\n choices: Schema.Array(OpenAiChoiceResponse),\n usage: Schema.optional(OpenAiUsageResponse)\n}) {}\n\nclass OpenAiConfig extends Context.Service<OpenAiConfig, OpenAiProviderConfig>()(\n '@app/OpenAiConfig'\n) {}\n\nconst OpenAiConfigLayer = Layer.effect(\n OpenAiConfig,\n Effect.gen(function* () {\n const apiKey = yield* Config.redacted('OPENAI_API_KEY')\n const maxCompletionTokens = yield* Config.int('OPENAI_MAX_COMPLETION_TOKENS')\n return { apiKey, maxCompletionTokens }\n }).pipe(\n Effect.mapError(\n () =>\n new LLMError({\n cause: 'provider_error',\n message: 'OpenAI provider environment configuration missing',\n retryable: false\n })\n )\n )\n)\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst unsupportedContentError = (contentType: string, providerName: string) =>\n new LLMError({\n cause: 'provider_error',\n message: `${contentType} content is not supported by the ${providerName} provider yet`,\n retryable: false\n })\n\nconst textDocumentToOpenAiPart = (\n part: Extract<ContentPart, { readonly _tag: 'Document' }>,\n providerName: string\n) =>\n attachmentSourceText(part.source).pipe(\n Effect.mapError(() => unsupportedContentError('Invalid document text', providerName)),\n Effect.flatMap(\n Option.match({\n onNone: () =>\n Effect.fail(unsupportedContentError('Unresolved document source', providerName)),\n onSome: text => {\n const block: OpenAiTextContentPart = {\n type: 'text',\n text: `Document: ${part.title ?? part.filename}\\n\\n${text}`\n }\n\n return Effect.succeed(block)\n }\n })\n )\n )\n\nconst contentPartToUserPart = (\n part: ContentPart,\n providerName: string\n): Effect.Effect<OpenAiTextContentPart | OpenAiImageContentPart, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed({ type: 'text', text: part.text })\n case 'Image':\n return Option.match(attachmentSourceUrl(part.source, part.mimeType), {\n onNone: () => Effect.fail(unsupportedContentError('Unresolved image source', providerName)),\n onSome: url => Effect.succeed({ type: 'image_url', image_url: { url } })\n })\n case 'Document':\n return isTextDocumentMimeType(part.mimeType)\n ? textDocumentToOpenAiPart(part, providerName)\n : Effect.fail(unsupportedContentError('Document', providerName))\n case 'Audio':\n return Effect.fail(unsupportedContentError('Audio', providerName))\n }\n}\n\nconst contentToUserContent = (\n content: Content,\n providerName: string\n): Effect.Effect<OpenAiUserContent, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToUserPart(part, providerName))\n\nconst contentPartToText = (\n part: ContentPart,\n owner: string,\n providerName: string\n): Effect.Effect<string, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed(part.text)\n case 'Image':\n return Effect.fail(unsupportedContentError(`${owner} image`, providerName))\n case 'Document':\n return Effect.fail(unsupportedContentError(`${owner} document`, providerName))\n case 'Audio':\n return Effect.fail(unsupportedContentError(`${owner} audio`, providerName))\n }\n}\n\nconst contentToText = (\n content: Content,\n owner: string,\n providerName: string\n): Effect.Effect<string, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToText(part, owner, providerName)).pipe(\n Effect.map(textParts => textParts.join('\\n'))\n )\n\nconst serializeToolArguments = (params: unknown, providerName: string) =>\n encodeJsonString(params, `Could not serialize ${providerName} tool arguments`)\n\nconst toolCallToOpenAiToolCall = (\n call: ToolCall,\n providerName: string\n): Effect.Effect<OpenAiToolCall, LLMError> =>\n Effect.gen(function* () {\n return {\n id: call.id,\n type: 'function',\n function: {\n name: call.name,\n arguments: yield* serializeToolArguments(call.params, providerName)\n }\n }\n })\n\nconst toOpenAiMessage = (\n message: AgentMessage,\n providerName: string\n): Effect.Effect<OpenAiMessage, LLMError> =>\n Effect.gen(function* () {\n switch (message._tag) {\n case 'User':\n return {\n role: 'user',\n content: yield* contentToUserContent(\n prependMessageContextToContent(message.content, messageContextText(message)),\n providerName\n )\n }\n case 'Assistant': {\n const content = prependMessageContextToContent(\n assistantContent(message),\n messageContextText(message)\n )\n const toolCalls = yield* Effect.forEach(assistantHostToolCalls(message), call =>\n toolCallToOpenAiToolCall(call, providerName)\n )\n\n if (toolCalls.length > 0) {\n return {\n role: 'assistant',\n content: yield* contentToText(content, 'Assistant', providerName),\n tool_calls: toolCalls\n }\n }\n\n return {\n role: 'assistant',\n content: yield* contentToText(content, 'Assistant', providerName)\n }\n }\n case 'ToolResult':\n return {\n role: 'tool',\n tool_call_id: message.toolCallId,\n content: yield* contentToText(\n prependMessageContextToContent(message.content, messageContextText(message)),\n 'Tool result',\n providerName\n )\n }\n }\n })\n\nconst toOpenAiTool = (tool: ToolDef): OpenAiTool => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters\n }\n})\n\nexport const toOpenAiRequestBody = (\n request: LLMRequest,\n config: OpenAiRequestBodyConfig\n): Effect.Effect<OpenAiRequestBody, LLMError> =>\n Effect.gen(function* () {\n const providerName = config.providerName ?? defaultOpenAiProviderIdentity.name\n\n if (!Number.isSafeInteger(config.maxCompletionTokens) || config.maxCompletionTokens <= 0) {\n return yield* Effect.fail(\n new LLMError({\n cause: 'validation_error',\n message: `${providerName} maxCompletionTokens must be a positive safe integer`,\n retryable: false\n })\n )\n }\n\n yield* validateProviderTranscript(request.messages)\n const systemMessage: OpenAiMessage = { role: 'system', content: request.systemPrompt }\n const requestMessages = yield* Effect.forEach(request.messages, message =>\n toOpenAiMessage(message, providerName)\n )\n const messages = [systemMessage, ...requestMessages]\n\n const completionTokenLimit =\n config.completionTokenField === 'max_tokens'\n ? { max_tokens: config.maxCompletionTokens }\n : { max_completion_tokens: config.maxCompletionTokens }\n const reasoning =\n config.reasoningEffortFormat === 'reasoning-object' && request.reasoningEffort !== undefined\n ? { reasoning: { effort: request.reasoningEffort } }\n : {}\n const body: OpenAiRequestBody = {\n ...config.extraBody,\n ...reasoning,\n model: request.model,\n messages,\n ...completionTokenLimit,\n stream: false\n }\n\n if (request.tools.length === 0) {\n return body\n }\n\n return {\n ...body,\n tools: request.tools.map(toOpenAiTool),\n parallel_tool_calls: true\n }\n })\n\nconst parseToolArguments = (raw: string, providerName: string) =>\n decodeJsonString(raw, `Invalid ${providerName} tool arguments JSON`)\n\nconst toLlmEvents = (\n choice: OpenAiChoiceResponse,\n providerIdentity: OpenAiProviderIdentity\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n if (choice.finish_reason === 'length' || choice.finish_reason === 'content_filter') {\n return yield* Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `${providerIdentity.name} response stopped with ${choice.finish_reason}`,\n retryable: false,\n provider: providerErrorInfo({\n provider: providerIdentity.id,\n kind: 'invalid_response',\n providerCode: choice.finish_reason\n })\n })\n )\n }\n\n const content = choice.message.content ?? ''\n const textEvents = content.length > 0 ? [LLMTextDelta.make({ text: content })] : []\n const toolCallEvents = yield* Effect.forEach(choice.message.tool_calls ?? [], call =>\n parseToolArguments(call.function.arguments, providerIdentity.name).pipe(\n Effect.map(params =>\n LLMToolCall.make({\n call: ToolCall.make({\n id: call.id,\n name: call.function.name,\n params\n })\n })\n )\n )\n )\n\n if (toolCallEvents.length > 0) {\n return [...textEvents, ...toolCallEvents, LLMDone.make({ stopReason: 'tool_use' })]\n }\n\n return [...textEvents, LLMDone.make({ stopReason: 'stop' })]\n })\n\nconst toAgentUsage = (usage: OpenAiUsageResponse) =>\n AgentUsage.make({\n input: AgentInputUsage.make({\n total: usage.prompt_tokens,\n uncached: usage.prompt_tokens - (usage.prompt_tokens_details?.cached_tokens ?? 0),\n cacheRead: usage.prompt_tokens_details?.cached_tokens\n }),\n output: AgentOutputUsage.make({\n total: usage.completion_tokens,\n reasoning: usage.completion_tokens_details?.reasoning_tokens,\n text: usage.completion_tokens - (usage.completion_tokens_details?.reasoning_tokens ?? 0)\n })\n })\n\nconst toHttpClientLlmError =\n (providerIdentity: OpenAiProviderIdentity, retryable: boolean) =>\n (error: HttpClientError.HttpClientError) =>\n new LLMError({\n cause: 'provider_error',\n message: `${providerIdentity.name} request failed: ${error.message}`,\n retryable,\n provider: providerErrorInfo({\n provider: providerIdentity.id,\n kind: retryable ? 'network' : 'unknown'\n })\n })\n\nconst parseOpenAiResponseJson = (\n response: HttpClientResponse.HttpClientResponse,\n providerName: string\n): Effect.Effect<unknown, LLMError> =>\n response.json.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Could not parse ${providerName} response JSON: ${error.message}`,\n retryable: false\n })\n )\n )\n\nconst sendOpenAiRequest = (\n config: OpenAiProviderConfig,\n request: LLMRequest,\n client: HttpClient.HttpClient\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n const providerIdentity = config.providerIdentity ?? defaultOpenAiProviderIdentity\n const body = yield* toOpenAiRequestBody(request, {\n maxCompletionTokens: config.maxCompletionTokens,\n providerName: providerIdentity.name,\n ...(config.completionTokenField === undefined\n ? {}\n : { completionTokenField: config.completionTokenField }),\n ...(config.extraBody === undefined ? {} : { extraBody: config.extraBody }),\n ...(config.reasoningEffortFormat === undefined\n ? {}\n : { reasoningEffortFormat: config.reasoningEffortFormat })\n })\n // Replayed transcripts can carry lone surrogates; harden the lowered\n // body so one bad historical string cannot poison every model call.\n const serializedBody = yield* encodeJsonString(\n replaceLoneSurrogatesDeep(body),\n `Could not serialize ${providerIdentity.name} request`\n )\n\n const httpRequest = HttpClientRequest.post(\n config.chatCompletionsUrl ?? 'https://api.openai.com/v1/chat/completions'\n ).pipe(\n HttpClientRequest.setHeaders({\n ...config.extraHeaders,\n accept: 'application/json',\n authorization: `Bearer ${Redacted.value(config.apiKey)}`,\n 'content-type': 'application/json'\n }),\n HttpClientRequest.bodyText(serializedBody, 'application/json')\n )\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientLlmError(providerIdentity, true)))\n\n if (response.status < 200 || response.status >= 300) {\n const errorText = yield* response.text.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `Could not read ${providerIdentity.name} error body: ${error.message}`,\n retryable: false\n })\n )\n )\n\n const provider = classifyProviderFailure({\n provider: providerIdentity.id,\n status: response.status,\n headers: response.headers,\n body: errorText\n })\n\n return yield* Effect.fail(\n new LLMError({\n cause: providerFailureCause(provider.kind),\n message: `${providerIdentity.name} returned ${response.status}`,\n retryable: providerFailureRetryable(provider.kind),\n provider\n })\n )\n }\n\n const json = yield* parseOpenAiResponseJson(response, providerIdentity.name)\n const parsed = yield* Schema.decodeUnknownEffect(OpenAiChatCompletionResponse)(json).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Invalid ${providerIdentity.name} response: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n const choice = parsed.choices[0]\n\n if (choice === undefined) {\n return yield* Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `${providerIdentity.name} response contained no choices`,\n retryable: false\n })\n )\n }\n\n const events = yield* toLlmEvents(choice, providerIdentity)\n\n if (parsed.usage === undefined) {\n return events\n }\n\n return [...events, LLMUsage.make({ usage: toAgentUsage(parsed.usage) })]\n }).pipe(\n Effect.withSpan(`${config.providerIdentity?.id ?? defaultOpenAiProviderIdentity.id}.stream`)\n )\n\nexport const makeOpenAiProviderLayer = (config: OpenAiProviderConfig) =>\n Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendOpenAiRequest(config, request, client)).pipe(\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n })\n })\n )\n\nexport const OpenAiProviderLayer = Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const config = yield* OpenAiConfig\n const client = yield* HttpClient.HttpClient\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendOpenAiRequest(config, request, client)).pipe(\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n })\n })\n).pipe(Layer.provide(Layer.mergeAll(OpenAiConfigLayer, FetchHttpClient.layer)))\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-gateway-provider.d.mts","names":[],"sources":["../../../src/providers/vercel/ai-gateway-provider.ts"],"mappings":";;;;cAKa,yBAAA;AAAA,cACA,iCAAA;AAAA,KAED,2BAAA;AAAA,KAEA,6BAAA;EAAA,SACD,KAAA,GAAQ,aAAA;EAAA,SACR,IAAA,GAAO,aAAA;EAAA,SACP,IAAA,GAAO,2BAAA;AAAA;AAAA,KAGN,6BAAA;8EAED,MAAA,EAAQ,QAAA,CAAS,QAAA;EAAA,SACjB,mBAAA;EAAA,SACA,cAAA,GAAiB,aAAA;EAAA,SACjB,OAAA,GAAU,6BAAA;EAAA,SACV,YAAA,GAAe,QAAA,CAAS,MAAA,mBAdI;EAAA,SAgB5B,kBAAA;AAAA;AAAA,cAaE,gCAAA,GAAoC,MAAA,EAAQ,6BAAA,KAA6B,KAAA,CAAA,KAAA,gCAAA,WAAA,mDAAA,UAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ai-gateway-provider.d.mts","names":[],"sources":["../../../src/providers/vercel/ai-gateway-provider.ts"],"mappings":";;;;cAKa,yBAAA;AAAA,cACA,iCAAA;AAAA,KAED,2BAAA;AAAA,KAEA,6BAAA;EAAA,SACD,KAAA,GAAQ,aAAA;EAAA,SACR,IAAA,GAAO,aAAA;EAAA,SACP,IAAA,GAAO,2BAAA;AAAA;AAAA,KAGN,6BAAA;8EAED,MAAA,EAAQ,QAAA,CAAS,QAAA;EAAA,SACjB,mBAAA;EAAA,SACA,cAAA,GAAiB,aAAA;EAAA,SACjB,OAAA,GAAU,6BAAA;EAAA,SACV,YAAA,GAAe,QAAA,CAAS,MAAA,mBAdI;EAAA,SAgB5B,kBAAA;AAAA;AAAA,cAaE,gCAAA,GAAoC,MAAA,EAAQ,6BAAA,KAA6B,KAAA,CAAA,KAAA,gCAAA,WAAA,mDAAA,UAAA;AAAA,cA8BzE,4BAAA,EAA4B,KAAA,CAAA,KAAA,gCAAA,WAAA,EAAA,QAAA"}
|
|
@@ -17,6 +17,7 @@ const makeVercelAiGatewayProviderLayer = (config) => makeOpenAiProviderLayer({
|
|
|
17
17
|
apiKey: config.apiKey,
|
|
18
18
|
maxCompletionTokens: config.maxCompletionTokens,
|
|
19
19
|
completionTokenField: "max_tokens",
|
|
20
|
+
reasoningEffortFormat: "reasoning-object",
|
|
20
21
|
chatCompletionsUrl: config.chatCompletionsUrl ?? "https://ai-gateway.vercel.sh/v1/chat/completions",
|
|
21
22
|
providerIdentity: vercelAiGatewayProviderIdentity,
|
|
22
23
|
extraBody: gatewayExtraBody(config),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-gateway-provider.mjs","names":[],"sources":["../../../src/providers/vercel/ai-gateway-provider.ts"],"sourcesContent":["import { Config, Effect, Layer, type Redacted } from 'effect'\nimport { FetchHttpClient } from 'effect/unstable/http'\nimport { LLMError } from '@yolk-sdk/agent/loop'\nimport { makeOpenAiProviderLayer } from '../openai/provider.ts'\n\nexport const vercelAiGatewayProviderId = 'vercel_ai_gateway'\nexport const vercelAiGatewayChatCompletionsUrl = 'https://ai-gateway.vercel.sh/v1/chat/completions'\n\nexport type VercelAiGatewayProviderSort = 'cost' | 'ttft' | 'tps'\n\nexport type VercelAiGatewayRoutingOptions = {\n readonly order?: ReadonlyArray<string>\n readonly only?: ReadonlyArray<string>\n readonly sort?: VercelAiGatewayProviderSort\n}\n\nexport type VercelAiGatewayProviderConfig = {\n /** Accepts either an AI Gateway API key or a Vercel OIDC token. */\n readonly apiKey: Redacted.Redacted<string>\n readonly maxCompletionTokens: number\n readonly fallbackModels?: ReadonlyArray<string>\n readonly routing?: VercelAiGatewayRoutingOptions\n readonly extraHeaders?: Readonly<Record<string, string>>\n /** Override only with a trusted proxy because the bearer credential is sent to this URL. */\n readonly chatCompletionsUrl?: string\n}\n\nconst vercelAiGatewayProviderIdentity = {\n id: vercelAiGatewayProviderId,\n name: 'Vercel AI Gateway'\n}\n\nconst gatewayExtraBody = (config: VercelAiGatewayProviderConfig) => ({\n ...(config.fallbackModels === undefined ? {} : { models: config.fallbackModels }),\n ...(config.routing === undefined ? {} : { providerOptions: { gateway: config.routing } })\n})\n\nexport const makeVercelAiGatewayProviderLayer = (config: VercelAiGatewayProviderConfig) =>\n makeOpenAiProviderLayer({\n apiKey: config.apiKey,\n maxCompletionTokens: config.maxCompletionTokens,\n completionTokenField: 'max_tokens',\n chatCompletionsUrl: config.chatCompletionsUrl ?? vercelAiGatewayChatCompletionsUrl,\n providerIdentity: vercelAiGatewayProviderIdentity,\n extraBody: gatewayExtraBody(config),\n ...(config.extraHeaders === undefined ? {} : { extraHeaders: config.extraHeaders })\n })\n\nconst vercelAiGatewayEnvironmentConfig = Effect.gen(function* () {\n const apiKey = yield* Config.redacted('AI_GATEWAY_API_KEY').pipe(\n Config.orElse(() => Config.redacted('VERCEL_OIDC_TOKEN'))\n )\n const maxCompletionTokens = yield* Config.int('AI_GATEWAY_MAX_COMPLETION_TOKENS')\n\n return { apiKey, maxCompletionTokens }\n}).pipe(\n Effect.mapError(\n () =>\n new LLMError({\n cause: 'provider_error',\n message: 'Vercel AI Gateway environment configuration missing',\n retryable: false\n })\n )\n)\n\nexport const VercelAiGatewayProviderLayer = Layer.unwrap(\n vercelAiGatewayEnvironmentConfig.pipe(Effect.map(makeVercelAiGatewayProviderLayer))\n).pipe(Layer.provide(FetchHttpClient.layer))\n"],"mappings":";;;;;AAKA,MAAa,4BAA4B;AACzC,MAAa,oCAAoC;AAqBjD,MAAM,kCAAkC;CACtC,IAAI;CACJ,MAAM;AACR;AAEA,MAAM,oBAAoB,YAA2C;CACnE,GAAI,OAAO,mBAAmB,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,eAAe;CAC/E,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,EAAE,SAAS,OAAO,QAAQ,EAAE;AACzF;AAEA,MAAa,oCAAoC,WAC/C,wBAAwB;CACtB,QAAQ,OAAO;CACf,qBAAqB,OAAO;CAC5B,sBAAsB;CACtB,oBAAoB,OAAO,sBAAA;CAC3B,kBAAkB;CAClB,WAAW,iBAAiB,MAAM;CAClC,GAAI,OAAO,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,OAAO,aAAa;AACnF,CAAC;AAEH,MAAM,mCAAmC,OAAO,IAAI,aAAa;CAM/D,OAAO;EAAE,QAAA,OALa,OAAO,SAAS,oBAAoB,EAAE,KAC1D,OAAO,aAAa,OAAO,SAAS,mBAAmB,CAAC,CAC1D;EAGiB,qBAAA,OAFkB,OAAO,IAAI,kCAAkC;CAE3C;AACvC,CAAC,EAAE,KACD,OAAO,eAEH,IAAI,SAAS;CACX,OAAO;CACP,SAAS;CACT,WAAW;AACb,CAAC,CACL,CACF;AAEA,MAAa,+BAA+B,MAAM,OAChD,iCAAiC,KAAK,OAAO,IAAI,gCAAgC,CAAC,CACpF,EAAE,KAAK,MAAM,QAAQ,gBAAgB,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"ai-gateway-provider.mjs","names":[],"sources":["../../../src/providers/vercel/ai-gateway-provider.ts"],"sourcesContent":["import { Config, Effect, Layer, type Redacted } from 'effect'\nimport { FetchHttpClient } from 'effect/unstable/http'\nimport { LLMError } from '@yolk-sdk/agent/loop'\nimport { makeOpenAiProviderLayer } from '../openai/provider.ts'\n\nexport const vercelAiGatewayProviderId = 'vercel_ai_gateway'\nexport const vercelAiGatewayChatCompletionsUrl = 'https://ai-gateway.vercel.sh/v1/chat/completions'\n\nexport type VercelAiGatewayProviderSort = 'cost' | 'ttft' | 'tps'\n\nexport type VercelAiGatewayRoutingOptions = {\n readonly order?: ReadonlyArray<string>\n readonly only?: ReadonlyArray<string>\n readonly sort?: VercelAiGatewayProviderSort\n}\n\nexport type VercelAiGatewayProviderConfig = {\n /** Accepts either an AI Gateway API key or a Vercel OIDC token. */\n readonly apiKey: Redacted.Redacted<string>\n readonly maxCompletionTokens: number\n readonly fallbackModels?: ReadonlyArray<string>\n readonly routing?: VercelAiGatewayRoutingOptions\n readonly extraHeaders?: Readonly<Record<string, string>>\n /** Override only with a trusted proxy because the bearer credential is sent to this URL. */\n readonly chatCompletionsUrl?: string\n}\n\nconst vercelAiGatewayProviderIdentity = {\n id: vercelAiGatewayProviderId,\n name: 'Vercel AI Gateway'\n}\n\nconst gatewayExtraBody = (config: VercelAiGatewayProviderConfig) => ({\n ...(config.fallbackModels === undefined ? {} : { models: config.fallbackModels }),\n ...(config.routing === undefined ? {} : { providerOptions: { gateway: config.routing } })\n})\n\nexport const makeVercelAiGatewayProviderLayer = (config: VercelAiGatewayProviderConfig) =>\n makeOpenAiProviderLayer({\n apiKey: config.apiKey,\n maxCompletionTokens: config.maxCompletionTokens,\n completionTokenField: 'max_tokens',\n reasoningEffortFormat: 'reasoning-object',\n chatCompletionsUrl: config.chatCompletionsUrl ?? vercelAiGatewayChatCompletionsUrl,\n providerIdentity: vercelAiGatewayProviderIdentity,\n extraBody: gatewayExtraBody(config),\n ...(config.extraHeaders === undefined ? {} : { extraHeaders: config.extraHeaders })\n })\n\nconst vercelAiGatewayEnvironmentConfig = Effect.gen(function* () {\n const apiKey = yield* Config.redacted('AI_GATEWAY_API_KEY').pipe(\n Config.orElse(() => Config.redacted('VERCEL_OIDC_TOKEN'))\n )\n const maxCompletionTokens = yield* Config.int('AI_GATEWAY_MAX_COMPLETION_TOKENS')\n\n return { apiKey, maxCompletionTokens }\n}).pipe(\n Effect.mapError(\n () =>\n new LLMError({\n cause: 'provider_error',\n message: 'Vercel AI Gateway environment configuration missing',\n retryable: false\n })\n )\n)\n\nexport const VercelAiGatewayProviderLayer = Layer.unwrap(\n vercelAiGatewayEnvironmentConfig.pipe(Effect.map(makeVercelAiGatewayProviderLayer))\n).pipe(Layer.provide(FetchHttpClient.layer))\n"],"mappings":";;;;;AAKA,MAAa,4BAA4B;AACzC,MAAa,oCAAoC;AAqBjD,MAAM,kCAAkC;CACtC,IAAI;CACJ,MAAM;AACR;AAEA,MAAM,oBAAoB,YAA2C;CACnE,GAAI,OAAO,mBAAmB,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,eAAe;CAC/E,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,EAAE,SAAS,OAAO,QAAQ,EAAE;AACzF;AAEA,MAAa,oCAAoC,WAC/C,wBAAwB;CACtB,QAAQ,OAAO;CACf,qBAAqB,OAAO;CAC5B,sBAAsB;CACtB,uBAAuB;CACvB,oBAAoB,OAAO,sBAAA;CAC3B,kBAAkB;CAClB,WAAW,iBAAiB,MAAM;CAClC,GAAI,OAAO,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,OAAO,aAAa;AACnF,CAAC;AAEH,MAAM,mCAAmC,OAAO,IAAI,aAAa;CAM/D,OAAO;EAAE,QAAA,OALa,OAAO,SAAS,oBAAoB,EAAE,KAC1D,OAAO,aAAa,OAAO,SAAS,mBAAmB,CAAC,CAC1D;EAGiB,qBAAA,OAFkB,OAAO,IAAI,kCAAkC;CAE3C;AACvC,CAAC,EAAE,KACD,OAAO,eAEH,IAAI,SAAS;CACX,OAAO;CACP,SAAS;CACT,WAAW;AACb,CAAC,CACL,CACF;AAEA,MAAa,+BAA+B,MAAM,OAChD,iCAAiC,KAAK,OAAO,IAAI,gCAAgC,CAAC,CACpF,EAAE,KAAK,MAAM,QAAQ,gBAAgB,KAAK,CAAC"}
|
|
@@ -40,8 +40,8 @@ declare const parseCommandMarkdown: (input: ParseCommandInput) => Effect.Effect<
|
|
|
40
40
|
fileRefs?: boolean | undefined;
|
|
41
41
|
access?: "read" | "write" | "destructive" | undefined;
|
|
42
42
|
arguments?: readonly {
|
|
43
|
-
readonly required: boolean;
|
|
44
43
|
readonly name: string;
|
|
44
|
+
readonly required: boolean;
|
|
45
45
|
readonly description?: string | undefined;
|
|
46
46
|
}[] | undefined;
|
|
47
47
|
name: string;
|
|
@@ -17,24 +17,24 @@ declare const mergeSkillsets: (sources: ReadonlyArray<SkillsetSource>) => Effect
|
|
|
17
17
|
skills: {
|
|
18
18
|
readonly name: string;
|
|
19
19
|
readonly description: string;
|
|
20
|
-
readonly content: string;
|
|
21
20
|
readonly location: string;
|
|
21
|
+
readonly content: string;
|
|
22
22
|
readonly source?: string | undefined;
|
|
23
23
|
}[];
|
|
24
24
|
commands: {
|
|
25
25
|
readonly name: string;
|
|
26
|
-
readonly hints: readonly string[];
|
|
27
26
|
readonly template: string;
|
|
27
|
+
readonly hints: readonly string[];
|
|
28
28
|
readonly description?: string | undefined;
|
|
29
|
-
readonly source?: string | undefined;
|
|
30
|
-
readonly location?: string | undefined;
|
|
31
29
|
readonly arguments?: readonly {
|
|
32
|
-
readonly required: boolean;
|
|
33
30
|
readonly name: string;
|
|
31
|
+
readonly required: boolean;
|
|
34
32
|
readonly description?: string | undefined;
|
|
35
33
|
}[] | undefined;
|
|
36
34
|
readonly access?: "read" | "write" | "destructive" | undefined;
|
|
37
35
|
readonly fileRefs?: boolean | undefined;
|
|
36
|
+
readonly location?: string | undefined;
|
|
37
|
+
readonly source?: string | undefined;
|
|
38
38
|
}[];
|
|
39
39
|
}, SkillsetError, never>;
|
|
40
40
|
//#endregion
|
package/dist/skillset/name.d.mts
CHANGED
|
@@ -3,8 +3,8 @@ import { Effect } from "effect";
|
|
|
3
3
|
|
|
4
4
|
//#region src/skillset/name.d.ts
|
|
5
5
|
declare const isValidSkillsetName: (name: string) => boolean;
|
|
6
|
-
declare const validateSkillsetName: (name: string) => Effect.Effect<
|
|
7
|
-
declare const validateDirectoryName: (expected: string, actual: string) => Effect.Effect<
|
|
6
|
+
declare const validateSkillsetName: (name: string) => Effect.Effect<string, never, never> | Effect.Effect<never, SkillsetError, never>;
|
|
7
|
+
declare const validateDirectoryName: (expected: string, actual: string) => Effect.Effect<string, never, never> | Effect.Effect<never, SkillsetError, never>;
|
|
8
8
|
//#endregion
|
|
9
9
|
export { isValidSkillsetName, validateDirectoryName, validateSkillsetName };
|
|
10
10
|
//# sourceMappingURL=name.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name.d.mts","names":[],"sources":["../../src/skillset/name.ts"],"mappings":";;;;cAMa,mBAAA,GAAuB,IAAY;AAAA,cAGnC,oBAAA,GAAwB,IAAA,aAAY,MAAA,CAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"name.d.mts","names":[],"sources":["../../src/skillset/name.ts"],"mappings":";;;;cAMa,mBAAA,GAAuB,IAAY;AAAA,cAGnC,oBAAA,GAAwB,IAAA,aAAY,MAAA,CAAA,MAAA,yBAAA,MAAA,CAAA,MAAA,QAAA,aAAA;AAAA,cAUpC,qBAAA,GAAyB,QAAA,UAAkB,MAAA,aAAc,MAAA,CAAA,MAAA,yBAAA,MAAA,CAAA,MAAA,QAAA,aAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yolk-sdk/agent",
|
|
3
|
-
"version": "0.1.0-canary.
|
|
3
|
+
"version": "0.1.0-canary.70",
|
|
4
4
|
"description": "Agent protocol, loop, runtime, Effect-native client, compaction, tools, React, providers, OAuth, skillset, and voice primitives.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -195,7 +195,7 @@
|
|
|
195
195
|
"provenance": true
|
|
196
196
|
},
|
|
197
197
|
"dependencies": {
|
|
198
|
-
"effect": "4.0.0-beta.
|
|
198
|
+
"effect": "4.0.0-beta.80"
|
|
199
199
|
},
|
|
200
200
|
"peerDependencies": {
|
|
201
201
|
"react": ">=19"
|
package/src/client/transport.ts
CHANGED
|
@@ -303,9 +303,7 @@ const idleReconnectMaxAttemptsEffect = (limit: number | undefined) => {
|
|
|
303
303
|
: Effect.fail(invalidIdleReconnectMaxAttemptsError(limit))
|
|
304
304
|
}
|
|
305
305
|
|
|
306
|
-
const validateAgentRunIdleReconnectEffect = (
|
|
307
|
-
options: AgentRunIdleReconnectOptions | undefined
|
|
308
|
-
) => {
|
|
306
|
+
const validateAgentRunIdleReconnectEffect = (options: AgentRunIdleReconnectOptions | undefined) => {
|
|
309
307
|
if (options === undefined) return Effect.void
|
|
310
308
|
|
|
311
309
|
if (!Number.isSafeInteger(options.idleTimeoutMs) || options.idleTimeoutMs <= 0) {
|
|
@@ -565,7 +563,10 @@ const requestAgentResponse = (request: StreamAgentEventsRequest) =>
|
|
|
565
563
|
|
|
566
564
|
const requestAgentRunResponse = (request: StreamAgentRunEventsRequest) =>
|
|
567
565
|
Effect.gen(function* () {
|
|
568
|
-
const endpoint = yield* agentRunEndpointWithStartIndexEffect(
|
|
566
|
+
const endpoint = yield* agentRunEndpointWithStartIndexEffect(
|
|
567
|
+
request.endpoint,
|
|
568
|
+
request.startIndex
|
|
569
|
+
)
|
|
569
570
|
|
|
570
571
|
const client = yield* HttpClient.HttpClient
|
|
571
572
|
const response = yield* client
|
|
@@ -725,10 +726,14 @@ const responseToEventStream = (response: HttpClientResponse.HttpClientResponse)
|
|
|
725
726
|
})
|
|
726
727
|
)
|
|
727
728
|
|
|
728
|
-
yield* run()
|
|
729
|
-
|
|
729
|
+
yield* run()
|
|
730
|
+
}).pipe(
|
|
731
|
+
// Callback producers must settle their queue on defects too, without turning
|
|
732
|
+
// programmer failures into recoverable AgentTransportErrors.
|
|
733
|
+
Effect.onExit(exit =>
|
|
734
|
+
Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void
|
|
730
735
|
)
|
|
731
|
-
|
|
736
|
+
)
|
|
732
737
|
)
|
|
733
738
|
|
|
734
739
|
const abortSignalError = (signal: AbortSignal) =>
|
|
@@ -1063,8 +1068,8 @@ export const streamAgentEventStreamUntilTerminal = (
|
|
|
1063
1068
|
)
|
|
1064
1069
|
yield* Queue.end(queue).pipe(Effect.asVoid)
|
|
1065
1070
|
}).pipe(
|
|
1066
|
-
Effect.
|
|
1067
|
-
Queue.failCause(queue,
|
|
1071
|
+
Effect.onExit(exit =>
|
|
1072
|
+
Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void
|
|
1068
1073
|
)
|
|
1069
1074
|
)
|
|
1070
1075
|
)
|
|
@@ -1107,8 +1112,8 @@ export const streamAgentRunEventStreamUntilTerminal = (
|
|
|
1107
1112
|
)
|
|
1108
1113
|
yield* Queue.end(queue).pipe(Effect.asVoid)
|
|
1109
1114
|
}).pipe(
|
|
1110
|
-
Effect.
|
|
1111
|
-
Queue.failCause(queue,
|
|
1115
|
+
Effect.onExit(exit =>
|
|
1116
|
+
Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void
|
|
1112
1117
|
)
|
|
1113
1118
|
)
|
|
1114
1119
|
)
|
|
@@ -1122,12 +1127,12 @@ const streamAgentRunHitlResponseInitialChunk = (
|
|
|
1122
1127
|
drainAgentEventStream({
|
|
1123
1128
|
queue,
|
|
1124
1129
|
stream: streamAgentRunHitlResponseEventStream({
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1130
|
+
...request,
|
|
1131
|
+
onResponse: response => {
|
|
1132
|
+
setStartIndex(agentRunStreamStartIndexFromHeaders(response.headers))
|
|
1133
|
+
request.onResponse?.(response)
|
|
1134
|
+
}
|
|
1135
|
+
}),
|
|
1131
1136
|
countOffset: 0,
|
|
1132
1137
|
idleReconnect: request.idleReconnect,
|
|
1133
1138
|
onEvent: request.onEvent
|
|
@@ -1170,8 +1175,8 @@ export const streamAgentRunHitlResponseEventStreamUntilTerminal = (
|
|
|
1170
1175
|
)
|
|
1171
1176
|
yield* Queue.end(queue).pipe(Effect.asVoid)
|
|
1172
1177
|
}).pipe(
|
|
1173
|
-
Effect.
|
|
1174
|
-
Queue.failCause(queue,
|
|
1178
|
+
Effect.onExit(exit =>
|
|
1179
|
+
Exit.isFailure(exit) ? Queue.failCause(queue, exit.cause).pipe(Effect.asVoid) : Effect.void
|
|
1175
1180
|
)
|
|
1176
1181
|
)
|
|
1177
1182
|
)
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
replaceLoneSurrogatesDeep,
|
|
22
22
|
prependMessageContextToContent,
|
|
23
23
|
type AgentMessage,
|
|
24
|
+
type AgentReasoningEffort,
|
|
24
25
|
type Content,
|
|
25
26
|
type ContentPart,
|
|
26
27
|
type ToolDef
|
|
@@ -54,8 +55,10 @@ export type OpenAiProviderConfig = {
|
|
|
54
55
|
/** Selects the compatible endpoint's output-limit parameter. Defaults to `max_completion_tokens`. */
|
|
55
56
|
readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'
|
|
56
57
|
readonly extraHeaders?: Readonly<Record<string, string>>
|
|
57
|
-
/** Adds
|
|
58
|
+
/** Adds endpoint extensions; enabled reasoning and canonical model/messages/limit/stream fields win. */
|
|
58
59
|
readonly extraBody?: Readonly<Record<string, unknown>>
|
|
60
|
+
/** Opts into a compatible endpoint's `{ reasoning: { effort } }` request extension. */
|
|
61
|
+
readonly reasoningEffortFormat?: 'reasoning-object'
|
|
59
62
|
/** Customizes safe error metadata for a branded OpenAI-compatible endpoint. */
|
|
60
63
|
readonly providerIdentity?: OpenAiProviderIdentity
|
|
61
64
|
readonly apiKey: Redacted.Redacted<string>
|
|
@@ -109,6 +112,9 @@ type OpenAiRequestBody = {
|
|
|
109
112
|
readonly max_completion_tokens?: number
|
|
110
113
|
readonly max_tokens?: number
|
|
111
114
|
readonly stream: false
|
|
115
|
+
readonly reasoning?: {
|
|
116
|
+
readonly effort: AgentReasoningEffort
|
|
117
|
+
}
|
|
112
118
|
readonly tools?: ReadonlyArray<OpenAiTool>
|
|
113
119
|
readonly parallel_tool_calls?: true
|
|
114
120
|
}
|
|
@@ -117,6 +123,7 @@ type OpenAiRequestBodyConfig = {
|
|
|
117
123
|
readonly maxCompletionTokens: number
|
|
118
124
|
readonly completionTokenField?: 'max_completion_tokens' | 'max_tokens'
|
|
119
125
|
readonly extraBody?: Readonly<Record<string, unknown>>
|
|
126
|
+
readonly reasoningEffortFormat?: 'reasoning-object'
|
|
120
127
|
readonly providerName?: string
|
|
121
128
|
}
|
|
122
129
|
|
|
@@ -415,8 +422,13 @@ export const toOpenAiRequestBody = (
|
|
|
415
422
|
config.completionTokenField === 'max_tokens'
|
|
416
423
|
? { max_tokens: config.maxCompletionTokens }
|
|
417
424
|
: { max_completion_tokens: config.maxCompletionTokens }
|
|
425
|
+
const reasoning =
|
|
426
|
+
config.reasoningEffortFormat === 'reasoning-object' && request.reasoningEffort !== undefined
|
|
427
|
+
? { reasoning: { effort: request.reasoningEffort } }
|
|
428
|
+
: {}
|
|
418
429
|
const body: OpenAiRequestBody = {
|
|
419
430
|
...config.extraBody,
|
|
431
|
+
...reasoning,
|
|
420
432
|
model: request.model,
|
|
421
433
|
messages,
|
|
422
434
|
...completionTokenLimit,
|
|
@@ -535,7 +547,10 @@ const sendOpenAiRequest = (
|
|
|
535
547
|
...(config.completionTokenField === undefined
|
|
536
548
|
? {}
|
|
537
549
|
: { completionTokenField: config.completionTokenField }),
|
|
538
|
-
...(config.extraBody === undefined ? {} : { extraBody: config.extraBody })
|
|
550
|
+
...(config.extraBody === undefined ? {} : { extraBody: config.extraBody }),
|
|
551
|
+
...(config.reasoningEffortFormat === undefined
|
|
552
|
+
? {}
|
|
553
|
+
: { reasoningEffortFormat: config.reasoningEffortFormat })
|
|
539
554
|
})
|
|
540
555
|
// Replayed transcripts can carry lone surrogates; harden the lowered
|
|
541
556
|
// body so one bad historical string cannot poison every model call.
|
|
@@ -40,6 +40,7 @@ export const makeVercelAiGatewayProviderLayer = (config: VercelAiGatewayProvider
|
|
|
40
40
|
apiKey: config.apiKey,
|
|
41
41
|
maxCompletionTokens: config.maxCompletionTokens,
|
|
42
42
|
completionTokenField: 'max_tokens',
|
|
43
|
+
reasoningEffortFormat: 'reasoning-object',
|
|
43
44
|
chatCompletionsUrl: config.chatCompletionsUrl ?? vercelAiGatewayChatCompletionsUrl,
|
|
44
45
|
providerIdentity: vercelAiGatewayProviderIdentity,
|
|
45
46
|
extraBody: gatewayExtraBody(config),
|