diff --git a/scripts/modules/supported-models.json b/scripts/modules/supported-models.json index 2015d277..47674d3b 100644 --- a/scripts/modules/supported-models.json +++ b/scripts/modules/supported-models.json @@ -997,6 +997,67 @@ "allowed_roles": ["main", "fallback"], "max_tokens": 16384, "supported": true + }, + { + "id": "gpt-5", + "swe_score": 0.749, + "cost_per_1m_tokens": { + "input": 5.0, + "output": 20.0 + }, + "allowed_roles": ["main", "fallback"], + "max_tokens": 100000, + "temperature": 1, + "supported": true, + "api_type": "responses" + }, + { + "id": "o1", + "swe_score": 0.489, + "cost_per_1m_tokens": { + "input": 15.0, + "output": 60.0 + }, + "allowed_roles": ["main"], + "max_tokens": 100000, + "supported": true, + "api_type": "responses" + }, + { + "id": "o3", + "swe_score": 0.5, + "cost_per_1m_tokens": { + "input": 2.0, + "output": 8.0 + }, + "allowed_roles": ["main", "fallback"], + "max_tokens": 100000, + "supported": true, + "api_type": "responses" + }, + { + "id": "o3-mini", + "swe_score": 0.493, + "cost_per_1m_tokens": { + "input": 1.1, + "output": 4.4 + }, + "allowed_roles": ["main"], + "max_tokens": 100000, + "supported": true, + "api_type": "responses" + }, + { + "id": "o4-mini", + "swe_score": 0.45, + "cost_per_1m_tokens": { + "input": 1.1, + "output": 4.4 + }, + "allowed_roles": ["main", "fallback"], + "max_tokens": 100000, + "supported": true, + "api_type": "responses" } ], "bedrock": [ diff --git a/src/ai-providers/azure.js b/src/ai-providers/azure.js index 105e647b..9681ff77 100644 --- a/src/ai-providers/azure.js +++ b/src/ai-providers/azure.js @@ -5,6 +5,7 @@ import { createAzure } from '@ai-sdk/azure'; import { BaseAIProvider } from './base-provider.js'; +import MODEL_MAP from '../../scripts/modules/supported-models.json' with { type: 'json' }; export class AzureProvider extends BaseAIProvider { constructor() { @@ -37,21 +38,65 @@ export class AzureProvider extends BaseAIProvider { } } + /** + * Determines if a model requires the responses API endpoint instead of chat/completions + * @param {string} modelId - The model ID to check + * @returns {boolean} True if the model needs the responses API + */ + isReasoningModel(modelId) { + const azureModels = MODEL_MAP.azure || []; + const modelDef = azureModels.find(m => m.id === modelId); + return modelDef?.api_type === 'responses'; + } + + /** + * Adjusts the base URL for reasoning models that need the responses endpoint + * @param {string} baseURL - Original base URL + * @param {string} modelId - Model ID + * @returns {string} Adjusted base URL + */ + adjustBaseURL(baseURL, modelId) { + if (!this.isReasoningModel(modelId)) { + return baseURL; + } + + // Convert chat/completions URL to responses URL for reasoning models + if (baseURL.includes('/chat/completions')) { + return baseURL.replace('/chat/completions', '/responses'); + } + + // If baseURL ends with deployments/, add responses endpoint + if (baseURL.includes('/deployments/')) { + return baseURL.replace(/\/deployments\/[^\/]+$/, '/responses'); + } + + // If baseURL is just the base, ensure it ends with /responses + if (!baseURL.endsWith('/responses')) { + return baseURL.replace(/\/$/, '') + '/responses'; + } + + return baseURL; + } + /** * Creates and returns an Azure OpenAI client instance. * @param {object} params - Parameters for client initialization * @param {string} params.apiKey - Azure OpenAI API key * @param {string} params.baseURL - Azure OpenAI endpoint URL (from .taskmasterconfig global.azureBaseURL or models.[role].baseURL) + * @param {string} params.modelId - Model ID (used to determine API endpoint) * @returns {Function} Azure OpenAI client function * @throws {Error} If required parameters are missing or initialization fails */ getClient(params) { try { - const { apiKey, baseURL } = params; + const { apiKey, baseURL, modelId } = params; + + // Adjust base URL for reasoning models + const adjustedBaseURL = this.adjustBaseURL(baseURL, modelId); return createAzure({ apiKey, - baseURL + baseURL: adjustedBaseURL }); } catch (error) { this.handleError('client initialization', error); diff --git a/src/constants/providers.js b/src/constants/providers.js index d1bcf7ba..bb0ac271 100644 --- a/src/constants/providers.js +++ b/src/constants/providers.js @@ -11,7 +11,11 @@ export const VALIDATED_PROVIDERS = [ 'perplexity', 'xai', 'groq', - 'mistral' + 'mistral', + 'azure', + 'openrouter', + 'bedrock', + 'ollama' ]; // Custom providers object for easy named access