13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/rach/provider/anthropic.rb', line 13
def chat(**parameters)
messages = parameters.dig(:parameters, :messages) || []
system_message = messages.find { |msg| msg[:role] == "system" }
messages = messages.reject { |msg| msg[:role] == "system" } if system_message
messages = messages.map do |msg|
{
role: msg[:role] == "assistant" ? "assistant" : "user",
content: msg[:content]
}
end
temperature = (parameters.dig(:parameters, :temperature) || 1).clamp(0, 1)
max_tokens = parameters.dig(:parameters, :max_tokens) || 1024
tools = convert_tools(parameters.dig(:parameters, :tools))
anthropic_params = {
model: parameters.dig(:parameters, :model),
messages:,
temperature:,
max_tokens:,
tools:,
tool_choice: convert_tool_choice(tools),
system: system_message&.[](:content)
}.compact
if @logger
@logger.info("Making API call to Anthropic")
@logger.info("Request parameters: #{anthropic_params.inspect}")
end
raw_response = @client.messages(
parameters: anthropic_params.compact
)
if @logger
@logger.info("Request to Anthropic: #{JSON.pretty_generate(anthropic_params)}")
@logger.info("Response: #{JSON.pretty_generate(raw_response)}")
end
Response.new(
id: raw_response["id"],
model: raw_response["model"],
content: raw_response.dig("content", 0, "text"),
tool_calls: convert_tool_calls(raw_response["content"]),
usage: {
"prompt_tokens" => raw_response["usage"]["input_tokens"],
"completion_tokens" => raw_response["usage"]["output_tokens"],
"total_tokens" => raw_response["usage"]["input_tokens"] + raw_response["usage"]["output_tokens"]
},
raw_response: raw_response
)
end
|