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;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc