@@ -5,6 +5,8 @@ import { DateTime } from 'luxon'
55import { inject } from '@adonisjs/core'
66import { OllamaService } from './ollama_service.js'
77import { ChatRequest } from 'ollama'
8+ import { SYSTEM_PROMPTS } from '../../constants/ollama.js'
9+ import { toTitleCase } from '../utils/misc.js'
810
911@inject ( )
1012export class ChatService {
@@ -37,9 +39,75 @@ export class ChatService {
3739 }
3840 }
3941
42+ async getChatSuggestions ( ) {
43+ try {
44+ const models = await this . ollamaService . getModels ( )
45+ if ( ! models ) {
46+ return [ ] // If no models are available, return empty suggestions
47+ }
48+
49+ // Larger models generally give "better" responses, so pick the largest one
50+ const largestModel = models . reduce ( ( prev , current ) => {
51+ return prev . size > current . size ? prev : current
52+ } )
53+
54+ if ( ! largestModel ) {
55+ return [ ]
56+ }
57+
58+ const response = await this . ollamaService . chat ( {
59+ model : largestModel . name ,
60+ messages : [
61+ {
62+ role : 'user' ,
63+ content : SYSTEM_PROMPTS . chat_suggestions ,
64+ }
65+ ] ,
66+ stream : false ,
67+ } )
68+
69+ if ( response && response . message && response . message . content ) {
70+ const content = response . message . content . trim ( )
71+
72+ // Handle both comma-separated and newline-separated formats
73+ let suggestions : string [ ] = [ ]
74+
75+ // Try splitting by commas first
76+ if ( content . includes ( ',' ) ) {
77+ suggestions = content . split ( ',' ) . map ( ( s ) => s . trim ( ) )
78+ }
79+ // Fall back to newline separation
80+ else {
81+ suggestions = content
82+ . split ( / \r ? \n / )
83+ . map ( ( s ) => s . trim ( ) )
84+ // Remove numbered list markers (1., 2., 3., etc.) and bullet points
85+ . map ( ( s ) => s . replace ( / ^ \d + \. \s * / , '' ) . replace ( / ^ [ - * • ] \s * / , '' ) )
86+ // Remove surrounding quotes if present
87+ . map ( ( s ) => s . replace ( / ^ [ " ' ] | [ " ' ] $ / g, '' ) )
88+ }
89+
90+ // Filter out empty strings and limit to 3 suggestions
91+ const filtered = suggestions
92+ . filter ( ( s ) => s . length > 0 )
93+ . slice ( 0 , 3 )
94+
95+ return filtered . map ( ( s ) => toTitleCase ( s ) )
96+ } else {
97+ return [ ]
98+ }
99+ } catch ( error ) {
100+ logger . error (
101+ `[ChatService] Failed to get chat suggestions: ${
102+ error instanceof Error ? error . message : error
103+ } `
104+ )
105+ return [ ]
106+ }
107+ }
108+
40109 async getSession ( sessionId : number ) {
41110 try {
42- console . log ( 'Fetching session with ID:' , sessionId ) ;
43111 const session = await ChatSession . query ( ) . where ( 'id' , sessionId ) . preload ( 'messages' ) . first ( )
44112
45113 if ( ! session ) {
0 commit comments