deepseek-1.x-dev/src/Plugin/AiProviders/OpenAIProvider.php
src/Plugin/AiProviders/OpenAIProvider.php
<?php
namespace Drupal\deepseek\Plugin\AiProviders;
use Drupal\Core\Config\Config;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\deepseek\AiProvidersInterface;
use Drupal\deepseek\Attribute\AiProviders;
use GuzzleHttp\Client;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provider for communicating with Openai api.
*/
#[AiProviders(
id: 'openai',
label: new TranslatableMarkup('OpenAI'),
url: 'https://api.openai.com/v1',
model: 'o3-mini',
api_key: 'sk-proj-',
embedding: 'text-embedding-ada-002',
)]
class OpenAIProvider implements AiProvidersInterface, ContainerFactoryPluginInterface {
/**
* Constructs an Open AI Provider object.
*
* @param string $plugin_id
* The plugin_id for the formatter.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param mixed $field_definition
* The definition of the field to which the formatter is associated.
* @param \Drupal\Core\Config\Config $configFactory
* The config factory service.
*/
public function __construct($plugin_id, $plugin_definition, $field_definition, protected Config $configFactory) {
unset($plugin_id, $plugin_definition, $field_definition);
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, $configuration, $plugin_id, $plugin_definition) {
return new static($plugin_id, $plugin_definition, $configuration, $container->get('config.factory')
->get('deepseek.settings'),);
}
/**
* Models list of available from the provider.
*/
public function models($url = '', $api_key = ''): array {
$models = [
'gpt-4.1',
'gpt-4.1-nano',
'gpt-4.1-mini',
'o4-mini',
'o3-mini',
'gpt-4o-mini-audio-preview',
'text-embedding-ada-002',
];
$client = !empty($url) ? \OpenAI::factory()
->withApiKey($api_key)
->withBaseUri($url)
->withHttpClient(new Client(['timeout' => 60, 'http_errors' => FALSE]))
->make() : \OpenAI::client($api_key);
$response = $client->models()->list();
if ($response) {
return $response?->data;
}
return $models;
}
/**
* Sends a prompt and receives a chat-style response.
*/
public function chat(array $messages, array $options = [], $files = []): array {
$model = $this->configFactory->get('model') ?: 'o3-mini';
$apiKey = $this->configFactory->get('api_key') ?? 'sk-proj-';
$baseUrl = $this->configFactory->get('base_url') ?: 'https://api.openai.com/v1';
// Variable API.
$apiData = array_merge([
'model' => $model,
'messages' => $messages,
'temperature' => 0.7,
'stream' => TRUE,
], $options);
$client = \OpenAI::factory()
->withApiKey($apiKey)
->withBaseUri($baseUrl)
->withHttpClient(new Client(['timeout' => 60, 'http_errors' => FALSE]))
->make();
return $client->chat()->createStreamed($apiData);
}
/**
* Sends a raw text prompt for single-shot completions (not chat).
*/
public function completions(string $prompt, array $options = []): array {
$model = $this->configFactory->get('model');
$apiKey = $this->configFactory->get('api_key') ?? 'RANDOM-KEY';
$baseUrl = $this->configFactory->get('base_url') ?: 'https://api.openai.com/v1';
// Variable API.
$apiData = array_merge([
'model' => $model ?? 'deepseek-chat',
'prompt' => $prompt,
'temperature' => 0.7,
'stream' => TRUE,
], $options);
$client = \OpenAI::factory()
->withApiKey($apiKey)
->withBaseUri($baseUrl)
->withHttpClient(new Client(['timeout' => 360, 'http_errors' => FALSE]))
->make();
return $client->completions()->createStreamed($apiData);
}
/**
* Generates embeddings from a given text or list of texts.
*/
public function embeddings(string $input, array $options = []): array {
$model = $this->configFactory->get('embedding');
if (empty($input) || empty($model)) {
return [];
}
$apiKey = $this->configFactory->get('api_key');
$client = \OpenAI::factory()->withApiKey($apiKey);
$apiData = [
'model' => $model,
'input' => $input,
];
$data = $client->embeddings()->create($apiData)->toArray()['data'];
return $data[0]['embedding'] ?? [];
}
/**
* Get mime type of file.
*/
public function getMimeType(string $mimeType): null {
return NULL;
}
}
