- Introduced Form, FormField, FormItem, FormLabel, FormControl, FormDescription, FormMessage components for structured form handling. - Added Input, Textarea, and Select components for user input. - Implemented Label and Separator components for better UI organization. - Created Skeleton component for loading states. - Developed Toast and Toaster components for user notifications. - Integrated useToast hook for managing toast notifications. - Established AI analysis functionality with analyzeJournalWithLocalAI. - Set up Dexie for local database management with Journal and Task models. - Configured Supabase client for server-side and browser-side interactions. - Defined database schema for journals, tasks, chat sessions, and messages with Row Level Security policies. Co-authored-by: Copilot <copilot@github.com>
49 lines
1.7 KiB
TypeScript
49 lines
1.7 KiB
TypeScript
export interface AIAnalysisResult {
|
||
ai_tags: string[];
|
||
ai_sentiment_score: number;
|
||
ai_summary: string;
|
||
suggested_tasks: string[];
|
||
}
|
||
|
||
export async function analyzeJournalWithLocalAI(content: string, model: string = "llama3"): Promise<AIAnalysisResult | null> {
|
||
const prompt = `
|
||
Sen şefkatli bir yapay zeka asistanı ve kişisel yansıma (reflection) yardımcısısın.
|
||
Aşağıdaki günlük girdisini analiz edip tam olarak belirtilen JSON formatında yanıt vermelisin. Düz metin kullanma, SADECE geçerli bir JSON objesi döndür.
|
||
|
||
Günlük Metni: "${content}"
|
||
|
||
İstenen JSON Formatı:
|
||
{
|
||
"ai_tags": ["#duygu", "#konu", vb.],
|
||
"ai_sentiment_score": 0.5, // -1.0 (çok negatif) ile +1.0 (çok pozitif) arası ondalıklı bir değer
|
||
"ai_summary": "Kullanıcının durumunu özetleyen 1-2 cümlelik şefkatli geri bildirim.",
|
||
"suggested_tasks": ["yapılabilecek pratik aksiyon 1", "aksiyon 2"] // Eylem gerektirmiyorsa boş dizi []
|
||
}
|
||
`;
|
||
|
||
try {
|
||
const response = await fetch("http://localhost:11434/api/generate", {
|
||
method: "POST",
|
||
headers: { "Content-Type": "application/json" },
|
||
body: JSON.stringify({
|
||
model: model, // Gerekirse "gemini-3-flash-preview:latest" gibi kendi modeliniz de olabilir
|
||
prompt: prompt,
|
||
stream: false,
|
||
format: "json"
|
||
})
|
||
});
|
||
|
||
if (!response.ok) {
|
||
throw new Error(`Ollama API Hatası: ${response.statusText}`);
|
||
}
|
||
|
||
const data = await response.json();
|
||
const parsedResult = JSON.parse(data.response);
|
||
return parsedResult as AIAnalysisResult;
|
||
|
||
} catch (error) {
|
||
console.error("AI Analizi başarısız oldu (Ollama açık olmayabilir):", error);
|
||
return null;
|
||
}
|
||
}
|