$prompt The prompt messages. * @return array */ protected function prepareGenerateTextParams( array $prompt ): array { $params = parent::prepareGenerateTextParams( $prompt ); $selected_model = get_option( Settings::OPTION_NAME, '' ); if ( '' !== $selected_model && empty( $params['model'] ) ) { $params['model'] = $selected_model; $this->effective_model_id = $selected_model; } // o1, o3, and gpt-5 models require max_completion_tokens instead of max_tokens. if ( isset( $params['max_tokens'] ) && $this->isReasoningModel( $params['model'] ?? '' ) ) { $params['max_completion_tokens'] = $params['max_tokens']; unset( $params['max_tokens'] ); } return $params; } /** * {@inheritDoc} * * @since 1.0.0 * * @param Response $response The HTTP response. * @return GenerativeAiResult */ protected function parseResponseToGenerativeAiResult( Response $response ): GenerativeAiResult { $result = parent::parseResponseToGenerativeAiResult( $response ); if ( null === $this->effective_model_id ) { return $result; } $original = $this->metadata(); $metadata = new ModelMetadata( $this->effective_model_id, $this->effective_model_id, $original->getSupportedCapabilities(), $original->getSupportedOptions() ); return new GenerativeAiResult( $result->getId(), $result->getCandidates(), $result->getTokenUsage(), $result->getProviderMetadata(), $metadata, $result->getAdditionalData() ); } /** * Returns true if the model requires max_completion_tokens instead of max_tokens. * * @since 1.0.0 * * @param string $model_id The model identifier. * @return bool */ private function isReasoningModel( string $model_id ): bool { return (bool) preg_match( '/^o\d/i', $model_id ) || str_contains( $model_id, 'gpt-5' ); } /** * {@inheritDoc} * * @since 1.0.0 * * @param HttpMethodEnum $method HTTP method. * @param string $path Endpoint path. * @param array> $headers Request headers. * @param string|array|null $data Request data. * @return Request */ protected function createRequest( HttpMethodEnum $method, string $path, array $headers = [], $data = null ): Request { // Rewrite v1/chat/completions → inference/chat/completions. $path = ltrim( (string) preg_replace( '#^v1/?#', '', ltrim( $path, '/' ) ), '/' ); $path = '/inference/' . $path; return new Request( $method, GitHubModelsProvider::url( $path ), $headers, $data, $this->getRequestOptions() ); } }