|
| 1 | +<?php |
| 2 | + |
| 3 | +namespace dokuwiki\plugin\aichat\Model\Reka; |
| 4 | + |
| 5 | +use dokuwiki\plugin\aichat\Model\AbstractModel; |
| 6 | +use dokuwiki\plugin\aichat\Model\ChatInterface; |
| 7 | + |
| 8 | +class ChatModel extends AbstractModel implements ChatInterface |
| 9 | +{ |
| 10 | + /** @inheritdoc */ |
| 11 | + public function __construct(string $name, array $config) |
| 12 | + { |
| 13 | + parent::__construct($name, $config); |
| 14 | + |
| 15 | + if (empty($config['reka_apikey'])) { |
| 16 | + throw new \Exception('Reka API key not configured'); |
| 17 | + } |
| 18 | + |
| 19 | + $this->http->headers['x-api-key'] = $config['reka_apikey']; |
| 20 | + } |
| 21 | + |
| 22 | + /** @inheritdoc */ |
| 23 | + public function getAnswer(array $messages): string |
| 24 | + { |
| 25 | + $chat = []; |
| 26 | + foreach ($messages as $message) { |
| 27 | + if ($message['role'] === 'user') { |
| 28 | + $chat[] = [ |
| 29 | + 'type' => 'human', |
| 30 | + 'text' => $message['content'], |
| 31 | + ]; |
| 32 | + } elseif ($message['role'] === 'assistant') { |
| 33 | + $chat[] = [ |
| 34 | + 'type' => 'model', |
| 35 | + 'text' => $message['content'], |
| 36 | + ]; |
| 37 | + } |
| 38 | + // system messages are not supported |
| 39 | + } |
| 40 | + |
| 41 | + $data = [ |
| 42 | + 'conversation_history' => $chat, |
| 43 | + 'model_name' => $this->getModelName(), |
| 44 | + 'temperature' => 0.0, |
| 45 | + ]; |
| 46 | + |
| 47 | + $response = $this->request('chat', $data); |
| 48 | + return $response['text']; |
| 49 | + } |
| 50 | + |
| 51 | + /** |
| 52 | + * Send a request to the API |
| 53 | + * |
| 54 | + * @param string $endpoint |
| 55 | + * @param array $data Payload to send |
| 56 | + * @return array API response |
| 57 | + * @throws \Exception |
| 58 | + */ |
| 59 | + protected function request($endpoint, $data) |
| 60 | + { |
| 61 | + $url = 'https://api.reka.ai/' . $endpoint; |
| 62 | + return $this->sendAPIRequest('POST', $url, $data); |
| 63 | + } |
| 64 | + |
| 65 | + /** @inheritdoc */ |
| 66 | + protected function parseAPIResponse($response) |
| 67 | + { |
| 68 | + if(((int) $this->http->status) !== 200) { |
| 69 | + if(isset($response['detail'])) { |
| 70 | + throw new \Exception('Reka API error: ' . $response['detail']); |
| 71 | + } else { |
| 72 | + throw new \Exception('Reka API error: ' . $this->http->status . ' ' . $this->http->error); |
| 73 | + } |
| 74 | + } |
| 75 | + |
| 76 | + if (isset($response['metadata'])) { |
| 77 | + $this->inputTokensUsed += $response['metadata']['input_tokens']; |
| 78 | + $this->outputTokensUsed += $response['metadata']['generated_tokens']; |
| 79 | + } |
| 80 | + |
| 81 | + return $response; |
| 82 | + } |
| 83 | +} |
0 commit comments