(prompts: PromptIO)
| 190 | } |
| 191 | |
| 192 | async function chooseEmbedding(prompts: PromptIO): Promise<EmbeddingChoice> { |
| 193 | const provider = await prompts.selectOne("Select embedding provider", [ |
| 194 | { |
| 195 | label: "Local embeddings — no API key required", |
| 196 | value: "local", |
| 197 | recommended: true, |
| 198 | }, |
| 199 | { label: "OpenAI-compatible endpoint", value: "openai-compatible" }, |
| 200 | ]); |
| 201 | |
| 202 | if (provider === "local") { |
| 203 | return { provider: "local", model: "Xenova/all-MiniLM-L6-v2" }; |
| 204 | } |
| 205 | |
| 206 | const endpoint = await prompts.text("Embedding endpoint URL", { |
| 207 | placeholder: "https://api.openai.com/v1", |
| 208 | validate: (value) => (value.trim().length === 0 ? "Endpoint is required" : undefined), |
| 209 | }); |
| 210 | const model = await prompts.text("Embedding model", { |
| 211 | initialValue: "text-embedding-3-small", |
| 212 | validate: (value) => (value.trim().length === 0 ? "Model is required" : undefined), |
| 213 | }); |
| 214 | const apiKey = await prompts.text("Embedding API key (optional; leave blank to use env)", { |
| 215 | placeholder: "optional", |
| 216 | }); |
| 217 | |
| 218 | return compactObject({ |
| 219 | provider: "openai-compatible" as const, |
| 220 | endpoint: endpoint.trim(), |
| 221 | model: model.trim(), |
| 222 | api_key: apiKey.trim() || undefined, |
| 223 | }); |
| 224 | } |
| 225 | |
| 226 | export async function runSetup(options: RunSetupOptions = {}): Promise<number> { |
| 227 | const prompts = options.prompts ?? (await getDefaultPrompts()); |
no test coverage detected