Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2023
1,824
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.3
  4.  
  5. // You're responsible for how your OpenAI account will be used!
  6. // Set script to "everyone" or "same group" on your own risk. Mandatory reading:
  7. // https://platform.openai.com/docs/usage-policies
  8. // https://openai.com/pricing
  9.  
  10. // Place your API key here
  11. // https://platform.openai.com/account/api-keys
  12. string gChatGptApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  13.  
  14. // ----------------------------------
  15.  
  16. // Defaults, do NOT change them here - use dialog menu instead!
  17. integer gBodyMaxLength = 16384;
  18. string gListenMode = "Owner";
  19. list gOpenAiModels = [
  20.  
  21.     "ModelName", "Davinci (chat)",
  22.     "Endpoint", "/v1/completions",
  23.     "Items", 6,
  24.     "model", "text-davinci-003",
  25.     "temperature", 0.9,
  26.     "max_tokens", 150,
  27.     "top_p", 1,
  28.     "frequency_penalty", 0.0,
  29.     "presence_penalty", 0.6,
  30.  
  31.     "ModelName", "3.5 Turbo (chat)",
  32.     "Endpoint", "/v1/chat/completions",
  33.     "Items", 6,
  34.     "model", "gpt-3.5-turbo",
  35.     "temperature", 0.9,
  36.     "max_tokens", 150,
  37.     "top_p", 1,
  38.     "frequency_penalty", 0.0,
  39.     "presence_penalty", 0.6,
  40.  
  41.     "ModelName", "DALL-E (images, slow)",
  42.     "Endpoint", "/v1/images/generations",
  43.     "Items", 2,
  44.     "n", 1,
  45.     "size", "1024x1024"
  46.  
  47. ];
  48.  
  49. // Set in runtime
  50. integer gEnabled;
  51. integer gListenHandle;
  52. integer gDialogChannel;
  53. integer gDialogHandle;
  54. string gCurrentEndpoint;
  55. string gCurrentModelName;
  56. list gCurrentModelData;
  57. list gModelsList;
  58. key gHTTPRequestId;
  59. key gOwnerKey;
  60.  
  61. // Functions
  62.  
  63. setListener()
  64. {
  65.     key listenKey = NULL_KEY;
  66.     if (gListenMode == "Owner")
  67.     {
  68.         listenKey = gOwnerKey;
  69.     }
  70.     gListenHandle = llListen(PUBLIC_CHANNEL, "", listenKey, "");
  71.     llListenControl(gListenHandle, gEnabled);
  72.     llSetText(gCurrentModelName + "\n" + llList2String(["Disabled", "Enabled"], gEnabled), <1, 1, 1>, 0.6);
  73. }
  74.  
  75. setModel(string modelName)
  76. {
  77.     integer modelPosition = llListFindList(gOpenAiModels, (list)modelName);
  78.     gCurrentEndpoint = llList2String(gOpenAiModels, modelPosition + 2);
  79.     gCurrentModelData = llList2List(gOpenAiModels, modelPosition + 5, modelPosition + 4 + llList2Integer(gOpenAiModels, modelPosition + 4) * 2);
  80.     gCurrentModelName = modelName;
  81.     llOwnerSay("Model selected: " + modelName);
  82. }
  83.  
  84. stopDlialog()
  85. {
  86.     llSetTimerEvent(0);
  87.     llListenRemove(gDialogHandle);
  88. }
  89.  
  90. // Script body
  91.  
  92. default
  93. {
  94.  
  95.     state_entry()
  96.     {
  97.  
  98.         llOwnerSay("Starting up...");
  99.         gOwnerKey = llGetOwner();
  100.         gDialogChannel = (integer)(llFrand(-10000000)-10000000);
  101.  
  102.         integer modelsLength = llGetListLength(gOpenAiModels);
  103.         integer i;
  104.         while (i < modelsLength)
  105.         {
  106.             string currentItem = llList2String(gOpenAiModels, i);
  107.             if (currentItem == "ModelName")
  108.             {
  109.                 gModelsList = gModelsList + llList2String(gOpenAiModels, i + 1);
  110.             }
  111.             ++i;
  112.         }
  113.  
  114.         if (llGetMemoryLimit() <= 16384)
  115.         {
  116.             gBodyMaxLength = 4096;
  117.             llOwnerSay("WARNING: You're using LSO VM. Maximum response body will be limited. Please compile script as Mono.");
  118.         }
  119.  
  120.         setModel(llList2String(gModelsList, 0));
  121.         stopDlialog();
  122.         setListener();
  123.         llOwnerSay("Ready. Touch me to set options or enable / disable.");
  124.  
  125.     }
  126.  
  127.     touch_start(integer nd)
  128.     {
  129.         key toucherKey = llDetectedKey(0);
  130.         if (toucherKey == gOwnerKey)
  131.         {
  132.             gDialogHandle = llListen(gDialogChannel, "", toucherKey, "");
  133.             llDialog(
  134.                 toucherKey,
  135.                 "\nCurrent state: " + llList2String(["Disabled", "Enabled"], gEnabled) + "\nCurrent model: " + gCurrentModelName + "\nCurrent listen mode: " + gListenMode, ["ON / OFF", "Select model", "Listen to"],
  136.                 gDialogChannel
  137.             );
  138.             llSetTimerEvent(60);
  139.         }
  140.     }
  141.  
  142.     listen(integer channel, string name, key id, string message)
  143.     {
  144.  
  145.         if (channel == gDialogChannel)
  146.         {
  147.             if (message == "ON / OFF")
  148.             {
  149.                 stopDlialog();
  150.                 gEnabled = !gEnabled;
  151.                 setListener();
  152.                 llOwnerSay("Listener " + llList2String(["disabled", "enabled"], gEnabled) + ".");
  153.             }
  154.             else if (message == "Select model")
  155.             {
  156.                 llSetTimerEvent(60);
  157.                 llDialog(id, "\nSelect model. Current one: " + gCurrentModelName, gModelsList, gDialogChannel);
  158.             }
  159.             else if (message == "Listen to")
  160.             {
  161.                 llSetTimerEvent(60);
  162.                 llDialog(id, "\nSelect listen mode. Current one: " + gListenMode, ["Owner", "Same group", "Everyone"], gDialogChannel);
  163.             }
  164.             else if (message == "Owner" || message == "Same group" || message == "Everyone")
  165.             {
  166.                 stopDlialog();
  167.                 gListenMode = message;
  168.                 setListener();
  169.                 llOwnerSay("Listen mode set to: " + message);
  170.             }
  171.             else if (~llListFindList(gModelsList, (list)message))
  172.             {
  173.                 stopDlialog();
  174.                 setModel(message);
  175.             }
  176.             return;
  177.         }
  178.  
  179.         id = llGetOwnerKey(id);
  180.         if (llGetAgentSize(id) == ZERO_VECTOR || llVecDist(llGetPos(), llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0)) > 20 || (gListenMode == "Owner" && id != gOwnerKey) || (gListenMode == "Same group" && !llSameGroup(id)))
  181.         {
  182.             return;
  183.         }
  184.  
  185.         list promptAdditions;
  186.         if (gCurrentModelName == "3.5 Turbo (chat)")
  187.         {
  188.             promptAdditions = ["user", (string)id, "messages", "[" + llList2Json(JSON_OBJECT, ["role", "user", "content", message]) + "]"];
  189.         }
  190.         else
  191.         {
  192.             promptAdditions = ["user", (string)id, "prompt", message];
  193.         }
  194.  
  195.         gHTTPRequestId = llHTTPRequest("https://api.openai.com" + gCurrentEndpoint, [
  196.             HTTP_MIMETYPE, "application/json",
  197.             HTTP_METHOD, "POST",
  198.             HTTP_BODY_MAXLENGTH, gBodyMaxLength,
  199.             HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + gChatGptApiKey
  200.         ], llList2Json(JSON_OBJECT, llListInsertList(gCurrentModelData, promptAdditions, 0)));
  201.  
  202.     }
  203.  
  204.     http_response(key request_id, integer status, list metadata, string body)
  205.     {
  206.         if (gHTTPRequestId == request_id)
  207.         {
  208.  
  209.             // Davinci
  210.             string result = llJsonGetValue(body, ["choices", 0, "text"]);
  211.  
  212.             // DALL-E
  213.             if (result == JSON_INVALID || result == JSON_NULL)
  214.             {
  215.                 result = llJsonGetValue(body, ["data", 0, "url"]);
  216.             }
  217.  
  218.             // GPT 3.5 Turbo
  219.             if (result == JSON_INVALID || result == JSON_NULL)
  220.             {
  221.                 result = llJsonGetValue(body, ["choices", 0, "message", "content"]);
  222.             }
  223.  
  224.             if (result == JSON_INVALID || result == JSON_NULL)
  225.             {
  226.                 llSay(0, "Something went wrong, please try again in a moment.");
  227.                 llOwnerSay("[SERVER MESSAGE] " + body);
  228.                 return;
  229.             }
  230.  
  231.             llSay(0, "([https://platform.openai.com/docs/usage-policies AI]) " + llStringTrim(result, STRING_TRIM));
  232.  
  233.         }
  234.     }
  235.  
  236.     on_rez(integer sp)
  237.     {
  238.         llResetScript();
  239.     }
  240.  
  241.     timer()
  242.     {
  243.         stopDlialog();
  244.     }
  245.  
  246.     changed(integer change)
  247.     {
  248.         if (change & CHANGED_OWNER)
  249.         {
  250.             llResetScript();
  251.         }
  252.     }
  253.  
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement