Mercurial Hosting > lang
annotate src/lib/Chat.luan @ 35:3117876debca
ai_first_message in textarea
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 05 Aug 2025 16:41:29 -0600 |
parents | 0fb3488a017d |
children | 2737eeedc1d5 |
rev | line source |
---|---|
4 | 1 local Luan = require "luan:Luan.luan" |
2 local error = Luan.error | |
3 local ipairs = Luan.ipairs or error() | |
4 local Number = require "luan:Number.luan" | |
5 local long = Number.long or error() | |
6 local Time = require "luan:Time.luan" | |
7 local time_now = Time.now or error() | |
8 local Html = require "luan:Html.luan" | |
9 local html_encode = Html.encode or error() | |
10 local Db = require "site:/lib/Db.luan" | |
5 | 11 local run_in_transaction = Db.run_in_transaction or error() |
25 | 12 local Ai_chat = require "site:/lib/ai/claude/Ai_chat.luan" |
16 | 13 local languages = require "site:/lib/languages.luan" |
25 | 14 local Course = require "site:/lib/Course.luan" |
15 local get_course_by_id = Course.get_by_id or error() | |
31 | 16 local Shared = require "site:/lib/Shared.luan" |
17 local voices = Shared.voices or error() | |
4 | 18 |
19 | |
20 local Chat = {} | |
21 | |
22 local function from_doc(doc) | |
23 doc.type == "chat" or error "wrong type" | |
24 return Chat.new { | |
25 id = doc.id | |
26 user_id = doc.chat_user_id | |
27 updated = doc.chat_updated | |
24 | 28 course_id = doc.course_id |
4 | 29 name = doc.name |
5 | 30 ai_thread = doc.ai_thread |
16 | 31 language = doc.language |
32 language_region = doc.language_region | |
31 | 33 voice = doc.voice |
34 | 34 show_text = doc.show_text == "true" |
4 | 35 } |
36 end | |
37 | |
38 local function to_doc(chat) | |
39 return { | |
40 type = "chat" | |
41 id = chat.id | |
42 chat_user_id = long(chat.user_id) | |
43 chat_updated = long(chat.updated) | |
24 | 44 course_id = long(chat.course_id) |
4 | 45 name = chat.name or error() |
35
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
46 ai_thread = chat.ai_thread or error() |
16 | 47 language = chat.language or error() |
48 language_region = chat.language_region or error() | |
31 | 49 voice = chat.voice or error() |
34 | 50 show_text = chat.show_text and "true" or "false" |
4 | 51 } |
52 end | |
53 | |
16 | 54 local function first_region(language) |
32 | 55 return languages[language].regions[1].code |
16 | 56 end |
57 | |
4 | 58 function Chat.new(chat) |
59 chat.updated = chat.updated or time_now() | |
16 | 60 chat.language_region = chat.language_region or first_region(chat.language) |
31 | 61 chat.voice = chat.voice or voices[1].code |
34 | 62 if chat.show_text==nil then chat.show_text = true end |
4 | 63 |
64 function chat.save() | |
65 local doc = to_doc(chat) | |
66 Db.save(doc) | |
67 chat.id = doc.id | |
68 end | |
69 | |
5 | 70 function chat.reload() |
71 return Chat.get_by_id(chat.id) or error(chat.id) | |
72 end | |
73 | |
4 | 74 function chat.delete() |
75 Db.delete("id:"..chat.id) | |
76 end | |
77 | |
29 | 78 function chat.info() |
79 return { | |
80 id = chat.id | |
81 language_region = chat.language_region | |
31 | 82 voice = chat.voice |
29 | 83 name = chat.name |
34 | 84 show_text = chat.show_text |
29 | 85 } |
86 end | |
87 | |
4 | 88 function chat.name_html() |
89 return html_encode(chat.name) | |
90 end | |
91 | |
35
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
92 function chat.init_text() -- return text for textarea |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
93 if Ai_chat.has_messages(chat.ai_thread) then |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
94 return "" |
25 | 95 end |
96 local course = get_course_by_id(chat.course_id) or error() | |
35
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
97 return course.ai_first_message or error() |
25 | 98 end |
99 | |
100 function chat.output_system_prompt() | |
101 Ai_chat.output_system_prompt(chat.ai_thread) | |
102 end | |
103 | |
104 function chat.output_messages_html() | |
34 | 105 Ai_chat.output_messages_html(chat.show_text,chat.ai_thread) |
25 | 106 end |
107 | |
108 function chat.ask(input) | |
109 local old_thread = chat.ai_thread | |
35
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
110 local ai_thread = Ai_chat.ask(old_thread,input) |
25 | 111 run_in_transaction( function() |
112 chat = chat.reload() | |
113 chat.ai_thread = ai_thread | |
114 chat.save() | |
115 end ) | |
34 | 116 return `Ai_chat.output_messages_html(chat.show_text,ai_thread,old_thread)` |
5 | 117 end |
118 | |
21 | 119 function chat.language_name() |
120 return languages[chat.language].name | |
121 end | |
122 | |
4 | 123 return chat |
124 end | |
125 | |
126 function Chat.search(query,sort,rows) | |
127 rows = rows or 1000000 | |
128 local chats = {} | |
129 local docs = Db.search(query,1,rows,{sort=sort}) | |
130 for _, doc in ipairs(docs) do | |
131 chats[#chats+1] = from_doc(doc) | |
132 end | |
133 return chats | |
134 end | |
135 | |
136 function Chat.get_by_id(id) | |
137 local doc = Db.get_document("id:"..id) | |
138 return doc and doc.type=="chat" and from_doc(doc) or nil | |
139 end | |
140 | |
141 return Chat |