@@ -9,6 +9,7 @@ import (
11 "github.com/anthropics/anthropic-sdk-go"
11 "github.com/anthropics/anthropic-sdk-go"
12+ "github.com/anthropics/anthropic-sdk-go/bedrock"
12 "github.com/anthropics/anthropic-sdk-go/option"
13 "github.com/anthropics/anthropic-sdk-go/option"
13 "github.com/kujtimiihoxha/termai/internal/llm/models"
14 "github.com/kujtimiihoxha/termai/internal/llm/models"
14 "github.com/kujtimiihoxha/termai/internal/llm/tools"
15 "github.com/kujtimiihoxha/termai/internal/llm/tools"
@@ -21,6 +22,8 @@ type anthropicProvider struct {
21 maxTokens int64
22 maxTokens int64
22 apiKey string
23 apiKey string
23 systemMessage string
24 systemMessage string
26type AnthropicOption func(*anthropicProvider)
29type AnthropicOption func(*anthropicProvider)
@@ -49,6 +52,18 @@ func WithAnthropicKey(apiKey string) AnthropicOption {
55+func WithAnthropicBedrock() AnthropicOption {
56+ return func(a *anthropicProvider) {
61+func WithAnthropicDisableCache() AnthropicOption {
62+ return func(a *anthropicProvider) {
63+ a.disableCache = true
52func NewAnthropicProvider(opts ...AnthropicOption) (Provider, error) {
67func NewAnthropicProvider(opts ...AnthropicOption) (Provider, error) {
53 provider := &anthropicProvider{
68 provider := &anthropicProvider{
54 maxTokens: 1024,
69 maxTokens: 1024,
@@ -62,7 +77,16 @@ func NewAnthropicProvider(opts ...AnthropicOption) (Provider, error) {
62 return nil, errors.New("system message is required")
77 return nil, errors.New("system message is required")
80+ anthropicOptions := []option.RequestOption{}
82+ if provider.apiKey != "" {
83+ anthropicOptions = append(anthropicOptions, option.WithAPIKey(provider.apiKey))
85+ if provider.useBedrock {
86+ anthropicOptions = append(anthropicOptions, bedrock.WithLoadDefaultConfig(context.Background()))
65− provider.client = anthropic.NewClient(option.WithAPIKey(provider.apiKey))
89+ provider.client = anthropic.NewClient(anthropicOptions...)
66 return provider, nil
90 return provider, nil
@@ -338,7 +362,7 @@ func (a *anthropicProvider) convertToAnthropicTools(tools []tools.BaseTool) []an
341− if i == len(tools)-1 {
365+ if i == len(tools)-1 && !a.disableCache {
342 toolParam.CacheControl = anthropic.CacheControlEphemeralParam{
366 toolParam.CacheControl = anthropic.CacheControlEphemeralParam{
343 Type: "ephemeral",
367 Type: "ephemeral",
@@ -358,7 +382,7 @@ func (a *anthropicProvider) convertToAnthropicMessages(messages []message.Messag
358 switch msg.Role {
382 switch msg.Role {
359 case message.User:
383 case message.User:
360 content := anthropic.NewTextBlock(msg.Content().String())
384 content := anthropic.NewTextBlock(msg.Content().String())
361− if cachedBlocks < 2 {
385+ if cachedBlocks < 2 && !a.disableCache {
362 content.OfRequestTextBlock.CacheControl = anthropic.CacheControlEphemeralParam{
386 content.OfRequestTextBlock.CacheControl = anthropic.CacheControlEphemeralParam{
363 Type: "ephemeral",
387 Type: "ephemeral",
@@ -370,7 +394,7 @@ func (a *anthropicProvider) convertToAnthropicMessages(messages []message.Messag
370 blocks := []anthropic.ContentBlockParamUnion{}
394 blocks := []anthropic.ContentBlockParamUnion{}
371 if msg.Content().String() != "" {
395 if msg.Content().String() != "" {
372 content := anthropic.NewTextBlock(msg.Content().String())
396 content := anthropic.NewTextBlock(msg.Content().String())
373− if cachedBlocks < 2 {
397+ if cachedBlocks < 2 && !a.disableCache {
374 content.OfRequestTextBlock.CacheControl = anthropic.CacheControlEphemeralParam{
398 content.OfRequestTextBlock.CacheControl = anthropic.CacheControlEphemeralParam{
375 Type: "ephemeral",
399 Type: "ephemeral",
@@ -404,4 +428,3 @@ func (a *anthropicProvider) convertToAnthropicMessages(messages []message.Messag
405 return anthropicMessages
429 return anthropicMessages