From 2a7ec490afd01ec2537c73e271f295e0d650b8f9 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 3 Aug 2023 10:29:36 +0000 Subject: [PATCH 1/7] setup appwrite assistant for test --- app/config/services.php | 13 ++++++ app/controllers/api/assistant.php | 74 +++++++++++++++++++++++++++++++ docker-compose.yml | 9 ++++ 3 files changed, 96 insertions(+) create mode 100644 app/controllers/api/assistant.php diff --git a/app/config/services.php b/app/config/services.php index 8383b44c82..086acd185a 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -199,4 +199,17 @@ return [ 'optional' => false, 'icon' => '', ], + 'assistant' => [ + 'key' => 'assistant', + 'name' => 'Assistant', + 'subtitle' => 'The Appwrite assistant service allows you to interact with appwrite assistant.', + 'description' => '', + 'controller' => 'api/assistant.php', + 'sdk' => true, + 'docs' => true, + 'docsUrl' => '', + 'tests' => false, + 'optional' => false, + 'icon' => '', + ], ]; diff --git a/app/controllers/api/assistant.php b/app/controllers/api/assistant.php new file mode 100644 index 0000000000..7ea9da87a4 --- /dev/null +++ b/app/controllers/api/assistant.php @@ -0,0 +1,74 @@ +groups(['console']) + ->inject('project') + ->action(function (Document $project) { + if ($project->getId() !== 'console') { + throw new Exception(Exception::GENERAL_ACCESS_FORBIDDEN); + } + }); + + +App::post('/v1/assistant/chat') + ->desc('Ask Query') + ->groups(['api', 'assistant']) + ->label('scope', 'public') + // ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) + ->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_JSON) + ->label('sdk.response.model', Response::MODEL_CONSOLE_VARIABLES) + ->param('query', '', new Text(2000), 'Query') + ->inject('response') + ->action(function (string $query, Response $response) { + $ch = curl_init('http://appwrite-assistant:3003/'); + $responseHeaders = []; + $responseStatus = -1; + $responseBody = ''; + $responseType = ''; + $query = json_encode(['prompt' => $query]); + + $headers = ['accept: text/event-stream']; + $handleEvent = function($ch, $data) { + var_dump($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); + + $responseBody = curl_exec($ch); + + curl_close($ch); + + $response->send('Response ended'); + + }); diff --git a/docker-compose.yml b/docker-compose.yml index 560c42ae38..f72458560f 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: dlohani/appwrite_ask + networks: + - appwrite + environment: + - OPENAI_API_KEY + mariadb: image: mariadb:10.7 # fix issues when upgrading using: mysql_upgrade -u root -p From 45afea91759a0d88064b327c2d10144926ec8b16 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 4 Aug 2023 01:42:22 +0000 Subject: [PATCH 2/7] moved assistant endpoint to console, and add env support --- .env | 4 +- app/config/services.php | 13 ------ app/controllers/api/assistant.php | 74 ------------------------------- app/controllers/api/console.php | 56 +++++++++++++++++++++++ docker-compose.yml | 2 + 5 files changed, 61 insertions(+), 88 deletions(-) delete mode 100644 app/controllers/api/assistant.php diff --git a/.env b/.env index 60c2fffa07..6af1940557 100644 --- a/.env +++ b/.env @@ -87,4 +87,6 @@ _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 +ASSISTANT_SECRET=your-secret-key \ No newline at end of file diff --git a/app/config/services.php b/app/config/services.php index 086acd185a..8383b44c82 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -199,17 +199,4 @@ return [ 'optional' => false, 'icon' => '', ], - 'assistant' => [ - 'key' => 'assistant', - 'name' => 'Assistant', - 'subtitle' => 'The Appwrite assistant service allows you to interact with appwrite assistant.', - 'description' => '', - 'controller' => 'api/assistant.php', - 'sdk' => true, - 'docs' => true, - 'docsUrl' => '', - 'tests' => false, - 'optional' => false, - 'icon' => '', - ], ]; diff --git a/app/controllers/api/assistant.php b/app/controllers/api/assistant.php deleted file mode 100644 index 7ea9da87a4..0000000000 --- a/app/controllers/api/assistant.php +++ /dev/null @@ -1,74 +0,0 @@ -groups(['console']) - ->inject('project') - ->action(function (Document $project) { - if ($project->getId() !== 'console') { - throw new Exception(Exception::GENERAL_ACCESS_FORBIDDEN); - } - }); - - -App::post('/v1/assistant/chat') - ->desc('Ask Query') - ->groups(['api', 'assistant']) - ->label('scope', 'public') - // ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) - ->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_JSON) - ->label('sdk.response.model', Response::MODEL_CONSOLE_VARIABLES) - ->param('query', '', new Text(2000), 'Query') - ->inject('response') - ->action(function (string $query, Response $response) { - $ch = curl_init('http://appwrite-assistant:3003/'); - $responseHeaders = []; - $responseStatus = -1; - $responseBody = ''; - $responseType = ''; - $query = json_encode(['prompt' => $query]); - - $headers = ['accept: text/event-stream']; - $handleEvent = function($ch, $data) { - var_dump($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); - - $responseBody = curl_exec($ch); - - curl_close($ch); - - $response->send('Response ended'); - - }); diff --git a/app/controllers/api/console.php b/app/controllers/api/console.php index 060fa10cb5..49994e4704 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.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) + ->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', 'authorization: ' . APP::getEnv('ASSISTANT_SECRET')]; + $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 f72458560f..64cfe1a8bf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -178,6 +178,7 @@ services: - _APP_GRAPHQL_MAX_BATCH_SIZE - _APP_GRAPHQL_MAX_COMPLEXITY - _APP_GRAPHQL_MAX_DEPTH + - ASSISTANT_SECRET appwrite-realtime: entrypoint: realtime @@ -667,6 +668,7 @@ services: - appwrite environment: - OPENAI_API_KEY + - ASSISTANT_SECRET mariadb: From 49085be4e4da1761f597203927dd86b4edf5588c Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 4 Aug 2023 02:17:02 +0000 Subject: [PATCH 3/7] fix formatting --- app/controllers/api/console.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/api/console.php b/app/controllers/api/console.php index 49994e4704..eb070f9f16 100644 --- a/app/controllers/api/console.php +++ b/app/controllers/api/console.php @@ -58,7 +58,7 @@ App::post('/v1/console/assistant') $query = json_encode(['prompt' => $query]); $headers = ['accept: text/event-stream', 'authorization: ' . APP::getEnv('ASSISTANT_SECRET')]; - $handleEvent = function($ch, $data) use ($response) { + $handleEvent = function ($ch, $data) use ($response) { $response->chunk($data); @@ -92,5 +92,4 @@ App::post('/v1/console/assistant') curl_close($ch); $response->chunk('', true); - }); From 64321cfb0bba6007c42c7c849d2d9b9bcd318711 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 4 Aug 2023 13:08:59 +0000 Subject: [PATCH 4/7] remove authorization --- .env | 3 +-- app/controllers/api/console.php | 8 ++++---- docker-compose.yml | 2 -- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.env b/.env index 6af1940557..9970305e49 100644 --- a/.env +++ b/.env @@ -88,5 +88,4 @@ _APP_GRAPHQL_MAX_DEPTH=3 DOCKERHUB_PULL_USERNAME= DOCKERHUB_PULL_PASSWORD= DOCKERHUB_PULL_EMAIL= -OPENAI_API_KEY=YOUR_OPENAI_API_KEY -ASSISTANT_SECRET=your-secret-key \ No newline at end of file +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 eb070f9f16..9b6be8ea8a 100644 --- a/app/controllers/api/console.php +++ b/app/controllers/api/console.php @@ -45,6 +45,7 @@ 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') @@ -52,14 +53,13 @@ App::post('/v1/console/assistant') ->label('sdk.response.type', Response::CONTENT_TYPE_TEXT) ->param('query', '', new Text(2000), 'Query') ->inject('response') - ->action(function (string $query, Response $response) { + ->inject('user') + ->action(function (string $query, Response $response, Document $user) { $ch = curl_init('http://appwrite-assistant:3003/'); $responseHeaders = []; $query = json_encode(['prompt' => $query]); - - $headers = ['accept: text/event-stream', 'authorization: ' . APP::getEnv('ASSISTANT_SECRET')]; + $headers = ['accept: text/event-stream']; $handleEvent = function ($ch, $data) use ($response) { - $response->chunk($data); return \strlen($data); diff --git a/docker-compose.yml b/docker-compose.yml index 64cfe1a8bf..f72458560f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -178,7 +178,6 @@ services: - _APP_GRAPHQL_MAX_BATCH_SIZE - _APP_GRAPHQL_MAX_COMPLEXITY - _APP_GRAPHQL_MAX_DEPTH - - ASSISTANT_SECRET appwrite-realtime: entrypoint: realtime @@ -668,7 +667,6 @@ services: - appwrite environment: - OPENAI_API_KEY - - ASSISTANT_SECRET mariadb: From cd18853fedaf94fac50f01f36c8b5de17d9561f2 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 4 Aug 2023 13:16:57 +0000 Subject: [PATCH 5/7] add abuse labels --- app/controllers/api/console.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/api/console.php b/app/controllers/api/console.php index 9b6be8ea8a..3c3e2757aa 100644 --- a/app/controllers/api/console.php +++ b/app/controllers/api/console.php @@ -51,6 +51,8 @@ App::post('/v1/console/assistant') ->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') ->inject('user') From 767a3caef848118cff53825520d15cd3ea1e0dd7 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 4 Aug 2023 13:17:23 +0000 Subject: [PATCH 6/7] remove unused injection --- app/controllers/api/console.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/api/console.php b/app/controllers/api/console.php index 3c3e2757aa..f2ea83af58 100644 --- a/app/controllers/api/console.php +++ b/app/controllers/api/console.php @@ -55,8 +55,7 @@ App::post('/v1/console/assistant') ->label('abuse-key', 'userId:{userId}') ->param('query', '', new Text(2000), 'Query') ->inject('response') - ->inject('user') - ->action(function (string $query, Response $response, Document $user) { + ->action(function (string $query, Response $response) { $ch = curl_init('http://appwrite-assistant:3003/'); $responseHeaders = []; $query = json_encode(['prompt' => $query]); From 72ebccfd7f9e352aab6738cc9c3971523dcf433b Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 7 Aug 2023 07:55:24 +0000 Subject: [PATCH 7/7] update assistant --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index f72458560f..47c45a4823 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -662,7 +662,7 @@ services: appwrite-assistant: container_name: appwrite-assistant - image: dlohani/appwrite_ask + image: appwrite/assistant:0.1.0 networks: - appwrite environment: