1// Package anthropic provides an implementation of the fantasy AI SDK for Anthropic's language models.
2package anthropic
3
4import (
5 "encoding/json"
6
7 "charm.land/fantasy"
8)
9
10// Global type identifiers for Anthropic-specific provider data.
11const (
12 TypeProviderOptions = Name + ".options"
13 TypeReasoningOptionMetadata = Name + ".reasoning_metadata"
14 TypeProviderCacheControl = Name + ".cache_control_options"
15)
16
17// Register Anthropic provider-specific types with the global registry.
18func init() {
19 fantasy.RegisterProviderType(TypeProviderOptions, func(data []byte) (fantasy.ProviderOptionsData, error) {
20 var v ProviderOptions
21 if err := json.Unmarshal(data, &v); err != nil {
22 return nil, err
23 }
24 return &v, nil
25 })
26 fantasy.RegisterProviderType(TypeReasoningOptionMetadata, func(data []byte) (fantasy.ProviderOptionsData, error) {
27 var v ReasoningOptionMetadata
28 if err := json.Unmarshal(data, &v); err != nil {
29 return nil, err
30 }
31 return &v, nil
32 })
33 fantasy.RegisterProviderType(TypeProviderCacheControl, func(data []byte) (fantasy.ProviderOptionsData, error) {
34 var v ProviderCacheControlOptions
35 if err := json.Unmarshal(data, &v); err != nil {
36 return nil, err
37 }
38 return &v, nil
39 })
40}
41
42// ProviderOptions represents additional options for the Anthropic provider.
43type ProviderOptions struct {
44 SendReasoning *bool `json:"send_reasoning"`
45 Thinking *ThinkingProviderOption `json:"thinking"`
46 DisableParallelToolUse *bool `json:"disable_parallel_tool_use"`
47}
48
49// Options implements the ProviderOptions interface.
50func (o *ProviderOptions) Options() {}
51
52// MarshalJSON implements custom JSON marshaling with type info for ProviderOptions.
53func (o ProviderOptions) MarshalJSON() ([]byte, error) {
54 type plain ProviderOptions
55 return fantasy.MarshalProviderType(TypeProviderOptions, plain(o))
56}
57
58// UnmarshalJSON implements custom JSON unmarshaling with type info for ProviderOptions.
59func (o *ProviderOptions) UnmarshalJSON(data []byte) error {
60 type plain ProviderOptions
61 var p plain
62 if err := fantasy.UnmarshalProviderType(data, &p); err != nil {
63 return err
64 }
65 *o = ProviderOptions(p)
66 return nil
67}
68
69// ThinkingProviderOption represents thinking options for the Anthropic provider.
70type ThinkingProviderOption struct {
71 BudgetTokens int64 `json:"budget_tokens"`
72}
73
74// ReasoningOptionMetadata represents reasoning metadata for the Anthropic provider.
75type ReasoningOptionMetadata struct {
76 Signature string `json:"signature"`
77 RedactedData string `json:"redacted_data"`
78}
79
80// Options implements the ProviderOptions interface.
81func (*ReasoningOptionMetadata) Options() {}
82
83// MarshalJSON implements custom JSON marshaling with type info for ReasoningOptionMetadata.
84func (m ReasoningOptionMetadata) MarshalJSON() ([]byte, error) {
85 type plain ReasoningOptionMetadata
86 return fantasy.MarshalProviderType(TypeReasoningOptionMetadata, plain(m))
87}
88
89// UnmarshalJSON implements custom JSON unmarshaling with type info for ReasoningOptionMetadata.
90func (m *ReasoningOptionMetadata) UnmarshalJSON(data []byte) error {
91 type plain ReasoningOptionMetadata
92 var p plain
93 if err := fantasy.UnmarshalProviderType(data, &p); err != nil {
94 return err
95 }
96 *m = ReasoningOptionMetadata(p)
97 return nil
98}
99
100// ProviderCacheControlOptions represents cache control options for the Anthropic provider.
101type ProviderCacheControlOptions struct {
102 CacheControl CacheControl `json:"cache_control"`
103}
104
105// Options implements the ProviderOptions interface.
106func (*ProviderCacheControlOptions) Options() {}
107
108// MarshalJSON implements custom JSON marshaling with type info for ProviderCacheControlOptions.
109func (o ProviderCacheControlOptions) MarshalJSON() ([]byte, error) {
110 type plain ProviderCacheControlOptions
111 return fantasy.MarshalProviderType(TypeProviderCacheControl, plain(o))
112}
113
114// UnmarshalJSON implements custom JSON unmarshaling with type info for ProviderCacheControlOptions.
115func (o *ProviderCacheControlOptions) UnmarshalJSON(data []byte) error {
116 type plain ProviderCacheControlOptions
117 var p plain
118 if err := fantasy.UnmarshalProviderType(data, &p); err != nil {
119 return err
120 }
121 *o = ProviderCacheControlOptions(p)
122 return nil
123}
124
125// CacheControl represents cache control settings for the Anthropic provider.
126type CacheControl struct {
127 Type string `json:"type"`
128}
129
130// NewProviderOptions creates new provider options for the Anthropic provider.
131func NewProviderOptions(opts *ProviderOptions) fantasy.ProviderOptions {
132 return fantasy.ProviderOptions{
133 Name: opts,
134 }
135}
136
137// NewProviderCacheControlOptions creates new cache control options for the Anthropic provider.
138func NewProviderCacheControlOptions(opts *ProviderCacheControlOptions) fantasy.ProviderOptions {
139 return fantasy.ProviderOptions{
140 Name: opts,
141 }
142}
143
144// ParseOptions parses provider options from a map for the Anthropic provider.
145func ParseOptions(data map[string]any) (*ProviderOptions, error) {
146 var options ProviderOptions
147 if err := fantasy.ParseOptions(data, &options); err != nil {
148 return nil, err
149 }
150 return &options, nil
151}