From 50929e3efcb06dd14048a80417252ca237245a1b Mon Sep 17 00:00:00 2001 From: Pepijn Date: Sat, 14 Jan 2023 19:52:59 +0100 Subject: [PATCH] v1.3.0 --- README.md | 4 ++-- module.json | 2 +- module.zip | Bin 4397 -> 5142 bytes scripts/chat_commands.js | 2 +- scripts/generator.js | 49 +++++++++++++++++++++++++++------------ scripts/main.js | 7 ++++-- scripts/settings.js | 19 +++++++++++++++ 7 files changed, 62 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 1c63c06..226df30 100644 --- a/README.md +++ b/README.md @@ -93,12 +93,12 @@ The module will never send a request to GPT-3 without being told to by pressing > WARNING! Using any of these functions will send a request to GPT-3 for which you will be charged like any other request made by this module. As such please be careful implenting them in macros and other modules. Test your code well before implementing these functions and I strongly advice users to avoid looping and recursive functions. Functions to construct and send your own prompts are provided under `game.modules.get('ai-description-generator').api`: -- `constructPrompt(language, system, world, entityType, subject, key)`: Construct and sends a prompt based on the provided context similar to how the base module does it. +- `constructPrompt(language, system, world, subject, subjectType, key)`: Construct and sends a prompt based on the provided context similar to how the base module does it. - `language`: The language GPT-3 will be encouraged to respond in. Use `game.settings.get('ai-description-generator', 'language')` to use the language provided in the module's/core's settings. - `system`: The RPG system to be used for context. Use `game.settings.get('ai-description-generator', 'system')` to use the system that was provided in the module's settings. - `world`: The world/setting to be used for context. Use `game.settings.get('ai-description-generator', 'world')` to use the world that was provided in the module's settings. - - `entityType`: Either `creature`, `item`, or `spell`. - `subject`: The name of the subject. + - `subjectType`: Additional information about the nature of the `subject`, like `creature` or `spell`. - `key`: Your API key. Use `game.settings.get('ai-description-generator', 'key')` to use the key that was provided in the module's settings. - `sendPrompt(prompt, key)`: Sends a completely custom prompt. - `prompt`: The prompt you want to send. diff --git a/module.json b/module.json index 9af000f..1a6e3ef 100644 --- a/module.json +++ b/module.json @@ -2,7 +2,7 @@ "id": "ai-description-generator", "title": "AI Description Generator", "description": "Utilizes the GPT-3 AI to generate descriptions from within Foundry.", - "version": "1.2.0", + "version": "1.3.0", "authors": [ { "name": "Pepijn Sietsema", diff --git a/module.zip b/module.zip index 277db641fced705a61ae2ae568e7cae4b237c364..2344240da8e113ae3fa4ccce4a5fe0ffa9f452ab 100644 GIT binary patch delta 4717 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 X0PweV{im4dUJ4Es4?!g8@6f*hRw%Lx delta 3926 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 vx}iOp_;~-Drv4KXPl>K!;^zJLNd*9y{uOck{ { registerSettings(); registerAPI(); }) +//Add a new button to the header of the actor sheet. Hooks.on('getActorSheetHeaderButtons', (sheet, headerButtons) => { if (!game.user.isGM) return; headerButtons.unshift({ @@ -19,14 +21,15 @@ Hooks.on('getActorSheetHeaderButtons', (sheet, headerButtons) => { game.settings.get('ai-description-generator', 'language'), game.settings.get('ai-description-generator', 'system'), game.settings.get('ai-description-generator', 'world'), - 'creature', sheet.object.name, + 'creature', game.settings.get('ai-description-generator', 'key') ); } }) }) +//Add a new button the the header of the itme sheet. Spells are also considered items. Hooks.on('getItemSheetHeaderButtons', (sheet, headerButtons) => { headerButtons.unshift({ label: 'GPT-3', @@ -37,8 +40,8 @@ Hooks.on('getItemSheetHeaderButtons', (sheet, headerButtons) => { game.settings.get('ai-description-generator', 'language'), game.settings.get('ai-description-generator', 'system'), game.settings.get('ai-description-generator', 'world'), - sheet.object.type == 'spell' ? 'spell': 'item', sheet.object.name, + sheet.object.type == 'spell' ? 'spell': 'item', game.settings.get('ai-description-generator', 'key') ); } diff --git a/scripts/settings.js b/scripts/settings.js index 1ea3979..c852108 100644 --- a/scripts/settings.js +++ b/scripts/settings.js @@ -53,6 +53,15 @@ export function registerSettings() { default: 'GPT-3' }); + game.settings.register('ai-description-generator', 'prompt', { + name: 'AI Prompt', + hint: 'The prompt that is used to contruct a request for GPT-3. Only alter this if you are dissatified with the results and know what you are doing!', + scope: 'world', + config: true, + type: String, + default: 'Reply in {language}. This is a tabletop roleplaying game using the {system} system and the {world} setting. Give a cool short sensory description the game master can use for a {subject} {subjectType}.' + }); + game.settings.register('ai-description-generator', 'max_tokens', { name: 'AI Max Tokens', hint: 'The maximum amount of tokens the AI can use per request.', @@ -92,6 +101,16 @@ export function registerSettings() { default: 0.0 }); + game.settings.register('ai-description-generator', 'model', { + name: 'AI Model', + hint: 'GPT-3 offers 4 main models, davanci-003 being the latest. This setting should not be changed if you do not know what this means.', + scope: 'world', + config: true, + type: String, + default: 'text-davinci-003', + choices: { 'text-davinci-003': 'text-davinci-003', 'text-curie-001': 'text-curie-001', 'text-babbage-001': 'text-babbage-001', 'text-ada-001': 'text-ada-001' } + }); + game.settings.register('ai-description-generator', 'api', { name: 'Enable API Functions', hint: 'Exposes functions to construct and send prompts in macros or other modules.',