Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // OpenAI's ChatGPT integration for LSL
- // Written by PanteraPolnocy, March 2023
- // Version 2.3
- // You're responsible for how your OpenAI account will be used!
- // Set script to "everyone" or "same group" on your own risk. Mandatory reading:
- // https://platform.openai.com/docs/usage-policies
- // https://openai.com/pricing
- // Place your API key here
- // https://platform.openai.com/account/api-keys
- string gChatGptApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
- // ----------------------------------
- // Defaults, do NOT change them here - use dialog menu instead!
- integer gBodyMaxLength = 16384;
- string gListenMode = "Owner";
- list gOpenAiModels = [
- "ModelName", "Davinci (chat)",
- "Endpoint", "/v1/completions",
- "Items", 6,
- "model", "text-davinci-003",
- "temperature", 0.9,
- "max_tokens", 150,
- "top_p", 1,
- "frequency_penalty", 0.0,
- "presence_penalty", 0.6,
- "ModelName", "3.5 Turbo (chat)",
- "Endpoint", "/v1/chat/completions",
- "Items", 6,
- "model", "gpt-3.5-turbo",
- "temperature", 0.9,
- "max_tokens", 150,
- "top_p", 1,
- "frequency_penalty", 0.0,
- "presence_penalty", 0.6,
- "ModelName", "DALL-E (images, slow)",
- "Endpoint", "/v1/images/generations",
- "Items", 2,
- "n", 1,
- "size", "1024x1024"
- ];
- // Set in runtime
- integer gEnabled;
- integer gListenHandle;
- integer gDialogChannel;
- integer gDialogHandle;
- string gCurrentEndpoint;
- string gCurrentModelName;
- list gCurrentModelData;
- list gModelsList;
- key gHTTPRequestId;
- key gOwnerKey;
- // Functions
- setListener()
- {
- key listenKey = NULL_KEY;
- if (gListenMode == "Owner")
- {
- listenKey = gOwnerKey;
- }
- gListenHandle = llListen(PUBLIC_CHANNEL, "", listenKey, "");
- llListenControl(gListenHandle, gEnabled);
- llSetText(gCurrentModelName + "\n" + llList2String(["Disabled", "Enabled"], gEnabled), <1, 1, 1>, 0.6);
- }
- setModel(string modelName)
- {
- integer modelPosition = llListFindList(gOpenAiModels, (list)modelName);
- gCurrentEndpoint = llList2String(gOpenAiModels, modelPosition + 2);
- gCurrentModelData = llList2List(gOpenAiModels, modelPosition + 5, modelPosition + 4 + llList2Integer(gOpenAiModels, modelPosition + 4) * 2);
- gCurrentModelName = modelName;
- llOwnerSay("Model selected: " + modelName);
- }
- stopDlialog()
- {
- llSetTimerEvent(0);
- llListenRemove(gDialogHandle);
- }
- // Script body
- default
- {
- state_entry()
- {
- llOwnerSay("Starting up...");
- gOwnerKey = llGetOwner();
- gDialogChannel = (integer)(llFrand(-10000000)-10000000);
- integer modelsLength = llGetListLength(gOpenAiModels);
- integer i;
- while (i < modelsLength)
- {
- string currentItem = llList2String(gOpenAiModels, i);
- if (currentItem == "ModelName")
- {
- gModelsList = gModelsList + llList2String(gOpenAiModels, i + 1);
- }
- ++i;
- }
- if (llGetMemoryLimit() <= 16384)
- {
- gBodyMaxLength = 4096;
- llOwnerSay("WARNING: You're using LSO VM. Maximum response body will be limited. Please compile script as Mono.");
- }
- setModel(llList2String(gModelsList, 0));
- stopDlialog();
- setListener();
- llOwnerSay("Ready. Touch me to set options or enable / disable.");
- }
- touch_start(integer nd)
- {
- key toucherKey = llDetectedKey(0);
- if (toucherKey == gOwnerKey)
- {
- gDialogHandle = llListen(gDialogChannel, "", toucherKey, "");
- llDialog(
- toucherKey,
- "\nCurrent state: " + llList2String(["Disabled", "Enabled"], gEnabled) + "\nCurrent model: " + gCurrentModelName + "\nCurrent listen mode: " + gListenMode, ["ON / OFF", "Select model", "Listen to"],
- gDialogChannel
- );
- llSetTimerEvent(60);
- }
- }
- listen(integer channel, string name, key id, string message)
- {
- if (channel == gDialogChannel)
- {
- if (message == "ON / OFF")
- {
- stopDlialog();
- gEnabled = !gEnabled;
- setListener();
- llOwnerSay("Listener " + llList2String(["disabled", "enabled"], gEnabled) + ".");
- }
- else if (message == "Select model")
- {
- llSetTimerEvent(60);
- llDialog(id, "\nSelect model. Current one: " + gCurrentModelName, gModelsList, gDialogChannel);
- }
- else if (message == "Listen to")
- {
- llSetTimerEvent(60);
- llDialog(id, "\nSelect listen mode. Current one: " + gListenMode, ["Owner", "Same group", "Everyone"], gDialogChannel);
- }
- else if (message == "Owner" || message == "Same group" || message == "Everyone")
- {
- stopDlialog();
- gListenMode = message;
- setListener();
- llOwnerSay("Listen mode set to: " + message);
- }
- else if (~llListFindList(gModelsList, (list)message))
- {
- stopDlialog();
- setModel(message);
- }
- return;
- }
- id = llGetOwnerKey(id);
- if (llGetAgentSize(id) == ZERO_VECTOR || llVecDist(llGetPos(), llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0)) > 20 || (gListenMode == "Owner" && id != gOwnerKey) || (gListenMode == "Same group" && !llSameGroup(id)))
- {
- return;
- }
- list promptAdditions;
- if (gCurrentModelName == "3.5 Turbo (chat)")
- {
- promptAdditions = ["user", (string)id, "messages", "[" + llList2Json(JSON_OBJECT, ["role", "user", "content", message]) + "]"];
- }
- else
- {
- promptAdditions = ["user", (string)id, "prompt", message];
- }
- gHTTPRequestId = llHTTPRequest("https://api.openai.com" + gCurrentEndpoint, [
- HTTP_MIMETYPE, "application/json",
- HTTP_METHOD, "POST",
- HTTP_BODY_MAXLENGTH, gBodyMaxLength,
- HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + gChatGptApiKey
- ], llList2Json(JSON_OBJECT, llListInsertList(gCurrentModelData, promptAdditions, 0)));
- }
- http_response(key request_id, integer status, list metadata, string body)
- {
- if (gHTTPRequestId == request_id)
- {
- // Davinci
- string result = llJsonGetValue(body, ["choices", 0, "text"]);
- // DALL-E
- if (result == JSON_INVALID || result == JSON_NULL)
- {
- result = llJsonGetValue(body, ["data", 0, "url"]);
- }
- // GPT 3.5 Turbo
- if (result == JSON_INVALID || result == JSON_NULL)
- {
- result = llJsonGetValue(body, ["choices", 0, "message", "content"]);
- }
- if (result == JSON_INVALID || result == JSON_NULL)
- {
- llSay(0, "Something went wrong, please try again in a moment.");
- llOwnerSay("[SERVER MESSAGE] " + body);
- return;
- }
- llSay(0, "([https://platform.openai.com/docs/usage-policies AI]) " + llStringTrim(result, STRING_TRIM));
- }
- }
- on_rez(integer sp)
- {
- llResetScript();
- }
- timer()
- {
- stopDlialog();
- }
- changed(integer change)
- {
- if (change & CHANGED_OWNER)
- {
- llResetScript();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement