Mercurial Hosting > lang
annotate src/lib/ai/claude/Ai_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 | 238a91f224b1 |
rev | line source |
---|---|
5 | 1 local Luan = require "luan:Luan.luan" |
2 local error = Luan.error | |
6 | 3 local ipairs = Luan.ipairs or error() |
4 local type = Luan.type or error() | |
5 local String = require "luan:String.luan" | |
6 local starts_with = String.starts_with or error() | |
7 local Html = require "luan:Html.luan" | |
8 local html_encode = Html.encode or error() | |
9 local Parsers = require "luan:Parsers.luan" | |
10 local json_parse = Parsers.json_parse or error() | |
11 local json_string = Parsers.json_string or error() | |
12 local Claude = require "site:/lib/ai/claude/Claude.luan" | |
13 local claude_chat = Claude.chat or error() | |
14 local Logging = require "luan:logging/Logging.luan" | |
19 | 15 local logger = Logging.logger "claude/Ai_chat" |
5 | 16 |
17 | |
19 | 18 local Ai_chat = {} |
5 | 19 |
19 | 20 function Ai_chat.output_system_prompt(thread) |
9 | 21 thread = json_parse(thread) |
22 local system_prompt = thread.system or error | |
23 system_prompt = html_encode(system_prompt) | |
24 %><%=system_prompt%><% | |
25 end | |
26 | |
34 | 27 function Ai_chat.output_messages_html(show_text,thread,old_thread) |
9 | 28 thread = json_parse(thread) |
29 local messages = thread.messages or error | |
13 | 30 local n = 0 |
31 if old_thread ~= nil then | |
32 old_thread = json_parse(old_thread) | |
33 local old_messages = old_thread.messages or error | |
34 n = #old_messages | |
35 end | |
34 | 36 local checked = show_text and "checked" or "" |
13 | 37 for i, message in ipairs(messages) do |
38 if i <= n then | |
39 continue | |
40 end | |
6 | 41 local role = message.role or error() |
42 local who | |
43 if role=="assistant" then | |
44 who = "Claude" | |
45 elseif role=="user" then | |
46 who = "You" | |
47 else | |
48 error(role) | |
49 end | |
50 local function output(text) | |
9 | 51 text = html_encode(text) |
6 | 52 %> |
7 | 53 <h3><%=who%></h3> |
34 | 54 <div role="<%=role%>"> |
55 <div message markdown><%=text%></div> | |
56 <% if role=="assistant" then %> | |
57 <div controls> | |
58 <audio controls preload=none></audio> | |
59 <label clickable><input type=checkbox name=show_text <%=checked%> >Show text</label> | |
60 </div> | |
61 <% end %> | |
62 </div> | |
6 | 63 <% |
64 end | |
65 local content = message.content or error() | |
66 if type(content) == "string" then | |
67 output(content) | |
68 else | |
69 for _, part in ipairs(content) do | |
70 if part.type=="text" then | |
71 local text = part.text or error() | |
72 output(text) | |
73 end | |
74 end | |
75 end | |
76 end_for | |
5 | 77 end |
78 | |
9 | 79 |
35
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
80 function Ai_chat.init(system_prompt) |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
81 local thread = { |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
82 system = system_prompt |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
83 messages = {nil} |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
84 } |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
85 return json_string(thread) |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
86 end |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
87 |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
88 function Ai_chat.has_messages(thread) |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
89 thread = json_parse(thread) |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
90 return #thread.messages > 0 |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
91 end |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
92 |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
93 function Ai_chat.ask(thread,input) |
3117876debca
ai_first_message in textarea
Franklin Schmidt <fschmidt@gmail.com>
parents:
34
diff
changeset
|
94 thread = json_parse(thread) |
9 | 95 local messages = thread.messages or error |
6 | 96 messages[#messages+1] = { |
97 role = "user" | |
98 content = input | |
99 } | |
100 --[=[ | |
101 messages[#messages+1] = { | |
102 role = "assistant" | |
103 content = [[ | |
13 | 104 hello |
6 | 105 ]] |
106 } | |
107 if true then | |
25 | 108 return |
6 | 109 end |
110 --]=] | |
20 | 111 -- logger.info(json_string(thread)) |
9 | 112 local resultJson = claude_chat(thread) |
6 | 113 local result = json_parse(resultJson) |
114 -- logger.info(json_string(result)) | |
115 result.type == "message" or error() | |
116 result.role == "assistant" or error() | |
117 result.stop_reason == "end_turn" or result.stop_reason == "tool_use" or error() | |
118 local content = result.content or error() | |
119 messages[#messages+1] = { | |
120 role = "assistant" | |
121 content = content | |
122 } | |
9 | 123 return json_string(thread) |
5 | 124 end |
125 | |
19 | 126 return Ai_chat |