1dce0dee5SAndreas Gohr<?php 2dce0dee5SAndreas Gohr 3dce0dee5SAndreas Gohrnamespace dokuwiki\plugin\aichat\Model\Anthropic; 4dce0dee5SAndreas Gohr 5dce0dee5SAndreas Gohruse dokuwiki\plugin\aichat\Model\AbstractModel; 6dce0dee5SAndreas Gohruse dokuwiki\plugin\aichat\Model\ChatInterface; 7dce0dee5SAndreas Gohr 8dce0dee5SAndreas Gohrclass ChatModel extends AbstractModel implements ChatInterface 9dce0dee5SAndreas Gohr{ 10dce0dee5SAndreas Gohr /** @inheritdoc */ 11dce0dee5SAndreas Gohr public function __construct(string $name, array $config) 12dce0dee5SAndreas Gohr { 13dce0dee5SAndreas Gohr parent::__construct($name, $config); 14dce0dee5SAndreas Gohr 15dce0dee5SAndreas Gohr $this->http->headers['x-api-key'] = $config['anthropic_key'] ?? ''; 16dce0dee5SAndreas Gohr $this->http->headers['anthropic-version'] = '2023-06-01'; 17dce0dee5SAndreas Gohr } 18dce0dee5SAndreas Gohr 19dce0dee5SAndreas Gohr /** @inheritdoc */ 20dce0dee5SAndreas Gohr public function getAnswer(array $messages): string 21dce0dee5SAndreas Gohr { 22dce0dee5SAndreas Gohr // convert OpenAI Style to Anthropic style 23dce0dee5SAndreas Gohr $system = ''; 24dce0dee5SAndreas Gohr $chat = []; 25dce0dee5SAndreas Gohr foreach ($messages as $message) { 26dce0dee5SAndreas Gohr if ($message['role'] === 'system') { 27dce0dee5SAndreas Gohr $system .= $message['content'] . "\n"; 28dce0dee5SAndreas Gohr } else { 29dce0dee5SAndreas Gohr $chat[] = $message; 30dce0dee5SAndreas Gohr } 31dce0dee5SAndreas Gohr } 32dce0dee5SAndreas Gohr 33dce0dee5SAndreas Gohr $data = [ 34dce0dee5SAndreas Gohr 'messages' => $chat, 35dce0dee5SAndreas Gohr 'model' => $this->getModelName(), 36*cfd76f4aSAndreas Gohr 'max_tokens' => $this->getMaxOutputTokenLength(), 37dce0dee5SAndreas Gohr 'stream' => false, 38dce0dee5SAndreas Gohr 'temperature' => 0.0, 39dce0dee5SAndreas Gohr ]; 40dce0dee5SAndreas Gohr 41dce0dee5SAndreas Gohr if ($system) { 42dce0dee5SAndreas Gohr $data['system'] = $system; 43dce0dee5SAndreas Gohr } 44dce0dee5SAndreas Gohr 45dce0dee5SAndreas Gohr $response = $this->request('messages', $data); 46dce0dee5SAndreas Gohr 47dce0dee5SAndreas Gohr print_r($response); 48dce0dee5SAndreas Gohr 49dce0dee5SAndreas Gohr return $response['content'][0]['text']; 50dce0dee5SAndreas Gohr } 51dce0dee5SAndreas Gohr 52dce0dee5SAndreas Gohr /** 53dce0dee5SAndreas Gohr * Send a request to the OpenAI API 54dce0dee5SAndreas Gohr * 55dce0dee5SAndreas Gohr * @param string $endpoint 56dce0dee5SAndreas Gohr * @param array $data Payload to send 57dce0dee5SAndreas Gohr * @return array API response 58dce0dee5SAndreas Gohr * @throws \Exception 59dce0dee5SAndreas Gohr */ 60dce0dee5SAndreas Gohr protected function request($endpoint, $data) 61dce0dee5SAndreas Gohr { 62dce0dee5SAndreas Gohr $url = 'https://api.anthropic.com/v1/' . $endpoint; 63dce0dee5SAndreas Gohr return $this->sendAPIRequest('POST', $url, $data); 64dce0dee5SAndreas Gohr } 65dce0dee5SAndreas Gohr 66dce0dee5SAndreas Gohr /** @inheritdoc */ 67dce0dee5SAndreas Gohr protected function parseAPIResponse($response) 68dce0dee5SAndreas Gohr { 69dce0dee5SAndreas Gohr if (isset($response['usage'])) { 70dce0dee5SAndreas Gohr $this->tokensUsed += $response['usage']['input_tokens'] + $response['usage']['output_tokens']; 71dce0dee5SAndreas Gohr } 72dce0dee5SAndreas Gohr 73dce0dee5SAndreas Gohr if (isset($response['error'])) { 74dce0dee5SAndreas Gohr throw new \Exception('Anthropic API error: ' . $response['error']['message']); 75dce0dee5SAndreas Gohr } 76dce0dee5SAndreas Gohr 77dce0dee5SAndreas Gohr return $response; 78dce0dee5SAndreas Gohr } 79dce0dee5SAndreas Gohr} 80