Merge pull request #248 from charmbracelet/fix-azure

Kujtim Hoxha created

fix: azure provider

Change summary

internal/config/load.go        | 11 +++++++++++
internal/llm/provider/azure.go | 24 +++++-------------------
2 files changed, 16 insertions(+), 19 deletions(-)

Detailed changes

internal/config/load.go 🔗

@@ -188,6 +188,17 @@ func (c *Config) configureProviders(env env.Env, resolver VariableResolver, know
 			}
 			prepared.ExtraParams["project"] = env.Get("GOOGLE_CLOUD_PROJECT")
 			prepared.ExtraParams["location"] = env.Get("GOOGLE_CLOUD_LOCATION")
+		case provider.InferenceProviderAzure:
+			endpoint, err := resolver.ResolveValue(p.APIEndpoint)
+			if err != nil || endpoint == "" {
+				if configExists {
+					slog.Warn("Skipping Azure provider due to missing API endpoint", "provider", p.ID, "error", err)
+					delete(c.Providers, string(p.ID))
+				}
+				continue
+			}
+			prepared.BaseURL = endpoint
+			prepared.ExtraParams["apiVersion"] = env.Get("AZURE_OPENAI_API_VERSION")
 		case provider.InferenceProviderBedrock:
 			if !hasAWSCredentials(env) {
 				if configExists {

internal/llm/provider/azure.go 🔗

@@ -1,9 +1,6 @@
 package provider
 
 import (
-	"os"
-
-	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
 	"github.com/openai/openai-go"
 	"github.com/openai/openai-go/azure"
 	"github.com/openai/openai-go/option"
@@ -16,27 +13,16 @@ type azureClient struct {
 type AzureClient ProviderClient
 
 func newAzureClient(opts providerClientOptions) AzureClient {
-	endpoint := os.Getenv("AZURE_OPENAI_ENDPOINT")      // ex: https://foo.openai.azure.com
-	apiVersion := os.Getenv("AZURE_OPENAI_API_VERSION") // ex: 2025-04-01-preview
-
-	if endpoint == "" || apiVersion == "" {
-		return &azureClient{openaiClient: newOpenAIClient(opts).(*openaiClient)}
+	apiVersion := opts.extraParams["apiVersion"]
+	if apiVersion == "" {
+		apiVersion = "2025-01-01-preview"
 	}
 
 	reqOpts := []option.RequestOption{
-		azure.WithEndpoint(endpoint, apiVersion),
-	}
-
-	if opts.apiKey != "" || os.Getenv("AZURE_OPENAI_API_KEY") != "" {
-		key := opts.apiKey
-		if key == "" {
-			key = os.Getenv("AZURE_OPENAI_API_KEY")
-		}
-		reqOpts = append(reqOpts, azure.WithAPIKey(key))
-	} else if cred, err := azidentity.NewDefaultAzureCredential(nil); err == nil {
-		reqOpts = append(reqOpts, azure.WithTokenCredential(cred))
+		azure.WithEndpoint(opts.baseURL, apiVersion),
 	}
 
+	reqOpts = append(reqOpts, azure.WithAPIKey(opts.apiKey))
 	base := &openaiClient{
 		providerOptions: opts,
 		client:          openai.NewClient(reqOpts...),