claude.go

 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}