feat: AI coach functions
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
import type { Database } from 'better-sqlite3';
|
||||
import { createAiClient } from './client';
|
||||
import { buildContext } from './context';
|
||||
import { progressPrompt, nextStepPrompt, reschedulePrompt, setupPrompt } from './prompts';
|
||||
import { parseScheduleJson, type ScheduleProposal } from './parser';
|
||||
import { getSetting } from '../db/settings';
|
||||
import { config } from '../config';
|
||||
|
||||
function getModel(db: Database): string {
|
||||
return getSetting(db, 'model') ?? config.defaultModel;
|
||||
}
|
||||
|
||||
async function chat(
|
||||
db: Database,
|
||||
system: string,
|
||||
user: string,
|
||||
jsonMode = false
|
||||
): Promise<string> {
|
||||
const client = createAiClient();
|
||||
const model = getModel(db);
|
||||
const response = await client.chat.completions.create({
|
||||
model,
|
||||
messages: [
|
||||
{ role: 'system', content: system },
|
||||
{ role: 'user', content: user },
|
||||
],
|
||||
...(jsonMode ? { response_format: { type: 'json_object' } } : {}),
|
||||
});
|
||||
return response.choices[0]?.message.content ?? '';
|
||||
}
|
||||
|
||||
export async function getProgressAnalysis(db: Database, today: string): Promise<string> {
|
||||
const ctx = buildContext(db, today);
|
||||
const { system, user } = progressPrompt(ctx);
|
||||
return chat(db, system, user);
|
||||
}
|
||||
|
||||
export async function getNextStep(db: Database, today: string): Promise<string> {
|
||||
const ctx = buildContext(db, today);
|
||||
const { system, user } = nextStepPrompt(ctx);
|
||||
return chat(db, system, user);
|
||||
}
|
||||
|
||||
export async function generateSchedule(
|
||||
db: Database, today: string, note: string | null
|
||||
): Promise<ScheduleProposal[]> {
|
||||
const ctx = buildContext(db, today);
|
||||
const { system, user } = reschedulePrompt(ctx, note);
|
||||
const raw = await chat(db, system, user);
|
||||
return parseScheduleJson(raw);
|
||||
}
|
||||
|
||||
export async function generateSetupSchedule(
|
||||
db: Database,
|
||||
today: string,
|
||||
currentLevel: string,
|
||||
availability: string,
|
||||
goal: string
|
||||
): Promise<ScheduleProposal[]> {
|
||||
const { system, user } = setupPrompt(currentLevel, availability, goal);
|
||||
const raw = await chat(db, system, user);
|
||||
return parseScheduleJson(raw);
|
||||
}
|
||||
|
||||
export async function freeChat(db: Database, today: string, message: string): Promise<string> {
|
||||
const ctx = buildContext(db, today);
|
||||
const { system } = progressPrompt(ctx);
|
||||
return chat(db, system, message);
|
||||
}
|
||||
Reference in New Issue
Block a user