Advertisement
Guest User

Untitled

a guest
Mar 4th, 2023
1,114
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.4
  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 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  13.  
  14. // ----------------------------------
  15.  
  16. // Defaults, do NOT change them here - use dialog menu instead!
  17. integer gBodyMaxLength = 16384;
  18. string gListenMode = "Owner";
  19. string gAnswerIn = "Nearby chat";
  20. integer gHovertext = TRUE;
  21. list gOpenAiModels = [
  22.  
  23.     "ModelName", "Davinci (chat)",
  24.     "Endpoint", "/v1/completions",
  25.     "Items", 6,
  26.     "model", "text-davinci-003",
  27.     "temperature", 0.9,
  28.     "max_tokens", 150,
  29.     "top_p", 1,
  30.     "frequency_penalty", 0.0,
  31.     "presence_penalty", 0.6,
  32.  
  33.     "ModelName", "3.5 Turbo (chat)",
  34.     "Endpoint", "/v1/chat/completions",
  35.     "Items", 6,
  36.     "model", "gpt-3.5-turbo",
  37.     "temperature", 0.9,
  38.     "max_tokens", 150,
  39.     "top_p", 1,
  40.     "frequency_penalty", 0.0,
  41.     "presence_penalty", 0.6,
  42.  
  43.     "ModelName", "DALL-E (images)",
  44.     "Endpoint", "/v1/images/generations",
  45.     "Items", 2,
  46.     "n", 1,
  47.     "size", "1024x1024"
  48.  
  49. ];
  50.  
  51. // Set in runtime
  52. integer gEnabled;
  53. integer gListenHandle;
  54. integer gDialogChannel;
  55. integer gDialogHandle;
  56. integer gChatIsLocked;
  57. string gCurrentEndpoint;
  58. string gCurrentModelName;
  59. list gCurrentModelData;
  60. list gModelsList;
  61. key gAnswerToAvatar;
  62. key gHTTPRequestId;
  63. key gOwnerKey;
  64.  
  65. // Functions
  66.  
  67. setListener()
  68. {
  69.     key listenKey = NULL_KEY;
  70.     if (gListenMode == "Owner")
  71.     {
  72.         listenKey = gOwnerKey;
  73.     }
  74.     gListenHandle = llListen(PUBLIC_CHANNEL, "", listenKey, "");
  75.     llListenControl(gListenHandle, gEnabled);
  76.     llSetText(gCurrentModelName + "\n" + llList2String(["Disabled", "Enabled"], gEnabled), <1, 1, 1>, gHovertext * 0.6);
  77. }
  78.  
  79. setModel(string modelName)
  80. {
  81.     integer modelPosition = llListFindList(gOpenAiModels, (list)modelName);
  82.     gCurrentEndpoint = llList2String(gOpenAiModels, modelPosition + 2);
  83.     gCurrentModelData = llList2List(gOpenAiModels, modelPosition + 5, modelPosition + 4 + llList2Integer(gOpenAiModels, modelPosition + 4) * 2);
  84.     gCurrentModelName = modelName;
  85.     llOwnerSay("Model selected: " + modelName);
  86. }
  87.  
  88. stopDlialog()
  89. {
  90.     llSetTimerEvent(0);
  91.     llListenRemove(gDialogHandle);
  92. }
  93.  
  94. setChatLock(integer enable)
  95. {
  96.     gChatIsLocked = enable;
  97.     if (enable)
  98.     {
  99.         // Chat lock timeout (10 seconds)
  100.         llSensorRepeat("cake is a lie", NULL_KEY, AGENT_BY_LEGACY_NAME, 0.001, 0.001, 10);
  101.     }
  102.     else
  103.     {
  104.         llSensorRemove();
  105.     }
  106. }
  107.  
  108. // Script body
  109.  
  110. default
  111. {
  112.  
  113.     state_entry()
  114.     {
  115.  
  116.         llOwnerSay("Starting up...");
  117.         gOwnerKey = llGetOwner();
  118.         gDialogChannel = (integer)(llFrand(-10000000)-10000000);
  119.  
  120.         integer modelsLength = llGetListLength(gOpenAiModels);
  121.         integer i;
  122.         while (i < modelsLength)
  123.         {
  124.             string currentItem = llList2String(gOpenAiModels, i);
  125.             if (currentItem == "ModelName")
  126.             {
  127.                 gModelsList = gModelsList + llList2String(gOpenAiModels, i + 1);
  128.             }
  129.             ++i;
  130.         }
  131.  
  132.         if (llGetMemoryLimit() <= 16384)
  133.         {
  134.             gBodyMaxLength = 4096;
  135.             llOwnerSay("WARNING: You're using LSO VM. Maximum response body will be limited. Please compile script as Mono.");
  136.         }
  137.  
  138.         setModel(llList2String(gModelsList, 0));
  139.         stopDlialog();
  140.         setListener();
  141.         setChatLock(FALSE);
  142.         llOwnerSay("Ready. Touch me to set options or enable / disable.");
  143.  
  144.     }
  145.  
  146.     touch_start(integer nd)
  147.     {
  148.         key toucherKey = llDetectedKey(0);
  149.         if (toucherKey == gOwnerKey)
  150.         {
  151.             gDialogHandle = llListen(gDialogChannel, "", toucherKey, "");
  152.             llDialog(
  153.                 toucherKey,
  154.                 "\nCurrent state: " + llList2String(["Disabled", "Enabled"], gEnabled) + "\nCurrent model: " + gCurrentModelName + "\nListen mode: " + gListenMode + "\nAnswering in: " + gAnswerIn, ["Hovertext", "Listen to", "Answer in", "Select model", "ON / OFF"],
  155.                 gDialogChannel
  156.             );
  157.             llSetTimerEvent(60);
  158.         }
  159.     }
  160.  
  161.     listen(integer channel, string name, key id, string message)
  162.     {
  163.  
  164.         if (channel == gDialogChannel)
  165.         {
  166.             if (message == "ON / OFF")
  167.             {
  168.                 stopDlialog();
  169.                 gEnabled = !gEnabled;
  170.                 setListener();
  171.                 llOwnerSay("Listener " + llList2String(["disabled", "enabled"], gEnabled) + ".");
  172.             }
  173.             else if (message == "Hovertext")
  174.             {
  175.                 stopDlialog();
  176.                 gHovertext = !gHovertext;
  177.                 setListener();
  178.                 llOwnerSay("Hovertext " + llList2String(["disabled", "enabled"], gHovertext) + ".");
  179.             }
  180.             else if (message == "Owner" || message == "Same group" || message == "Everyone")
  181.             {
  182.                 stopDlialog();
  183.                 gListenMode = message;
  184.                 setListener();
  185.                 llOwnerSay("Listen mode set to: " + message);
  186.             }
  187.             else if (message == "Nearby chat" || message == "Privately")
  188.             {
  189.                 stopDlialog();
  190.                 gAnswerIn = message;
  191.                 setListener();
  192.                 llOwnerSay("Answering in: " + message);
  193.             }
  194.             else if (message == "Select model")
  195.             {
  196.                 llSetTimerEvent(60);
  197.                 llDialog(id, "\nSelect the OpenAI model.\nCurrent one: " + gCurrentModelName, gModelsList, gDialogChannel);
  198.             }
  199.             else if (message == "Listen to")
  200.             {
  201.                 llSetTimerEvent(60);
  202.                 llDialog(id, "\nSelect listen mode.\nCurrent one: " + gListenMode, ["Owner", "Same group", "Everyone"], gDialogChannel);
  203.             }
  204.             else if (message == "Answer in")
  205.             {
  206.                 llSetTimerEvent(60);
  207.                 llDialog(id, "\nSelect where to send responses.\nCurrently: " + gAnswerIn, ["Nearby chat", "Privately"], gDialogChannel);
  208.             }
  209.             else if (~llListFindList(gModelsList, (list)message))
  210.             {
  211.                 stopDlialog();
  212.                 setModel(message);
  213.                 setListener();
  214.             }
  215.             return;
  216.         }
  217.  
  218.         id = llGetOwnerKey(id);
  219.         if (gChatIsLocked || (gListenMode == "Owner" && id != gOwnerKey) || llGetAgentSize(id) == ZERO_VECTOR || llVecDist(llGetPos(), llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0)) > 20 || (gListenMode == "Same group" && !llSameGroup(id)))
  220.         {
  221.             return;
  222.         }
  223.  
  224.         setChatLock(TRUE);
  225.         gAnswerToAvatar = id;
  226.  
  227.         message = llStringTrim(message, STRING_TRIM);
  228.         if (gCurrentModelName == "Davinci (chat)" || gCurrentModelName == "3.5 Turbo (chat)")
  229.         {
  230.             message = "UTC now: " + llGetTimestamp() + ". Person sending this query to you: \"" + llGetUsername(id) + "\". Write a reply to message: " + message;
  231.         }
  232.         else if (gCurrentModelName == "DALL-E (images)")
  233.         {
  234.             if (gAnswerIn == "Nearby chat")
  235.             {
  236.                 llSay(0, "Query received, please be patient...");
  237.             }
  238.             else
  239.             {
  240.                 llRegionSayTo(gAnswerToAvatar, 0, "Query received, please be patient...");
  241.             }
  242.         }
  243.  
  244.         list promptAdditions;
  245.         if (gCurrentModelName == "3.5 Turbo (chat)")
  246.         {
  247.             promptAdditions = ["user", (string)id, "messages", "[" + llList2Json(JSON_OBJECT, ["role", "user", "content", message]) + "]"];
  248.         }
  249.         else
  250.         {
  251.             promptAdditions = ["user", (string)id, "prompt", message];
  252.         }
  253.  
  254.         gHTTPRequestId = llHTTPRequest("https://api.openai.com" + gCurrentEndpoint, [
  255.             HTTP_MIMETYPE, "application/json",
  256.             HTTP_METHOD, "POST",
  257.             HTTP_BODY_MAXLENGTH, gBodyMaxLength,
  258.             HTTP_ACCEPT, "application/json",
  259.             HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + gChatGptApiKey
  260.         ], llList2Json(JSON_OBJECT, llListInsertList(gCurrentModelData, promptAdditions, 0)));
  261.  
  262.     }
  263.  
  264.     http_response(key request_id, integer status, list metadata, string body)
  265.     {
  266.         if (gHTTPRequestId == request_id)
  267.         {
  268.  
  269.             // Davinci
  270.             string result = llJsonGetValue(body, ["choices", 0, "text"]);
  271.  
  272.             // DALL-E
  273.             if (result == JSON_INVALID || result == JSON_NULL)
  274.             {
  275.                 result = llJsonGetValue(body, ["data", 0, "url"]);
  276.             }
  277.  
  278.             // GPT 3.5 Turbo
  279.             if (result == JSON_INVALID || result == JSON_NULL)
  280.             {
  281.                 result = llJsonGetValue(body, ["choices", 0, "message", "content"]);
  282.             }
  283.  
  284.             if (result == JSON_INVALID || result == JSON_NULL)
  285.             {
  286.                 llSay(0, "Something went wrong, please try again in a moment.");
  287.                 llOwnerSay("[SERVER MESSAGE] [HTTP STATUS " + (string)status + "] " + body);
  288.                 return;
  289.             }
  290.  
  291.             result = "([https://platform.openai.com/docs/usage-policies AI]) " + llStringTrim(result, STRING_TRIM);
  292.             if (gAnswerIn == "Nearby chat")
  293.             {
  294.                 llSay(0, result);
  295.             }
  296.             else
  297.             {
  298.                 llRegionSayTo(gAnswerToAvatar, 0, result);
  299.             }
  300.  
  301.             setChatLock(FALSE);
  302.  
  303.         }
  304.     }
  305.  
  306.     on_rez(integer sp)
  307.     {
  308.         llResetScript();
  309.     }
  310.  
  311.     timer()
  312.     {
  313.         stopDlialog();
  314.     }
  315.  
  316.     no_sensor()
  317.     {
  318.         setChatLock(FALSE);
  319.     }
  320.  
  321.     changed(integer change)
  322.     {
  323.         if (change & CHANGED_OWNER)
  324.         {
  325.             llResetScript();
  326.         }
  327.     }
  328.  
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement