| 72 | } |
| 73 | |
| 74 | function prepareOptions(model: ModelV2.Info, pkg: string) { |
| 75 | const options: Record<string, any> = { |
| 76 | name: model.providerID, |
| 77 | ...(model.api.type === "aisdk" ? (model.api.settings ?? {}) : {}), |
| 78 | ...model.request.body, |
| 79 | } |
| 80 | if (model.api.type === "aisdk" && model.api.url) options.baseURL = model.api.url |
| 81 | |
| 82 | const customFetch = options.fetch |
| 83 | const chunkTimeout = options.chunkTimeout |
| 84 | delete options.chunkTimeout |
| 85 | options.fetch = async (input: Parameters<typeof fetch>[0], init?: RequestInit) => { |
| 86 | const opts = { ...(init ?? {}) } |
| 87 | const signals = [ |
| 88 | opts.signal, |
| 89 | typeof chunkTimeout === "number" && chunkTimeout > 0 ? new AbortController() : undefined, |
| 90 | options.timeout !== undefined && options.timeout !== null && options.timeout !== false |
| 91 | ? AbortSignal.timeout(options.timeout) |
| 92 | : undefined, |
| 93 | ].filter((item): item is AbortSignal | AbortController => Boolean(item)) |
| 94 | const chunkAbortCtl = signals.find((item): item is AbortController => item instanceof AbortController) |
| 95 | const abortSignals = signals.map((item) => (item instanceof AbortController ? item.signal : item)) |
| 96 | if (abortSignals.length === 1) opts.signal = abortSignals[0] |
| 97 | if (abortSignals.length > 1) opts.signal = AbortSignal.any(abortSignals) |
| 98 | |
| 99 | if ( |
| 100 | (pkg === "@ai-sdk/openai" || pkg === "@ai-sdk/azure" || pkg === "@ai-sdk/amazon-bedrock/mantle") && |
| 101 | opts.body && |
| 102 | opts.method === "POST" |
| 103 | ) { |
| 104 | const body = JSON.parse(opts.body as string) |
| 105 | if (body.store !== true && Array.isArray(body.input)) { |
| 106 | for (const item of body.input) { |
| 107 | if ("id" in item) delete item.id |
| 108 | } |
| 109 | opts.body = JSON.stringify(body) |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | const res = await (typeof customFetch === "function" ? customFetch : fetch)(input, { |
| 114 | ...opts, |
| 115 | timeout: false, |
| 116 | }) |
| 117 | if (!chunkAbortCtl || typeof chunkTimeout !== "number") return res |
| 118 | return wrapSSE(res, chunkTimeout, chunkAbortCtl) |
| 119 | } |
| 120 | |
| 121 | return options |
| 122 | } |
| 123 | |
| 124 | export class InitError extends Schema.TaggedErrorClass<InitError>()("AISDK.InitError", { |
| 125 | providerID: ProviderV2.ID, |