Mercurial Hosting > lang
view src/lib/Chat.luan @ 16:f5425a3c1898
add languages
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 30 Jul 2025 10:38:27 -0600 |
parents | 65bd7e245c63 |
children | 0351b3d474f8 |
line wrap: on
line source
local Luan = require "luan:Luan.luan" local error = Luan.error local ipairs = Luan.ipairs or error() local Number = require "luan:Number.luan" local long = Number.long or error() local Time = require "luan:Time.luan" local time_now = Time.now or error() local Html = require "luan:Html.luan" local html_encode = Html.encode or error() local Db = require "site:/lib/Db.luan" local run_in_transaction = Db.run_in_transaction or error() local Ai = require "site:/lib/ai/Ai.luan" local languages = require "site:/lib/languages.luan" local Utils = require "site:/lib/Utils.luan" local get_first = Utils.get_first or error() local Chat = {} local function from_doc(doc) doc.type == "chat" or error "wrong type" return Chat.new { id = doc.id user_id = doc.chat_user_id updated = doc.chat_updated name = doc.name ai_name = doc.ai_name ai_thread = doc.ai_thread language = doc.language language_region = doc.language_region } end local function to_doc(chat) return { type = "chat" id = chat.id chat_user_id = long(chat.user_id) chat_updated = long(chat.updated) name = chat.name or error() ai_name = chat.ai_name or error() ai_thread = chat.ai_thread -- or error() language = chat.language or error() language_region = chat.language_region or error() } end local function first_region(language) return get_first(languages[language].regions) end function Chat.new(chat) chat.updated = chat.updated or time_now() chat.ai_name = chat.ai_name or "claude" chat.ai = Ai[chat.ai_name]["Chat.luan"] or error() chat.language_region = chat.language_region or first_region(chat.language) function chat.save() local doc = to_doc(chat) Db.save(doc) chat.id = doc.id end function chat.reload() return Chat.get_by_id(chat.id) or error(chat.id) end function chat.delete() Db.delete("id:"..chat.id) end function chat.name_html() return html_encode(chat.name) end function chat.output_system_prompt() chat.ai.output_system_prompt(chat.ai_thread) end function chat.output_messages_html() chat.ai.output_messages_html(chat.ai_thread) end function chat.ask(input) local old_thread = chat.ai_thread local ai_thread = chat.ai.ask(old_thread,input) run_in_transaction( function() chat = chat.reload() chat.ai_thread = ai_thread chat.save() end ) return `chat.ai.output_messages_html(chat.language_region,ai_thread,old_thread)` end return chat end function Chat.search(query,sort,rows) rows = rows or 1000000 local chats = {} local docs = Db.search(query,1,rows,{sort=sort}) for _, doc in ipairs(docs) do chats[#chats+1] = from_doc(doc) end return chats end function Chat.get_by_id(id) local doc = Db.get_document("id:"..id) return doc and doc.type=="chat" and from_doc(doc) or nil end return Chat