| 129 | model.api.type === "aisdk" ? `${model.api.type}:${model.api.package}` : model.api.type |
| 130 | |
| 131 | export const fromCatalogModel = ( |
| 132 | model: ModelV2.Info, |
| 133 | credential?: Credential.Value, |
| 134 | ): Effect.Effect<Model, UnsupportedApiError> => { |
| 135 | const resolved = |
| 136 | credential?.type !== "key" || credential.metadata === undefined |
| 137 | ? model |
| 138 | : produce(model, (draft) => { |
| 139 | Object.assign(draft.request.body, credential.metadata) |
| 140 | }) |
| 141 | const key = apiKey(resolved, credential) |
| 142 | if (resolved.api.type === "aisdk" && resolved.api.package === "@ai-sdk/openai") { |
| 143 | return Effect.succeed( |
| 144 | withDefaults(resolved, OpenAIResponses.route) |
| 145 | .with({ auth: key === undefined ? Auth.none : Auth.bearer(key) }) |
| 146 | .model({ id: resolved.api.id }), |
| 147 | ) |
| 148 | } |
| 149 | if (resolved.api.type === "aisdk" && resolved.api.package === "@ai-sdk/anthropic") { |
| 150 | return Effect.succeed( |
| 151 | withDefaults(resolved, AnthropicMessages.route) |
| 152 | .with({ auth: key === undefined ? Auth.none : Auth.header("x-api-key", key) }) |
| 153 | .model({ id: resolved.api.id }), |
| 154 | ) |
| 155 | } |
| 156 | if (resolved.api.type === "aisdk" && resolved.api.package === "@ai-sdk/openai-compatible" && resolved.api.url) { |
| 157 | return Effect.succeed( |
| 158 | withDefaults(resolved, OpenAICompatibleChat.route) |
| 159 | .with({ auth: key === undefined ? Auth.none : Auth.bearer(key) }) |
| 160 | .model({ id: resolved.api.id }), |
| 161 | ) |
| 162 | } |
| 163 | return Effect.fail( |
| 164 | new UnsupportedApiError({ |
| 165 | providerID: resolved.providerID, |
| 166 | modelID: resolved.id, |
| 167 | api: apiName(resolved), |
| 168 | }), |
| 169 | ) |
| 170 | } |
| 171 | |
| 172 | export const resolve = (session: SessionSchema.Info, model: ModelV2.Info, credential?: Credential.Value) => |
| 173 | withVariant(model, session.model?.variant).pipe(Effect.flatMap((model) => fromCatalogModel(model, credential))) |