AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>./*** Class providing completions for assistant API** @package block_openai_chat* @copyright 2023 Bryce Yoder <me@bryceyoder.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/namespace block_openai_chat\completion;use block_openai_chat\completion;defined('MOODLE_INTERNAL') || die;class assistant extends \block_openai_chat\completion {private $thread_id;public function __construct($model, $message, $history, $block_settings, $thread_id) {parent::__construct($model, $message, $history, $block_settings);// If thread_id is NULL, create a new threadif (!$thread_id) {$thread_id = $this->create_thread();}$this->thread_id = $thread_id;}/*** Given everything we know after constructing the parent, create a completion by constructing the prompt and making the api call* @return JSON: The API response from OpenAI*/public function create_completion($context) {$this->add_message_to_thread();return $this->run();}private function create_thread() {$curl = new \curl();$curl->setopt(array('CURLOPT_HTTPHEADER' => array('Authorization: Bearer ' . $this->apikey,'Content-Type: application/json','OpenAI-Beta: assistants=v2'),));$response = $curl->post("https://api.openai.com/v1/threads");$response = json_decode($response);return $response->id;}private function add_message_to_thread() {$curlbody = ["role" => "user","content" => $this->message];$curl = new \curl();$curl->setopt(array('CURLOPT_HTTPHEADER' => array('Authorization: Bearer ' . $this->apikey,'Content-Type: application/json','OpenAI-Beta: assistants=v2'),));$response = $curl->post("https://api.openai.com/v1/threads/" . $this->thread_id ."/messages",json_encode($curlbody));$response = json_decode($response);return $response->id;}/*** Make the actual API call to OpenAI* @return JSON: The response from OpenAI*/private function run() {$curlbody = ["assistant_id" => $this->assistant,];if ($this->instructions) {$curlbody["instructions"] = $this->instructions;}$curl = new \curl();$curl->setopt(array('CURLOPT_HTTPHEADER' => array('Authorization: Bearer ' . $this->apikey,'Content-Type: application/json','OpenAI-Beta: assistants=v2'),));$response = $curl->post("https://api.openai.com/v1/threads/" . $this->thread_id . "/runs",json_encode($curlbody));$response = json_decode($response);if (isset($response->error)) {throw new \Exception($response->error->message);}$run_id = $response->id;$run_completed = false;while (!$run_completed) {$run_completed = $this->check_run_status($run_id);sleep(1);}$curl = new \curl();$curl->setopt(array('CURLOPT_HTTPHEADER' => array('Authorization: Bearer ' . $this->apikey,'Content-Type: application/json','OpenAI-Beta: assistants=v2'),));$response = $curl->get("https://api.openai.com/v1/threads/" . $this->thread_id . '/messages');$response = json_decode($response);return ["id" => $response->data[0]->id,"message" => $response->data[0]->content[0]->text->value,"thread_id" => $response->data[0]->thread_id];}private function check_run_status($run_id) {$curl = new \curl();$curl->setopt(array('CURLOPT_HTTPHEADER' => array('Authorization: Bearer ' . $this->apikey,'Content-Type: application/json','OpenAI-Beta: assistants=v2'),));$response = $curl->get("https://api.openai.com/v1/threads/" . $this->thread_id . "/runs/" . $run_id);$response = json_decode($response);if ($response->status === 'completed') {return true;}return false;}}