import ChatSession from '#models/chat_session' import ChatMessage from '#models/chat_message' import logger from '@adonisjs/core/services/logger' import { DateTime } from 'luxon' import { inject } from '@adonisjs/core' import { OllamaService } from './ollama_service.js' import { ChatRequest } from 'ollama' @inject() export class ChatService { constructor(private ollamaService: OllamaService) {} async chat(chatRequest: ChatRequest & { stream?: false }) { try { return await this.ollamaService.chat(chatRequest) } catch (error) { logger.error(`[ChatService] Chat error: ${error instanceof Error ? error.message : error}`) throw new Error('Chat processing failed') } } async getAllSessions() { try { const sessions = await ChatSession.query().orderBy('updated_at', 'desc') return sessions.map((session) => ({ id: session.id.toString(), title: session.title, model: session.model, timestamp: session.updated_at.toJSDate(), lastMessage: null, // Will be populated from messages if needed })) } catch (error) { logger.error( `[ChatService] Failed to get sessions: ${error instanceof Error ? error.message : error}` ) return [] } } async getSession(sessionId: number) { try { console.log('Fetching session with ID:', sessionId); const session = await ChatSession.query().where('id', sessionId).preload('messages').first() if (!session) { return null } return { id: session.id.toString(), title: session.title, model: session.model, timestamp: session.updated_at.toJSDate(), messages: session.messages.map((msg) => ({ id: msg.id.toString(), role: msg.role, content: msg.content, timestamp: msg.created_at.toJSDate(), })), } } catch (error) { logger.error( `[ChatService] Failed to get session ${sessionId}: ${ error instanceof Error ? error.message : error }` ) return null } } async createSession(title: string, model?: string) { try { const session = await ChatSession.create({ title, model: model || null, }) return { id: session.id.toString(), title: session.title, model: session.model, timestamp: session.created_at.toJSDate(), } } catch (error) { logger.error( `[ChatService] Failed to create session: ${error instanceof Error ? error.message : error}` ) throw new Error('Failed to create chat session') } } async updateSession(sessionId: number, data: { title?: string; model?: string }) { try { const session = await ChatSession.findOrFail(sessionId) if (data.title) { session.title = data.title } if (data.model !== undefined) { session.model = data.model } await session.save() return { id: session.id.toString(), title: session.title, model: session.model, timestamp: session.updated_at.toJSDate(), } } catch (error) { logger.error( `[ChatService] Failed to update session ${sessionId}: ${ error instanceof Error ? error.message : error }` ) throw new Error('Failed to update chat session') } } async addMessage(sessionId: number, role: 'system' | 'user' | 'assistant', content: string) { try { const message = await ChatMessage.create({ session_id: sessionId, role, content, }) // Update session's updated_at timestamp const session = await ChatSession.findOrFail(sessionId) session.updated_at = DateTime.now() await session.save() return { id: message.id.toString(), role: message.role, content: message.content, timestamp: message.created_at.toJSDate(), } } catch (error) { logger.error( `[ChatService] Failed to add message to session ${sessionId}: ${ error instanceof Error ? error.message : error }` ) throw new Error('Failed to add message') } } async deleteSession(sessionId: number) { try { const session = await ChatSession.findOrFail(sessionId) await session.delete() return { success: true } } catch (error) { logger.error( `[ChatService] Failed to delete session ${sessionId}: ${ error instanceof Error ? error.message : error }` ) throw new Error('Failed to delete chat session') } } /** * Delete all chat sessions and messages */ async deleteAllSessions() { try { await ChatSession.query().delete() return { success: true, message: 'All chat sessions deleted' } } catch (error) { logger.error( `[ChatService] Failed to delete all sessions: ${ error instanceof Error ? error.message : error }` ) throw new Error('Failed to delete all chat sessions') } } }