changeset 39:df72d5d5d9dc

add cache_control
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 10 Aug 2025 06:25:35 +0900
parents 238a91f224b1
children 6cdb2c761e08
files src/lib/Utils.luan src/lib/ai/claude/Claude.luan
diffstat 2 files changed, 43 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
diff -r 238a91f224b1 -r df72d5d5d9dc src/lib/Utils.luan
--- a/src/lib/Utils.luan	Sat Aug 09 09:31:28 2025 +0900
+++ b/src/lib/Utils.luan	Sun Aug 10 06:25:35 2025 +0900
@@ -1,6 +1,7 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
 local pairs = Luan.pairs or error()
+local type = Luan.type or error()
 local Http = require "luan:http/Http.luan"
 
 
@@ -19,6 +20,27 @@
 	return rtn
 end
 
+local function deep_copy2(v,map)
+	if type(v) ~= "table" then
+		return v
+	end
+	local v2 = map[v]
+	if v2 ~= nil then
+		return v2
+	end
+	local t = {}
+	map[v] = t
+	for key, val in pairs(v) do
+		t[deep_copy2(key,map)] = deep_copy2(val,map)
+	end
+	return t
+end
+
+local function deep_copy(v)
+	return deep_copy2(v,{})
+end
+Utils.deep_copy = deep_copy
+
 --[[
 function Utils.get_first(t)
 	return pairs(t)()
diff -r 238a91f224b1 -r df72d5d5d9dc src/lib/ai/claude/Claude.luan
--- a/src/lib/ai/claude/Claude.luan	Sat Aug 09 09:31:28 2025 +0900
+++ b/src/lib/ai/claude/Claude.luan	Sun Aug 10 06:25:35 2025 +0900
@@ -1,12 +1,14 @@
 local Luan = require "luan:Luan.luan"
 local error = Luan.error
+local ipairs = Luan.ipairs or error()
+local type = Luan.type or error()
 local Io = require "luan:Io.luan"
 local uri = Io.uri or error()
 local Parsers = require "luan:Parsers.luan"
 local json_string = Parsers.json_string or error()
 local Config = require "site:/private/Config.luan"
 local Utils = require "site:/lib/Utils.luan"
-local shallow_copy = Utils.shallow_copy or error()
+local deep_copy = Utils.deep_copy or error()
 local Logging = require "luan:logging/Logging.luan"
 local logger = Logging.logger "claude/Claude"
 
@@ -24,14 +26,27 @@
 local model = "claude-sonnet-4-0"
 local max_tokens = 8192
 
-function Claude.chat(content)
-	content = shallow_copy(content)
-	content.model = content.model or model
-	content.max_tokens = content.max_tokens or max_tokens
+function Claude.chat(thread)
+	thread = deep_copy(thread)
+	thread.model = thread.model or model
+	thread.max_tokens = thread.max_tokens or max_tokens
+	local messages = thread.messages or error()
+	for _, message in ipairs(messages) do
+		local content = message.content or error()
+		if type(content) == "string" then
+			content = {{
+				type = "text"
+				text = content
+			}}
+			message.content = content
+		end
+	end
+	local content = messages[#messages].content or error()
+	content[#content].cache_control = { type = "ephemeral" }
 	local options = {
 		method = "POST"
 		headers = headers
-		content = json_string(content)
+		content = json_string(thread)
 	}
 	local response = uri(url,options).read_text()
 	return response