summaryrefslogtreecommitdiffhomepage
path: root/internal/llm/provider
diff options
context:
space:
mode:
authorYJG <[email protected]>2025-04-28 10:42:57 -0300
committerGitHub <[email protected]>2025-04-28 15:42:57 +0200
commit805aeff83cad4c17e25acdd671d2731be104b3e0 (patch)
treee2bdcbda42858a9b159301d3253929b37ed39f84 /internal/llm/provider
parentbce2ec5c10c1895a80fae48d315b132341b7dc96 (diff)
downloadopencode-805aeff83cad4c17e25acdd671d2731be104b3e0.tar.gz
opencode-805aeff83cad4c17e25acdd671d2731be104b3e0.zip
feat: add azure openai models (#74)
Diffstat (limited to 'internal/llm/provider')
-rw-r--r--internal/llm/provider/azure.go47
-rw-r--r--internal/llm/provider/provider.go5
2 files changed, 52 insertions, 0 deletions
diff --git a/internal/llm/provider/azure.go b/internal/llm/provider/azure.go
new file mode 100644
index 000000000..6368a181c
--- /dev/null
+++ b/internal/llm/provider/azure.go
@@ -0,0 +1,47 @@
+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"
+)
+
+type azureClient struct {
+ *openaiClient
+}
+
+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)}
+ }
+
+ 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))
+ }
+
+ base := &openaiClient{
+ providerOptions: opts,
+ client: openai.NewClient(reqOpts...),
+ }
+
+ return &azureClient{openaiClient: base}
+}
diff --git a/internal/llm/provider/provider.go b/internal/llm/provider/provider.go
index 00b7b2978..737b6fb00 100644
--- a/internal/llm/provider/provider.go
+++ b/internal/llm/provider/provider.go
@@ -115,6 +115,11 @@ func NewProvider(providerName models.ModelProvider, opts ...ProviderClientOption
options: clientOptions,
client: newOpenAIClient(clientOptions),
}, nil
+ case models.ProviderAzure:
+ return &baseProvider[AzureClient]{
+ options: clientOptions,
+ client: newAzureClient(clientOptions),
+ }, nil
case models.ProviderMock:
// TODO: implement mock client for test
panic("not implemented")