Files
Travis Cline 94f289e427 httprr: add httprr package (#1296)
* httprr: add HTTP record/replay framework with default API key scrubbing

- Add httprr package for deterministic HTTP testing
- Implement default scrubbing for common API key headers

* httputil: reorganize transport layer and add logging infrastructure

- Replace debug transports with structured logging via slog
- Add comprehensive user agent handling with version info
- Improve transport layer organization and documentation
- Maintain backward compatibility with deprecated types
- Add JSON debug transport with color output support
2025-06-04 08:35:32 -07:00

53 lines
1.3 KiB
Go

package httputil
import (
"fmt"
"runtime"
"runtime/debug"
"strings"
"sync"
)
var (
userAgent string
userAgentOnce sync.Once
)
// UserAgent returns the default User-Agent string for LangChainGo HTTP clients.
// Format: program/version langchaingo/version Go/version (GOOS GOARCH)
// Example: "openai-chat-example/devel langchaingo/v0.1.8 Go/go1.21.0 (darwin arm64)"
func UserAgent() string {
userAgentOnce.Do(func() {
parts := []string{}
// Get build info once
if info, ok := debug.ReadBuildInfo(); ok {
// Add program name if available
if info.Main.Path != "" && info.Main.Path != "command-line-arguments" {
name := info.Main.Path[strings.LastIndex(info.Main.Path, "/")+1:]
parts = append(parts, name+"/devel")
}
// Add langchaingo version
langchainVer := "devel"
for _, dep := range info.Deps {
if dep.Path == "github.com/tmc/langchaingo" {
langchainVer = strings.Trim(dep.Version, "()")
break
}
}
parts = append(parts, "langchaingo/"+langchainVer)
} else {
// Fallback if no build info
parts = append(parts, "langchaingo/devel")
}
// Add Go version and platform
parts = append(parts, fmt.Sprintf("Go/%s", runtime.Version()))
parts = append(parts, fmt.Sprintf("(%s %s)", runtime.GOOS, runtime.GOARCH))
userAgent = strings.Join(parts, " ")
})
return userAgent
}