Skip to content

Commit 196123f

Browse files
committed
fix(openrouter): inject headers via custom HTTP client; cast embedding model type; restore build
1 parent bf4eba4 commit 196123f

3 files changed

Lines changed: 50 additions & 14 deletions

File tree

internal/providers/openai/embedding.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
// EmbeddingProvider is an OpenAI implementation of the EmbeddingProvider interface
1515
type EmbeddingProvider struct {
16-
client *openai.Client
16+
client *openai.Client
1717
}
1818

1919
// NewEmbeddingProvider creates a new OpenAI embedding provider instance
@@ -23,15 +23,17 @@ func NewEmbeddingProvider(apiKey string) providers.EmbeddingProvider {
2323
if base := strings.TrimSpace(os.Getenv("OPENAI_BASE_URL")); base != "" {
2424
cfg.BaseURL = base
2525
}
26-
// If using OpenRouter, attach recommended headers if provided
26+
// If using OpenRouter, attach recommended headers via custom transport
2727
if strings.Contains(strings.ToLower(cfg.BaseURL), "openrouter.ai") {
28+
headers := map[string]string{}
2829
if ref := strings.TrimSpace(os.Getenv("OPENROUTER_SITE_URL")); ref != "" {
29-
if cfg.Headers == nil { cfg.Headers = map[string]string{} }
30-
cfg.Headers["HTTP-Referer"] = ref
30+
headers["HTTP-Referer"] = ref
3131
}
3232
if title := strings.TrimSpace(os.Getenv("OPENROUTER_APP_NAME")); title != "" {
33-
if cfg.Headers == nil { cfg.Headers = map[string]string{} }
34-
cfg.Headers["X-Title"] = title
33+
headers["X-Title"] = title
34+
}
35+
if len(headers) > 0 {
36+
cfg.HTTPClient = makeHTTPDoerWithHeaders(headers)
3537
}
3638
}
3739
client := openai.NewClientWithConfig(cfg)
@@ -43,15 +45,15 @@ func NewEmbeddingProvider(apiKey string) providers.EmbeddingProvider {
4345
// CreateEmbedding converts text into a vector embedding using OpenAI's API
4446
func (p *EmbeddingProvider) CreateEmbedding(ctx context.Context, text string) ([]float32, error) {
4547
// Choose embedding model (allow override via env for non-OpenAI endpoints)
46-
model := openai.LargeEmbedding3
48+
modelName := string(openai.LargeEmbedding3)
4749
if v := strings.TrimSpace(os.Getenv("OPENAI_EMBEDDING_MODEL")); v != "" {
48-
model = v
50+
modelName = v
4951
}
5052

5153
// Create embedding request
5254
req := openai.EmbeddingRequest{
5355
Input: []string{text},
54-
Model: model,
56+
Model: openai.EmbeddingModel(modelName),
5557
}
5658

5759
// Call OpenAI API
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package openai
2+
3+
import (
4+
"net/http"
5+
)
6+
7+
// makeHTTPDoerWithHeaders returns an *http.Client that injects headers into every request.
8+
func makeHTTPDoerWithHeaders(headers map[string]string) *http.Client {
9+
return &http.Client{
10+
Transport: &headerRoundTripper{
11+
next: http.DefaultTransport,
12+
headers: headers,
13+
},
14+
}
15+
}
16+
17+
type headerRoundTripper struct {
18+
next http.RoundTripper
19+
headers map[string]string
20+
}
21+
22+
func (h *headerRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
23+
for k, v := range h.headers {
24+
if v != "" {
25+
req.Header.Set(k, v)
26+
}
27+
}
28+
return h.next.RoundTrip(req)
29+
}
30+

internal/providers/openai/provider.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,17 @@ func NewProviderWithModel(apiKey, model string) *Provider {
3131
if base := strings.TrimSpace(os.Getenv("OPENAI_BASE_URL")); base != "" {
3232
cfg.BaseURL = base
3333
}
34-
// If using OpenRouter, attach recommended headers if provided
34+
// If using OpenRouter, attach recommended headers via custom transport
3535
if strings.Contains(strings.ToLower(cfg.BaseURL), "openrouter.ai") {
36+
headers := map[string]string{}
3637
if ref := strings.TrimSpace(os.Getenv("OPENROUTER_SITE_URL")); ref != "" {
37-
if cfg.Headers == nil { cfg.Headers = map[string]string{} }
38-
cfg.Headers["HTTP-Referer"] = ref
38+
headers["HTTP-Referer"] = ref
3939
}
4040
if title := strings.TrimSpace(os.Getenv("OPENROUTER_APP_NAME")); title != "" {
41-
if cfg.Headers == nil { cfg.Headers = map[string]string{} }
42-
cfg.Headers["X-Title"] = title
41+
headers["X-Title"] = title
42+
}
43+
if len(headers) > 0 {
44+
cfg.HTTPClient = makeHTTPDoerWithHeaders(headers)
4345
}
4446
}
4547

@@ -53,6 +55,8 @@ func NewProviderWithModel(apiKey, model string) *Provider {
5355
}
5456
}
5557

58+
// header helpers moved to httpclient.go
59+
5660
// Execute implements the ComputeProvider interface
5761
func (p *Provider) Execute(ctx context.Context, requestData map[string]interface{}) (string, error) {
5862
var messages []openai.ChatCompletionMessage

0 commit comments

Comments
 (0)