mirror of
https://github.com/Dokploy/dokploy
synced 2025-06-26 18:27:59 +00:00
- Add server-side model fetching endpoint with flexible provider support - Refactor client-side AI settings component to use new API query - Implement dynamic header generation for different AI providers - Enhance error handling and toast notifications - Remove local model fetching logic in favor of server-side implementation
113 lines
2.8 KiB
TypeScript
113 lines
2.8 KiB
TypeScript
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
import { createAzure } from "@ai-sdk/azure";
|
|
import { createCohere } from "@ai-sdk/cohere";
|
|
import { createDeepInfra } from "@ai-sdk/deepinfra";
|
|
import { createMistral } from "@ai-sdk/mistral";
|
|
import { createOpenAI } from "@ai-sdk/openai";
|
|
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
import { createOllama } from "ollama-ai-provider";
|
|
|
|
function getProviderName(apiUrl: string) {
|
|
if (apiUrl.includes("api.openai.com")) return "openai";
|
|
if (apiUrl.includes("azure.com")) return "azure";
|
|
if (apiUrl.includes("api.anthropic.com")) return "anthropic";
|
|
if (apiUrl.includes("api.cohere.ai")) return "cohere";
|
|
if (apiUrl.includes("api.perplexity.ai")) return "perplexity";
|
|
if (apiUrl.includes("api.mistral.ai")) return "mistral";
|
|
if (apiUrl.includes("localhost:11434") || apiUrl.includes("ollama"))
|
|
return "ollama";
|
|
if (apiUrl.includes("api.deepinfra.com")) return "deepinfra";
|
|
return "custom";
|
|
}
|
|
|
|
export function selectAIProvider(config: { apiUrl: string; apiKey: string }) {
|
|
const providerName = getProviderName(config.apiUrl);
|
|
|
|
switch (providerName) {
|
|
case "openai":
|
|
return createOpenAI({
|
|
apiKey: config.apiKey,
|
|
baseURL: config.apiUrl,
|
|
});
|
|
case "azure":
|
|
return createAzure({
|
|
apiKey: config.apiKey,
|
|
baseURL: config.apiUrl,
|
|
});
|
|
case "anthropic":
|
|
return createAnthropic({
|
|
apiKey: config.apiKey,
|
|
baseURL: config.apiUrl,
|
|
});
|
|
case "cohere":
|
|
return createCohere({
|
|
baseURL: config.apiUrl,
|
|
apiKey: config.apiKey,
|
|
});
|
|
case "perplexity":
|
|
return createOpenAICompatible({
|
|
name: "perplexity",
|
|
baseURL: config.apiUrl,
|
|
headers: {
|
|
Authorization: `Bearer ${config.apiKey}`,
|
|
},
|
|
});
|
|
case "mistral":
|
|
return createMistral({
|
|
baseURL: config.apiUrl,
|
|
apiKey: config.apiKey,
|
|
});
|
|
case "ollama":
|
|
return createOllama({
|
|
// optional settings, e.g.
|
|
baseURL: config.apiUrl,
|
|
});
|
|
case "deepinfra":
|
|
return createDeepInfra({
|
|
baseURL: config.apiUrl,
|
|
apiKey: config.apiKey,
|
|
});
|
|
case "custom":
|
|
return createOpenAICompatible({
|
|
name: "custom",
|
|
baseURL: config.apiUrl,
|
|
headers: {
|
|
Authorization: `Bearer ${config.apiKey}`,
|
|
},
|
|
});
|
|
default:
|
|
throw new Error(`Unsupported AI provider: ${providerName}`);
|
|
}
|
|
}
|
|
|
|
export const getProviderHeaders = (
|
|
apiUrl: string,
|
|
apiKey: string,
|
|
): Record<string, string> => {
|
|
// Anthropic
|
|
if (apiUrl.includes("anthropic")) {
|
|
return {
|
|
"x-api-key": apiKey,
|
|
"anthropic-version": "2023-06-01",
|
|
};
|
|
}
|
|
|
|
// Mistral
|
|
if (apiUrl.includes("mistral")) {
|
|
return {
|
|
Authorization: apiKey,
|
|
};
|
|
}
|
|
|
|
// Default (OpenAI style)
|
|
return {
|
|
Authorization: `Bearer ${apiKey}`,
|
|
};
|
|
};
|
|
export interface Model {
|
|
id: string;
|
|
object: string;
|
|
created: number;
|
|
owned_by: string;
|
|
}
|