Advertisement
Guest User

Untitled

a guest
Mar 2nd, 2023
2,040
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // OpenAI's ChatGPT integration for LSL
  2. // Written by PanteraPolnocy, March 2023
  3. // Version 2.1
  4.  
  5. // Configurable
  6. string gChatGptApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  7.  
  8. // Defaults, do NOT change them here - use dialog menu instead!
  9. integer gBodyMaxLength = 16384;
  10. string gListenMode = "Owner";
  11. list gModelsList = ["Davinci (chat)", "DALL-E (images, slow)"];
  12. list gOpenAiModels = [
  13.  
  14.     "Davinci (chat)",
  15.     "Endpoint", "/v1/completions",
  16.     "Items", 6,
  17.     "model", "text-davinci-003",
  18.     "temperature", 0.9,
  19.     "max_tokens", 150,
  20.     "top_p", 1,
  21.     "frequency_penalty", 0.0,
  22.     "presence_penalty", 0.6,
  23.  
  24.     "DALL-E (images, slow)",
  25.     "Endpoint", "/v1/images/generations",
  26.     "Items", 2,
  27.     "n", 1,
  28.     "size", "1024x1024"
  29.  
  30. ];
  31.  
  32. // Set in runtime, do not touch
  33. integer gEnabled;
  34. integer gListenHandle;
  35. integer gDialogChannel;
  36. integer gDialogHandle;
  37. string gCurrentEndpoint;
  38. string gCurrentModelName;
  39. list gCurrentModelData;
  40. key gOwnerKey;
  41. key gHTTPRequestId;
  42.  
  43. // Functions
  44.  
  45. setListener()
  46. {
  47.     key listenKey = NULL_KEY;
  48.     if (gListenMode == "Owner")
  49.     {
  50.         listenKey = gOwnerKey;
  51.     }
  52.     gListenHandle = llListen(PUBLIC_CHANNEL, "", listenKey, "");
  53.     llListenControl(gListenHandle, gEnabled);
  54.     llSetText("Listener " + llList2String(["disabled", "enabled"], gEnabled), <1, 1, 1>, 0.5);
  55. }
  56.  
  57. setModel(string modelName)
  58. {
  59.     integer modelPosition = llListFindList(gOpenAiModels, (list)modelName);
  60.     if (modelPosition == -1)
  61.     {
  62.         llOwnerSay("Cannot find model: " + modelName);
  63.         return;
  64.     }
  65.     gCurrentEndpoint = llList2String(gOpenAiModels, modelPosition + 2);
  66.     gCurrentModelData = llList2List(gOpenAiModels, modelPosition + 5, modelPosition + 4 + llList2Integer(gOpenAiModels, modelPosition + 4) * 2);
  67.     gCurrentModelName = modelName;
  68.     llOwnerSay("Model selected: " + modelName);
  69. }
  70.  
  71. stopDlialog()
  72. {
  73.     llSetTimerEvent(0);
  74.     llListenRemove(gDialogHandle);
  75. }
  76.  
  77. // Script body
  78.  
  79. default
  80. {
  81.  
  82.     on_rez(integer sp)
  83.     {
  84.         llResetScript();
  85.     }
  86.  
  87.     state_entry()
  88.     {
  89.         gOwnerKey = llGetOwner();
  90.         gDialogChannel = (integer)(llFrand(-10000000)-10000000);
  91.         if (llGetMemoryLimit() <= 16384)
  92.         {
  93.             gBodyMaxLength = 4096;
  94.             llOwnerSay("Warning: You're using LSO VM. Maximum response body will be limited. Please compile script as Mono.");
  95.         }
  96.         setModel("Davinci (chat)");
  97.         setListener();
  98.     }
  99.  
  100.     touch_start(integer nd)
  101.     {
  102.         key toucherKey = llDetectedKey(0);
  103.         if (toucherKey != gOwnerKey)
  104.         {
  105.             return;
  106.         }
  107.         gDialogHandle = llListen(gDialogChannel, "", toucherKey, "");
  108.         llDialog(toucherKey, "\nThis menu can be only seen by the object owner. Select an option.\n-\nCurrent state: " + llList2String(["Disabled", "Enabled"], gEnabled) + "\nCurrent model: " + gCurrentModelName + "\nCurrent listen mode: " + gListenMode, ["ON / OFF", "Select model", "Listen to"], gDialogChannel);
  109.         llSetTimerEvent(60);
  110.     }
  111.  
  112.     timer()
  113.     {
  114.         stopDlialog();
  115.     }
  116.  
  117.     listen(integer channel, string name, key id, string message)
  118.     {
  119.  
  120.         if (channel == gDialogChannel)
  121.         {
  122.             if (message == "ON / OFF")
  123.             {
  124.                 stopDlialog();
  125.                 gEnabled = !gEnabled;
  126.                 setListener();
  127.                 llOwnerSay("Listener " + llList2String(["disabled", "enabled"], gEnabled) + ".");
  128.             }
  129.             else if (message == "Select model")
  130.             {
  131.                 llSetTimerEvent(60);
  132.                 llDialog(id, "\nSelect model. Current one: " + gCurrentModelName, gModelsList, gDialogChannel);
  133.             }
  134.             else if (message == "Listen to")
  135.             {
  136.                 llSetTimerEvent(60);
  137.                 llDialog(id, "\nSelect listen mode. Current one: " + gListenMode, ["Owner", "Same group", "Everyone"], gDialogChannel);
  138.             }
  139.             else if (message == "Owner" || message == "Same group" || message == "Everyone")
  140.             {
  141.                 stopDlialog();
  142.                 gListenMode = message;
  143.                 setListener();
  144.                 llOwnerSay("Listen mode set to: " + message);
  145.             }
  146.             else if (~llListFindList(gModelsList, (list)message))
  147.             {
  148.                 stopDlialog();
  149.                 setModel(message);
  150.             }
  151.             return;
  152.         }
  153.  
  154.         id = llGetOwnerKey(id);
  155.         if (llGetAgentSize(id) == ZERO_VECTOR || llVecDist(llGetPos(), llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0)) > 20 || (gListenMode == "Owner" && id != gOwnerKey) || (gListenMode == "Same group" && !llSameGroup(id)))
  156.         {
  157.             return;
  158.         }
  159.         gHTTPRequestId = llHTTPRequest("https://api.openai.com" + gCurrentEndpoint, [
  160.             HTTP_MIMETYPE, "application/json",
  161.             HTTP_METHOD, "POST",
  162.             HTTP_BODY_MAXLENGTH, gBodyMaxLength,
  163.             HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + gChatGptApiKey
  164.         ], llList2Json(JSON_OBJECT, llListInsertList(gCurrentModelData, ["prompt", message, "user", (string)id], 0)));
  165.  
  166.     }
  167.  
  168.     http_response(key request_id, integer status, list metadata, string body)
  169.     {
  170.         if (gHTTPRequestId != request_id)
  171.         {
  172.             return;
  173.         }
  174.         string result = llJsonGetValue(body, ["choices", 0, "text"]); // Davinci
  175.         if (result == JSON_INVALID || result == JSON_NULL)
  176.         {
  177.             result = llJsonGetValue(body, ["data", 0, "url"]); // DALL-E
  178.             if (result == JSON_INVALID || result == JSON_NULL)
  179.             {
  180.                 llSay(0, "Something went wrong, try again in a moment.");
  181.                 llOwnerSay("[SERVER MESSAGE] " + body);
  182.                 return;
  183.             }
  184.         }
  185.         llSay(0, llStringTrim(result, STRING_TRIM));
  186.     }
  187.  
  188.     changed(integer change)
  189.     {
  190.         if (change & CHANGED_OWNER)
  191.         {
  192.             llResetScript();
  193.         }
  194.     }
  195.  
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement