mirror of
https://github.com/Crosstalk-Solutions/project-nomad.git
synced 2026-03-31 05:59:26 +02:00
182 lines
5.0 KiB
TypeScript
182 lines
5.0 KiB
TypeScript
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')
|
|
}
|
|
}
|
|
}
|