6
|
1 local Luan = require "luan:Luan.luan"
|
|
2 local error = Luan.error
|
39
|
3 local ipairs = Luan.ipairs or error()
|
|
4 local type = Luan.type or error()
|
6
|
5 local Io = require "luan:Io.luan"
|
|
6 local uri = Io.uri or error()
|
|
7 local Parsers = require "luan:Parsers.luan"
|
|
8 local json_string = Parsers.json_string or error()
|
|
9 local Config = require "site:/private/Config.luan"
|
9
|
10 local Utils = require "site:/lib/Utils.luan"
|
39
|
11 local deep_copy = Utils.deep_copy or error()
|
6
|
12 local Logging = require "luan:logging/Logging.luan"
|
|
13 local logger = Logging.logger "claude/Claude"
|
|
14
|
|
15
|
26
|
16 -- https://docs.anthropic.com/
|
|
17
|
6
|
18 local Claude = {}
|
|
19
|
|
20 local url = "https://api.anthropic.com/v1/messages"
|
|
21 local headers = {
|
|
22 ["x-api-key"] = Config.claude.key or error()
|
|
23 ["anthropic-version"] = "2023-06-01"
|
|
24 ["Content-Type"] = "application/json"
|
|
25 }
|
|
26 local model = "claude-sonnet-4-0"
|
|
27 local max_tokens = 8192
|
|
28
|
39
|
29 function Claude.chat(thread)
|
|
30 thread = deep_copy(thread)
|
|
31 thread.model = thread.model or model
|
|
32 thread.max_tokens = thread.max_tokens or max_tokens
|
|
33 local messages = thread.messages or error()
|
|
34 for _, message in ipairs(messages) do
|
|
35 local content = message.content or error()
|
|
36 if type(content) == "string" then
|
|
37 content = {{
|
|
38 type = "text"
|
|
39 text = content
|
|
40 }}
|
|
41 message.content = content
|
|
42 end
|
|
43 end
|
|
44 local content = messages[#messages].content or error()
|
|
45 content[#content].cache_control = { type = "ephemeral" }
|
6
|
46 local options = {
|
|
47 method = "POST"
|
|
48 headers = headers
|
39
|
49 content = json_string(thread)
|
6
|
50 }
|
40
|
51 try
|
|
52 local response = uri(url,options).read_text()
|
|
53 return response
|
|
54 catch e
|
|
55 logger.error(options.content)
|
|
56 e.throw()
|
|
57 end
|
6
|
58 end
|
|
59
|
|
60 return Claude
|