diff --git a/.env b/.env index 60c2fffa07..9970305e49 100644 --- a/.env +++ b/.env @@ -87,4 +87,5 @@ _APP_GRAPHQL_MAX_COMPLEXITY=250 _APP_GRAPHQL_MAX_DEPTH=3 DOCKERHUB_PULL_USERNAME= DOCKERHUB_PULL_PASSWORD= -DOCKERHUB_PULL_EMAIL= \ No newline at end of file +DOCKERHUB_PULL_EMAIL= +OPENAI_API_KEY=YOUR_OPENAI_API_KEY \ No newline at end of file diff --git a/app/controllers/api/console.php b/app/controllers/api/console.php index 060fa10cb5..f2ea83af58 100644 --- a/app/controllers/api/console.php +++ b/app/controllers/api/console.php @@ -4,6 +4,7 @@ use Appwrite\Extend\Exception; use Appwrite\Utopia\Response; use Utopia\App; use Utopia\Database\Document; +use Utopia\Validator\Text; App::init() ->groups(['console']) @@ -38,3 +39,58 @@ App::get('/v1/console/variables') $response->dynamic($variables, Response::MODEL_CONSOLE_VARIABLES); }); + + +App::post('/v1/console/assistant') + ->desc('Ask Query') + ->groups(['api', 'assistant']) + ->label('scope', 'public') + ->label('sdk.auth', [APP_AUTH_TYPE_SESSION]) + ->label('sdk.namespace', 'assistant') + ->label('sdk.method', 'chat') + ->label('sdk.description', '/docs/references/assistant/chat.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_TEXT) + ->label('abuse-limit', 15) + ->label('abuse-key', 'userId:{userId}') + ->param('query', '', new Text(2000), 'Query') + ->inject('response') + ->action(function (string $query, Response $response) { + $ch = curl_init('http://appwrite-assistant:3003/'); + $responseHeaders = []; + $query = json_encode(['prompt' => $query]); + $headers = ['accept: text/event-stream']; + $handleEvent = function ($ch, $data) use ($response) { + $response->chunk($data); + + return \strlen($data); + }; + + curl_setopt($ch, CURLOPT_WRITEFUNCTION, $handleEvent); + + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); + curl_setopt($ch, CURLOPT_TIMEOUT, 9000); + curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$responseHeaders) { + $len = strlen($header); + $header = explode(':', $header, 2); + + if (count($header) < 2) { // ignore invalid headers + return $len; + } + + $responseHeaders[strtolower(trim($header[0]))] = trim($header[1]); + + return $len; + }); + + curl_setopt($ch, CURLOPT_POSTFIELDS, $query); + + curl_exec($ch); + + curl_close($ch); + + $response->chunk('', true); + }); diff --git a/docker-compose.yml b/docker-compose.yml index 560c42ae38..47c45a4823 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -659,6 +659,15 @@ services: - _APP_REDIS_PORT - _APP_REDIS_USER - _APP_REDIS_PASS + + appwrite-assistant: + container_name: appwrite-assistant + image: appwrite/assistant:0.1.0 + networks: + - appwrite + environment: + - OPENAI_API_KEY + mariadb: image: mariadb:10.7 # fix issues when upgrading using: mysql_upgrade -u root -p