own provider update + retry buggy response
This commit is contained in:
+45
-12
@@ -1,14 +1,25 @@
|
||||
import { config } from "../config.ts";
|
||||
import { ApiDriverBase } from "./apiBase.ts";
|
||||
|
||||
/**
|
||||
* Concrete API drivers read their key from the server env by default.
|
||||
* Pass `apiKeyOverride` to build a per-user (BYOK) instance instead: the
|
||||
* driver is then enabled whenever the override key is non-empty, ignoring
|
||||
* the global `*_ENABLED` flag. See `src/userProviders.ts`.
|
||||
*/
|
||||
function globalEnabled(flag: boolean, key: string): boolean {
|
||||
return flag && key.length > 0;
|
||||
}
|
||||
|
||||
/** Mistral API driver. Global priority #2 (after local ollama). */
|
||||
export class MistralDriver extends ApiDriverBase {
|
||||
readonly name = "mistral";
|
||||
constructor() {
|
||||
constructor(apiKeyOverride?: string) {
|
||||
const apiKey = apiKeyOverride ?? config.mistralApiKey;
|
||||
super({
|
||||
baseUrl: "https://api.mistral.ai/v1",
|
||||
apiKey: config.mistralApiKey,
|
||||
enabled: config.mistralEnabled,
|
||||
apiKey,
|
||||
enabled: apiKeyOverride !== undefined ? apiKey.length > 0 : globalEnabled(config.mistralEnabled, apiKey),
|
||||
defaultModels: ["mistral-large-latest", "mistral-medium-latest", "mistral-small-latest"],
|
||||
});
|
||||
}
|
||||
@@ -17,11 +28,12 @@ export class MistralDriver extends ApiDriverBase {
|
||||
/** DeepSeek API driver. Priority within APIs: DeepSeek first. */
|
||||
export class DeepSeekDriver extends ApiDriverBase {
|
||||
readonly name = "deepseek";
|
||||
constructor() {
|
||||
constructor(apiKeyOverride?: string) {
|
||||
const apiKey = apiKeyOverride ?? config.deepseekApiKey;
|
||||
super({
|
||||
baseUrl: "https://api.deepseek.com/v1",
|
||||
apiKey: config.deepseekApiKey,
|
||||
enabled: config.deepseekEnabled,
|
||||
apiKey,
|
||||
enabled: apiKeyOverride !== undefined ? apiKey.length > 0 : globalEnabled(config.deepseekEnabled, apiKey),
|
||||
defaultModels: ["deepseek-chat", "deepseek-reasoner"],
|
||||
});
|
||||
}
|
||||
@@ -30,11 +42,12 @@ export class DeepSeekDriver extends ApiDriverBase {
|
||||
/** Anthropic driver (OpenAI-compatible endpoint). Priority: after DeepSeek. */
|
||||
export class AnthropicDriver extends ApiDriverBase {
|
||||
readonly name = "anthropic";
|
||||
constructor() {
|
||||
constructor(apiKeyOverride?: string) {
|
||||
const apiKey = apiKeyOverride ?? config.anthropicApiKey;
|
||||
super({
|
||||
baseUrl: "https://api.anthropic.com/v1",
|
||||
apiKey: config.anthropicApiKey,
|
||||
enabled: config.anthropicEnabled,
|
||||
apiKey,
|
||||
enabled: apiKeyOverride !== undefined ? apiKey.length > 0 : globalEnabled(config.anthropicEnabled, apiKey),
|
||||
defaultModels: ["claude-sonnet-4-20250514", "claude-3-7-sonnet-latest"],
|
||||
});
|
||||
}
|
||||
@@ -43,16 +56,36 @@ export class AnthropicDriver extends ApiDriverBase {
|
||||
/** OpenAI API driver. Priority: last among APIs. */
|
||||
export class OpenAIDriver extends ApiDriverBase {
|
||||
readonly name = "openai";
|
||||
constructor() {
|
||||
constructor(apiKeyOverride?: string) {
|
||||
const apiKey = apiKeyOverride ?? config.openaiApiKey;
|
||||
super({
|
||||
baseUrl: "https://api.openai.com/v1",
|
||||
apiKey: config.openaiApiKey,
|
||||
enabled: config.openaiEnabled,
|
||||
apiKey,
|
||||
enabled: apiKeyOverride !== undefined ? apiKey.length > 0 : globalEnabled(config.openaiEnabled, apiKey),
|
||||
defaultModels: ["gpt-4o", "gpt-4o-mini"],
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gemini driver (Google AI, OpenAI-compatible endpoint). Priority: after GLM.
|
||||
* Docs: https://ai.google.dev/gemini-api/docs/openai — key from
|
||||
* https://aistudio.google.com/apikey (server: GEMINI_API_KEY, or per-user
|
||||
* BYOK in settings).
|
||||
*/
|
||||
export class GeminiDriver extends ApiDriverBase {
|
||||
readonly name = "gemini";
|
||||
constructor(apiKeyOverride?: string) {
|
||||
const apiKey = apiKeyOverride ?? config.geminiApiKey;
|
||||
super({
|
||||
baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
|
||||
apiKey,
|
||||
enabled: apiKeyOverride !== undefined ? apiKey.length > 0 : globalEnabled(config.geminiEnabled, apiKey),
|
||||
defaultModels: ["gemini-2.5-flash", "gemini-2.5-pro", "gemini-2.0-flash"],
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GLM driver (Zhipu AI, OpenAI-compatible endpoint). Priority: after Mistral.
|
||||
* Docs: https://docs.z.ai — international base is api.z.ai, mainland China
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
import { AnthropicDriver, DeepSeekDriver, GlmDriver, MistralDriver, OpenAIDriver } from "./apis.ts";
|
||||
import { AnthropicDriver, DeepSeekDriver, GeminiDriver, GlmDriver, MistralDriver, OpenAIDriver } from "./apis.ts";
|
||||
import { OllamaDriver } from "./ollama.ts";
|
||||
import { createArcaicDrivers } from "./arcaic.ts";
|
||||
import type { DriverModel, LLMDriver } from "./types.ts";
|
||||
|
||||
/**
|
||||
* Global driver priority (per spec):
|
||||
* 1. ollama (local) -> 2. mistral -> 3. glm
|
||||
* -> 4. arcaic-openai -> 5. arcaic-gemini -> 6. arcaic-qwen
|
||||
* -> 7. deepseek -> 8. anthropic -> 9. openai
|
||||
* 1. ollama (local) -> 2. mistral -> 3. glm -> 4. gemini
|
||||
* -> 5. arcaic-openai -> 6. arcaic-gemini -> 7. arcaic-qwen
|
||||
* -> 8. deepseek -> 9. anthropic -> 10. openai
|
||||
*/
|
||||
const PRIORITY = [
|
||||
"ollama",
|
||||
"mistral",
|
||||
"glm",
|
||||
"gemini",
|
||||
"arcaic-openai",
|
||||
"arcaic-gemini",
|
||||
"arcaic-qwen",
|
||||
@@ -37,6 +38,7 @@ export class DriverRegistry {
|
||||
new OllamaDriver(),
|
||||
new MistralDriver(),
|
||||
new GlmDriver(),
|
||||
new GeminiDriver(),
|
||||
...createArcaicDrivers(),
|
||||
new DeepSeekDriver(),
|
||||
new AnthropicDriver(),
|
||||
|
||||
Reference in New Issue
Block a user