55 "errors"
66 "fmt"
77 "io"
8+ "log"
89 "net/http"
10+ "net/http/httputil"
911 "os"
1012
1113 "github.com/anthropics/anthropic-sdk-go"
@@ -19,7 +21,7 @@ var _ Provider = &AnthropicProvider{}
1921
2022// AnthropicProvider allows for interactions with the Anthropic API.
2123type AnthropicProvider struct {
22- baseURL , key string
24+ cfg ProviderConfig
2325}
2426
2527const (
@@ -37,8 +39,7 @@ func NewAnthropicProvider(cfg ProviderConfig) *AnthropicProvider {
3739 }
3840
3941 return & AnthropicProvider {
40- baseURL : cfg .BaseURL ,
41- key : cfg .Key ,
42+ cfg : cfg ,
4243 }
4344}
4445
@@ -74,17 +75,17 @@ func (p *AnthropicProvider) CreateInterceptor(w http.ResponseWriter, r *http.Req
7475 }
7576
7677 if req .Stream {
77- return NewAnthropicMessagesStreamingInterception (id , & req , p .baseURL , p . key ), nil
78+ return NewAnthropicMessagesStreamingInterception (id , & req , p .cfg ), nil
7879 }
7980
80- return NewAnthropicMessagesBlockingInterception (id , & req , p .baseURL , p . key ), nil
81+ return NewAnthropicMessagesBlockingInterception (id , & req , p .cfg ), nil
8182 }
8283
8384 return nil , UnknownRoute
8485}
8586
8687func (p * AnthropicProvider ) BaseURL () string {
87- return p .baseURL
88+ return p .cfg . BaseURL
8889}
8990
9091func (p * AnthropicProvider ) AuthHeader () string {
@@ -96,12 +97,42 @@ func (p *AnthropicProvider) InjectAuthHeader(headers *http.Header) {
9697 headers = & http.Header {}
9798 }
9899
99- headers .Set (p .AuthHeader (), p .key )
100+ headers .Set (p .AuthHeader (), p .cfg . Key )
100101}
101102
102- func newAnthropicClient (baseURL , key string , opts ... option.RequestOption ) anthropic.Client {
103- opts = append (opts , option .WithAPIKey (key ))
104- opts = append (opts , option .WithBaseURL (baseURL ))
103+ func newAnthropicClient (cfg ProviderConfig , id string , opts ... option.RequestOption ) anthropic.Client {
104+ opts = append (opts , option .WithAPIKey (cfg .Key ))
105+ opts = append (opts , option .WithBaseURL (cfg .BaseURL ))
106+
107+ if cfg .EnableUpstreamLogging {
108+ reqLogFile , err := os .OpenFile ("/tmp/anthropic-req.log" , os .O_CREATE | os .O_WRONLY | os .O_APPEND , 0644 )
109+ if err == nil {
110+ reqLogger := log .New (reqLogFile , "" , log .LstdFlags )
111+
112+ resLogFile , err := os .OpenFile ("/tmp/anthropic-res.log" , os .O_CREATE | os .O_WRONLY | os .O_APPEND , 0644 )
113+ if err == nil {
114+ resLogger := log .New (resLogFile , "" , log .LstdFlags )
115+
116+ opts = append (opts , option .WithMiddleware (func (req * http.Request , next option.MiddlewareNext ) (* http.Response , error ) {
117+ if reqDump , err := httputil .DumpRequest (req , true ); err == nil {
118+ reqLogger .Printf ("[req] [%s] %s" , id , reqDump )
119+ }
120+
121+ resp , err := next (req )
122+ if err != nil {
123+ resLogger .Printf ("[res] [%s] Error: %v" , id , err )
124+ return resp , err
125+ }
126+
127+ if respDump , err := httputil .DumpResponse (resp , true ); err == nil {
128+ resLogger .Printf ("[res] [%s] %s" , id , respDump )
129+ }
130+
131+ return resp , err
132+ }))
133+ }
134+ }
135+ }
105136
106137 return anthropic .NewClient (opts ... )
107138}
0 commit comments