view src/lib/ai/claude/Claude.luan @ 69:f5e72f2d1025

add stt_prompt
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 23 Aug 2025 07:07:59 -0600
parents 6cdb2c761e08
children
line wrap: on
line source

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 deep_copy = Utils.deep_copy or error()
local Logging = require "luan:logging/Logging.luan"
local logger = Logging.logger "claude/Claude"


-- https://docs.anthropic.com/

local Claude = {}

local url = "https://api.anthropic.com/v1/messages"
local headers = {
	["x-api-key"] = Config.claude.key or error()
	["anthropic-version"] = "2023-06-01"
	["Content-Type"] = "application/json"
}
local model = "claude-sonnet-4-0"
local max_tokens = 8192

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(thread)
	}
	try
		local response = uri(url,options).read_text()
		return response
	catch e
		logger.error(options.content)
		e.throw()
	end
end

return Claude