Add Azure OpenAI Custom Model Integration (#1001)
Fixes #710 This PR implements comprehensive Azure OpenAI integration for Dyad, enabling users to leverage Azure OpenAI models through proper environment variable configuration. The implementation adds Azure as a supported provider with full integration into the existing language model architecture, including support for GPT-5 models. Key features include environment-based configuration using `AZURE_API_KEY` and `AZURE_RESOURCE_NAME`, specialized UI components that provide clear setup instructions and status indicators, and seamless integration with Dyad's existing provider system. The Azure provider leverages the @ai-sdk/azure package (v1.3.25) for compatibility with the current TypeScript language model interfaces. The implementation includes robust error handling for missing configuration, comprehensive test coverage with 9 new unit tests covering critical functionality like model client creation and error scenarios, and an E2E test for the Azure-specific settings UI. <img width="1510" height="908" alt="Screenshot 2025-08-18 at 9 14 32 PM" src="https://github.com/user-attachments/assets/04aa99e1-1590-4bb0-86c9-a67b97bc7500" /> --------- Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> Co-authored-by: Will Chen <willchen90@gmail.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { createOpenAI } from "@ai-sdk/openai";
|
||||
import { createGoogleGenerativeAI as createGoogle } from "@ai-sdk/google";
|
||||
import { createAnthropic } from "@ai-sdk/anthropic";
|
||||
import { azure } from "@ai-sdk/azure";
|
||||
import { createOpenRouter } from "@openrouter/ai-sdk-provider";
|
||||
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
||||
import type { LargeLanguageModel, UserSettings } from "../../lib/schemas";
|
||||
@@ -224,6 +225,54 @@ function getRegularModelClient(
|
||||
backupModelClients: [],
|
||||
};
|
||||
}
|
||||
case "azure": {
|
||||
// Check if we're in e2e testing mode
|
||||
const testAzureBaseUrl = getEnvVar("TEST_AZURE_BASE_URL");
|
||||
|
||||
if (testAzureBaseUrl) {
|
||||
// Use fake server for e2e testing
|
||||
logger.info(`Using test Azure base URL: ${testAzureBaseUrl}`);
|
||||
const provider = createOpenAICompatible({
|
||||
name: "azure-test",
|
||||
baseURL: testAzureBaseUrl,
|
||||
apiKey: "fake-api-key-for-testing",
|
||||
});
|
||||
return {
|
||||
modelClient: {
|
||||
model: provider(model.name),
|
||||
builtinProviderId: providerId,
|
||||
},
|
||||
backupModelClients: [],
|
||||
};
|
||||
}
|
||||
|
||||
// Azure OpenAI requires both API key and resource name as env vars
|
||||
// We use environment variables for Azure configuration
|
||||
const resourceName = getEnvVar("AZURE_RESOURCE_NAME");
|
||||
const azureApiKey = getEnvVar("AZURE_API_KEY");
|
||||
|
||||
if (!resourceName) {
|
||||
throw new Error(
|
||||
"Azure OpenAI resource name is required. Please set the AZURE_RESOURCE_NAME environment variable.",
|
||||
);
|
||||
}
|
||||
|
||||
if (!azureApiKey) {
|
||||
throw new Error(
|
||||
"Azure OpenAI API key is required. Please set the AZURE_API_KEY environment variable.",
|
||||
);
|
||||
}
|
||||
|
||||
// Use the default Azure provider with environment variables
|
||||
// The azure provider automatically picks up AZURE_RESOURCE_NAME and AZURE_API_KEY
|
||||
return {
|
||||
modelClient: {
|
||||
model: azure(model.name),
|
||||
builtinProviderId: providerId,
|
||||
},
|
||||
backupModelClients: [],
|
||||
};
|
||||
}
|
||||
case "ollama": {
|
||||
const provider = createOllamaProvider({ baseURL: getOllamaApiUrl() });
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user