Update dependencies, enhance AI integration, and improve email content
Some checks failed
Deploy / deploy (push) Failing after 1h35m43s

- Added @google/genai dependency for enhanced AI capabilities.
- Updated CI workflow to include new environment variables for AI integration.
- Refactored AI client to support multiple providers and improved key management.
- Enhanced email templates for better user engagement and clarity.
- Updated error handling in AI-related functions to provide clearer feedback.
- Made various improvements to the application structure and code clarity.
This commit is contained in:
bilalgursen
2026-08-02 21:37:25 +03:00
parent 2278d2a218
commit c2aba25814
12 changed files with 548 additions and 98 deletions

View File

@@ -1,11 +1,44 @@
import Anthropic from "@anthropic-ai/sdk";
import { GoogleGenAI } from "@google/genai";
// Model seçimi (bilinçli): rapor tek seferlik ve yüksek değerli -> Opus 4.8;
export type Saglayici = "anthropic" | "gemini";
/** AI_SAGLAYICI env'i ile seçilir; tanımsızsa hangi anahtar varsa o kullanılır. */
export function saglayici(): Saglayici {
const secim = process.env.AI_SAGLAYICI?.trim().toLowerCase();
if (secim === "gemini" || secim === "anthropic") return secim;
return process.env.GEMINI_API_KEY ? "gemini" : "anthropic";
}
/** Seçili sağlayıcının anahtarı tanımlı mı (mock moduna düşülecek mi)? */
export function anahtarVar(): boolean {
return saglayici() === "gemini"
? Boolean(process.env.GEMINI_API_KEY)
: Boolean(process.env.ANTHROPIC_API_KEY || process.env.ANTHROPIC_AUTH_TOKEN);
}
// Model seçimi (bilinçli):
// Anthropic — rapor tek seferlik ve yüksek değerli -> Opus 4.8;
// sohbet kredi başına marj hassas -> Haiku 4.5 (kullanıcı kararı, 22 Tem 2026).
export const RAPOR_MODEL = "claude-opus-4-8";
export const SOHBET_MODEL = "claude-haiku-4-5";
// Gemini — ücretsiz katmanda yalnızca Flash ailesi açık (Pro'da kota 0),
// bu yüzden rapor ve sohbet aynı modeli kullanır; ayrım thinking seviyesinde.
const MODELLER: Record<Saglayici, { rapor: string; sohbet: string }> = {
anthropic: { rapor: "claude-opus-4-8", sohbet: "claude-haiku-4-5" },
gemini: { rapor: "gemini-3.6-flash", sohbet: "gemini-3.6-flash" },
};
const globalForAi = globalThis as unknown as { __anthropic?: Anthropic };
export function raporModeli(): string {
return MODELLER[saglayici()].rapor;
}
export function sohbetModeli(): string {
return MODELLER[saglayici()].sohbet;
}
const globalForAi = globalThis as unknown as {
__anthropic?: Anthropic;
__gemini?: GoogleGenAI;
};
export function getAnthropic(): Anthropic {
if (!process.env.ANTHROPIC_API_KEY && !process.env.ANTHROPIC_AUTH_TOKEN) {
@@ -17,5 +50,16 @@ export function getAnthropic(): Anthropic {
return globalForAi.__anthropic;
}
export function getGemini(): GoogleGenAI {
const apiKey = process.env.GEMINI_API_KEY;
if (!apiKey) {
throw new Error("AI_KEY_MISSING");
}
if (!globalForAi.__gemini) {
globalForAi.__gemini = new GoogleGenAI({ apiKey });
}
return globalForAi.__gemini;
}
export const SORUMLULUK_REDDI =
"KolayTercih bir karar destek aracıdır; öneriler resmî YÖK Atlas verisine dayanır ancak yerleşme garantisi verilmez. Nihai tercih sorumluluğu adaya aittir.";