1package bedrock
2
3import (
4 "fmt"
5
6 "github.com/charmbracelet/fantasy/ai"
7)
8
9// https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-text-completion.html
10// https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html
11
12type claudeInput struct {
13 AnthropicVersion string `json:"anthropic_version"`
14 MaxTokens *int64 `json:"max_tokens"`
15 Messages []claudeMessage `json:"messages"`
16}
17
18type claudeMessage struct {
19 Role string `json:"role"`
20 Content string `json:"content"`
21}
22
23func toClaudeInput(call ai.Call) (claudeInput, error) {
24 var err error
25 i := claudeInput{
26 MaxTokens: call.MaxOutputTokens,
27 }
28
29 i.Messages, err = toClaudePrompt(call.Prompt)
30 if err != nil {
31 return i, err
32 }
33 return i, nil
34}
35
36func toClaudePrompt(prompt ai.Prompt) (messages []claudeMessage, err error) {
37 for _, m := range prompt {
38 message := claudeMessage{
39 Role: string(m.Role),
40 }
41
42 for _, part := range m.Content {
43 switch content := part.(type) {
44 case ai.TextPart:
45 message.Content = content.Text
46 default:
47 return nil, fmt.Errorf("fantasy: ")
48 }
49 }
50
51 messages = append(messages, message)
52 }
53 return messages, err
54}